25143b9475198de67c19056492f6415e236600a2
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 = ≀
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");
105 _wr->setUpdating (false);
106 }
108 RegisteredUnitMenu::RegisteredUnitMenu()
109 : _label(0), _sel(0)
110 {
111 }
113 RegisteredUnitMenu::~RegisteredUnitMenu()
114 {
115 _changed_connection.disconnect();
116 if (_label) delete _label;
117 if (_sel) delete _sel;
118 }
120 void
121 RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr)
122 {
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 = ≀
129 _key = key;
130 _changed_connection = _sel->signal_changed().connect (sigc::mem_fun (*this, &RegisteredUnitMenu::on_changed));
131 }
133 void
134 RegisteredUnitMenu::setUnit (const SPUnit* unit)
135 {
136 _sel->setUnit (sp_unit_get_abbreviation (unit));
137 }
139 void
140 RegisteredUnitMenu::on_changed()
141 {
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");
164 _wr->setUpdating (false);
165 }
168 RegisteredScalarUnit::RegisteredScalarUnit()
169 : _widget(0), _um(0)
170 {
171 }
173 RegisteredScalarUnit::~RegisteredScalarUnit()
174 {
175 if (_widget) delete _widget;
176 _value_changed_connection.disconnect();
177 }
179 void
180 RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, const RegisteredUnitMenu &rum, Registry& wr)
181 {
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 = ≀
190 }
192 ScalarUnit*
193 RegisteredScalarUnit::getSU()
194 {
195 return _widget;
196 }
198 void
199 RegisteredScalarUnit::setValue (double val)
200 {
201 _widget->setValue (val);
202 on_value_changed();
203 }
205 void
206 RegisteredScalarUnit::on_value_changed()
207 {
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");
232 _wr->setUpdating (false);
233 }
235 RegisteredColorPicker::RegisteredColorPicker()
236 : _label(0), _cp(0)
237 {
238 }
240 RegisteredColorPicker::~RegisteredColorPicker()
241 {
242 _changed_connection.disconnect();
243 if (_cp) delete _cp;
244 if (_label) delete _label;
245 }
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)
249 {
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 = ≀
257 _changed_connection = _cp->connectChanged (sigc::mem_fun (*this, &RegisteredColorPicker::on_changed));
258 }
260 void
261 RegisteredColorPicker::setRgba32 (guint32 rgba)
262 {
263 _cp->setRgba32 (rgba);
264 }
266 void
267 RegisteredColorPicker::closeWindow()
268 {
269 _cp->closeWindow();
270 }
272 void
273 RegisteredColorPicker::on_changed (guint32 rgba)
274 {
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);
285 }
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)
291 {
292 }
294 RegisteredSuffixedInteger::~RegisteredSuffixedInteger()
295 {
296 _changed_connection.disconnect();
297 if (_label) delete _label;
298 if (_suffix) delete _suffix;
299 if (_sb) delete _sb;
300 }
302 void
303 RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr)
304 {
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 = ≀
317 }
319 void
320 RegisteredSuffixedInteger::setValue (int i)
321 {
322 _adj.set_value (i);
323 }
325 void
326 RegisteredSuffixedInteger::on_value_changed()
327 {
328 if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
329 return;
331 _wr->setUpdating (true);
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");
343 _wr->setUpdating (false);
344 }
346 RegisteredRadioButtonPair::RegisteredRadioButtonPair()
347 : _hbox(0)
348 {
349 }
351 RegisteredRadioButtonPair::~RegisteredRadioButtonPair()
352 {
353 _changed_connection.disconnect();
354 }
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)
361 {
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 = ≀
374 _changed_connection = _rb1->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredRadioButtonPair::on_value_changed));
375 }
377 void
378 RegisteredRadioButtonPair::setValue (bool second)
379 {
380 if (second) _rb2->set_active();
381 else _rb1->set_active();
382 }
384 void
385 RegisteredRadioButtonPair::on_value_changed()
386 {
387 if (_wr->isUpdating())
388 return;
390 SPDesktop *dt = SP_ACTIVE_DESKTOP;
391 if (!dt)
392 return;
394 _wr->setUpdating (true);
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");
407 _wr->setUpdating (false);
408 }
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 :