Code

1f688fc38c96d2d75a253a79733b61cfaf19a015
[inkscape.git] / src / ui / widget / registered-widget.cpp
1 /** \file
2  *
3  *
4  * Authors:
5  *   bulia byak <buliabyak@users.sf.net>
6  *   Bryce W. Harrington <bryce@bryceharrington.org>
7  *   Lauris Kaplinski <lauris@kaplinski.com>
8  *   Jon Phillips <jon@rejon.org>
9  *   Ralf Stephan <ralf@ark.in-berlin.de> (Gtkmm)
10  *
11  * Copyright (C) 2000 - 2005 Authors
12  *
13  * Released under GNU GPL.  Read the file 'COPYING' for more information
14  */
16 #ifdef HAVE_CONFIG_H
17 # include <config.h>
18 #endif
21 #include "ui/widget/color-picker.h"
22 #include "ui/widget/registry.h"
23 #include "ui/widget/scalar-unit.h"
25 #include "helper/units.h"
26 #include "xml/repr.h"
27 #include "svg/svg-color.h"
28 #include "svg/stringstream.h"
30 #include "inkscape.h"
31 #include "document.h"
32 #include "desktop-handles.h"
33 #include "sp-namedview.h"
35 #include "registered-widget.h"
36 #include "verbs.h"
38 namespace Inkscape {
39 namespace UI {
40 namespace Widget {
42 //===================================================
44 //---------------------------------------------------
48 //====================================================
50 RegisteredCheckButton::RegisteredCheckButton()
51 : _button(0)
52 {
53 }
55 RegisteredCheckButton::~RegisteredCheckButton()
56 {
57     _toggled_connection.disconnect();
58     if (_button) delete _button;
59 }
61 void
62 RegisteredCheckButton::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, Registry& wr, bool right)
63 {
64     _button = new Gtk::CheckButton;
65     _tt.set_tip (*_button, tip);
66     Gtk::Label *l = new Gtk::Label (label);
67     l->set_use_underline (true);
68     _button->add (*manage (l));
69     _button->set_alignment (right? 1.0 : 0.0, 0.5);
70     _key = key;
71     _wr = &wr;
72     _toggled_connection = _button->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredCheckButton::on_toggled));
73 }
75 void
76 RegisteredCheckButton::setActive (bool b)
77 {
78     _button->set_active (b);
79 }
81 void
82 RegisteredCheckButton::on_toggled()
83 {
84     if (_wr->isUpdating())
85         return;
87     SPDesktop *dt = SP_ACTIVE_DESKTOP;
88     if (!dt) {
89         return;
90     }
92     SPDocument *doc = sp_desktop_document(dt);
94     Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
95     _wr->setUpdating (true);
97     bool saved = sp_document_get_undo_sensitive (doc);
98     sp_document_set_undo_sensitive (doc, FALSE);
99     sp_repr_set_boolean(repr, _key.c_str(), _button->get_active());
100     doc->rroot->setAttribute("sodipodi:modified", "true");
101     sp_document_set_undo_sensitive (doc, saved);
102     sp_document_done (doc, SP_VERB_NONE,
103                       /* TODO: annotate */ "registered-widget.cpp:103");
104     
105     _wr->setUpdating (false);
108 RegisteredUnitMenu::RegisteredUnitMenu()
109 : _label(0), _sel(0)
113 RegisteredUnitMenu::~RegisteredUnitMenu()
115     _changed_connection.disconnect();
116     if (_label) delete _label;
117     if (_sel) delete _sel;
120 void
121 RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr)
123     _label = new Gtk::Label (label, 1.0, 0.5);
124     _label->set_use_underline (true);
125     _sel = new UnitMenu ();
126     _label->set_mnemonic_widget (*_sel);
127     _sel->setUnitType (UNIT_TYPE_LINEAR);
128     _wr = &wr;
129     _key = key;
130     _changed_connection = _sel->signal_changed().connect (sigc::mem_fun (*this, &RegisteredUnitMenu::on_changed));
133 void 
134 RegisteredUnitMenu::setUnit (const SPUnit* unit)
136     _sel->setUnit (sp_unit_get_abbreviation (unit));
139 void
140 RegisteredUnitMenu::on_changed()
142     if (_wr->isUpdating())
143         return;
145     SPDesktop *dt = SP_ACTIVE_DESKTOP;
146     if (!dt) 
147         return;
149     Inkscape::SVGOStringStream os;
150     os << _sel->getUnitAbbr();
152     _wr->setUpdating (true);
154     SPDocument *doc = sp_desktop_document(dt);
155     bool saved = sp_document_get_undo_sensitive (doc);
156     sp_document_set_undo_sensitive (doc, FALSE);
157     Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
158     repr->setAttribute(_key.c_str(), os.str().c_str());
159     doc->rroot->setAttribute("sodipodi:modified", "true");
160     sp_document_set_undo_sensitive (doc, saved);
161     sp_document_done (doc, SP_VERB_NONE, 
162                       /* TODO: annotate */ "registered-widget.cpp:162");
163     
164     _wr->setUpdating (false);
168 RegisteredScalarUnit::RegisteredScalarUnit()
169 : _widget(0), _um(0)
173 RegisteredScalarUnit::~RegisteredScalarUnit()
175     if (_widget) delete _widget;
176     _value_changed_connection.disconnect();
179 void
180 RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, const RegisteredUnitMenu &rum, Registry& wr)
182     _widget = new ScalarUnit (label, tip, UNIT_TYPE_LINEAR, "", "", rum._sel);
183     _widget->initScalar (-1e6, 1e6);
184     _widget->setUnit (rum._sel->getUnitAbbr());
185     _widget->setDigits (2);
186     _key = key;
187     _um = rum._sel;
188     _value_changed_connection = _widget->signal_value_changed().connect (sigc::mem_fun (*this, &RegisteredScalarUnit::on_value_changed));
189     _wr = &wr;
192 ScalarUnit*
193 RegisteredScalarUnit::getSU()
195     return _widget;
198 void 
199 RegisteredScalarUnit::setValue (double val)
201     _widget->setValue (val);
202     on_value_changed();
205 void
206 RegisteredScalarUnit::on_value_changed()
208     if (_wr->isUpdating())
209         return;
211     SPDesktop *dt = SP_ACTIVE_DESKTOP;
212     if (!dt) 
213         return;
215     Inkscape::SVGOStringStream os;
216     os << _widget->getValue("");
217     if (_um)
218         os << _um->getUnitAbbr();
220     _wr->setUpdating (true);
222     SPDocument *doc = sp_desktop_document(dt);
223     bool saved = sp_document_get_undo_sensitive (doc);
224     sp_document_set_undo_sensitive (doc, FALSE);
225     Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
226     repr->setAttribute(_key.c_str(), os.str().c_str());
227     doc->rroot->setAttribute("sodipodi:modified", "true");
228     sp_document_set_undo_sensitive (doc, saved);
229     sp_document_done (doc, SP_VERB_NONE, 
230                       /* TODO: annotate */ "registered-widget.cpp:230");
231     
232     _wr->setUpdating (false);
235 RegisteredColorPicker::RegisteredColorPicker()
236 : _label(0), _cp(0)
240 RegisteredColorPicker::~RegisteredColorPicker()
242     _changed_connection.disconnect();
243     if (_cp) delete _cp;
244     if (_label) delete _label;
247 void
248 RegisteredColorPicker::init (const Glib::ustring& label, const Glib::ustring& title, const Glib::ustring& tip, const Glib::ustring& ckey, const Glib::ustring& akey, Registry& wr)
250     _label = new Gtk::Label (label, 1.0, 0.5);
251     _label->set_use_underline (true);
252     _cp = new ColorPicker (title,tip,0,true);
253     _label->set_mnemonic_widget (*_cp);
254     _ckey = ckey;
255     _akey = akey;
256     _wr = &wr;
257     _changed_connection = _cp->connectChanged (sigc::mem_fun (*this, &RegisteredColorPicker::on_changed));
260 void 
261 RegisteredColorPicker::setRgba32 (guint32 rgba)
263     _cp->setRgba32 (rgba);
266 void
267 RegisteredColorPicker::closeWindow()
269     _cp->closeWindow();
272 void
273 RegisteredColorPicker::on_changed (guint32 rgba)
275     if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
276         return;
278     _wr->setUpdating (true);
279     Inkscape::XML::Node *repr = SP_OBJECT_REPR(sp_desktop_namedview(SP_ACTIVE_DESKTOP));
280     gchar c[32];
281     sp_svg_write_color(c, 32, rgba);
282     repr->setAttribute(_ckey.c_str(), c);
283     sp_repr_set_css_double(repr, _akey.c_str(), (rgba & 0xff) / 255.0);
284     _wr->setUpdating (false);
287 RegisteredSuffixedInteger::RegisteredSuffixedInteger()
288 : _label(0), _sb(0),
289   _adj(0.0,0.0,100.0,1.0,1.0,1.0), 
290   _suffix(0)
294 RegisteredSuffixedInteger::~RegisteredSuffixedInteger()
296     _changed_connection.disconnect();
297     if (_label) delete _label;
298     if (_suffix) delete _suffix;
299     if (_sb) delete _sb;
302 void
303 RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr)
305     _key = key;
306     _label = new Gtk::Label (label);
307     _label->set_alignment (1.0, 0.5);
308     _label->set_use_underline();
309     _sb = new Gtk::SpinButton (_adj, 1.0, 0);
310     _label->set_mnemonic_widget (*_sb);
311     _suffix = new Gtk::Label (suffix);
312     _hbox.pack_start (*_sb, true, true, 0);
313     _hbox.pack_start (*_suffix, false, false, 0);
315     _changed_connection = _adj.signal_value_changed().connect (sigc::mem_fun(*this, &RegisteredSuffixedInteger::on_value_changed));
316     _wr = &wr;
319 void 
320 RegisteredSuffixedInteger::setValue (int i)
322     _adj.set_value (i);
325 void
326 RegisteredSuffixedInteger::on_value_changed()
328     if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
329         return;
331     _wr->setUpdating (true);
332     
333     SPDesktop* dt = SP_ACTIVE_DESKTOP;
334     Inkscape::XML::Node *repr = SP_OBJECT_REPR(sp_desktop_namedview(dt));
335     Inkscape::SVGOStringStream os;
336     int value = int(_adj.get_value());
337     os << value;
339     repr->setAttribute(_key.c_str(), os.str().c_str());
340     sp_document_done(sp_desktop_document(dt), SP_VERB_NONE, 
341                      /* TODO: annotate */ "registered-widget.cpp:341");
342     
343     _wr->setUpdating (false);
346 RegisteredRadioButtonPair::RegisteredRadioButtonPair()
347 : _hbox(0)
351 RegisteredRadioButtonPair::~RegisteredRadioButtonPair()
353     _changed_connection.disconnect();
356 void
357 RegisteredRadioButtonPair::init (const Glib::ustring& label, 
358 const Glib::ustring& label1, const Glib::ustring& label2, 
359 const Glib::ustring& tip1, const Glib::ustring& tip2, 
360 const Glib::ustring& key, Registry& wr)
362     _hbox = new Gtk::HBox;
363     _hbox->add (*manage (new Gtk::Label (label)));
364     _rb1 = manage (new Gtk::RadioButton (label1, true));
365     _hbox->add (*_rb1);
366     Gtk::RadioButtonGroup group = _rb1->get_group();
367     _rb2 = manage (new Gtk::RadioButton (group, label2, true));
368     _hbox->add (*_rb2);
369     _rb2->set_active();
370     _tt.set_tip (*_rb1, tip1);
371     _tt.set_tip (*_rb2, tip2);
372     _key = key;
373     _wr = &wr;
374     _changed_connection = _rb1->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredRadioButtonPair::on_value_changed));
377 void 
378 RegisteredRadioButtonPair::setValue (bool second)
380     if (second) _rb2->set_active();
381     else        _rb1->set_active();
384 void
385 RegisteredRadioButtonPair::on_value_changed()
387     if (_wr->isUpdating())
388         return;
390     SPDesktop *dt = SP_ACTIVE_DESKTOP;
391     if (!dt) 
392         return;
394     _wr->setUpdating (true);
395     
396     bool second = _rb2->get_active();
397     SPDocument *doc = sp_desktop_document(dt);
398     bool saved = sp_document_get_undo_sensitive (doc);
399     sp_document_set_undo_sensitive (doc, FALSE);
400     Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
401     repr->setAttribute(_key.c_str(), second ? "true" : "false");
402     doc->rroot->setAttribute("sodipodi:modified", "true");
403     sp_document_set_undo_sensitive (doc, saved);
404     sp_document_done (doc, SP_VERB_NONE, 
405                       /* TODO: annotate */ "registered-widget.cpp:405");
406     
407     _wr->setUpdating (false);
410 } // namespace Dialog
411 } // namespace UI
412 } // namespace Inkscape
414 /*
415   Local Variables:
416   mode:c++
417   c-file-style:"stroustrup"
418   c-file-offsets:((innamespace . 0)(inline-open . 0))
419   indent-tabs-mode:nil
420   fill-column:99
421   End:
422 */
423 // vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :