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 "layer-manager.h"
26 #include "message-stack.h"
27 #include "desktop-handles.h"
28 #include "sp-object.h"
29 #include "sp-item.h"
31 #include "layer-properties.h"
33 namespace Inkscape {
34 namespace UI {
35 namespace Dialogs {
37 LayerPropertiesDialog::LayerPropertiesDialog()
38 : _strategy(NULL), _desktop(NULL), _layer(NULL), _position_visible(false)
39 {
40 Gtk::VBox *mainVBox = get_vbox();
42 _layout_table.set_spacings(4);
43 _layout_table.resize (1, 2);
45 // Layer name widgets
46 _layer_name_entry.set_activates_default(true);
47 _layer_name_label.set_label(_("Layer name:"));
48 _layer_name_label.set_alignment(1.0, 0.5);
50 _layout_table.attach(_layer_name_label,
51 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
52 _layout_table.attach(_layer_name_entry,
53 1, 2, 0, 1, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
54 mainVBox->pack_start(_layout_table, false, false, 4);
56 // Buttons
57 _close_button.set_use_stock(true);
58 _close_button.set_label(Gtk::Stock::CANCEL.id);
59 _close_button.set_flags(Gtk::CAN_DEFAULT);
61 _apply_button.set_use_underline(true);
62 _apply_button.set_flags(Gtk::CAN_DEFAULT);
64 _close_button.signal_clicked()
65 .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_close));
66 _apply_button.signal_clicked()
67 .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_apply));
69 signal_delete_event().connect(
70 sigc::bind_return(
71 sigc::hide(sigc::mem_fun(*this, &LayerPropertiesDialog::_close)),
72 true
73 )
74 );
76 add_action_widget(_close_button, Gtk::RESPONSE_CLOSE);
77 add_action_widget(_apply_button, Gtk::RESPONSE_APPLY);
79 _apply_button.grab_default();
81 show_all_children();
82 }
84 LayerPropertiesDialog::~LayerPropertiesDialog() {
85 _setDesktop(NULL);
86 _setLayer(NULL);
87 }
89 void LayerPropertiesDialog::_showDialog(LayerPropertiesDialog::Strategy &strategy,
90 SPDesktop *desktop, SPObject *layer)
91 {
92 LayerPropertiesDialog *dialog = new LayerPropertiesDialog();
94 dialog->_strategy = &strategy;
95 dialog->_setDesktop(desktop);
96 dialog->_setLayer(layer);
98 dialog->_strategy->setup(*dialog);
100 dialog->set_modal(true);
101 desktop->setWindowTransient (dialog->gobj());
102 dialog->property_destroy_with_parent() = true;
104 dialog->show();
105 dialog->present();
106 }
108 void
109 LayerPropertiesDialog::_apply()
110 {
111 g_assert(_strategy != NULL);
113 _strategy->perform(*this);
114 sp_document_done(sp_desktop_document(SP_ACTIVE_DESKTOP));
116 _close();
117 }
119 void
120 LayerPropertiesDialog::_close()
121 {
122 _setLayer(NULL);
123 _setDesktop(NULL);
124 destroy_();
125 Glib::signal_idle().connect(
126 sigc::bind_return(
127 sigc::bind(sigc::ptr_fun(&::operator delete), this),
128 false
129 )
130 );
131 }
133 void
134 LayerPropertiesDialog::_setup_position_controls() {
135 if ( NULL == _layer || _desktop->currentRoot() == _layer ) {
136 // no layers yet, so option above/below/sublayer is useless
137 return;
138 }
140 _position_visible = true;
141 _dropdown_list = Gtk::ListStore::create(_dropdown_columns);
142 _layer_position_combo.set_model(_dropdown_list);
143 _layer_position_combo.pack_start(_label_renderer);
144 _layer_position_combo.set_cell_data_func(_label_renderer,
145 sigc::mem_fun(*this, &LayerPropertiesDialog::_prepareLabelRenderer));
147 _layout_table.resize (2, 2);
149 Gtk::ListStore::iterator row;
150 row = _dropdown_list->append();
151 row->set_value(_dropdown_columns.position, LPOS_ABOVE);
152 row->set_value(_dropdown_columns.name, Glib::ustring(_("Above current")));
153 _layer_position_combo.set_active(row);
154 row = _dropdown_list->append();
155 row->set_value(_dropdown_columns.position, LPOS_BELOW);
156 row->set_value(_dropdown_columns.name, Glib::ustring(_("Below current")));
157 row = _dropdown_list->append();
158 row->set_value(_dropdown_columns.position, LPOS_CHILD);
159 row->set_value(_dropdown_columns.name, Glib::ustring(_("As sublayer of current")));
161 _layout_table.attach(_layer_position_combo,
162 1, 2, 1, 2, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
163 _layer_position_label.set_label(_("Position:"));
164 _layer_position_label.set_alignment(1.0, 0.5);
165 _layout_table.attach(_layer_position_label,
166 0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
167 show_all_children();
168 }
170 /** Formats the label for a given layer row
171 */
172 void LayerPropertiesDialog::_prepareLabelRenderer(
173 Gtk::TreeModel::const_iterator const &row
174 ) {
175 Glib::ustring name=(*row)[_dropdown_columns.name];
176 _label_renderer.property_markup() = name.c_str();
177 }
179 void LayerPropertiesDialog::Rename::setup(LayerPropertiesDialog &dialog) {
180 SPDesktop *desktop=dialog._desktop;
181 dialog.set_title(_("Rename Layer"));
182 gchar const *name = desktop->currentLayer()->label();
183 dialog._layer_name_entry.set_text(( name ? name : "" ));
184 dialog._apply_button.set_label(_("_Rename"));
185 }
187 void LayerPropertiesDialog::Rename::perform(LayerPropertiesDialog &dialog) {
188 SPDesktop *desktop=dialog._desktop;
189 Glib::ustring name(dialog._layer_name_entry.get_text());
190 desktop->layer_manager->renameLayer( desktop->currentLayer(),
191 ( name.empty() ? NULL : (gchar *)name.c_str() )
192 );
193 sp_document_done(sp_desktop_document(desktop));
194 // TRANSLATORS: This means "The layer has been renamed"
195 desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Renamed layer"));
196 }
198 void LayerPropertiesDialog::Create::setup(LayerPropertiesDialog &dialog) {
199 dialog.set_title(_("Add Layer"));
200 dialog._layer_name_entry.set_text("");
201 dialog._apply_button.set_label(_("_Add"));
202 dialog._setup_position_controls();
203 }
205 void LayerPropertiesDialog::Create::perform(LayerPropertiesDialog &dialog) {
206 SPDesktop *desktop=dialog._desktop;
208 LayerRelativePosition position = LPOS_ABOVE;
210 if (dialog._position_visible) {
211 Gtk::ListStore::iterator activeRow(dialog._layer_position_combo.get_active());
212 position = activeRow->get_value(dialog._dropdown_columns.position);
213 }
215 SPObject *new_layer=Inkscape::create_layer(desktop->currentRoot(), dialog._layer, position);
217 Glib::ustring name(dialog._layer_name_entry.get_text());
218 if (!name.empty()) {
219 desktop->layer_manager->renameLayer( new_layer, (gchar *)name.c_str() );
220 }
221 sp_desktop_selection(desktop)->clear();
222 desktop->setCurrentLayer(new_layer);
223 desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("New layer created."));
224 }
226 void LayerPropertiesDialog::_setDesktop(SPDesktop *desktop) {
227 if (desktop) {
228 Inkscape::GC::anchor (desktop);
229 }
230 if (_desktop) {
231 Inkscape::GC::release (_desktop);
232 }
233 _desktop = desktop;
234 }
236 void LayerPropertiesDialog::_setLayer(SPObject *layer) {
237 if (layer) {
238 sp_object_ref(layer, NULL);
239 }
240 if (_layer) {
241 sp_object_unref(_layer, NULL);
242 }
243 _layer = layer;
244 }
246 } // namespace
247 } // namespace
248 } // namespace
251 /*
252 Local Variables:
253 mode:c++
254 c-file-style:"stroustrup"
255 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
256 indent-tabs-mode:nil
257 fill-column:99
258 End:
259 */
260 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :