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 = ≀
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_DT_DOCUMENT(dt);
93 Inkscape::XML::Node *repr = SP_OBJECT_REPR (SP_DT_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);
103 _wr->setUpdating (false);
104 }
106 RegisteredUnitMenu::RegisteredUnitMenu()
107 : _label(0), _sel(0)
108 {
109 }
111 RegisteredUnitMenu::~RegisteredUnitMenu()
112 {
113 _changed_connection.disconnect();
114 if (_label) delete _label;
115 if (_sel) delete _sel;
116 }
118 void
119 RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr)
120 {
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 = ≀
127 _key = key;
128 _changed_connection = _sel->signal_changed().connect (sigc::mem_fun (*this, &RegisteredUnitMenu::on_changed));
129 }
131 void
132 RegisteredUnitMenu::setUnit (const SPUnit* unit)
133 {
134 _sel->setUnit (sp_unit_get_abbreviation (unit));
135 }
137 void
138 RegisteredUnitMenu::on_changed()
139 {
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_DT_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_DT_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);
161 _wr->setUpdating (false);
162 }
165 RegisteredScalarUnit::RegisteredScalarUnit()
166 : _widget(0), _um(0)
167 {
168 }
170 RegisteredScalarUnit::~RegisteredScalarUnit()
171 {
172 if (_widget) delete _widget;
173 _value_changed_connection.disconnect();
174 }
176 void
177 RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, const RegisteredUnitMenu &rum, Registry& wr)
178 {
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 = ≀
187 }
189 ScalarUnit*
190 RegisteredScalarUnit::getSU()
191 {
192 return _widget;
193 }
195 void
196 RegisteredScalarUnit::setValue (double val)
197 {
198 _widget->setValue (val);
199 on_value_changed();
200 }
202 void
203 RegisteredScalarUnit::on_value_changed()
204 {
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_DT_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_DT_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);
228 _wr->setUpdating (false);
229 }
231 RegisteredColorPicker::RegisteredColorPicker()
232 : _label(0), _cp(0)
233 {
234 }
236 RegisteredColorPicker::~RegisteredColorPicker()
237 {
238 _changed_connection.disconnect();
239 if (_cp) delete _cp;
240 if (_label) delete _label;
241 }
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)
245 {
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 = ≀
253 _changed_connection = _cp->connectChanged (sigc::mem_fun (*this, &RegisteredColorPicker::on_changed));
254 }
256 void
257 RegisteredColorPicker::setRgba32 (guint32 rgba)
258 {
259 _cp->setRgba32 (rgba);
260 }
262 void
263 RegisteredColorPicker::closeWindow()
264 {
265 _cp->closeWindow();
266 }
268 void
269 RegisteredColorPicker::on_changed (guint32 rgba)
270 {
271 if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
272 return;
274 _wr->setUpdating (true);
275 Inkscape::XML::Node *repr = SP_OBJECT_REPR(SP_DT_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);
281 }
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)
287 {
288 }
290 RegisteredSuffixedInteger::~RegisteredSuffixedInteger()
291 {
292 _changed_connection.disconnect();
293 if (_label) delete _label;
294 if (_suffix) delete _suffix;
295 if (_sb) delete _sb;
296 }
298 void
299 RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr)
300 {
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 = ≀
313 }
315 void
316 RegisteredSuffixedInteger::setValue (int i)
317 {
318 _adj.set_value (i);
319 }
321 void
322 RegisteredSuffixedInteger::on_value_changed()
323 {
324 if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP)
325 return;
327 _wr->setUpdating (true);
329 SPDesktop* dt = SP_ACTIVE_DESKTOP;
330 Inkscape::XML::Node *repr = SP_OBJECT_REPR(SP_DT_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_DT_DOCUMENT(dt));
338 _wr->setUpdating (false);
339 }
341 RegisteredRadioButtonPair::RegisteredRadioButtonPair()
342 : _hbox(0)
343 {
344 }
346 RegisteredRadioButtonPair::~RegisteredRadioButtonPair()
347 {
348 _changed_connection.disconnect();
349 }
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)
356 {
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 = ≀
369 _changed_connection = _rb1->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredRadioButtonPair::on_value_changed));
370 }
372 void
373 RegisteredRadioButtonPair::setValue (bool second)
374 {
375 if (second) _rb2->set_active();
376 else _rb1->set_active();
377 }
379 void
380 RegisteredRadioButtonPair::on_value_changed()
381 {
382 if (_wr->isUpdating())
383 return;
385 SPDesktop *dt = SP_ACTIVE_DESKTOP;
386 if (!dt)
387 return;
389 _wr->setUpdating (true);
391 bool second = _rb2->get_active();
392 SPDocument *doc = SP_DT_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_DT_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);
401 _wr->setUpdating (false);
402 }
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 :