X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fwidget%2Fstyle-swatch.cpp;h=cad07fbd6ed3435cb6b87e2e31baf3a50152357c;hb=10233f4d8b628c765ea0b54c84da614cadf0f2c3;hp=023f91c55bef63350f2436a40dc35a1fc2a337f3;hpb=b37248c6315ce652f83ce2ca885e296448d603fa;p=inkscape.git diff --git a/src/ui/widget/style-swatch.cpp b/src/ui/widget/style-swatch.cpp index 023f91c55..cad07fbd6 100644 --- a/src/ui/widget/style-swatch.cpp +++ b/src/ui/widget/style-swatch.cpp @@ -26,6 +26,7 @@ #include "xml/node-event-vector.h" #include "widgets/widget-sizes.h" #include "helper/units.h" +#include "helper/action.h" #include "inkscape.h" enum { @@ -61,12 +62,12 @@ static void style_swatch_tool_attr_changed(Inkscape::XML::Node *repr, gchar cons bool is_interactive, gpointer data) { Inkscape::UI::Widget::StyleSwatch *ss = (Inkscape::UI::Widget::StyleSwatch *) data; - + if (!strcmp (name, "usecurrent")) { // FIXME: watching only for the style attr, no CSS attrs if (!strcmp (new_value, "1")) { - ss->setWatched (inkscape_get_repr(INKSCAPE, "desktop")); + ss->setWatched (inkscape_get_repr(INKSCAPE, "desktop"), inkscape_get_repr(INKSCAPE, ss->_tool_path)); } else { - ss->setWatched (inkscape_get_repr(INKSCAPE, ss->_tool_path)); + ss->setWatched (inkscape_get_repr(INKSCAPE, ss->_tool_path), NULL); } // UGLY HACK: we have to reconnect to the watched tool repr again, retrieving it from the stored // tool_path, because the actual repr keeps shifting with each change, no idea why @@ -87,7 +88,7 @@ namespace Inkscape { namespace UI { namespace Widget { -StyleSwatch::StyleSwatch(SPCSSAttr *css) +StyleSwatch::StyleSwatch(SPCSSAttr *css, gchar const *main_tip) : _tool_path(NULL), _css (NULL), @@ -101,8 +102,8 @@ StyleSwatch::StyleSwatch(SPCSSAttr *css) _tooltips () { - _label[SS_FILL].set_markup(_("F:")); - _label[SS_STROKE].set_markup(_("S:")); + _label[SS_FILL].set_markup(_("Fill:")); + _label[SS_STROKE].set_markup(_("Stroke:")); for (int i = SS_FILL; i <= SS_STROKE; i++) { _label[i].set_alignment(0.0, 0.5); @@ -121,8 +122,8 @@ StyleSwatch::StyleSwatch(SPCSSAttr *css) _stroke_width_place.add(_stroke_width); _stroke.pack_start(_stroke_width_place, Gtk::PACK_SHRINK); - _table.attach(_label[SS_FILL], 0,1, 0,1, Gtk::SHRINK, Gtk::SHRINK); - _table.attach(_label[SS_STROKE], 0,1, 1,2, Gtk::SHRINK, Gtk::SHRINK); + _table.attach(_label[SS_FILL], 0,1, 0,1, Gtk::FILL, Gtk::SHRINK); + _table.attach(_label[SS_STROKE], 0,1, 1,2, Gtk::FILL, Gtk::SHRINK); _table.attach(_place[SS_FILL], 1,2, 0,1); _table.attach(_stroke, 1,2, 1,2); @@ -130,7 +131,8 @@ StyleSwatch::StyleSwatch(SPCSSAttr *css) _opacity_place.add(_opacity_value); _table.attach(_opacity_place, 2,3, 0,2, Gtk::SHRINK, Gtk::SHRINK); - pack_start(_table, true, true, 0); + _swatch.add(_table); + pack_start(_swatch, true, true, 0); set_size_request (STYLE_SWATCH_WIDTH, -1); @@ -143,6 +145,30 @@ StyleSwatch::StyleSwatch(SPCSSAttr *css) } setStyle (css); + + _swatch.signal_button_press_event().connect(sigc::mem_fun(*this, &StyleSwatch::on_click)); + + _tooltips.set_tip(_swatch, main_tip); +} + +void StyleSwatch::setClickVerb(sp_verb_t verb_t) { + _verb_t = verb_t; +} + +void StyleSwatch::setDesktop(SPDesktop *desktop) { + _desktop = desktop; +} + +bool +StyleSwatch::on_click(GdkEventButton *event) +{ + if (this->_desktop && this->_verb_t != SP_VERB_NONE) { + Inkscape::Verb *verb = Inkscape::Verb::get(this->_verb_t); + SPAction *action = verb->get_action((Inkscape::UI::View::View *) this->_desktop); + sp_action_perform (action, NULL); + return true; + } + return false; } StyleSwatch::~StyleSwatch() @@ -161,7 +187,6 @@ StyleSwatch::~StyleSwatch() } if (_watched_tool) { - std::cout << " =============remove\n"; sp_repr_remove_listener_by_data(_watched_tool, this); Inkscape::GC::release(_watched_tool); _watched_tool = NULL; @@ -170,7 +195,7 @@ StyleSwatch::~StyleSwatch() } void -StyleSwatch::setWatched(Inkscape::XML::Node *watched) +StyleSwatch::setWatched(Inkscape::XML::Node *watched, Inkscape::XML::Node *secondary) { if (_watched) { sp_repr_remove_listener_by_data(_watched, this); @@ -183,6 +208,18 @@ StyleSwatch::setWatched(Inkscape::XML::Node *watched) Inkscape::GC::anchor(_watched); sp_repr_add_listener(_watched, &style_swatch_repr_events, this); sp_repr_synthesize_events(_watched, &style_swatch_repr_events, this); + + // If desktop's last-set style is empty, a tool uses its own fixed style even if set to use + // last-set (so long as it's empty). To correctly show this, we're passed the second repr, + // that of the tool prefs node, from which we now setStyle if the watched repr's style is + // empty. + if (secondary) { + SPCSSAttr *css = sp_repr_css_attr_inherited(watched, "style"); + if (!css->attributeList()) { // is css empty? + SPCSSAttr *css_secondary = sp_repr_css_attr_inherited(secondary, "style"); + this->setStyle (css_secondary); + } + } } } @@ -225,8 +262,9 @@ StyleSwatch::setStyle(SPCSSAttr *css) sp_repr_css_merge(_css, css); gchar const *css_string = sp_repr_css_write_string (_css); - SPStyle *temp_spstyle = sp_style_new(); - sp_style_merge_from_style_string (temp_spstyle, css_string); + SPStyle *temp_spstyle = sp_style_new(SP_ACTIVE_DOCUMENT); + if (css_string) + sp_style_merge_from_style_string (temp_spstyle, css_string); setStyle (temp_spstyle); @@ -259,9 +297,9 @@ StyleSwatch::setStyle(SPStyle *query) place->add(*_color_preview[i]); gchar *tip; if (i == SS_FILL) { - tip = g_strdup_printf ("Fill: %06x/%.3g", color >> 8, SP_RGBA32_A_F(color)); + tip = g_strdup_printf (_("Fill: %06x/%.3g"), color >> 8, SP_RGBA32_A_F(color)); } else { - tip = g_strdup_printf ("Stroke: %06x/%.3g", color >> 8, SP_RGBA32_A_F(color)); + tip = g_strdup_printf (_("Stroke: %06x/%.3g"), color >> 8, SP_RGBA32_A_F(color)); } _tooltips.set_tip(*place, tip); g_free (tip); @@ -283,12 +321,12 @@ StyleSwatch::setStyle(SPStyle *query) } } else if (paint->set && paint->type == SP_PAINT_TYPE_NONE) { - _value[i].set_markup(_("None")); + _value[i].set_markup(_("None")); place->add(_value[i]); _tooltips.set_tip(*place, (i == SS_FILL)? (_("No fill")) : (_("No stroke"))); if (i == SS_STROKE) has_stroke = false; } else if (!paint->set) { - _value[i].set_markup(_("Unset")); + _value[i].set_markup(_("Unset")); place->add(_value[i]); _tooltips.set_tip(*place, (i == SS_FILL)? (_("Unset fill")) : (_("Unset stroke"))); if (i == SS_STROKE) has_stroke = false; @@ -326,9 +364,9 @@ StyleSwatch::setStyle(SPStyle *query) { gchar *str; if (op == 0) - str = g_strdup_printf(_("0:%.3g"), op); + str = g_strdup_printf(_("O:%.3g"), op); else - str = g_strdup_printf(_("0:.%d"), (int) (op*10)); + str = g_strdup_printf(_("O:.%d"), (int) (op*10)); _opacity_value.set_markup (str); g_free (str); }