Code

Moved compass like display of angles from windows to steps in preferences
[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"
37 namespace Inkscape {
38 namespace UI {
39 namespace Widget {
41 //===================================================
43 //---------------------------------------------------
47 //====================================================
49 RegisteredCheckButton::RegisteredCheckButton()
50 : _button(0)
51 {
52 }
54 RegisteredCheckButton::~RegisteredCheckButton()
55 {
56     _toggled_connection.disconnect();
57     if (_button) delete _button;
58 }
60 void
61 RegisteredCheckButton::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, Registry& wr, bool right)
62 {
63     _button = new Gtk::CheckButton;
64     _tt.set_tip (*_button, tip);
65     Gtk::Label *l = new Gtk::Label (label);
66     l->set_use_underline (true);
67     _button->add (*manage (l));
68     _button->set_alignment (right? 1.0 : 0.0, 0.5);
69     _key = key;
70     _wr = &wr;
71     _toggled_connection = _button->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredCheckButton::on_toggled));
72 }
74 void
75 RegisteredCheckButton::setActive (bool b)
76 {
77     _button->set_active (b);
78 }
80 void
81 RegisteredCheckButton::on_toggled()
82 {
83     if (_wr->isUpdating())
84         return;
86     SPDesktop *dt = SP_ACTIVE_DESKTOP;
87     if (!dt) {
88         return;
89     }
91     SPDocument *doc = sp_desktop_document(dt);
93     Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
94     _wr->setUpdating (true);
96     gboolean saved = sp_document_get_undo_sensitive (doc);
97     sp_document_set_undo_sensitive (doc, FALSE);
98     sp_repr_set_boolean(repr, _key.c_str(), _button->get_active());
99     doc->rroot->setAttribute("sodipodi:modified", "true");
100     sp_document_set_undo_sensitive (doc, saved);
101     sp_document_done (doc);
102     
103     _wr->setUpdating (false);
106 RegisteredUnitMenu::RegisteredUnitMenu()
107 : _label(0), _sel(0)
111 RegisteredUnitMenu::~RegisteredUnitMenu()
113     _changed_connection.disconnect();
114     if (_label) delete _label;
115     if (_sel) delete _sel;
118 void
119 RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr)
121     _label = new Gtk::Label (label, 1.0, 0.5);
122     _label->set_use_underline (true);
123     _sel = new UnitMenu ();
124     _label->set_mnemonic_widget (*_sel);
125     _sel->setUnitType (UNIT_TYPE_LINEAR);
126     _wr = &wr;
127     _key = key;
128     _changed_connection = _sel->signal_changed().connect (sigc::mem_fun (*this, &RegisteredUnitMenu::on_changed));
131 void 
132 RegisteredUnitMenu::setUnit (const SPUnit* unit)
134     _sel->setUnit (sp_unit_get_abbreviation (unit));
137 void
138 RegisteredUnitMenu::on_changed()
140     if (_wr->isUpdating())
141         return;
143     SPDesktop *dt = SP_ACTIVE_DESKTOP;
144     if (!dt) 
145         return;
147     Inkscape::SVGOStringStream os;
148     os << _sel->getUnitAbbr();
150     _wr->setUpdating (true);
152     SPDocument *doc = sp_desktop_document(dt);
153     gboolean saved = sp_document_get_undo_sensitive (doc);
154     sp_document_set_undo_sensitive (doc, FALSE);
155     Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
156     repr->setAttribute(_key.c_str(), os.str().c_str());
157     doc->rroot->setAttribute("sodipodi:modified", "true");
158     sp_document_set_undo_sensitive (doc, saved);
159     sp_document_done (doc);
160     
161     _wr->setUpdating (false);
165 RegisteredScalarUnit::RegisteredScalarUnit()
166 : _widget(0), _um(0)
170 RegisteredScalarUnit::~RegisteredScalarUnit()
172     if (_widget) delete _widget;
173     _value_changed_connection.disconnect();
176 void
177 RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, const RegisteredUnitMenu &rum, Registry& wr)
179     _widget = new ScalarUnit (label, tip, UNIT_TYPE_LINEAR, "", "", rum._sel);
180     _widget->initScalar (-1e6, 1e6);
181     _widget->setUnit (rum._sel->getUnitAbbr());
182     _widget->setDigits (2);
183     _key = key;
184     _um = rum._sel;
185     _value_changed_connection = _widget->signal_value_changed().connect (sigc::mem_fun (*this, &RegisteredScalarUnit::on_value_changed));
186     _wr = &wr;
189 ScalarUnit*
190 RegisteredScalarUnit::getSU()
192     return _widget;
195 void 
196 RegisteredScalarUnit::setValue (double val)
198     _widget->setValue (val);
199     on_value_changed();
202 void
203 RegisteredScalarUnit::on_value_changed()
205     if (_wr->isUpdating())
206         return;
208     SPDesktop *dt = SP_ACTIVE_DESKTOP;
209     if (!dt) 
210         return;
212     Inkscape::SVGOStringStream os;
213     os << _widget->getValue("");
214     if (_um)
215         os << _um->getUnitAbbr();
217     _wr->setUpdating (true);
219     SPDocument *doc = sp_desktop_document(dt);
220     gboolean saved = sp_document_get_undo_sensitive (doc);
221     sp_document_set_undo_sensitive (doc, FALSE);
222     Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
223     repr->setAttribute(_key.c_str(), os.str().c_str());
224     doc->rroot->setAttribute("sodipodi:modified", "true");
225     sp_document_set_undo_sensitive (doc, saved);
226     sp_document_done (doc);
227     
228     _wr->setUpdating (false);
231 RegisteredColorPicker::RegisteredColorPicker()
232 : _label(0), _cp(0)
236 RegisteredColorPicker::~RegisteredColorPicker()
238     _changed_connection.disconnect();
239     if (_cp) delete _cp;
240     if (_label) delete _label;
243 void
244 RegisteredColorPicker::init (const Glib::ustring& label, const Glib::ustring& title, const Glib::ustring& tip, const Glib::ustring& ckey, const Glib::ustring& akey, Registry& wr)
246     _label = new Gtk::Label (label, 1.0, 0.5);
247     _label->set_use_underline (true);
248     _cp = new ColorPicker (title,tip,0,true);
249     _label->set_mnemonic_widget (*_cp);
250     _ckey = ckey;
251     _akey = akey;
252     _wr = &wr;
253     _changed_connection = _cp->connectChanged (sigc::mem_fun (*this, &RegisteredColorPicker::on_changed));
256 void 
257 RegisteredColorPicker::setRgba32 (guint32 rgba)
259     _cp->setRgba32 (rgba);
262 void
263 RegisteredColorPicker::closeWindow()
265     _cp->closeWindow();
268 void
269 RegisteredColorPicker::on_changed (guint32 rgba)
271     if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
272         return;
274     _wr->setUpdating (true);
275     Inkscape::XML::Node *repr = SP_OBJECT_REPR(sp_desktop_namedview(SP_ACTIVE_DESKTOP));
276     gchar c[32];
277     sp_svg_write_color(c, 32, rgba);
278     repr->setAttribute(_ckey.c_str(), c);
279     sp_repr_set_css_double(repr, _akey.c_str(), (rgba & 0xff) / 255.0);
280     _wr->setUpdating (false);
283 RegisteredSuffixedInteger::RegisteredSuffixedInteger()
284 : _label(0), _sb(0),
285   _adj(0.0,0.0,100.0,1.0,1.0,1.0), 
286   _suffix(0)
290 RegisteredSuffixedInteger::~RegisteredSuffixedInteger()
292     _changed_connection.disconnect();
293     if (_label) delete _label;
294     if (_suffix) delete _suffix;
295     if (_sb) delete _sb;
298 void
299 RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr)
301     _key = key;
302     _label = new Gtk::Label (label);
303     _label->set_alignment (1.0, 0.5);
304     _label->set_use_underline();
305     _sb = new Gtk::SpinButton (_adj, 1.0, 0);
306     _label->set_mnemonic_widget (*_sb);
307     _suffix = new Gtk::Label (suffix);
308     _hbox.pack_start (*_sb, true, true, 0);
309     _hbox.pack_start (*_suffix, false, false, 0);
311     _changed_connection = _adj.signal_value_changed().connect (sigc::mem_fun(*this, &RegisteredSuffixedInteger::on_value_changed));
312     _wr = &wr;
315 void 
316 RegisteredSuffixedInteger::setValue (int i)
318     _adj.set_value (i);
321 void
322 RegisteredSuffixedInteger::on_value_changed()
324     if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
325         return;
327     _wr->setUpdating (true);
328     
329     SPDesktop* dt = SP_ACTIVE_DESKTOP;
330     Inkscape::XML::Node *repr = SP_OBJECT_REPR(sp_desktop_namedview(dt));
331     Inkscape::SVGOStringStream os;
332     int value = int(_adj.get_value());
333     os << value;
335     repr->setAttribute(_key.c_str(), os.str().c_str());
336     sp_document_done(sp_desktop_document(dt));
337     
338     _wr->setUpdating (false);
341 RegisteredRadioButtonPair::RegisteredRadioButtonPair()
342 : _hbox(0)
346 RegisteredRadioButtonPair::~RegisteredRadioButtonPair()
348     _changed_connection.disconnect();
351 void
352 RegisteredRadioButtonPair::init (const Glib::ustring& label, 
353 const Glib::ustring& label1, const Glib::ustring& label2, 
354 const Glib::ustring& tip1, const Glib::ustring& tip2, 
355 const Glib::ustring& key, Registry& wr)
357     _hbox = new Gtk::HBox;
358     _hbox->add (*manage (new Gtk::Label (label)));
359     _rb1 = manage (new Gtk::RadioButton (label1, true));
360     _hbox->add (*_rb1);
361     Gtk::RadioButtonGroup group = _rb1->get_group();
362     _rb2 = manage (new Gtk::RadioButton (group, label2, true));
363     _hbox->add (*_rb2);
364     _rb2->set_active();
365     _tt.set_tip (*_rb1, tip1);
366     _tt.set_tip (*_rb2, tip2);
367     _key = key;
368     _wr = &wr;
369     _changed_connection = _rb1->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredRadioButtonPair::on_value_changed));
372 void 
373 RegisteredRadioButtonPair::setValue (bool second)
375     if (second) _rb2->set_active();
376     else        _rb1->set_active();
379 void
380 RegisteredRadioButtonPair::on_value_changed()
382     if (_wr->isUpdating())
383         return;
385     SPDesktop *dt = SP_ACTIVE_DESKTOP;
386     if (!dt) 
387         return;
389     _wr->setUpdating (true);
390     
391     bool second = _rb2->get_active();
392     SPDocument *doc = sp_desktop_document(dt);
393     gboolean saved = sp_document_get_undo_sensitive (doc);
394     sp_document_set_undo_sensitive (doc, FALSE);
395     Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt));
396     repr->setAttribute(_key.c_str(), second ? "true" : "false");
397     doc->rroot->setAttribute("sodipodi:modified", "true");
398     sp_document_set_undo_sensitive (doc, saved);
399     sp_document_done (doc);
400     
401     _wr->setUpdating (false);
404 } // namespace Dialog
405 } // namespace UI
406 } // namespace Inkscape
408 /*
409   Local Variables:
410   mode:c++
411   c-file-style:"stroustrup"
412   c-file-offsets:((innamespace . 0)(inline-open . 0))
413   indent-tabs-mode:nil
414   fill-column:99
415   End:
416 */
417 // vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :