Code

Monster commit. New grid infrastructure. The old gridmanagement code is still there...
[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     if (!repr)
97         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
99     _wr->setUpdating (true);
101     bool saved = sp_document_get_undo_sensitive (doc);
102     sp_document_set_undo_sensitive (doc, false);
103     sp_repr_set_boolean(repr, _key.c_str(), _button->get_active());
104     doc->rroot->setAttribute("sodipodi:modified", "true");
105     sp_document_set_undo_sensitive (doc, saved);
106     sp_document_done (doc, SP_VERB_NONE,
107                       /* TODO: annotate */ "registered-widget.cpp:103");
109     _wr->setUpdating (false);
112 RegisteredUnitMenu::RegisteredUnitMenu()
113 : _label(0), _sel(0)
117 RegisteredUnitMenu::~RegisteredUnitMenu()
119     _changed_connection.disconnect();
120     if (_label) delete _label;
121     if (_sel) delete _sel;
124 void
125 RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in)
127     _label = new Gtk::Label (label, 1.0, 0.5);
128     _label->set_use_underline (true);
129     _sel = new UnitMenu ();
130     _label->set_mnemonic_widget (*_sel);
131     _sel->setUnitType (UNIT_TYPE_LINEAR);
132     _wr = &wr;
133     _key = key;
134     _changed_connection = _sel->signal_changed().connect (sigc::mem_fun (*this, &RegisteredUnitMenu::on_changed));
136     repr = repr_in;
139 void
140 RegisteredUnitMenu::setUnit (const SPUnit* unit)
142     _sel->setUnit (sp_unit_get_abbreviation (unit));
145 void
146 RegisteredUnitMenu::on_changed()
148     if (_wr->isUpdating())
149         return;
151     SPDesktop *dt = SP_ACTIVE_DESKTOP;
152     if (!dt)
153         return;
155     Inkscape::SVGOStringStream os;
156     os << _sel->getUnitAbbr();
158     _wr->setUpdating (true);
160     SPDocument *doc = sp_desktop_document(dt);
161     bool saved = sp_document_get_undo_sensitive (doc);
162     sp_document_set_undo_sensitive (doc, false);
163     if (!repr)
164         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
165     repr->setAttribute(_key.c_str(), os.str().c_str());
166     doc->rroot->setAttribute("sodipodi:modified", "true");
167     sp_document_set_undo_sensitive (doc, saved);
168     sp_document_done (doc, SP_VERB_NONE,
169                       /* TODO: annotate */ "registered-widget.cpp:162");
171     _wr->setUpdating (false);
175 RegisteredScalarUnit::RegisteredScalarUnit()
176 : _widget(0), _um(0)
180 RegisteredScalarUnit::~RegisteredScalarUnit()
182     if (_widget) delete _widget;
183     _value_changed_connection.disconnect();
186 void
187 RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, const RegisteredUnitMenu &rum, Registry& wr, Inkscape::XML::Node* repr_in)
189     _widget = new ScalarUnit (label, tip, UNIT_TYPE_LINEAR, "", "", rum._sel);
190     _widget->initScalar (-1e6, 1e6);
191     _widget->setUnit (rum._sel->getUnitAbbr());
192     _widget->setDigits (2);
193     _key = key;
194     _um = rum._sel;
195     _value_changed_connection = _widget->signal_value_changed().connect (sigc::mem_fun (*this, &RegisteredScalarUnit::on_value_changed));
196     _wr = &wr;
198     repr = repr_in;
201 ScalarUnit*
202 RegisteredScalarUnit::getSU()
204     return _widget;
207 void
208 RegisteredScalarUnit::setValue (double val)
210     _widget->setValue (val);
211     on_value_changed();
214 void
215 RegisteredScalarUnit::on_value_changed()
217     if (_wr->isUpdating())
218         return;
220     SPDesktop *dt = SP_ACTIVE_DESKTOP;
221     if (!dt)
222         return;
224     Inkscape::SVGOStringStream os;
225     os << _widget->getValue("");
226     if (_um)
227         os << _um->getUnitAbbr();
229     _wr->setUpdating (true);
231     SPDocument *doc = sp_desktop_document(dt);
232     bool saved = sp_document_get_undo_sensitive (doc);
233     sp_document_set_undo_sensitive (doc, false);
234     if (!repr)
235         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
236     repr->setAttribute(_key.c_str(), os.str().c_str());
237     doc->rroot->setAttribute("sodipodi:modified", "true");
238     sp_document_set_undo_sensitive (doc, saved);
239     sp_document_done (doc, SP_VERB_NONE,
240                       /* TODO: annotate */ "registered-widget.cpp:230");
242     _wr->setUpdating (false);
245 RegisteredColorPicker::RegisteredColorPicker()
246 : _label(0), _cp(0)
250 RegisteredColorPicker::~RegisteredColorPicker()
252     _changed_connection.disconnect();
253     if (_cp) delete _cp;
254     if (_label) delete _label;
257 void
258 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)
260     _label = new Gtk::Label (label, 1.0, 0.5);
261     _label->set_use_underline (true);
262     _cp = new ColorPicker (title,tip,0,true);
263     _label->set_mnemonic_widget (*_cp);
264     _ckey = ckey;
265     _akey = akey;
266     _wr = &wr;
267     _changed_connection = _cp->connectChanged (sigc::mem_fun (*this, &RegisteredColorPicker::on_changed));
269     repr = repr_in;
272 void
273 RegisteredColorPicker::setRgba32 (guint32 rgba)
275     _cp->setRgba32 (rgba);
278 void
279 RegisteredColorPicker::closeWindow()
281     _cp->closeWindow();
284 void
285 RegisteredColorPicker::on_changed (guint32 rgba)
287     if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
288         return;
290     _wr->setUpdating (true);
291     if (!repr)
292         repr = SP_OBJECT_REPR (sp_desktop_namedview(SP_ACTIVE_DESKTOP));
293     gchar c[32];
294     sp_svg_write_color(c, 32, rgba);
295     repr->setAttribute(_ckey.c_str(), c);
296     sp_repr_set_css_double(repr, _akey.c_str(), (rgba & 0xff) / 255.0);
297     _wr->setUpdating (false);
300 RegisteredSuffixedInteger::RegisteredSuffixedInteger()
301 : _label(0), _sb(0),
302   _adj(0.0,0.0,100.0,1.0,1.0,1.0),
303   _suffix(0)
307 RegisteredSuffixedInteger::~RegisteredSuffixedInteger()
309     _changed_connection.disconnect();
310     if (_label) delete _label;
311     if (_suffix) delete _suffix;
312     if (_sb) delete _sb;
315 void
316 RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in)
318     _key = key;
319     _label = new Gtk::Label (label);
320     _label->set_alignment (1.0, 0.5);
321     _label->set_use_underline();
322     _sb = new Gtk::SpinButton (_adj, 1.0, 0);
323     _label->set_mnemonic_widget (*_sb);
324     _suffix = new Gtk::Label (suffix);
325     _hbox.pack_start (*_sb, true, true, 0);
326     _hbox.pack_start (*_suffix, false, false, 0);
328     _changed_connection = _adj.signal_value_changed().connect (sigc::mem_fun(*this, &RegisteredSuffixedInteger::on_value_changed));
329     _wr = &wr;
331     repr = repr_in;
334 void
335 RegisteredSuffixedInteger::setValue (int i)
337     _adj.set_value (i);
340 void
341 RegisteredSuffixedInteger::on_value_changed()
343     if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
344         return;
346     _wr->setUpdating (true);
348     SPDesktop* dt = SP_ACTIVE_DESKTOP;
349     if (!repr)
350         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
351     Inkscape::SVGOStringStream os;
352     int value = int(_adj.get_value());
353     os << value;
355     repr->setAttribute(_key.c_str(), os.str().c_str());
356     sp_document_done(sp_desktop_document(dt), SP_VERB_NONE,
357                      /* TODO: annotate */ "registered-widget.cpp:341");
359     _wr->setUpdating (false);
362 RegisteredRadioButtonPair::RegisteredRadioButtonPair()
363 : _hbox(0)
367 RegisteredRadioButtonPair::~RegisteredRadioButtonPair()
369     _changed_connection.disconnect();
372 void
373 RegisteredRadioButtonPair::init (const Glib::ustring& label,
374 const Glib::ustring& label1, const Glib::ustring& label2,
375 const Glib::ustring& tip1, const Glib::ustring& tip2,
376 const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in)
378     _hbox = new Gtk::HBox;
379     _hbox->add (*manage (new Gtk::Label (label)));
380     _rb1 = manage (new Gtk::RadioButton (label1, true));
381     _hbox->add (*_rb1);
382     Gtk::RadioButtonGroup group = _rb1->get_group();
383     _rb2 = manage (new Gtk::RadioButton (group, label2, true));
384     _hbox->add (*_rb2);
385     _rb2->set_active();
386     _tt.set_tip (*_rb1, tip1);
387     _tt.set_tip (*_rb2, tip2);
388     _key = key;
389     _wr = &wr;
390     _changed_connection = _rb1->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredRadioButtonPair::on_value_changed));
392     repr = repr_in;
395 void
396 RegisteredRadioButtonPair::setValue (bool second)
398     if (second) _rb2->set_active();
399     else        _rb1->set_active();
402 void
403 RegisteredRadioButtonPair::on_value_changed()
405     if (_wr->isUpdating())
406         return;
408     SPDesktop *dt = SP_ACTIVE_DESKTOP;
409     if (!dt)
410         return;
412     _wr->setUpdating (true);
414     bool second = _rb2->get_active();
415     SPDocument *doc = sp_desktop_document(dt);
416     bool saved = sp_document_get_undo_sensitive (doc);
417     sp_document_set_undo_sensitive (doc, false);
418     if (!repr)
419         repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
420     repr->setAttribute(_key.c_str(), second ? "true" : "false");
421     doc->rroot->setAttribute("sodipodi:modified", "true");
422     sp_document_set_undo_sensitive (doc, saved);
423     sp_document_done (doc, SP_VERB_NONE,
424                       /* TODO: annotate */ "registered-widget.cpp:405");
426     _wr->setUpdating (false);
429 } // namespace Dialog
430 } // namespace UI
431 } // namespace Inkscape
433 /*
434   Local Variables:
435   mode:c++
436   c-file-style:"stroustrup"
437   c-file-offsets:((innamespace . 0)(inline-open . 0))
438   indent-tabs-mode:nil
439   fill-column:99
440   End:
441 */
442 // vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :