X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fwidget%2Fselected-style.cpp;h=9cf5aa32b39606a9d866f567275f29f83ed6ed05;hb=41d5edd305122148718ea6dcfce4f92150215f8e;hp=be707e15ee45b5487c9acb7b6770fa1335d82655;hpb=1f20d21b317b972dd652396b261d24ed08bf4110;p=inkscape.git diff --git a/src/ui/widget/selected-style.cpp b/src/ui/widget/selected-style.cpp index be707e15e..9cf5aa32b 100644 --- a/src/ui/widget/selected-style.cpp +++ b/src/ui/widget/selected-style.cpp @@ -32,9 +32,11 @@ #include "document.h" #include "widgets/widget-sizes.h" #include "widgets/spinbutton-events.h" -#include "svg/svg.h" +#include "svg/svg-color.h" #include "svg/css-ostringstream.h" #include "helper/units.h" +#include "verbs.h" +#include static gdouble const _sw_presets[] = { 32 , 16 , 10 , 8 , 6 , 4 , 3 , 2 , 1.5 , 1 , 0.75 , 0.5 , 0.25 , 0.1 }; static gchar* const _sw_presets_str[] = {"32", "16", "10", "8", "6", "4", "3", "2", "1.5", "1", "0.75", "0.5", "0.25", "0.1"}; @@ -95,8 +97,8 @@ SelectedStyle::SelectedStyle(bool layout) _stroke_flag_place (), _opacity_place (), - _opacity_adjustment (1.0, 0.0, 1.0, 0.01, 0.1), - _opacity_sb (0.02, 2), + _opacity_adjustment (100, 0.0, 100, 1.0, 10.0), + _opacity_sb (0.02, 0), _stroke (), _stroke_width (""), @@ -109,11 +111,12 @@ SelectedStyle::SelectedStyle(bool layout) _sw_unit(NULL), - _tooltips (), + _tooltips () - _drop((void*[]){0,0}), - _dropEnabled((bool[]){false, false}) { + _drop[0] = _drop[1] = 0; + _dropEnabled[0] = _dropEnabled[1] = false; + _fill_label.set_alignment(0.0, 0.5); _fill_label.set_padding(0, 0); _stroke_label.set_alignment(0.0, 0.5); @@ -373,7 +376,7 @@ SelectedStyle::setDesktop(SPDesktop *desktop) _desktop = desktop; gtk_object_set_data (GTK_OBJECT(_opacity_sb.gobj()), "dtw", _desktop->canvas); - Inkscape::Selection *selection = SP_DT_SELECTION (desktop); + Inkscape::Selection *selection = sp_desktop_selection (desktop); selection_changed_connection = new sigc::connection (selection->connectChanged( sigc::bind ( @@ -391,7 +394,7 @@ SelectedStyle::setDesktop(SPDesktop *desktop) this ) )); - //_sw_unit = (SPUnit *) SP_DT_NAMEDVIEW(desktop)->doc_units; + //_sw_unit = (SPUnit *) sp_desktop_namedview(desktop)->doc_units; } void SelectedStyle::dragDataReceived( GtkWidget *widget, @@ -424,7 +427,8 @@ void SelectedStyle::dragDataReceived( GtkWidget *widget, sp_repr_css_set_property( css, (tracker->item == SS_FILL) ? "fill":"stroke", c ); sp_desktop_set_style( tracker->parent->_desktop, css ); sp_repr_css_attr_unref( css ); - sp_document_done( SP_DT_DOCUMENT(tracker->parent->_desktop) ); + sp_document_done( sp_desktop_document(tracker->parent->_desktop) , SP_VERB_NONE, + _("Drop color")); } } break; @@ -434,33 +438,37 @@ void SelectedStyle::dragDataReceived( GtkWidget *widget, void SelectedStyle::on_fill_remove() { SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_set_property (css, "fill", "none"); - sp_desktop_set_style (_desktop, css, true, false); // do not write to current, to preserve current color + sp_desktop_set_style (_desktop, css, true, true); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Remove fill")); } void SelectedStyle::on_stroke_remove() { SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_set_property (css, "stroke", "none"); - sp_desktop_set_style (_desktop, css, true, false); // do not write to current, to preserve current color + sp_desktop_set_style (_desktop, css, true, true); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Remove stroke")); } void SelectedStyle::on_fill_unset() { SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_unset_property (css, "fill"); - sp_desktop_set_style (_desktop, css, true, false); // do not write to current, to preserve current color + sp_desktop_set_style (_desktop, css, true, true); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Unset fill")); } void SelectedStyle::on_stroke_unset() { SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_unset_property (css, "stroke"); - sp_desktop_set_style (_desktop, css, true, false); // do not write to current, to preserve current color + sp_desktop_set_style (_desktop, css, true, true); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Unset stroke")); } void SelectedStyle::on_fill_opaque() { @@ -468,7 +476,8 @@ void SelectedStyle::on_fill_opaque() { sp_repr_css_set_property (css, "fill-opacity", "1"); sp_desktop_set_style (_desktop, css, true); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Make fill opaque")); } void SelectedStyle::on_stroke_opaque() { @@ -476,7 +485,8 @@ void SelectedStyle::on_stroke_opaque() { sp_repr_css_set_property (css, "stroke-opacity", "1"); sp_desktop_set_style (_desktop, css, true); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Make fill opaque")); } void SelectedStyle::on_fill_lastused() { @@ -487,7 +497,8 @@ void SelectedStyle::on_fill_lastused() { sp_repr_css_set_property (css, "fill", c); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Apply last set color to fill")); } void SelectedStyle::on_stroke_lastused() { @@ -498,7 +509,8 @@ void SelectedStyle::on_stroke_lastused() { sp_repr_css_set_property (css, "stroke", c); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Apply last set color to stroke")); } void SelectedStyle::on_fill_lastselected() { @@ -508,7 +520,8 @@ void SelectedStyle::on_fill_lastselected() { sp_repr_css_set_property (css, "fill", c); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Apply last selected color to fill")); } void SelectedStyle::on_stroke_lastselected() { @@ -518,7 +531,8 @@ void SelectedStyle::on_stroke_lastselected() { sp_repr_css_set_property (css, "stroke", c); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Apply last selected color to stroke")); } void SelectedStyle::on_fill_invert() { @@ -537,7 +551,8 @@ void SelectedStyle::on_fill_invert() { sp_repr_css_set_property (css, "fill", c); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Invert fill")); } void SelectedStyle::on_stroke_invert() { @@ -556,7 +571,8 @@ void SelectedStyle::on_stroke_invert() { sp_repr_css_set_property (css, "stroke", c); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Invert stroke")); } void SelectedStyle::on_fill_white() { @@ -567,7 +583,8 @@ void SelectedStyle::on_fill_white() { sp_repr_css_set_property (css, "fill-opacity", "1"); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("White fill")); } void SelectedStyle::on_stroke_white() { @@ -578,7 +595,8 @@ void SelectedStyle::on_stroke_white() { sp_repr_css_set_property (css, "stroke-opacity", "1"); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("White stroke")); } void SelectedStyle::on_fill_black() { @@ -589,7 +607,8 @@ void SelectedStyle::on_fill_black() { sp_repr_css_set_property (css, "fill-opacity", "1.0"); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Black fill")); } void SelectedStyle::on_stroke_black() { @@ -600,7 +619,8 @@ void SelectedStyle::on_stroke_black() { sp_repr_css_set_property (css, "stroke-opacity", "1.0"); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Black stroke")); } void SelectedStyle::on_fill_copy() { @@ -642,7 +662,8 @@ void SelectedStyle::on_fill_paste() { sp_repr_css_set_property (css, "fill", text.c_str()); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Paste fill")); } } @@ -659,15 +680,14 @@ void SelectedStyle::on_stroke_paste() { sp_repr_css_set_property (css, "stroke", text.c_str()); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Paste stroke")); } } void SelectedStyle::on_fillstroke_swap() { SPCSSAttr *css = sp_repr_css_attr_new (); - g_message("on_fillstroke_swap()"); - switch (_mode[SS_FILL]) { case SS_NA: case SS_MANY: @@ -714,7 +734,8 @@ void SelectedStyle::on_fillstroke_swap() { sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Swap fill and stroke")); } void SelectedStyle::on_fill_edit() { @@ -776,12 +797,13 @@ bool SelectedStyle::on_opacity_click(GdkEventButton *event) { if (event->button == 2) { // middle click - const char* opacity = _opacity_sb.get_value() < 0.5? "0.5" : (_opacity_sb.get_value() == 1? "0" : "1"); + const char* opacity = _opacity_sb.get_value() < 50? "0.5" : (_opacity_sb.get_value() == 100? "0" : "1"); SPCSSAttr *css = sp_repr_css_attr_new (); sp_repr_css_set_property (css, "opacity", opacity); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT (_desktop)); + sp_document_done (sp_desktop_document (_desktop), SP_VERB_DIALOG_FILL_STROKE, + _("Change opacity")); return true; } @@ -812,9 +834,11 @@ void SelectedStyle::on_popup_preset(int i) { Inkscape::CSSOStringStream os; os << w; sp_repr_css_set_property (css, "stroke-width", os.str().c_str()); + // FIXME: update dash patterns! sp_desktop_set_style (_desktop, css, true); sp_repr_css_attr_unref (css); - sp_document_done (SP_DT_DOCUMENT(_desktop)); + sp_document_done (sp_desktop_document(_desktop), SP_VERB_DIALOG_SWATCHES, + _("Change stroke width")); } void @@ -887,24 +911,27 @@ SelectedStyle::update() } else if (paint->set && paint->type == SP_PAINT_TYPE_PAINTSERVER) { SPPaintServer *server = (i == SS_FILL)? SP_STYLE_FILL_SERVER (query) : SP_STYLE_STROKE_SERVER (query); - - Inkscape::XML::Node *srepr = SP_OBJECT_REPR(server); - _paintserver_id[i] += "url(#"; - _paintserver_id[i] += srepr->attribute("id"); - _paintserver_id[i] += ")"; - - if (SP_IS_LINEARGRADIENT (server)) { - place->add(_lgradient[i]); - _tooltips.set_tip(*place, __lgradient[i]); - _mode[i] = SS_LGRADIENT; - } else if (SP_IS_RADIALGRADIENT (server)) { - place->add(_rgradient[i]); - _tooltips.set_tip(*place, __rgradient[i]); - _mode[i] = SS_RGRADIENT; - } else if (SP_IS_PATTERN (server)) { - place->add(_pattern[i]); - _tooltips.set_tip(*place, __pattern[i]); - _mode[i] = SS_PATTERN; + if ( server ) { + Inkscape::XML::Node *srepr = SP_OBJECT_REPR(server); + _paintserver_id[i] += "url(#"; + _paintserver_id[i] += srepr->attribute("id"); + _paintserver_id[i] += ")"; + + if (SP_IS_LINEARGRADIENT (server)) { + place->add(_lgradient[i]); + _tooltips.set_tip(*place, __lgradient[i]); + _mode[i] = SS_LGRADIENT; + } else if (SP_IS_RADIALGRADIENT (server)) { + place->add(_rgradient[i]); + _tooltips.set_tip(*place, __rgradient[i]); + _mode[i] = SS_RGRADIENT; + } else if (SP_IS_PATTERN (server)) { + place->add(_pattern[i]); + _tooltips.set_tip(*place, __pattern[i]); + _mode[i] = SS_PATTERN; + } + } else { + g_warning ("file %s: line %d: Unknown paint server", __FILE__, __LINE__); } } else if (paint->set && paint->type == SP_PAINT_TYPE_NONE) { @@ -936,21 +963,25 @@ SelectedStyle::update() // Now query opacity _tooltips.unset_tip(_opacity_place); + _tooltips.unset_tip(_opacity_sb); int result = sp_desktop_query_style (_desktop, query, QUERY_STYLE_PROPERTY_MASTEROPACITY); switch (result) { case QUERY_STYLE_NOTHING: _tooltips.set_tip(_opacity_place, _("Nothing selected")); + _tooltips.set_tip(_opacity_sb, _("Nothing selected")); _opacity_sb.set_sensitive(false); break; case QUERY_STYLE_SINGLE: case QUERY_STYLE_MULTIPLE_AVERAGED: case QUERY_STYLE_MULTIPLE_SAME: - _tooltips.set_tip(_opacity_place, _("Master opacity")); + _tooltips.set_tip(_opacity_place, _("Master opacity, %")); + _tooltips.set_tip(_opacity_sb, _("Master opacity, %")); + if (_opacity_blocked) break; _opacity_blocked = true; _opacity_sb.set_sensitive(true); - _opacity_adjustment.set_value(SP_SCALE24_TO_FLOAT(query->opacity.value)); + _opacity_adjustment.set_value(SP_SCALE24_TO_FLOAT(query->opacity.value) * 100); _opacity_blocked = false; break; } @@ -995,10 +1026,10 @@ SelectedStyle::update() } void SelectedStyle::opacity_0(void) {_opacity_sb.set_value(0);} -void SelectedStyle::opacity_025(void) {_opacity_sb.set_value(0.25);} -void SelectedStyle::opacity_05(void) {_opacity_sb.set_value(0.5);} -void SelectedStyle::opacity_075(void) {_opacity_sb.set_value(0.75);} -void SelectedStyle::opacity_1(void) {_opacity_sb.set_value(1.0);} +void SelectedStyle::opacity_025(void) {_opacity_sb.set_value(25);} +void SelectedStyle::opacity_05(void) {_opacity_sb.set_value(50);} +void SelectedStyle::opacity_075(void) {_opacity_sb.set_value(75);} +void SelectedStyle::opacity_1(void) {_opacity_sb.set_value(100);} void SelectedStyle::on_opacity_menu (Gtk::Menu *menu) { @@ -1015,25 +1046,25 @@ void SelectedStyle::on_opacity_menu (Gtk::Menu *menu) { } { Gtk::MenuItem *item = new Gtk::MenuItem; - item->add(*(new Gtk::Label("0.25", 0, 0))); + item->add(*(new Gtk::Label("25%", 0, 0))); item->signal_activate().connect(sigc::mem_fun(*this, &SelectedStyle::opacity_025 )); menu->add(*item); } { Gtk::MenuItem *item = new Gtk::MenuItem; - item->add(*(new Gtk::Label("0.5", 0, 0))); + item->add(*(new Gtk::Label("50%", 0, 0))); item->signal_activate().connect(sigc::mem_fun(*this, &SelectedStyle::opacity_05 )); menu->add(*item); } { Gtk::MenuItem *item = new Gtk::MenuItem; - item->add(*(new Gtk::Label("0.75", 0, 0))); + item->add(*(new Gtk::Label("75%", 0, 0))); item->signal_activate().connect(sigc::mem_fun(*this, &SelectedStyle::opacity_075 )); menu->add(*item); } { Gtk::MenuItem *item = new Gtk::MenuItem; - item->add(*(new Gtk::Label(_("1.0 (opaque)"), 0, 0))); + item->add(*(new Gtk::Label(_("100% (opaque)"), 0, 0))); item->signal_activate().connect(sigc::mem_fun(*this, &SelectedStyle::opacity_1 )); menu->add(*item); } @@ -1047,11 +1078,22 @@ void SelectedStyle::on_opacity_changed () { _opacity_blocked = true; SPCSSAttr *css = sp_repr_css_attr_new (); Inkscape::CSSOStringStream os; - os << CLAMP (_opacity_adjustment.get_value(), 0.0, 1.0); + os << CLAMP ((_opacity_adjustment.get_value() / 100), 0.0, 1.0); sp_repr_css_set_property (css, "opacity", os.str().c_str()); + // FIXME: workaround for GTK breakage: display interruptibility sometimes results in GTK + // sending multiple value-changed events. As if when Inkscape interrupts redraw for main loop + // iterations, GTK discovers that this callback hasn't finished yet, and for some weird reason + // decides to add yet another value-changed event to the queue. Totally braindead if you ask + // me. As a result, scrolling the spinbutton once results in runaway change until it hits 1.0 + // or 0.0. (And no, this is not a race with ::update, I checked that.) + // Sigh. So we disable interruptibility while we're setting the new value. + sp_canvas_force_full_redraw_after_interruptions(sp_desktop_canvas(_desktop), 0); sp_desktop_set_style (_desktop, css); sp_repr_css_attr_unref (css); - sp_document_maybe_done (SP_DT_DOCUMENT (_desktop), "fillstroke:opacity"); + sp_document_maybe_done (sp_desktop_document (_desktop), "fillstroke:opacity", SP_VERB_DIALOG_FILL_STROKE, + _("Change opacity")); + // resume interruptibility + sp_canvas_end_forced_full_redraws(sp_desktop_canvas(_desktop)); spinbutton_defocus(GTK_OBJECT(_opacity_sb.gobj())); _opacity_blocked = false; }