1 /** @file
2 * @brief Dialog for renaming layers
3 */
4 /* Author:
5 * Bryce W. Harrington <bryce@bryceharrington.com>
6 * Andrius R. <knutux@gmail.com>
7 * Abhishek Sharma
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 #include <gtkmm/stock.h>
16 #include <glibmm/i18n.h>
17 #include "inkscape.h"
18 #include "desktop.h"
19 #include "document.h"
20 #include "layer-manager.h"
21 #include "message-stack.h"
22 #include "desktop-handles.h"
23 #include "sp-object.h"
24 #include "sp-item.h"
26 #include "layer-properties.h"
28 namespace Inkscape {
29 namespace UI {
30 namespace Dialogs {
32 LayerPropertiesDialog::LayerPropertiesDialog()
33 : _strategy(NULL), _desktop(NULL), _layer(NULL), _position_visible(false)
34 {
35 Gtk::VBox *mainVBox = get_vbox();
37 _layout_table.set_spacings(4);
38 _layout_table.resize (1, 2);
40 // Layer name widgets
41 _layer_name_entry.set_activates_default(true);
42 _layer_name_label.set_label(_("Layer name:"));
43 _layer_name_label.set_alignment(1.0, 0.5);
45 _layout_table.attach(_layer_name_label,
46 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
47 _layout_table.attach(_layer_name_entry,
48 1, 2, 0, 1, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
49 mainVBox->pack_start(_layout_table, false, false, 4);
51 // Buttons
52 _close_button.set_use_stock(true);
53 _close_button.set_label(Gtk::Stock::CANCEL.id);
54 _close_button.set_flags(Gtk::CAN_DEFAULT);
56 _apply_button.set_use_underline(true);
57 _apply_button.set_flags(Gtk::CAN_DEFAULT);
59 _close_button.signal_clicked()
60 .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_close));
61 _apply_button.signal_clicked()
62 .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_apply));
64 signal_delete_event().connect(
65 sigc::bind_return(
66 sigc::hide(sigc::mem_fun(*this, &LayerPropertiesDialog::_close)),
67 true
68 )
69 );
71 add_action_widget(_close_button, Gtk::RESPONSE_CLOSE);
72 add_action_widget(_apply_button, Gtk::RESPONSE_APPLY);
74 _apply_button.grab_default();
76 show_all_children();
77 }
79 LayerPropertiesDialog::~LayerPropertiesDialog() {
80 _setDesktop(NULL);
81 _setLayer(NULL);
82 }
84 void LayerPropertiesDialog::_showDialog(LayerPropertiesDialog::Strategy &strategy,
85 SPDesktop *desktop, SPObject *layer)
86 {
87 LayerPropertiesDialog *dialog = new LayerPropertiesDialog();
89 dialog->_strategy = &strategy;
90 dialog->_setDesktop(desktop);
91 dialog->_setLayer(layer);
93 dialog->_strategy->setup(*dialog);
95 dialog->set_modal(true);
96 desktop->setWindowTransient (dialog->gobj());
97 dialog->property_destroy_with_parent() = true;
99 dialog->show();
100 dialog->present();
101 }
103 void
104 LayerPropertiesDialog::_apply()
105 {
106 g_assert(_strategy != NULL);
108 _strategy->perform(*this);
109 DocumentUndo::done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_NONE,
110 _("Add layer"));
112 _close();
113 }
115 void
116 LayerPropertiesDialog::_close()
117 {
118 _setLayer(NULL);
119 _setDesktop(NULL);
120 destroy_();
121 Glib::signal_idle().connect(
122 sigc::bind_return(
123 sigc::bind(sigc::ptr_fun(&::operator delete), this),
124 false
125 )
126 );
127 }
129 void
130 LayerPropertiesDialog::_setup_position_controls() {
131 if ( NULL == _layer || _desktop->currentRoot() == _layer ) {
132 // no layers yet, so option above/below/sublayer is useless
133 return;
134 }
136 _position_visible = true;
137 _dropdown_list = Gtk::ListStore::create(_dropdown_columns);
138 _layer_position_combo.set_model(_dropdown_list);
139 _layer_position_combo.pack_start(_label_renderer);
140 _layer_position_combo.set_cell_data_func(_label_renderer,
141 sigc::mem_fun(*this, &LayerPropertiesDialog::_prepareLabelRenderer));
143 _layout_table.resize (2, 2);
145 Gtk::ListStore::iterator row;
146 row = _dropdown_list->append();
147 row->set_value(_dropdown_columns.position, LPOS_ABOVE);
148 row->set_value(_dropdown_columns.name, Glib::ustring(_("Above current")));
149 _layer_position_combo.set_active(row);
150 row = _dropdown_list->append();
151 row->set_value(_dropdown_columns.position, LPOS_BELOW);
152 row->set_value(_dropdown_columns.name, Glib::ustring(_("Below current")));
153 row = _dropdown_list->append();
154 row->set_value(_dropdown_columns.position, LPOS_CHILD);
155 row->set_value(_dropdown_columns.name, Glib::ustring(_("As sublayer of current")));
157 _layout_table.attach(_layer_position_combo,
158 1, 2, 1, 2, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
159 _layer_position_label.set_label(_("Position:"));
160 _layer_position_label.set_alignment(1.0, 0.5);
161 _layout_table.attach(_layer_position_label,
162 0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
163 show_all_children();
164 }
166 /** Formats the label for a given layer row
167 */
168 void LayerPropertiesDialog::_prepareLabelRenderer(
169 Gtk::TreeModel::const_iterator const &row
170 ) {
171 Glib::ustring name=(*row)[_dropdown_columns.name];
172 _label_renderer.property_markup() = name.c_str();
173 }
175 void LayerPropertiesDialog::Rename::setup(LayerPropertiesDialog &dialog) {
176 SPDesktop *desktop=dialog._desktop;
177 dialog.set_title(_("Rename Layer"));
178 gchar const *name = desktop->currentLayer()->label();
179 dialog._layer_name_entry.set_text(( name ? name : _("Layer") ));
180 dialog._apply_button.set_label(_("_Rename"));
181 }
183 void LayerPropertiesDialog::Rename::perform(LayerPropertiesDialog &dialog) {
184 SPDesktop *desktop=dialog._desktop;
185 Glib::ustring name(dialog._layer_name_entry.get_text());
186 if (name.empty())
187 return;
188 desktop->layer_manager->renameLayer( desktop->currentLayer(),
189 (gchar *)name.c_str(),
190 FALSE
191 );
192 DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_NONE,
193 _("Rename layer"));
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 //TODO: find an unused layer number, forming name from _("Layer ") + "%d"
201 dialog._layer_name_entry.set_text(_("Layer"));
202 dialog._apply_button.set_label(_("_Add"));
203 dialog._setup_position_controls();
204 }
206 void LayerPropertiesDialog::Create::perform(LayerPropertiesDialog &dialog) {
207 SPDesktop *desktop=dialog._desktop;
209 LayerRelativePosition position = LPOS_ABOVE;
211 if (dialog._position_visible) {
212 Gtk::ListStore::iterator activeRow(dialog._layer_position_combo.get_active());
213 position = activeRow->get_value(dialog._dropdown_columns.position);
214 }
215 Glib::ustring name(dialog._layer_name_entry.get_text());
216 if (name.empty())
217 return;
219 SPObject *new_layer=Inkscape::create_layer(desktop->currentRoot(), dialog._layer, position);
221 if (!name.empty()) {
222 desktop->layer_manager->renameLayer( new_layer, (gchar *)name.c_str(), TRUE );
223 }
224 sp_desktop_selection(desktop)->clear();
225 desktop->setCurrentLayer(new_layer);
226 desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("New layer created."));
227 }
229 void LayerPropertiesDialog::_setDesktop(SPDesktop *desktop) {
230 if (desktop) {
231 Inkscape::GC::anchor (desktop);
232 }
233 if (_desktop) {
234 Inkscape::GC::release (_desktop);
235 }
236 _desktop = desktop;
237 }
239 void LayerPropertiesDialog::_setLayer(SPObject *layer) {
240 if (layer) {
241 sp_object_ref(layer, NULL);
242 }
243 if (_layer) {
244 sp_object_unref(_layer, NULL);
245 }
246 _layer = layer;
247 }
249 } // namespace
250 } // namespace
251 } // namespace
254 /*
255 Local Variables:
256 mode:c++
257 c-file-style:"stroustrup"
258 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
259 indent-tabs-mode:nil
260 fill-column:99
261 End:
262 */
263 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :