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 = ≀
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);
112 }
114 RegisteredUnitMenu::RegisteredUnitMenu()
115 : _label(0), _sel(0)
116 {
117 }
119 RegisteredUnitMenu::~RegisteredUnitMenu()
120 {
121 _changed_connection.disconnect();
122 if (_label) delete _label;
123 if (_sel) delete _sel;
124 }
126 void
127 RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in)
128 {
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 = ≀
135 _key = key;
136 _changed_connection = _sel->signal_changed().connect (sigc::mem_fun (*this, &RegisteredUnitMenu::on_changed));
138 repr = repr_in;
139 }
141 void
142 RegisteredUnitMenu::setUnit (const SPUnit* unit)
143 {
144 _sel->setUnit (sp_unit_get_abbreviation (unit));
145 }
147 void
148 RegisteredUnitMenu::on_changed()
149 {
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);
174 }
177 RegisteredScalarUnit::RegisteredScalarUnit()
178 : _widget(0), _um(0)
179 {
180 }
182 RegisteredScalarUnit::~RegisteredScalarUnit()
183 {
184 if (_widget) delete _widget;
185 _value_changed_connection.disconnect();
186 }
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)
190 {
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 = ≀
200 repr = repr_in;
201 }
203 ScalarUnit*
204 RegisteredScalarUnit::getSU()
205 {
206 return _widget;
207 }
209 void
210 RegisteredScalarUnit::setValue (double val)
211 {
212 _widget->setValue (val);
213 on_value_changed();
214 }
216 void
217 RegisteredScalarUnit::on_value_changed()
218 {
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);
245 }
247 RegisteredColorPicker::RegisteredColorPicker()
248 : _label(0), _cp(0)
249 {
250 }
252 RegisteredColorPicker::~RegisteredColorPicker()
253 {
254 _changed_connection.disconnect();
255 if (_cp) delete _cp;
256 if (_label) delete _label;
257 }
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)
261 {
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 = ≀
269 _changed_connection = _cp->connectChanged (sigc::mem_fun (*this, &RegisteredColorPicker::on_changed));
271 repr = repr_in;
272 }
274 void
275 RegisteredColorPicker::setRgba32 (guint32 rgba)
276 {
277 _cp->setRgba32 (rgba);
278 }
280 void
281 RegisteredColorPicker::closeWindow()
282 {
283 _cp->closeWindow();
284 }
286 void
287 RegisteredColorPicker::on_changed (guint32 rgba)
288 {
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);
300 }
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)
306 {
307 }
309 RegisteredSuffixedInteger::~RegisteredSuffixedInteger()
310 {
311 _changed_connection.disconnect();
312 if (_label) delete _label;
313 if (_suffix) delete _suffix;
314 if (_sb) delete _sb;
315 }
317 void
318 RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in)
319 {
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 = ≀
333 repr = repr_in;
334 }
336 void
337 RegisteredSuffixedInteger::setValue (int i)
338 {
339 _adj.set_value (i);
340 }
342 void
343 RegisteredSuffixedInteger::on_value_changed()
344 {
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);
362 }
364 RegisteredRadioButtonPair::RegisteredRadioButtonPair()
365 : _hbox(0)
366 {
367 }
369 RegisteredRadioButtonPair::~RegisteredRadioButtonPair()
370 {
371 _changed_connection.disconnect();
372 }
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)
379 {
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 = ≀
392 _changed_connection = _rb1->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredRadioButtonPair::on_value_changed));
394 repr = repr_in;
395 }
397 void
398 RegisteredRadioButtonPair::setValue (bool second)
399 {
400 if (second) _rb2->set_active();
401 else _rb1->set_active();
402 }
404 void
405 RegisteredRadioButtonPair::on_value_changed()
406 {
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);
429 }
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 :