1 /**
2 *
3 * \brief Dialog for renaming layers
4 *
5 * Author:
6 * Bryce W. Harrington <bryce@bryceharrington.com>
7 * Andrius R. <knutux@gmail.com>
8 *
9 * Copyright (C) 2004 Bryce Harrington
10 * Copyright (C) 2006 Andrius R.
11 *
12 * Released under GNU GPL. Read the file 'COPYING' for more information
13 */
15 #ifdef HAVE_CONFIG_H
16 # include <config.h>
17 #endif
19 #include <gtkmm/stock.h>
21 #include <glibmm/i18n.h>
22 #include "inkscape.h"
23 #include "desktop.h"
24 #include "document.h"
25 #include "message-stack.h"
26 #include "desktop-handles.h"
27 #include "sp-object.h"
28 #include "sp-item.h"
30 #include "layer-properties.h"
32 namespace Inkscape {
33 namespace UI {
34 namespace Dialogs {
36 LayerPropertiesDialog::LayerPropertiesDialog()
37 : _strategy(NULL), _desktop(NULL), _layer(NULL), _position_visible(false)
38 {
39 GtkWidget *dlg = GTK_WIDGET(gobj());
40 g_assert(dlg);
42 Gtk::VBox *mainVBox = get_vbox();
44 _layout_table.set_spacings(4);
45 _layout_table.resize (1, 2);
47 // Layer name widgets
48 _layer_name_entry.set_activates_default(true);
49 _layer_name_label.set_label(_("Layer name:"));
50 _layer_name_label.set_alignment(1.0, 0.5);
52 _layout_table.attach(_layer_name_label,
53 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
54 _layout_table.attach(_layer_name_entry,
55 1, 2, 0, 1, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
56 mainVBox->pack_start(_layout_table, false, false, 4);
58 // Buttons
59 _close_button.set_use_stock(true);
60 _close_button.set_label(Gtk::Stock::CANCEL.id);
61 _close_button.set_flags(Gtk::CAN_DEFAULT);
63 _apply_button.set_use_underline(true);
64 _apply_button.set_flags(Gtk::CAN_DEFAULT);
66 _close_button.signal_clicked()
67 .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_close));
68 _apply_button.signal_clicked()
69 .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_apply));
71 signal_delete_event().connect(
72 sigc::bind_return(
73 sigc::hide(sigc::mem_fun(*this, &LayerPropertiesDialog::_close)),
74 true
75 )
76 );
78 add_action_widget(_close_button, Gtk::RESPONSE_CLOSE);
79 add_action_widget(_apply_button, Gtk::RESPONSE_APPLY);
81 _apply_button.grab_default();
83 show_all_children();
84 }
86 LayerPropertiesDialog::~LayerPropertiesDialog() {
87 _setDesktop(NULL);
88 _setLayer(NULL);
89 }
91 void LayerPropertiesDialog::_showDialog(LayerPropertiesDialog::Strategy &strategy,
92 SPDesktop *desktop, SPObject *layer)
93 {
94 LayerPropertiesDialog *dialog = new LayerPropertiesDialog();
96 dialog->_strategy = &strategy;
97 dialog->_setDesktop(desktop);
98 dialog->_setLayer(layer);
100 dialog->_strategy->setup(*dialog);
102 dialog->set_modal(true);
103 desktop->setWindowTransient (dialog->gobj());
104 dialog->property_destroy_with_parent() = true;
106 dialog->show();
107 dialog->present();
108 }
110 void
111 LayerPropertiesDialog::_apply()
112 {
113 g_assert(_strategy != NULL);
115 _strategy->perform(*this);
116 sp_document_done(sp_desktop_document(SP_ACTIVE_DESKTOP));
118 _close();
119 }
121 void
122 LayerPropertiesDialog::_close()
123 {
124 _setLayer(NULL);
125 _setDesktop(NULL);
126 destroy_();
127 Glib::signal_idle().connect(
128 sigc::bind_return(
129 sigc::bind(sigc::ptr_fun(&::operator delete), this),
130 false
131 )
132 );
133 }
135 void
136 LayerPropertiesDialog::_setup_position_controls() {
137 if ( NULL == _layer || _desktop->currentRoot() == _layer ) {
138 // no layers yet, so option above/below/sublayer is useless
139 return;
140 }
142 _position_visible = true;
143 _dropdown_list = Gtk::ListStore::create(_dropdown_columns);
144 _layer_position_combo.set_model(_dropdown_list);
145 _layer_position_combo.pack_start(_label_renderer);
146 _layer_position_combo.set_cell_data_func(_label_renderer,
147 sigc::mem_fun(*this, &LayerPropertiesDialog::_prepareLabelRenderer));
149 _layout_table.resize (2, 2);
151 Gtk::ListStore::iterator row;
152 row = _dropdown_list->append();
153 row->set_value(_dropdown_columns.position, LPOS_ABOVE);
154 row->set_value(_dropdown_columns.name, Glib::ustring(_("Above current")));
155 _layer_position_combo.set_active(row);
156 row = _dropdown_list->append();
157 row->set_value(_dropdown_columns.position, LPOS_BELOW);
158 row->set_value(_dropdown_columns.name, Glib::ustring(_("Below current")));
159 row = _dropdown_list->append();
160 row->set_value(_dropdown_columns.position, LPOS_CHILD);
161 row->set_value(_dropdown_columns.name, Glib::ustring(_("As sublayer of current")));
163 _layout_table.attach(_layer_position_combo,
164 1, 2, 1, 2, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
165 _layer_position_label.set_label(_("Position:"));
166 _layer_position_label.set_alignment(1.0, 0.5);
167 _layout_table.attach(_layer_position_label,
168 0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
169 show_all_children();
170 }
172 /** Formats the label for a given layer row
173 */
174 void LayerPropertiesDialog::_prepareLabelRenderer(
175 Gtk::TreeModel::const_iterator const &row
176 ) {
177 Glib::ustring name=(*row)[_dropdown_columns.name];
178 _label_renderer.property_markup() = name.c_str();
179 }
181 void LayerPropertiesDialog::Rename::setup(LayerPropertiesDialog &dialog) {
182 SPDesktop *desktop=dialog._desktop;
183 dialog.set_title(_("Rename Layer"));
184 gchar const *name = desktop->currentLayer()->label();
185 dialog._layer_name_entry.set_text(( name ? name : "" ));
186 dialog._apply_button.set_label(_("_Rename"));
187 }
189 void LayerPropertiesDialog::Rename::perform(LayerPropertiesDialog &dialog) {
190 SPDesktop *desktop=dialog._desktop;
191 Glib::ustring name(dialog._layer_name_entry.get_text());
192 desktop->currentLayer()->setLabel(
193 ( name.empty() ? NULL : (gchar *)name.c_str() )
194 );
195 sp_document_done(sp_desktop_document(desktop));
196 // TRANSLATORS: This means "The layer has been renamed"
197 desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Renamed layer"));
198 }
200 void LayerPropertiesDialog::Create::setup(LayerPropertiesDialog &dialog) {
201 dialog.set_title(_("Add Layer"));
202 dialog._layer_name_entry.set_text("");
203 dialog._apply_button.set_label(_("_Add"));
204 dialog._setup_position_controls();
205 }
207 void LayerPropertiesDialog::Create::perform(LayerPropertiesDialog &dialog) {
208 SPDesktop *desktop=dialog._desktop;
210 LayerRelativePosition position = LPOS_ABOVE;
212 if (dialog._position_visible) {
213 Gtk::ListStore::iterator activeRow(dialog._layer_position_combo.get_active());
214 position = activeRow->get_value(dialog._dropdown_columns.position);
215 }
217 SPObject *new_layer=Inkscape::create_layer(desktop->currentRoot(), dialog._layer, position);
219 Glib::ustring name(dialog._layer_name_entry.get_text());
220 if (!name.empty()) {
221 new_layer->setLabel((gchar *)name.c_str());
222 }
223 sp_desktop_selection(desktop)->clear();
224 desktop->setCurrentLayer(new_layer);
225 desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("New layer created."));
226 }
228 void LayerPropertiesDialog::_setDesktop(SPDesktop *desktop) {
229 if (desktop) {
230 Inkscape::GC::anchor (desktop);
231 }
232 if (_desktop) {
233 Inkscape::GC::release (_desktop);
234 }
235 _desktop = desktop;
236 }
238 void LayerPropertiesDialog::_setLayer(SPObject *layer) {
239 if (layer) {
240 sp_object_ref(layer, NULL);
241 }
242 if (_layer) {
243 sp_object_unref(_layer, NULL);
244 }
245 _layer = layer;
246 }
248 } // namespace
249 } // namespace
250 } // namespace
253 /*
254 Local Variables:
255 mode:c++
256 c-file-style:"stroustrup"
257 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
258 indent-tabs-mode:nil
259 fill-column:99
260 End:
261 */
262 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :