Code

Merge and cleanup of GSoC C++-ification project.
[inkscape.git] / src / ui / dialog / layer-properties.cpp
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();
103 void
104 LayerPropertiesDialog::_apply()
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();
115 void
116 LayerPropertiesDialog::_close()
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     );
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();
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();
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"));
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"));
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();
206 void LayerPropertiesDialog::Create::perform(LayerPropertiesDialog &dialog) {
207     SPDesktop *desktop=dialog._desktop;
209     LayerRelativePosition position = LPOS_ABOVE;
210     
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);
220     
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."));
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;
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;
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 :