X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fwidget%2Fregistered-widget.cpp;h=86c76b2361fd230ca6aa5635d05357b6d25602a0;hb=10233f4d8b628c765ea0b54c84da614cadf0f2c3;hp=4ac73e48476b049e0cef28f45eb9224501858f5c;hpb=f4f507228b30d55fd7e39386ba513f3a0a54bd5d;p=inkscape.git diff --git a/src/ui/widget/registered-widget.cpp b/src/ui/widget/registered-widget.cpp index 4ac73e484..86c76b236 100644 --- a/src/ui/widget/registered-widget.cpp +++ b/src/ui/widget/registered-widget.cpp @@ -59,7 +59,7 @@ RegisteredCheckButton::~RegisteredCheckButton() } void -RegisteredCheckButton::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, Registry& wr, bool right) +RegisteredCheckButton::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, Registry& wr, bool right, Inkscape::XML::Node* repr_in, SPDocument *doc_in) { _button = new Gtk::CheckButton; _tt.set_tip (*_button, tip); @@ -70,6 +70,11 @@ RegisteredCheckButton::init (const Glib::ustring& label, const Glib::ustring& ti _key = key; _wr = ≀ _toggled_connection = _button->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredCheckButton::on_toggled)); + + repr = repr_in; + doc = doc_in; + if (repr && !doc) // doc cannot be NULL when repr is not NULL + g_error("Initialization of registered widget using defined repr but with doc==NULL"); } void @@ -84,24 +89,29 @@ RegisteredCheckButton::on_toggled() if (_wr->isUpdating()) return; - SPDesktop *dt = SP_ACTIVE_DESKTOP; - if (!dt) { - return; + // Use local repr here. When repr is specified, use that one, but + // if repr==NULL, get the repr of namedview of active desktop. + Inkscape::XML::Node *local_repr = repr; + SPDocument *local_doc = doc; + if (!local_repr) { + // no repr specified, use active desktop's namedview's repr + SPDesktop *dt = SP_ACTIVE_DESKTOP; + if (!dt) + return; + local_repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); + local_doc = sp_desktop_document(dt); } - SPDocument *doc = sp_desktop_document(dt); - - Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); _wr->setUpdating (true); - gboolean saved = sp_document_get_undo_sensitive (doc); - sp_document_set_undo_sensitive (doc, FALSE); - sp_repr_set_boolean(repr, _key.c_str(), _button->get_active()); - doc->rroot->setAttribute("sodipodi:modified", "true"); - sp_document_set_undo_sensitive (doc, saved); - sp_document_done (doc, SP_VERB_NONE, - /* TODO: annotate */ "registered-widget.cpp:103"); - + bool saved = sp_document_get_undo_sensitive (local_doc); + sp_document_set_undo_sensitive (local_doc, false); + sp_repr_set_boolean(local_repr, _key.c_str(), _button->get_active()); + local_doc->rroot->setAttribute("sodipodi:modified", "true"); + sp_document_set_undo_sensitive (local_doc, saved); + sp_document_done (local_doc, SP_VERB_NONE, + /* TODO: annotate */ "registered-widget.cpp: RegisteredCheckButton::on_toggled"); + _wr->setUpdating (false); } @@ -118,7 +128,7 @@ RegisteredUnitMenu::~RegisteredUnitMenu() } void -RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr) +RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in, SPDocument *doc_in) { _label = new Gtk::Label (label, 1.0, 0.5); _label->set_use_underline (true); @@ -128,9 +138,14 @@ RegisteredUnitMenu::init (const Glib::ustring& label, const Glib::ustring& key, _wr = ≀ _key = key; _changed_connection = _sel->signal_changed().connect (sigc::mem_fun (*this, &RegisteredUnitMenu::on_changed)); + + repr = repr_in; + doc = doc_in; + if (repr && !doc) // doc cannot be NULL when repr is not NULL + g_warning("Initialization of registered widget using defined repr but with doc==NULL"); } -void +void RegisteredUnitMenu::setUnit (const SPUnit* unit) { _sel->setUnit (sp_unit_get_abbreviation (unit)); @@ -142,25 +157,32 @@ RegisteredUnitMenu::on_changed() if (_wr->isUpdating()) return; - SPDesktop *dt = SP_ACTIVE_DESKTOP; - if (!dt) - return; + // Use local repr here. When repr is specified, use that one, but + // if repr==NULL, get the repr of namedview of active desktop. + Inkscape::XML::Node *local_repr = repr; + SPDocument *local_doc = doc; + if (!local_repr) { + // no repr specified, use active desktop's namedview's repr + SPDesktop *dt = SP_ACTIVE_DESKTOP; + if (!dt) + return; + local_repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); + local_doc = sp_desktop_document(dt); + } Inkscape::SVGOStringStream os; os << _sel->getUnitAbbr(); _wr->setUpdating (true); - SPDocument *doc = sp_desktop_document(dt); - gboolean saved = sp_document_get_undo_sensitive (doc); - sp_document_set_undo_sensitive (doc, FALSE); - Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); - repr->setAttribute(_key.c_str(), os.str().c_str()); - doc->rroot->setAttribute("sodipodi:modified", "true"); - sp_document_set_undo_sensitive (doc, saved); - sp_document_done (doc, SP_VERB_NONE, - /* TODO: annotate */ "registered-widget.cpp:162"); - + bool saved = sp_document_get_undo_sensitive (local_doc); + sp_document_set_undo_sensitive (local_doc, false); + local_repr->setAttribute(_key.c_str(), os.str().c_str()); + local_doc->rroot->setAttribute("sodipodi:modified", "true"); + sp_document_set_undo_sensitive (local_doc, saved); + sp_document_done (local_doc, SP_VERB_NONE, + /* TODO: annotate */ "registered-widget.cpp: RegisteredUnitMenu::on_changed"); + _wr->setUpdating (false); } @@ -177,7 +199,7 @@ RegisteredScalarUnit::~RegisteredScalarUnit() } void -RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, const RegisteredUnitMenu &rum, Registry& wr) +RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, const RegisteredUnitMenu &rum, Registry& wr, Inkscape::XML::Node* repr_in, SPDocument *doc_in) { _widget = new ScalarUnit (label, tip, UNIT_TYPE_LINEAR, "", "", rum._sel); _widget->initScalar (-1e6, 1e6); @@ -187,6 +209,11 @@ RegisteredScalarUnit::init (const Glib::ustring& label, const Glib::ustring& tip _um = rum._sel; _value_changed_connection = _widget->signal_value_changed().connect (sigc::mem_fun (*this, &RegisteredScalarUnit::on_value_changed)); _wr = ≀ + + repr = repr_in; + doc = doc_in; + if (repr && !doc) // doc cannot be NULL when repr is not NULL + g_warning("Initialization of registered widget using defined repr but with doc==NULL"); } ScalarUnit* @@ -195,7 +222,7 @@ RegisteredScalarUnit::getSU() return _widget; } -void +void RegisteredScalarUnit::setValue (double val) { _widget->setValue (val); @@ -208,9 +235,18 @@ RegisteredScalarUnit::on_value_changed() if (_wr->isUpdating()) return; - SPDesktop *dt = SP_ACTIVE_DESKTOP; - if (!dt) - return; + // Use local repr here. When repr is specified, use that one, but + // if repr==NULL, get the repr of namedview of active desktop. + Inkscape::XML::Node *local_repr = repr; + SPDocument *local_doc = doc; + if (!local_repr) { + // no repr specified, use active desktop's namedview's repr + SPDesktop *dt = SP_ACTIVE_DESKTOP; + if (!dt) + return; + local_repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); + local_doc = sp_desktop_document(dt); + } Inkscape::SVGOStringStream os; os << _widget->getValue(""); @@ -219,16 +255,14 @@ RegisteredScalarUnit::on_value_changed() _wr->setUpdating (true); - SPDocument *doc = sp_desktop_document(dt); - gboolean saved = sp_document_get_undo_sensitive (doc); - sp_document_set_undo_sensitive (doc, FALSE); - Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); - repr->setAttribute(_key.c_str(), os.str().c_str()); - doc->rroot->setAttribute("sodipodi:modified", "true"); - sp_document_set_undo_sensitive (doc, saved); - sp_document_done (doc, SP_VERB_NONE, - /* TODO: annotate */ "registered-widget.cpp:230"); - + bool saved = sp_document_get_undo_sensitive (local_doc); + sp_document_set_undo_sensitive (local_doc, false); + local_repr->setAttribute(_key.c_str(), os.str().c_str()); + local_doc->rroot->setAttribute("sodipodi:modified", "true"); + sp_document_set_undo_sensitive (local_doc, saved); + sp_document_done (local_doc, SP_VERB_NONE, + /* TODO: annotate */ "registered-widget.cpp: RegisteredScalarUnit::on_value_changed"); + _wr->setUpdating (false); } @@ -245,7 +279,7 @@ RegisteredColorPicker::~RegisteredColorPicker() } void -RegisteredColorPicker::init (const Glib::ustring& label, const Glib::ustring& title, const Glib::ustring& tip, const Glib::ustring& ckey, const Glib::ustring& akey, Registry& wr) +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, SPDocument *doc_in) { _label = new Gtk::Label (label, 1.0, 0.5); _label->set_use_underline (true); @@ -255,9 +289,14 @@ RegisteredColorPicker::init (const Glib::ustring& label, const Glib::ustring& ti _akey = akey; _wr = ≀ _changed_connection = _cp->connectChanged (sigc::mem_fun (*this, &RegisteredColorPicker::on_changed)); + + repr = repr_in; + doc = doc_in; + if (repr && !doc) // doc cannot be NULL when repr is not NULL + g_warning("Initialization of registered widget using defined repr but with doc==NULL"); } -void +void RegisteredColorPicker::setRgba32 (guint32 rgba) { _cp->setRgba32 (rgba); @@ -272,21 +311,41 @@ RegisteredColorPicker::closeWindow() void RegisteredColorPicker::on_changed (guint32 rgba) { - if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP) + if (_wr->isUpdating()) return; _wr->setUpdating (true); - Inkscape::XML::Node *repr = SP_OBJECT_REPR(sp_desktop_namedview(SP_ACTIVE_DESKTOP)); + + // Use local repr here. When repr is specified, use that one, but + // if repr==NULL, get the repr of namedview of active desktop. + Inkscape::XML::Node *local_repr = repr; + SPDocument *local_doc = doc; + if (!local_repr) { + // no repr specified, use active desktop's namedview's repr + SPDesktop *dt = SP_ACTIVE_DESKTOP; + if (!dt) + return; + local_repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); + local_doc = sp_desktop_document(dt); + } + gchar c[32]; sp_svg_write_color(c, 32, rgba); - repr->setAttribute(_ckey.c_str(), c); - sp_repr_set_css_double(repr, _akey.c_str(), (rgba & 0xff) / 255.0); + bool saved = sp_document_get_undo_sensitive (local_doc); + sp_document_set_undo_sensitive (local_doc, false); + local_repr->setAttribute(_ckey.c_str(), c); + sp_repr_set_css_double(local_repr, _akey.c_str(), (rgba & 0xff) / 255.0); + local_doc->rroot->setAttribute("sodipodi:modified", "true"); + sp_document_set_undo_sensitive (local_doc, saved); + sp_document_done (local_doc, SP_VERB_NONE, + /* TODO: annotate */ "registered-widget.cpp: RegisteredColorPicker::on_changed"); + _wr->setUpdating (false); } RegisteredSuffixedInteger::RegisteredSuffixedInteger() : _label(0), _sb(0), - _adj(0.0,0.0,100.0,1.0,1.0,1.0), + _adj(0.0,0.0,100.0,1.0,1.0,1.0), _suffix(0) { } @@ -300,7 +359,7 @@ RegisteredSuffixedInteger::~RegisteredSuffixedInteger() } void -RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr) +RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring& suffix, const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in, SPDocument *doc_in) { _key = key; _label = new Gtk::Label (label); @@ -314,9 +373,14 @@ RegisteredSuffixedInteger::init (const Glib::ustring& label, const Glib::ustring _changed_connection = _adj.signal_value_changed().connect (sigc::mem_fun(*this, &RegisteredSuffixedInteger::on_value_changed)); _wr = ≀ + + repr = repr_in; + doc = doc_in; + if (repr && !doc) // doc cannot be NULL when repr is not NULL + g_warning("Initialization of registered widget using defined repr but with doc==NULL"); } -void +void RegisteredSuffixedInteger::setValue (int i) { _adj.set_value (i); @@ -325,21 +389,32 @@ RegisteredSuffixedInteger::setValue (int i) void RegisteredSuffixedInteger::on_value_changed() { - if (_wr->isUpdating() || !SP_ACTIVE_DESKTOP) + if (_wr->isUpdating()) return; _wr->setUpdating (true); - - SPDesktop* dt = SP_ACTIVE_DESKTOP; - Inkscape::XML::Node *repr = SP_OBJECT_REPR(sp_desktop_namedview(dt)); + + // Use local repr here. When repr is specified, use that one, but + // if repr==NULL, get the repr of namedview of active desktop. + Inkscape::XML::Node *local_repr = repr; + SPDocument *local_doc = doc; + if (!local_repr) { + // no repr specified, use active desktop's namedview's repr + SPDesktop *dt = SP_ACTIVE_DESKTOP; + if (!dt) + return; + local_repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); + local_doc = sp_desktop_document(dt); + } + Inkscape::SVGOStringStream os; int value = int(_adj.get_value()); os << value; - repr->setAttribute(_key.c_str(), os.str().c_str()); - sp_document_done(sp_desktop_document(dt), SP_VERB_NONE, - /* TODO: annotate */ "registered-widget.cpp:341"); - + local_repr->setAttribute(_key.c_str(), os.str().c_str()); + sp_document_done(local_doc, SP_VERB_NONE, + /* TODO: annotate */ "registered-widget.cpp: RegisteredSuffixedInteger::on_value_changed"); + _wr->setUpdating (false); } @@ -354,10 +429,10 @@ RegisteredRadioButtonPair::~RegisteredRadioButtonPair() } void -RegisteredRadioButtonPair::init (const Glib::ustring& label, -const Glib::ustring& label1, const Glib::ustring& label2, -const Glib::ustring& tip1, const Glib::ustring& tip2, -const Glib::ustring& key, Registry& wr) +RegisteredRadioButtonPair::init (const Glib::ustring& label, +const Glib::ustring& label1, const Glib::ustring& label2, +const Glib::ustring& tip1, const Glib::ustring& tip2, +const Glib::ustring& key, Registry& wr, Inkscape::XML::Node* repr_in, SPDocument *doc_in) { _hbox = new Gtk::HBox; _hbox->add (*manage (new Gtk::Label (label))); @@ -372,9 +447,14 @@ const Glib::ustring& key, Registry& wr) _key = key; _wr = ≀ _changed_connection = _rb1->signal_toggled().connect (sigc::mem_fun (*this, &RegisteredRadioButtonPair::on_value_changed)); + + repr = repr_in; + doc = doc_in; + if (repr && !doc) // doc cannot be NULL when repr is not NULL + g_error("Initialization of registered widget using defined repr but with doc==NULL"); } -void +void RegisteredRadioButtonPair::setValue (bool second) { if (second) _rb2->set_active(); @@ -387,23 +467,30 @@ RegisteredRadioButtonPair::on_value_changed() if (_wr->isUpdating()) return; - SPDesktop *dt = SP_ACTIVE_DESKTOP; - if (!dt) - return; + // Use local repr here. When repr is specified, use that one, but + // if repr==NULL, get the repr of namedview of active desktop. + Inkscape::XML::Node *local_repr = repr; + SPDocument *local_doc = doc; + if (!local_repr) { + // no repr specified, use active desktop's namedview's repr + SPDesktop *dt = SP_ACTIVE_DESKTOP; + if (!dt) + return; + local_repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); + local_doc = sp_desktop_document(dt); + } _wr->setUpdating (true); - + bool second = _rb2->get_active(); - SPDocument *doc = sp_desktop_document(dt); - gboolean saved = sp_document_get_undo_sensitive (doc); - sp_document_set_undo_sensitive (doc, FALSE); - Inkscape::XML::Node *repr = SP_OBJECT_REPR (sp_desktop_namedview(dt)); - repr->setAttribute(_key.c_str(), second ? "true" : "false"); - doc->rroot->setAttribute("sodipodi:modified", "true"); - sp_document_set_undo_sensitive (doc, saved); - sp_document_done (doc, SP_VERB_NONE, - /* TODO: annotate */ "registered-widget.cpp:405"); - + bool saved = sp_document_get_undo_sensitive (local_doc); + sp_document_set_undo_sensitive (local_doc, false); + local_repr->setAttribute(_key.c_str(), second ? "true" : "false"); + local_doc->rroot->setAttribute("sodipodi:modified", "true"); + sp_document_set_undo_sensitive (local_doc, saved); + sp_document_done (local_doc, SP_VERB_NONE, + /* TODO: annotate */ "registered-widget.cpp: RegisteredRadioButtonPair::on_value_changed"); + _wr->setUpdating (false); }