Code

6a88597bed50b8e06e7aa54ccf3c30b85fa53e60
[inkscape.git] / src / dialogs / layer-properties.cpp
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     Gtk::VBox *mainVBox = get_vbox();
41     _layout_table.set_spacings(4);
42     _layout_table.resize (1, 2);
44     // Layer name widgets
45     _layer_name_entry.set_activates_default(true);
46     _layer_name_label.set_label(_("Layer name:"));
47     _layer_name_label.set_alignment(1.0, 0.5);
49     _layout_table.attach(_layer_name_label,
50                          0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
51     _layout_table.attach(_layer_name_entry,
52                          1, 2, 0, 1, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
53     mainVBox->pack_start(_layout_table, false, false, 4);
55     // Buttons
56     _close_button.set_use_stock(true);
57     _close_button.set_label(Gtk::Stock::CANCEL.id);
58     _close_button.set_flags(Gtk::CAN_DEFAULT);
60     _apply_button.set_use_underline(true);
61     _apply_button.set_flags(Gtk::CAN_DEFAULT);
63     _close_button.signal_clicked()
64         .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_close));
65     _apply_button.signal_clicked()
66         .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_apply));
68     signal_delete_event().connect(
69         sigc::bind_return(
70             sigc::hide(sigc::mem_fun(*this, &LayerPropertiesDialog::_close)),
71             true
72         )
73     );
75     add_action_widget(_close_button, Gtk::RESPONSE_CLOSE);
76     add_action_widget(_apply_button, Gtk::RESPONSE_APPLY);
78     _apply_button.grab_default();
80     show_all_children();
81 }
83 LayerPropertiesDialog::~LayerPropertiesDialog() {
84     _setDesktop(NULL);
85     _setLayer(NULL);
86 }
88 void LayerPropertiesDialog::_showDialog(LayerPropertiesDialog::Strategy &strategy,
89                                         SPDesktop *desktop, SPObject *layer)
90 {
91     LayerPropertiesDialog *dialog = new LayerPropertiesDialog();
93     dialog->_strategy = &strategy;
94     dialog->_setDesktop(desktop);
95     dialog->_setLayer(layer);
97     dialog->_strategy->setup(*dialog);
99     dialog->set_modal(true);
100     desktop->setWindowTransient (dialog->gobj());
101     dialog->property_destroy_with_parent() = true;
103     dialog->show();
104     dialog->present();
107 void
108 LayerPropertiesDialog::_apply()
110     g_assert(_strategy != NULL);
112     _strategy->perform(*this);
113     sp_document_done(sp_desktop_document(SP_ACTIVE_DESKTOP));
115     _close();
118 void
119 LayerPropertiesDialog::_close()
121     _setLayer(NULL);
122     _setDesktop(NULL);
123     destroy_();
124     Glib::signal_idle().connect(
125         sigc::bind_return(
126             sigc::bind(sigc::ptr_fun(&::operator delete), this),
127             false 
128         )
129     );
132 void
133 LayerPropertiesDialog::_setup_position_controls() {
134     if ( NULL == _layer || _desktop->currentRoot() == _layer ) {
135         // no layers yet, so option above/below/sublayer is useless
136         return;
137     }
139     _position_visible = true;
140     _dropdown_list = Gtk::ListStore::create(_dropdown_columns);
141     _layer_position_combo.set_model(_dropdown_list);
142     _layer_position_combo.pack_start(_label_renderer);
143     _layer_position_combo.set_cell_data_func(_label_renderer,
144                                              sigc::mem_fun(*this, &LayerPropertiesDialog::_prepareLabelRenderer));
146     _layout_table.resize (2, 2);
148     Gtk::ListStore::iterator row;
149     row = _dropdown_list->append();
150     row->set_value(_dropdown_columns.position, LPOS_ABOVE);
151     row->set_value(_dropdown_columns.name, Glib::ustring(_("Above current")));
152     _layer_position_combo.set_active(row);
153     row = _dropdown_list->append();
154     row->set_value(_dropdown_columns.position, LPOS_BELOW);
155     row->set_value(_dropdown_columns.name, Glib::ustring(_("Below current")));
156     row = _dropdown_list->append();
157     row->set_value(_dropdown_columns.position, LPOS_CHILD);
158     row->set_value(_dropdown_columns.name, Glib::ustring(_("As sublayer of current")));
160     _layout_table.attach(_layer_position_combo,
161                          1, 2, 1, 2, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
162     _layer_position_label.set_label(_("Position:"));
163     _layer_position_label.set_alignment(1.0, 0.5);
164     _layout_table.attach(_layer_position_label,
165                          0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
166     show_all_children();
169 /** Formats the label for a given layer row 
170  */
171 void LayerPropertiesDialog::_prepareLabelRenderer(
172     Gtk::TreeModel::const_iterator const &row
173 ) {
174     Glib::ustring name=(*row)[_dropdown_columns.name];
175     _label_renderer.property_markup() = name.c_str();
178 void LayerPropertiesDialog::Rename::setup(LayerPropertiesDialog &dialog) {
179     SPDesktop *desktop=dialog._desktop;
180     dialog.set_title(_("Rename Layer"));
181     gchar const *name = desktop->currentLayer()->label();
182     dialog._layer_name_entry.set_text(( name ? name : "" ));
183     dialog._apply_button.set_label(_("_Rename"));
186 void LayerPropertiesDialog::Rename::perform(LayerPropertiesDialog &dialog) {
187     SPDesktop *desktop=dialog._desktop;
188     Glib::ustring name(dialog._layer_name_entry.get_text());
189     desktop->currentLayer()->setLabel(
190         ( name.empty() ? NULL : (gchar *)name.c_str() )
191     );
192     sp_document_done(sp_desktop_document(desktop));
193     // TRANSLATORS: This means "The layer has been renamed"
194     desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Renamed layer"));
197 void LayerPropertiesDialog::Create::setup(LayerPropertiesDialog &dialog) {
198     dialog.set_title(_("Add Layer"));
199     dialog._layer_name_entry.set_text("");
200     dialog._apply_button.set_label(_("_Add"));
201     dialog._setup_position_controls();
204 void LayerPropertiesDialog::Create::perform(LayerPropertiesDialog &dialog) {
205     SPDesktop *desktop=dialog._desktop;
207     LayerRelativePosition position = LPOS_ABOVE;
208     
209     if (dialog._position_visible) {
210         Gtk::ListStore::iterator activeRow(dialog._layer_position_combo.get_active());
211         position = activeRow->get_value(dialog._dropdown_columns.position);
212     }
214     SPObject *new_layer=Inkscape::create_layer(desktop->currentRoot(), dialog._layer, position);
215     
216     Glib::ustring name(dialog._layer_name_entry.get_text());
217     if (!name.empty()) {
218         new_layer->setLabel((gchar *)name.c_str());
219     }
220     sp_desktop_selection(desktop)->clear();
221     desktop->setCurrentLayer(new_layer);
222     desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("New layer created."));
225 void LayerPropertiesDialog::_setDesktop(SPDesktop *desktop) {
226     if (desktop) {
227         Inkscape::GC::anchor (desktop);
228     }
229     if (_desktop) {
230         Inkscape::GC::release (_desktop);
231     }
232     _desktop = desktop;
235 void LayerPropertiesDialog::_setLayer(SPObject *layer) {
236     if (layer) {
237         sp_object_ref(layer, NULL);
238     }
239     if (_layer) {
240         sp_object_unref(_layer, NULL);
241     }
242     _layer = layer;
245 } // namespace
246 } // namespace
247 } // namespace
250 /*
251   Local Variables:
252   mode:c++
253   c-file-style:"stroustrup"
254   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
255   indent-tabs-mode:nil
256   fill-column:99
257   End:
258 */
259 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :