Code

45ff46dc6ab37f6d759c3f46e437e4fe13df577b
[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, Inkscape::XML::Node* repr_in)
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));
74     repr = repr_in;
75 }
77 void
78 RegisteredCheckButton::setActive (bool b)
79 {
80     _button->set_active (b);
81 }
83 void
84 RegisteredCheckButton::on_toggled()
85 {
86     if (_wr->isUpdating())
87         return;
89     SPDesktop *dt = SP_ACTIVE_DESKTOP;
90     if (!dt) {
91         return;
92     }
94     SPDocument *doc = sp_desktop_document(dt);
96     //always get the obj.repr. of the current view, as the focus
97     //might have changed when multiple documents are open. Never
98     //use the old value of "repr" here 
99     repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
101     _wr->setUpdating (true);
103     bool saved = sp_document_get_undo_sensitive (doc);
104     sp_document_set_undo_sensitive (doc, false);
105     sp_repr_set_boolean(repr, _key.c_str(), _button->get_active());
106     doc->rroot->setAttribute("sodipodi:modified", "true");
107     sp_document_set_undo_sensitive (doc, saved);
108     sp_document_done (doc, SP_VERB_NONE,
109                       /* TODO: annotate */ "registered-widget.cpp:103");
111     _wr->setUpdating (false);
114 RegisteredUnitMenu::RegisteredUnitMenu()
115 : _label(0), _sel(0)
119 RegisteredUnitMenu::~RegisteredUnitMenu()
121     _changed_connection.disconnect();
122     if (_label) delete _label;
123     if (_sel) delete _sel;
126 void
127 RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in)
129     _label = new Gtk::Label (label, 1.0, 0.5);
130     _label->set_use_underline (true);
131     _sel = new UnitMenu ();
132     _label->set_mnemonic_widget (*_sel);
133     _sel->setUnitType (UNIT_TYPE_LINEAR);
134     _wr = &wr;
135     _key = key;
136     _changed_connection = _sel->signal_changed().connect (sigc::mem_fun (*this, &RegisteredUnitMenu::on_changed));
138     repr = repr_in;
141 void
142 RegisteredUnitMenu::setUnit (const SPUnit* unit)
144     _sel->setUnit (sp_unit_get_abbreviation (unit));
147 void
148 RegisteredUnitMenu::on_changed()
150     if (_wr->isUpdating())
151         return;
153     SPDesktop *dt = SP_ACTIVE_DESKTOP;
154     if (!dt)
155         return;
157     Inkscape::SVGOStringStream os;
158     os << _sel->getUnitAbbr();
160     _wr->setUpdating (true);
162     SPDocument *doc = sp_desktop_document(dt);
163     bool saved = sp_document_get_undo_sensitive (doc);
164     sp_document_set_undo_sensitive (doc, false);
165     if (!repr)
166         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
167     repr->setAttribute(_key.c_str(), os.str().c_str());
168     doc->rroot->setAttribute("sodipodi:modified", "true");
169     sp_document_set_undo_sensitive (doc, saved);
170     sp_document_done (doc, SP_VERB_NONE,
171                       /* TODO: annotate */ "registered-widget.cpp:162");
173     _wr->setUpdating (false);
177 RegisteredScalarUnit::RegisteredScalarUnit()
178 : _widget(0), _um(0)
182 RegisteredScalarUnit::~RegisteredScalarUnit()
184     if (_widget) delete _widget;
185     _value_changed_connection.disconnect();
188 void
189 RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, const RegisteredUnitMenu &rum, Registry& wr, Inkscape::XML::Node* repr_in)
191     _widget = new ScalarUnit (label, tip, UNIT_TYPE_LINEAR, "", "", rum._sel);
192     _widget->initScalar (-1e6, 1e6);
193     _widget->setUnit (rum._sel->getUnitAbbr());
194     _widget->setDigits (2);
195     _key = key;
196     _um = rum._sel;
197     _value_changed_connection = _widget->signal_value_changed().connect (sigc::mem_fun (*this, &RegisteredScalarUnit::on_value_changed));
198     _wr = &wr;
200     repr = repr_in;
203 ScalarUnit*
204 RegisteredScalarUnit::getSU()
206     return _widget;
209 void
210 RegisteredScalarUnit::setValue (double val)
212     _widget->setValue (val);
213     on_value_changed();
216 void
217 RegisteredScalarUnit::on_value_changed()
219     if (_wr->isUpdating())
220         return;
222     SPDesktop *dt = SP_ACTIVE_DESKTOP;
223     if (!dt)
224         return;
226     Inkscape::SVGOStringStream os;
227     os << _widget->getValue("");
228     if (_um)
229         os << _um->getUnitAbbr();
231     _wr->setUpdating (true);
233     SPDocument *doc = sp_desktop_document(dt);
234     bool saved = sp_document_get_undo_sensitive (doc);
235     sp_document_set_undo_sensitive (doc, false);
236     if (!repr)
237         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
238     repr->setAttribute(_key.c_str(), os.str().c_str());
239     doc->rroot->setAttribute("sodipodi:modified", "true");
240     sp_document_set_undo_sensitive (doc, saved);
241     sp_document_done (doc, SP_VERB_NONE,
242                       /* TODO: annotate */ "registered-widget.cpp:230");
244     _wr->setUpdating (false);
247 RegisteredColorPicker::RegisteredColorPicker()
248 : _label(0), _cp(0)
252 RegisteredColorPicker::~RegisteredColorPicker()
254     _changed_connection.disconnect();
255     if (_cp) delete _cp;
256     if (_label) delete _label;
259 void
260 RegisteredColorPicker::init (const Glib::ustring& label, const Glib::ustring& title, const Glib::ustring& tip, const Glib::ustring& ckey, const Glib::ustring& akey, Registry& wr, Inkscape::XML::Node* repr_in)
262     _label = new Gtk::Label (label, 1.0, 0.5);
263     _label->set_use_underline (true);
264     _cp = new ColorPicker (title,tip,0,true);
265     _label->set_mnemonic_widget (*_cp);
266     _ckey = ckey;
267     _akey = akey;
268     _wr = &wr;
269     _changed_connection = _cp->connectChanged (sigc::mem_fun (*this, &RegisteredColorPicker::on_changed));
271     repr = repr_in;
274 void
275 RegisteredColorPicker::setRgba32 (guint32 rgba)
277     _cp->setRgba32 (rgba);
280 void
281 RegisteredColorPicker::closeWindow()
283     _cp->closeWindow();
286 void
287 RegisteredColorPicker::on_changed (guint32 rgba)
289     if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
290         return;
292     _wr->setUpdating (true);
293     if (!repr)
294         repr = SP_OBJECT_REPR (sp_desktop_namedview(SP_ACTIVE_DESKTOP));
295     gchar c[32];
296     sp_svg_write_color(c, 32, rgba);
297     repr->setAttribute(_ckey.c_str(), c);
298     sp_repr_set_css_double(repr, _akey.c_str(), (rgba & 0xff) / 255.0);
299     _wr->setUpdating (false);
302 RegisteredSuffixedInteger::RegisteredSuffixedInteger()
303 : _label(0), _sb(0),
304   _adj(0.0,0.0,100.0,1.0,1.0,1.0),
305   _suffix(0)
309 RegisteredSuffixedInteger::~RegisteredSuffixedInteger()
311     _changed_connection.disconnect();
312     if (_label) delete _label;
313     if (_suffix) delete _suffix;
314     if (_sb) delete _sb;
317 void
318 RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in)
320     _key = key;
321     _label = new Gtk::Label (label);
322     _label->set_alignment (1.0, 0.5);
323     _label->set_use_underline();
324     _sb = new Gtk::SpinButton (_adj, 1.0, 0);
325     _label->set_mnemonic_widget (*_sb);
326     _suffix = new Gtk::Label (suffix);
327     _hbox.pack_start (*_sb, true, true, 0);
328     _hbox.pack_start (*_suffix, false, false, 0);
330     _changed_connection = _adj.signal_value_changed().connect (sigc::mem_fun(*this, &RegisteredSuffixedInteger::on_value_changed));
331     _wr = &wr;
333     repr = repr_in;
336 void
337 RegisteredSuffixedInteger::setValue (int i)
339     _adj.set_value (i);
342 void
343 RegisteredSuffixedInteger::on_value_changed()
345     if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
346         return;
348     _wr->setUpdating (true);
350     SPDesktop* dt = SP_ACTIVE_DESKTOP;
351     if (!repr)
352         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
353     Inkscape::SVGOStringStream os;
354     int value = int(_adj.get_value());
355     os << value;
357     repr->setAttribute(_key.c_str(), os.str().c_str());
358     sp_document_done(sp_desktop_document(dt), SP_VERB_NONE,
359                      /* TODO: annotate */ "registered-widget.cpp:341");
361     _wr->setUpdating (false);
364 RegisteredRadioButtonPair::RegisteredRadioButtonPair()
365 : _hbox(0)
369 RegisteredRadioButtonPair::~RegisteredRadioButtonPair()
371     _changed_connection.disconnect();
374 void
375 RegisteredRadioButtonPair::init (const Glib::ustring& label,
376 const Glib::ustring& label1, const Glib::ustring& label2,
377 const Glib::ustring& tip1, const Glib::ustring& tip2,
378 const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in)
380     _hbox = new Gtk::HBox;
381     _hbox->add (*manage (new Gtk::Label (label)));
382     _rb1 = manage (new Gtk::RadioButton (label1, true));
383     _hbox->add (*_rb1);
384     Gtk::RadioButtonGroup group = _rb1->get_group();
385     _rb2 = manage (new Gtk::RadioButton (group, label2, true));
386     _hbox->add (*_rb2);
387     _rb2->set_active();
388     _tt.set_tip (*_rb1, tip1);
389     _tt.set_tip (*_rb2, tip2);
390     _key = key;
391     _wr = &wr;
392     _changed_connection = _rb1->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredRadioButtonPair::on_value_changed));
394     repr = repr_in;
397 void
398 RegisteredRadioButtonPair::setValue (bool second)
400     if (second) _rb2->set_active();
401     else        _rb1->set_active();
404 void
405 RegisteredRadioButtonPair::on_value_changed()
407     if (_wr->isUpdating())
408         return;
410     SPDesktop *dt = SP_ACTIVE_DESKTOP;
411     if (!dt)
412         return;
414     _wr->setUpdating (true);
416     bool second = _rb2->get_active();
417     SPDocument *doc = sp_desktop_document(dt);
418     bool saved = sp_document_get_undo_sensitive (doc);
419     sp_document_set_undo_sensitive (doc, false);
420     if (!repr)
421         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
422     repr->setAttribute(_key.c_str(), second ? "true" : "false");
423     doc->rroot->setAttribute("sodipodi:modified", "true");
424     sp_document_set_undo_sensitive (doc, saved);
425     sp_document_done (doc, SP_VERB_NONE,
426                       /* TODO: annotate */ "registered-widget.cpp:405");
428     _wr->setUpdating (false);
431 } // namespace Dialog
432 } // namespace UI
433 } // namespace Inkscape
435 /*
436   Local Variables:
437   mode:c++
438   c-file-style:"stroustrup"
439   c-file-offsets:((innamespace . 0)(inline-open . 0))
440   indent-tabs-mode:nil
441   fill-column:99
442   End:
443 */
444 // vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :