summaryrefslogtreecommitdiffstats
path: root/src/widgets/stroke-style.cpp
diff options
context:
space:
mode:
authorJohn Smith <john.smith7545@yahoo.com>2012-08-04 01:55:39 +0000
committerJohn Smith <john.smith7545@yahoo.com>2012-08-04 01:55:39 +0000
commit6946c98d961a414b23a056ad15c784ac114f12c8 (patch)
tree328484fceb73da7b4665594386a1f6186afe2013 /src/widgets/stroke-style.cpp
parentFix for 575831 : Add font variant drop-down box to new text toolbar (diff)
downloadinkscape-6946c98d961a414b23a056ad15c784ac114f12c8.tar.gz
inkscape-6946c98d961a414b23a056ad15c784ac114f12c8.zip
Fix for 1032880 : Stroke style panel is mirrored between open windows
(bzr r11587)
Diffstat (limited to 'src/widgets/stroke-style.cpp')
-rw-r--r--src/widgets/stroke-style.cpp981
1 files changed, 434 insertions, 547 deletions
diff --git a/src/widgets/stroke-style.cpp b/src/widgets/stroke-style.cpp
index d6168ca04..1a1865326 100644
--- a/src/widgets/stroke-style.cpp
+++ b/src/widgets/stroke-style.cpp
@@ -17,106 +17,309 @@
#define noSP_SS_VERBOSE
-#include "widgets/dash-selector.h"
-#include <gtkmm/radiobutton.h>
-#include <gtkmm/table.h>
-#include <glibmm/i18n.h>
-
-#include "desktop-handles.h"
-#include "desktop-style.h"
-#include "dialogs/dialog-events.h"
-#include "display/canvas-bpath.h" // for SP_STROKE_LINEJOIN_*
-#include "display/drawing.h"
-#include "document-private.h"
-#include "document-undo.h"
-#include "gradient-chemistry.h"
-#include "helper/stock-items.h"
-#include "helper/unit-menu.h"
-#include "helper/units.h"
-#include "inkscape.h"
-#include "io/sys.h"
-#include "marker.h"
-#include "path-prefix.h"
-#include "selection.h"
-#include "sp-linear-gradient.h"
-#include "sp-namedview.h"
-#include "sp-pattern.h"
-#include "sp-radial-gradient.h"
-#include "sp-rect.h"
-#include "sp-text.h"
-#include "style.h"
-#include "svg/css-ostringstream.h"
-#include "ui/cache/svg_preview_cache.h"
-#include "ui/icon-names.h"
-#include "widgets/icon.h"
-#include "widgets/paint-selector.h"
-#include "widgets/sp-widget.h"
-#include "widgets/spw-utilities.h"
-#include "ui/widget/spinbutton.h"
-#include "xml/repr.h"
-
#include "stroke-style.h"
-#include "stroke-marker-selector.h"
-#include "fill-style.h" // to get sp_fill_style_widget_set_desktop
-#include "fill-n-stroke-factory.h"
-
-#include "verbs.h"
using Inkscape::DocumentUndo;
-
-static MarkerComboBox *start_marker_combobox = NULL;
-static MarkerComboBox *mid_marker_combobox = NULL;
-static MarkerComboBox *end_marker_combobox = NULL;
-
-sigc::connection start_marker_connection;
-sigc::connection mid_marker_connection;
-sigc::connection end_marker_connection;
-
-static SPObject *ink_extract_marker_name(gchar const *n, SPDocument *doc);
-static void ink_markers_combo_update(Gtk::Container* spw, SPMarkerLoc const which);
-
+/**
+ * Creates a new widget for the line stroke paint.
+ */
Gtk::Widget *sp_stroke_style_paint_widget_new(void)
{
return Inkscape::Widgets::createStyleWidget( STROKE );
}
+/**
+ * Creates a new widget for the line stroke style.
+ */
+Gtk::Widget *sp_stroke_style_line_widget_new(void)
+{
+ return Inkscape::Widgets::createStrokeStyleWidget();
+}
+
void sp_stroke_style_widget_set_desktop(Gtk::Widget *widget, SPDesktop *desktop)
{
- sp_fill_style_widget_set_desktop(widget, desktop);
+ Inkscape::StrokeStyle *ss = dynamic_cast<Inkscape::StrokeStyle*>(widget);
+ if (ss) {
+ ss->setDesktop(desktop);
+ }
+}
+
+namespace Inkscape {
+
+/**
+ * Create the fill or stroke style widget, and hook up all the signals.
+ */
+Gtk::Widget *Inkscape::Widgets::createStrokeStyleWidget( )
+{
+ StrokeStyle *strokeStyle = new StrokeStyle();
+
+ return strokeStyle;
}
-/* Line */
+StrokeStyle::StrokeStyle() :
+ Gtk::VBox(),
+ miterLimitSpin(),
+ widthSpin(),
+ unitSelector(),
+ joinMiter(),
+ joinRound(),
+ joinBevel(),
+ capButt(),
+ capRound(),
+ capSquare(),
+ dashSelector(),
+ update(false),
+ desktop(0),
+ selectChangedConn(),
+ selectModifiedConn(),
+ startMarkerConn(),
+ midMarkerConn(),
+ endMarkerConn()
+{
+ Gtk::HBox *hb;
+ Gtk::HBox *f = new Gtk::HBox(false, 0);
+ f->show();
+ add(*f);
+
+ table = new Gtk::Table(3, 6, false);
+ table->show();
+ table->set_border_width(4);
+ table->set_row_spacings(4);
+ f->add(*table);
-static void sp_stroke_style_line_selection_modified(SPWidget *spw, Inkscape::Selection *selection, guint flags, gpointer data);
-static void sp_stroke_style_line_selection_changed(SPWidget *spw, Inkscape::Selection *selection, gpointer data);
+ gint i = 0;
+
+ //spw_label(t, C_("Stroke width", "_Width:"), 0, i);
-static void sp_stroke_style_line_update(Gtk::Container *spw, Inkscape::Selection *sel);
+ hb = spw_hbox(table, 3, 1, i);
-static void sp_stroke_style_set_join_buttons(Gtk::Container *spw, Gtk::ToggleButton *active);
+// TODO: when this is gtkmmified, use an Inkscape::UI::Widget::ScalarUnit instead of the separate
+// spinbutton and unit selector for stroke width. In sp_stroke_style_line_update, use
+// setHundredPercent to remember the averaged width corresponding to 100%. Then the
+// stroke_width_set_unit will be removed (because ScalarUnit takes care of conversions itself), and
+// with it, the two remaining calls of stroke_average_width, allowing us to get rid of that
+// function in desktop-style.
-static void sp_stroke_style_set_cap_buttons(Gtk::Container *spw, Gtk::ToggleButton *active);
+#if WITH_GTKMM_3_0
+ widthAdj = new Glib::RefPtr<Gtk::Adjustment>(Gtk::Adjustment::create(1.0, 0.0, 1000.0, 0.1, 10.0, 0.0));
+#else
+ widthAdj = new Gtk::Adjustment(1.0, 0.0, 1000.0, 0.1, 10.0, 0.0);
+#endif
-static void sp_stroke_style_width_changed(Gtk::Container *spw);
-static void sp_stroke_style_miterlimit_changed(Gtk::Container *spw);
-static void sp_stroke_style_any_toggled(Gtk::ToggleButton *tb, Gtk::Container *spw);
-static void sp_stroke_style_line_dash_changed(Gtk::Container *spw);
+ widthSpin = new Inkscape::UI::Widget::SpinButton(*widthAdj, 0.1, 3);
+ widthSpin->set_tooltip_text(_("Stroke width"));
+ widthSpin->show();
+ spw_label(table, C_("Stroke width", "_Width:"), 0, i, widthSpin);
-static void sp_stroke_style_update_marker_combo(Gtk::Container *spw, GSList const *objects);
+ sp_dialog_defocus_on_enter_cpp(widthSpin);
+
+ hb->pack_start(*widthSpin, false, false, 0);
+ unitSelector = sp_unit_selector_new(SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
+ Gtk::Widget *us = manage(Glib::wrap(unitSelector));
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+
+ if (desktop)
+ sp_unit_selector_set_unit (SP_UNIT_SELECTOR(unitSelector), sp_desktop_namedview(desktop)->doc_units);
+ sp_unit_selector_add_unit(SP_UNIT_SELECTOR(unitSelector), &sp_unit_get_by_id(SP_UNIT_PERCENT), 0);
+ g_signal_connect ( G_OBJECT (unitSelector), "set_unit", G_CALLBACK (StrokeStyle::setStrokeWidthUnit), this );
+ us->show();
+
+#if WITH_GTKMM_3_0
+ sp_unit_selector_add_adjustment( SP_UNIT_SELECTOR(unitSelector), GTK_ADJUSTMENT((*widthAdj)->gobj()) );
+#else
+ sp_unit_selector_add_adjustment( SP_UNIT_SELECTOR(unitSelector), GTK_ADJUSTMENT(widthAdj->gobj()) );
+#endif
+
+ hb->pack_start(*us, FALSE, FALSE, 0);
+
+#if WITH_GTKMM_3_0
+ (*widthAdj)->signal_value_changed().connect(sigc::mem_fun(*this, &StrokeStyle::widthChangedCB));
+#else
+ widthAdj->signal_value_changed().connect(sigc::mem_fun(*this, &StrokeStyle::widthChangedCB));
+#endif
+ i++;
+
+ /* Join type */
+ // TRANSLATORS: The line join style specifies the shape to be used at the
+ // corners of paths. It can be "miter", "round" or "bevel".
+ spw_label(table, _("Join:"), 0, i, NULL);
+
+ hb = spw_hbox(table, 3, 1, i);
+
+ //tb = NULL;
+
+ joinMiter = makeRadioButton(NULL, INKSCAPE_ICON("stroke-join-miter"),
+ hb, "join", "miter");
+ // TRANSLATORS: Miter join: joining lines with a sharp (pointed) corner.
+ // For an example, draw a triangle with a large stroke width and modify the
+ // "Join" option (in the Fill and Stroke dialog).
+ joinMiter->set_tooltip_text(_("Miter join"));
+
+ joinRound = makeRadioButton(joinMiter, INKSCAPE_ICON("stroke-join-round"),
+ hb, "join", "round");
+ // TRANSLATORS: Round join: joining lines with a rounded corner.
+ // For an example, draw a triangle with a large stroke width and modify the
+ // "Join" option (in the Fill and Stroke dialog).
+ joinRound->set_tooltip_text(_("Round join"));
+
+ joinBevel = makeRadioButton(joinMiter, INKSCAPE_ICON("stroke-join-bevel"),
+ hb, "join", "bevel");
+ // TRANSLATORS: Bevel join: joining lines with a blunted (flattened) corner.
+ // For an example, draw a triangle with a large stroke width and modify the
+ // "Join" option (in the Fill and Stroke dialog).
+ joinBevel->set_tooltip_text(_("Bevel join"));
+
+ i++;
+
+ /* Miterlimit */
+ // TRANSLATORS: Miter limit: only for "miter join", this limits the length
+ // of the sharp "spike" when the lines connect at too sharp an angle.
+ // When two line segments meet at a sharp angle, a miter join results in a
+ // spike that extends well beyond the connection point. The purpose of the
+ // miter limit is to cut off such spikes (i.e. convert them into bevels)
+ // when they become too long.
+ //spw_label(t, _("Miter _limit:"), 0, i);
+
+ hb = spw_hbox(table, 3, 1, i);
+
+#if WITH_GTKMM_3_0
+ miterLimitAdj = new Glib::RefPtr<Gtk::Adjustment>(Gtk::Adjustment::create(4.0, 0.0, 100.0, 0.1, 10.0, 0.0));
+ miterLimitSpin = new Inkscape::UI::Widget::SpinButton(*miterLimitAdj, 0.1, 2);
+#else
+ miterLimitAdj = new Gtk::Adjustment(4.0, 0.0, 100.0, 0.1, 10.0, 0.0);
+ miterLimitSpin = new Inkscape::UI::Widget::SpinButton(*miterLimitAdj, 0.1, 2);
+#endif
+
+ miterLimitSpin->set_tooltip_text(_("Maximum length of the miter (in units of stroke width)"));
+ miterLimitSpin->show();
+ spw_label(table, _("Miter _limit:"), 0, i, miterLimitSpin);
+ sp_dialog_defocus_on_enter_cpp(miterLimitSpin);
+
+ hb->pack_start(*miterLimitSpin, false, false, 0);
+
+#if WITH_GTKMM_3_0
+ (*miterLimitAdj)->signal_value_changed().connect(sigc::mem_fun(*this, &StrokeStyle::miterLimitChangedCB));
+
+#else
+ miterLimitAdj->signal_value_changed().connect(sigc::mem_fun(*this, &StrokeStyle::miterLimitChangedCB));
+#endif
+ i++;
+
+ /* Cap type */
+ // TRANSLATORS: cap type specifies the shape for the ends of lines
+ //spw_label(t, _("_Cap:"), 0, i);
+ spw_label(table, _("Cap:"), 0, i, NULL);
+
+ hb = spw_hbox(table, 3, 1, i);
+
+ capButt = makeRadioButton(capButt, INKSCAPE_ICON("stroke-cap-butt"),
+ hb, "cap", "butt");
+ // TRANSLATORS: Butt cap: the line shape does not extend beyond the end point
+ // of the line; the ends of the line are square
+ capButt->set_tooltip_text(_("Butt cap"));
+
+ capRound = makeRadioButton(capButt, INKSCAPE_ICON("stroke-cap-round"),
+ hb, "cap", "round");
+ // TRANSLATORS: Round cap: the line shape extends beyond the end point of the
+ // line; the ends of the line are rounded
+ capRound->set_tooltip_text(_("Round cap"));
+
+ capSquare = makeRadioButton(capButt, INKSCAPE_ICON("stroke-cap-square"),
+ hb, "cap", "square");
+ // TRANSLATORS: Square cap: the line shape extends beyond the end point of the
+ // line; the ends of the line are square
+ capSquare->set_tooltip_text(_("Square cap"));
+
+ i++;
+
+ /* Dash */
+ spw_label(table, _("Dashes:"), 0, i, NULL); //no mnemonic for now
+ //decide what to do:
+ // implement a set_mnemonic_source function in the
+ // SPDashSelector class, so that we do not have to
+ // expose any of the underlying widgets?
+ dashSelector = manage(new SPDashSelector);
+
+ dashSelector->show();
+ table->attach(*dashSelector, 1, 4, i, i+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 0, 0);
+ dashSelector->changed_signal.connect(sigc::mem_fun(*this, &StrokeStyle::lineDashChangedCB));
+
+ i++;
+
+ /* Drop down marker selectors*/
+ // TRANSLATORS: Path markers are an SVG feature that allows you to attach arbitrary shapes
+ // (arrowheads, bullets, faces, whatever) to the start, end, or middle nodes of a path.
+
+ startMarkerCombo = manage(new MarkerComboBox("marker-start"));
+ spw_label(table, _("_Start Markers:"), 0, i, startMarkerCombo);
+ startMarkerCombo->set_tooltip_text(_("Start Markers are drawn on the first node of a path or shape"));
+ startMarkerConn = startMarkerCombo->signal_changed().connect(
+ sigc::bind<MarkerComboBox *, StrokeStyle *, SPMarkerLoc>(
+ sigc::ptr_fun(&StrokeStyle::markerSelectCB), startMarkerCombo, this, SP_MARKER_LOC_START));
+ startMarkerCombo->show();
+ table->attach(*startMarkerCombo, 1, 4, i, i+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 0, 0);
+ i++;
+
+ midMarkerCombo = manage(new MarkerComboBox("marker-mid"));
+ spw_label(table, _("_Mid Markers:"), 0, i, midMarkerCombo);
+ midMarkerCombo->set_tooltip_text(_("Mid Markers are drawn on every node of a path or shape except the first and last nodes"));
+ midMarkerConn = midMarkerCombo->signal_changed().connect(
+ sigc::bind<MarkerComboBox *, StrokeStyle *, SPMarkerLoc>(
+ sigc::ptr_fun(&StrokeStyle::markerSelectCB), midMarkerCombo, this, SP_MARKER_LOC_MID));
+ midMarkerCombo->show();
+ table->attach(*midMarkerCombo, 1, 4, i, i+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 0, 0);
+ i++;
+
+ endMarkerCombo = manage(new MarkerComboBox("marker-end"));
+ spw_label(table, _("_End Markers:"), 0, i, endMarkerCombo);
+ endMarkerCombo->set_tooltip_text(_("End Markers are drawn on the last node of a path or shape"));
+ endMarkerConn = endMarkerCombo->signal_changed().connect(
+ sigc::bind<MarkerComboBox *, StrokeStyle *, SPMarkerLoc>(
+ sigc::ptr_fun(&StrokeStyle::markerSelectCB), endMarkerCombo, this, SP_MARKER_LOC_END));
+ endMarkerCombo->show();
+ table->attach(*endMarkerCombo, 1, 4, i, i+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 0, 0);
+ i++;
+
+ setDesktop(desktop);
+ updateLine();
+
+}
+
+StrokeStyle::~StrokeStyle()
+{
+ selectModifiedConn.disconnect();
+ selectChangedConn.disconnect();
+}
+
+void StrokeStyle::setDesktop(SPDesktop *desktop)
+{
+ if (this->desktop != desktop) {
+
+ if (this->desktop) {
+ selectModifiedConn.disconnect();
+ selectChangedConn.disconnect();
+ }
+ this->desktop = desktop;
+ if (desktop && desktop->selection) {
+ selectChangedConn = desktop->selection->connectChanged(sigc::hide(sigc::mem_fun(*this, &StrokeStyle::selectionChangedCB)));
+ selectModifiedConn = desktop->selection->connectModified(sigc::hide<0>(sigc::mem_fun(*this, &StrokeStyle::selectionModifiedCB)));
+ }
+ updateLine();
+ }
+}
/**
* Helper function for creating radio buttons. This should probably be re-thought out
* when reimplementing this with Gtkmm.
*/
-static Gtk::RadioButton *
-sp_stroke_radio_button(Gtk::RadioButton *tb, char const *icon,
- Gtk::HBox *hb, Gtk::Container *spw,
- gchar const *key, gchar const *data)
+Gtk::RadioButton *
+StrokeStyle::makeRadioButton(Gtk::RadioButton *tb, char const *icon,
+ Gtk::HBox *hb, gchar const *key, gchar const *data)
{
g_assert(icon != NULL);
g_assert(hb != NULL);
- g_assert(spw != NULL);
if (tb == NULL) {
tb = new Gtk::RadioButton();
@@ -128,10 +331,13 @@ sp_stroke_radio_button(Gtk::RadioButton *tb, char const *icon,
tb->show();
tb->set_mode(false);
hb->pack_start(*tb, false, false, 0);
- spw->set_data(icon, tb);
+ // TODO
+ set_data(icon, tb);
tb->set_data(key, (gpointer*)data);
- tb->signal_toggled().connect(sigc::bind<Gtk::RadioButton *, Gtk::Container *>(
- sigc::ptr_fun(&sp_stroke_style_any_toggled), tb, spw));
+
+ tb->signal_toggled().connect(sigc::bind<Gtk::RadioButton *, StrokeStyle *>(
+ sigc::ptr_fun(&StrokeStyle::buttonToggledCB), tb, this));
+
Gtk::Widget *px = manage(Glib::wrap(sp_icon_new(Inkscape::ICON_SIZE_LARGE_TOOLBAR, icon)));
g_assert(px != NULL);
px->show();
@@ -146,15 +352,14 @@ sp_stroke_radio_button(Gtk::RadioButton *tb, char const *icon,
* Gets the marker uri string and applies it to all selected
* items in the current desktop.
*/
-static void
-sp_marker_select(MarkerComboBox *marker_combo, Gtk::Container *spw, SPMarkerLoc const which)
+void
+StrokeStyle::markerSelectCB(MarkerComboBox *marker_combo, StrokeStyle *spw, SPMarkerLoc const which)
{
- if (spw->get_data("update")) {
+ if (spw->update) {
return;
}
- SPDesktop *desktop = inkscape_active_desktop();
- SPDocument *document = sp_desktop_document(desktop);
+ SPDocument *document = sp_desktop_document(spw->desktop);
if (!document) {
return;
}
@@ -162,7 +367,6 @@ sp_marker_select(MarkerComboBox *marker_combo, Gtk::Container *spw, SPMarkerLoc
/* Get Marker */
gchar const *marker = marker_combo->get_active_marker_uri();
-
SPCSSAttr *css = sp_repr_css_attr_new();
gchar const *combo_id = marker_combo->get_id();
sp_repr_css_set_property(css, combo_id, marker);
@@ -170,9 +374,9 @@ sp_marker_select(MarkerComboBox *marker_combo, Gtk::Container *spw, SPMarkerLoc
// Also update the marker combobox, so the document's markers
// show up at the top of the combobox
// sp_stroke_style_line_update( SP_WIDGET(spw), desktop ? sp_desktop_selection(desktop) : NULL);
- ink_markers_combo_update(spw, which);
+ spw->updateMarkerHist(which);
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(spw->desktop);
GSList const *items = selection->itemList();
for (; items != NULL; items = items->next) {
SPItem *item = reinterpret_cast<SPItem *>(items->data);
@@ -195,26 +399,26 @@ sp_marker_select(MarkerComboBox *marker_combo, Gtk::Container *spw, SPMarkerLoc
};
-static void
-ink_markers_combo_update(Gtk::Container* /*spw*/, SPMarkerLoc const which) {
+void
+StrokeStyle::updateMarkerHist(SPMarkerLoc const which) {
switch (which) {
case SP_MARKER_LOC_START:
- start_marker_connection.block();
- start_marker_combobox->set_active_history();
- start_marker_connection.unblock();
+ startMarkerConn.block();
+ startMarkerCombo->set_active_history();
+ startMarkerConn.unblock();
break;
case SP_MARKER_LOC_MID:
- mid_marker_connection.block();
- mid_marker_combobox->set_active_history();
- mid_marker_connection.unblock();
+ midMarkerConn.block();
+ midMarkerCombo->set_active_history();
+ midMarkerConn.unblock();
break;
case SP_MARKER_LOC_END:
- end_marker_connection.block();
- end_marker_combobox->set_active_history();
- end_marker_connection.unblock();
+ endMarkerConn.block();
+ endMarkerCombo->set_active_history();
+ endMarkerConn.unblock();
break;
default:
g_assert_not_reached();
@@ -225,22 +429,20 @@ ink_markers_combo_update(Gtk::Container* /*spw*/, SPMarkerLoc const which) {
* Sets the stroke width units for all selected items.
* Also handles absolute and dimensionless units.
*/
-static gboolean stroke_width_set_unit(SPUnitSelector *,
+gboolean StrokeStyle::setStrokeWidthUnit(SPUnitSelector *,
SPUnit const *old,
SPUnit const *new_units,
- Gtk::Container *spw)
+ StrokeStyle *spw)
{
- if (spw->get_data("update")) {
+ if (spw->update) {
return FALSE;
}
- SPDesktop *desktop = SP_ACTIVE_DESKTOP;
-
- if (!desktop) {
+ if (!spw->desktop) {
return FALSE;
}
- Inkscape::Selection *selection = sp_desktop_selection (desktop);
+ Inkscape::Selection *selection = sp_desktop_selection (spw->desktop);
if (selection->isEmpty())
return FALSE;
@@ -251,14 +453,12 @@ static gboolean stroke_width_set_unit(SPUnitSelector *,
(new_units->base == SP_UNIT_DIMENSIONLESS)) {
/* Absolute to percentage */
- spw->set_data ("update", GUINT_TO_POINTER (TRUE));
+ spw->update = true;
#if WITH_GTKMM_3_0
- Glib::RefPtr<Gtk::Adjustment> *a = static_cast<Glib::RefPtr<Gtk::Adjustment> *>(spw->get_data("width"));
- float w = sp_units_get_pixels( (*a)->get_value(), *old);
+ float w = sp_units_get_pixels( (*spw->widthAdj)->get_value(), *old);
#else
- Gtk::Adjustment *a = static_cast<Gtk::Adjustment *>(spw->get_data("width"));
- float w = sp_units_get_pixels(a->get_value(), *old);
+ float w = sp_units_get_pixels(spw->widthAdj->get_value(), *old);
#endif
gdouble average = stroke_average_width (objects);
@@ -267,330 +467,62 @@ static gboolean stroke_width_set_unit(SPUnitSelector *,
return FALSE;
#if WITH_GTKMM_3_0
- (*a)->set_value(100.0 * w / average);
+ (*spw->widthAdj)->set_value(100.0 * w / average);
#else
- a->set_value(100.0 * w / average);
+ spw->widthAdj->set_value(100.0 * w / average);
#endif
- spw->set_data ("update", GUINT_TO_POINTER (FALSE));
+ spw->update = false;
return TRUE;
} else if ((old->base == SP_UNIT_DIMENSIONLESS) &&
(new_units->base == SP_UNIT_ABSOLUTE || new_units->base == SP_UNIT_DEVICE)) {
/* Percentage to absolute */
- spw->set_data ("update", GUINT_TO_POINTER (TRUE));
-
-#if WITH_GTKMM_3_0
- Glib::RefPtr<Gtk::Adjustment> *a = static_cast<Glib::RefPtr<Gtk::Adjustment> *>(spw->get_data("width"));
-#else
- Gtk::Adjustment *a = static_cast<Gtk::Adjustment *>(spw->get_data("width"));
-#endif
+ spw->update = true;
gdouble average = stroke_average_width (objects);
#if WITH_GTKMM_3_0
- (*a)->set_value (sp_pixels_get_units (0.01 * (*a)->get_value() * average, *new_units));
+ (*spw->widthAdj)->set_value (sp_pixels_get_units (0.01 * (*spw->widthAdj)->get_value() * average, *new_units));
#else
- a->set_value (sp_pixels_get_units (0.01 * a->get_value() * average, *new_units));
+ spw->widthAdj->set_value (sp_pixels_get_units (0.01 * spw->widthAdj->get_value() * average, *new_units));
#endif
- spw->set_data ("update", GUINT_TO_POINTER (FALSE));
+ spw->update = false;
return TRUE;
}
return FALSE;
}
-
-/**
- * Creates a new widget for the line stroke style.
- */
-Gtk::Container *sp_stroke_style_line_widget_new(void)
-{
- Inkscape::UI::Widget::SpinButton *sb;
- Gtk::RadioButton *tb;
- Gtk::HBox *hb;
-
- GtkWidget *spw_old = sp_widget_new_global(INKSCAPE);
- Gtk::Container *spw = dynamic_cast<Gtk::Container *>(manage(Glib::wrap(spw_old)));
-
- Gtk::HBox *f = new Gtk::HBox(false, 0);
- f->show();
- spw->add(*f);
-
- Gtk::Table *t = new Gtk::Table(3, 6, false);
- t->show();
- t->set_border_width(4);
- t->set_row_spacings(4);
- f->add(*t);
- spw->set_data("stroke", t);
-
- gint i = 0;
-
- //spw_label(t, C_("Stroke width", "_Width:"), 0, i);
-
- hb = spw_hbox(t, 3, 1, i);
-
-// TODO: when this is gtkmmified, use an Inkscape::UI::Widget::ScalarUnit instead of the separate
-// spinbutton and unit selector for stroke width. In sp_stroke_style_line_update, use
-// setHundredPercent to remember the averaged width corresponding to 100%. Then the
-// stroke_width_set_unit will be removed (because ScalarUnit takes care of conversions itself), and
-// with it, the two remaining calls of stroke_average_width, allowing us to get rid of that
-// function in desktop-style.
-
-#if WITH_GTKMM_3_0
- Glib::RefPtr<Gtk::Adjustment> *a = new Glib::RefPtr<Gtk::Adjustment>(Gtk::Adjustment::create(1.0, 0.0, 1000.0, 0.1, 10.0, 0.0));
-#else
- Gtk::Adjustment *a = new Gtk::Adjustment(1.0, 0.0, 1000.0, 0.1, 10.0, 0.0);
-#endif
-
- spw->set_data("width", a);
- sb = new Inkscape::UI::Widget::SpinButton(*a, 0.1, 3);
- sb->set_tooltip_text(_("Stroke width"));
- sb->show();
- spw_label(t, C_("Stroke width", "_Width:"), 0, i, sb);
-
- sp_dialog_defocus_on_enter_cpp(sb);
-
- hb->pack_start(*sb, false, false, 0);
- GtkWidget *us_old = sp_unit_selector_new(SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
- Gtk::Widget *us = manage(Glib::wrap(us_old));
- SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- if (desktop)
- sp_unit_selector_set_unit (SP_UNIT_SELECTOR(us_old), sp_desktop_namedview(desktop)->doc_units);
- sp_unit_selector_add_unit(SP_UNIT_SELECTOR(us_old), &sp_unit_get_by_id(SP_UNIT_PERCENT), 0);
- g_signal_connect ( G_OBJECT (us_old), "set_unit", G_CALLBACK (stroke_width_set_unit), spw );
- us->show();
-
-#if WITH_GTKMM_3_0
- sp_unit_selector_add_adjustment( SP_UNIT_SELECTOR(us_old), GTK_ADJUSTMENT((*a)->gobj()) );
-#else
- sp_unit_selector_add_adjustment( SP_UNIT_SELECTOR(us_old), GTK_ADJUSTMENT(a->gobj()) );
-#endif
-
- hb->pack_start(*us, FALSE, FALSE, 0);
- spw->set_data("units", us_old);
-
-#if WITH_GTKMM_3_0
- (*a)->signal_value_changed().connect(sigc::bind(sigc::ptr_fun(&sp_stroke_style_width_changed), spw));
-#else
- a->signal_value_changed().connect(sigc::bind(sigc::ptr_fun(&sp_stroke_style_width_changed), spw));
-#endif
- i++;
-
- /* Join type */
- // TRANSLATORS: The line join style specifies the shape to be used at the
- // corners of paths. It can be "miter", "round" or "bevel".
- spw_label(t, _("Join:"), 0, i, NULL);
-
- hb = spw_hbox(t, 3, 1, i);
-
- tb = NULL;
-
- tb = sp_stroke_radio_button(tb, INKSCAPE_ICON("stroke-join-miter"),
- hb, spw, "join", "miter");
-
- // TRANSLATORS: Miter join: joining lines with a sharp (pointed) corner.
- // For an example, draw a triangle with a large stroke width and modify the
- // "Join" option (in the Fill and Stroke dialog).
- tb->set_tooltip_text(_("Miter join"));
- spw->set_data("miter join", tb);
-
- tb = sp_stroke_radio_button(tb, INKSCAPE_ICON("stroke-join-round"),
- hb, spw, "join", "round");
-
-
- // TRANSLATORS: Round join: joining lines with a rounded corner.
- // For an example, draw a triangle with a large stroke width and modify the
- // "Join" option (in the Fill and Stroke dialog).
- tb->set_tooltip_text(_("Round join"));
- spw->set_data("round join", tb);
-
- tb = sp_stroke_radio_button(tb, INKSCAPE_ICON("stroke-join-bevel"),
- hb, spw, "join", "bevel");
-
-
- // TRANSLATORS: Bevel join: joining lines with a blunted (flattened) corner.
- // For an example, draw a triangle with a large stroke width and modify the
- // "Join" option (in the Fill and Stroke dialog).
- tb->set_tooltip_text(_("Bevel join"));
- spw->set_data("bevel join", tb);
-
- i++;
-
- /* Miterlimit */
- // TRANSLATORS: Miter limit: only for "miter join", this limits the length
- // of the sharp "spike" when the lines connect at too sharp an angle.
- // When two line segments meet at a sharp angle, a miter join results in a
- // spike that extends well beyond the connection point. The purpose of the
- // miter limit is to cut off such spikes (i.e. convert them into bevels)
- // when they become too long.
- //spw_label(t, _("Miter _limit:"), 0, i);
-
- hb = spw_hbox(t, 3, 1, i);
-
-#if WITH_GTKMM_3_0
- a = new Glib::RefPtr<Gtk::Adjustment>(Gtk::Adjustment::create(4.0, 0.0, 100.0, 0.1, 10.0, 0.0));
- spw->set_data("miterlimit", a);
- sb = new Inkscape::UI::Widget::SpinButton(*a, 0.1, 2);
-#else
- a = new Gtk::Adjustment(4.0, 0.0, 100.0, 0.1, 10.0, 0.0);
- spw->set_data("miterlimit", a);
- sb = new Inkscape::UI::Widget::SpinButton(*a, 0.1, 2);
-#endif
-
- sb->set_tooltip_text(_("Maximum length of the miter (in units of stroke width)"));
- sb->show();
- spw_label(t, _("Miter _limit:"), 0, i, sb);
- spw->set_data("miterlimit_sb", sb);
- sp_dialog_defocus_on_enter_cpp(sb);
-
- hb->pack_start(*sb, false, false, 0);
-
-#if WITH_GTKMM_3_0
- (*a)->signal_value_changed().connect(sigc::bind(sigc::ptr_fun(&sp_stroke_style_miterlimit_changed), spw));
-#else
- a->signal_value_changed().connect(sigc::bind(sigc::ptr_fun(&sp_stroke_style_miterlimit_changed), spw));
-#endif
- i++;
-
- /* Cap type */
- // TRANSLATORS: cap type specifies the shape for the ends of lines
- //spw_label(t, _("_Cap:"), 0, i);
- spw_label(t, _("Cap:"), 0, i, NULL);
-
- hb = spw_hbox(t, 3, 1, i);
-
- tb = NULL;
-
- tb = sp_stroke_radio_button(tb, INKSCAPE_ICON("stroke-cap-butt"),
- hb, spw, "cap", "butt");
- spw->set_data("cap butt", tb);
-
- // TRANSLATORS: Butt cap: the line shape does not extend beyond the end point
- // of the line; the ends of the line are square
- tb->set_tooltip_text(_("Butt cap"));
-
- tb = sp_stroke_radio_button(tb, INKSCAPE_ICON("stroke-cap-round"),
- hb, spw, "cap", "round");
- spw->set_data("cap round", tb);
-
- // TRANSLATORS: Round cap: the line shape extends beyond the end point of the
- // line; the ends of the line are rounded
- tb->set_tooltip_text(_("Round cap"));
-
- tb = sp_stroke_radio_button(tb, INKSCAPE_ICON("stroke-cap-square"),
- hb, spw, "cap", "square");
- spw->set_data("cap square", tb);
-
- // TRANSLATORS: Square cap: the line shape extends beyond the end point of the
- // line; the ends of the line are square
- tb->set_tooltip_text(_("Square cap"));
-
- i++;
-
-
- /* Dash */
- spw_label(t, _("Dashes:"), 0, i, NULL); //no mnemonic for now
- //decide what to do:
- // implement a set_mnemonic_source function in the
- // SPDashSelector class, so that we do not have to
- // expose any of the underlying widgets?
- SPDashSelector *ds = manage(new SPDashSelector);
-
- ds->show();
- t->attach(*ds, 1, 4, i, i+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 0, 0);
- spw->set_data("dash", ds);
- ds->changed_signal.connect(sigc::bind(sigc::ptr_fun(&sp_stroke_style_line_dash_changed), spw));
- i++;
-
- /* Drop down marker selectors*/
- // TRANSLATORS: Path markers are an SVG feature that allows you to attach arbitrary shapes
- // (arrowheads, bullets, faces, whatever) to the start, end, or middle nodes of a path.
-
- start_marker_combobox = manage(new MarkerComboBox("marker-start"));
- spw_label(t, _("_Start Markers:"), 0, i, start_marker_combobox);
- start_marker_combobox->set_tooltip_text(_("Start Markers are drawn on the first node of a path or shape"));
- start_marker_connection = start_marker_combobox->signal_changed().connect(
- sigc::bind<MarkerComboBox *, Gtk::Container *, SPMarkerLoc>(
- sigc::ptr_fun(&sp_marker_select), start_marker_combobox, spw, SP_MARKER_LOC_START));
- start_marker_combobox->show();
- t->attach(*start_marker_combobox, 1, 4, i, i+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 0, 0);
- spw->set_data("start_marker_combobox", start_marker_combobox);
- i++;
-
- mid_marker_combobox = manage(new MarkerComboBox("marker-mid"));
- spw_label(t, _("_Mid Markers:"), 0, i, mid_marker_combobox);
- mid_marker_combobox->set_tooltip_text(_("Mid Markers are drawn on every node of a path or shape except the first and last nodes"));
- mid_marker_connection = mid_marker_combobox->signal_changed().connect(
- sigc::bind<MarkerComboBox *, Gtk::Container *, SPMarkerLoc>(
- sigc::ptr_fun(&sp_marker_select), mid_marker_combobox, spw, SP_MARKER_LOC_MID));
- mid_marker_combobox->show();
- t->attach(*mid_marker_combobox, 1, 4, i, i+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 0, 0);
- spw->set_data("mid_marker_combobox", mid_marker_combobox);
- i++;
-
- end_marker_combobox = manage(new MarkerComboBox("marker-end"));
- spw_label(t, _("_End Markers:"), 0, i, end_marker_combobox);
- end_marker_combobox->set_tooltip_text(_("End Markers are drawn on the last node of a path or shape"));
- end_marker_connection = end_marker_combobox->signal_changed().connect(
- sigc::bind<MarkerComboBox *, Gtk::Container *, SPMarkerLoc>(
- sigc::ptr_fun(&sp_marker_select), end_marker_combobox, spw, SP_MARKER_LOC_END));
- end_marker_combobox->show();
- t->attach(*end_marker_combobox, 1, 4, i, i+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 0, 0);
- spw->set_data("end_marker_combobox", end_marker_combobox);
- i++;
-
- // FIXME: we cheat and still use gtk+ signals
-
- g_signal_connect(G_OBJECT(spw_old), "modify_selection",
- G_CALLBACK(sp_stroke_style_line_selection_modified),
- spw);
- g_signal_connect(G_OBJECT(spw_old), "change_selection",
- G_CALLBACK(sp_stroke_style_line_selection_changed),
- spw);
-
- sp_stroke_style_line_update(spw, desktop ? sp_desktop_selection(desktop) : NULL);
-
- return spw;
-}
-
/**
* Callback for when stroke style widget is modified.
* Triggers update action.
*/
-static void
-sp_stroke_style_line_selection_modified(SPWidget *,
- Inkscape::Selection *selection,
- guint flags,
- gpointer data)
+void
+StrokeStyle::selectionModifiedCB(guint flags)
{
- Gtk::Container *spw = static_cast<Gtk::Container *>(data);
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_PARENT_MODIFIED_FLAG)) {
- sp_stroke_style_line_update(spw, selection);
+ updateLine();
}
-
}
/**
* Callback for when stroke style widget is changed.
* Triggers update action.
*/
-static void
-sp_stroke_style_line_selection_changed(SPWidget *,
- Inkscape::Selection *selection,
- gpointer data)
+void
+StrokeStyle::selectionChangedCB()
{
- Gtk::Container *spw = static_cast<Gtk::Container *>(data);
- sp_stroke_style_line_update(spw, selection);
+ updateLine();
}
/**
* Sets selector widgets' dash style from an SPStyle object.
*/
-static void
-sp_dash_selector_set_from_style(SPDashSelector *dsel, SPStyle *style)
+void
+StrokeStyle::setDashSelectorFromStyle(SPDashSelector *dsel, SPStyle *style)
{
if (style->stroke_dash.n_dash > 0) {
double d[64];
@@ -612,76 +544,66 @@ sp_dash_selector_set_from_style(SPDashSelector *dsel, SPStyle *style)
/**
* Sets the join type for a line, and updates the stroke style widget's buttons
*/
-static void
-sp_jointype_set (Gtk::Container *spw, unsigned const jointype)
+void
+StrokeStyle::setJoinType (unsigned const jointype)
{
Gtk::RadioButton *tb = NULL;
switch (jointype) {
case SP_STROKE_LINEJOIN_MITER:
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-join-miter")));
+ tb = joinMiter;
break;
case SP_STROKE_LINEJOIN_ROUND:
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-join-round")));
+ tb = joinRound;
break;
case SP_STROKE_LINEJOIN_BEVEL:
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-join-bevel")));
+ tb = joinBevel;
break;
default:
break;
}
- sp_stroke_style_set_join_buttons(spw, tb);
+ setJoinButtons(tb);
}
/**
* Sets the cap type for a line, and updates the stroke style widget's buttons
*/
-static void
-sp_captype_set (Gtk::Container *spw, unsigned const captype)
+void
+StrokeStyle::setCapType (unsigned const captype)
{
Gtk::RadioButton *tb = NULL;
switch (captype) {
case SP_STROKE_LINECAP_BUTT:
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-cap-butt")));
+ tb = capButt;
break;
case SP_STROKE_LINECAP_ROUND:
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-cap-round")));
+ tb = capRound;
break;
case SP_STROKE_LINECAP_SQUARE:
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-cap-square")));
+ tb = capSquare;
break;
default:
break;
}
- sp_stroke_style_set_cap_buttons(spw, tb);
+ setCapButtons(tb);
}
/**
* Callback for when stroke style widget is updated, including markers, cap type,
* join type, etc.
*/
-static void
-sp_stroke_style_line_update(Gtk::Container *spw, Inkscape::Selection *sel)
+void
+StrokeStyle::updateLine()
{
- if (spw->get_data("update")) {
+ if (update) {
return;
}
- spw->set_data("update", GINT_TO_POINTER(TRUE));
+ update = true;
- FillOrStroke kind = GPOINTER_TO_INT(spw->get_data("kind")) ? FILL : STROKE;
+ Inkscape::Selection *sel = desktop ? sp_desktop_selection(desktop) : NULL;
- Gtk::Table *sset = static_cast<Gtk::Table *>(spw->get_data("stroke"));
-
-#if WITH_GTKMM_3_0
- Glib::RefPtr<Gtk::Adjustment> *width = static_cast<Glib::RefPtr<Gtk::Adjustment> *>(spw->get_data("width"));
- Glib::RefPtr<Gtk::Adjustment> *ml = static_cast<Glib::RefPtr<Gtk::Adjustment> *>(spw->get_data("miterlimit"));
-#else
- Gtk::Adjustment *width = static_cast<Gtk::Adjustment *>(spw->get_data("width"));
- Gtk::Adjustment *ml = static_cast<Gtk::Adjustment *>(spw->get_data("miterlimit"));
-#endif
-
- SPUnitSelector *us = SP_UNIT_SELECTOR(spw->get_data("units"));
- SPDashSelector *dsel = static_cast<SPDashSelector *>(spw->get_data("dash"));
+ // TODO
+ FillOrStroke kind = GPOINTER_TO_INT(get_data("kind")) ? FILL : STROKE;
// create temporary style
SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT);
@@ -694,39 +616,39 @@ sp_stroke_style_line_update(Gtk::Container *spw, Inkscape::Selection *sel)
if (!sel || sel->isEmpty()) {
// Nothing selected, grey-out all controls in the stroke-style dialog
- sset->set_sensitive(false);
+ table->set_sensitive(false);
- spw->set_data("update", GINT_TO_POINTER(FALSE));
+ update = false;
return;
} else {
- sset->set_sensitive(true);
+ table->set_sensitive(true);
- SPUnit const *unit = sp_unit_selector_get_unit(us);
+ SPUnit const *unit = sp_unit_selector_get_unit(SP_UNIT_SELECTOR(unitSelector));
if (result_sw == QUERY_STYLE_MULTIPLE_AVERAGED) {
- sp_unit_selector_set_unit(us, &sp_unit_get_by_id(SP_UNIT_PERCENT));
+ sp_unit_selector_set_unit(SP_UNIT_SELECTOR(unitSelector), &sp_unit_get_by_id(SP_UNIT_PERCENT));
} else {
// same width, or only one object; no sense to keep percent, switch to absolute
if (unit->base != SP_UNIT_ABSOLUTE && unit->base != SP_UNIT_DEVICE) {
- sp_unit_selector_set_unit(us, sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units);
+ sp_unit_selector_set_unit(SP_UNIT_SELECTOR(unitSelector), sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units);
}
}
- unit = sp_unit_selector_get_unit(us);
+ unit = sp_unit_selector_get_unit(SP_UNIT_SELECTOR(unitSelector));
if (unit->base == SP_UNIT_ABSOLUTE || unit->base == SP_UNIT_DEVICE) {
double avgwidth = sp_pixels_get_units (query->stroke_width.computed, *unit);
#if WITH_GTKMM_3_0
- (*width)->set_value(avgwidth);
+ (*widthAdj)->set_value(avgwidth);
#else
- width->set_value(avgwidth);
+ widthAdj->set_value(avgwidth);
#endif
} else {
#if WITH_GTKMM_3_0
- (*width)->set_value(100);
+ (*widthAdj)->set_value(100);
#else
- width->set_value(100);
+ widthAdj->set_value(100);
#endif
}
@@ -734,45 +656,36 @@ sp_stroke_style_line_update(Gtk::Container *spw, Inkscape::Selection *sel)
// The markers might still be shown though, so these will not be disabled
bool enabled = (result_sw != QUERY_STYLE_NOTHING) && !targPaint.isNoneSet();
/* No objects stroked, set insensitive */
- Gtk::RadioButton *tb = NULL;
- tb = static_cast<Gtk::RadioButton *>(spw->get_data("miter join"));
- tb->set_sensitive(enabled);
- tb = static_cast<Gtk::RadioButton *>(spw->get_data("round join"));
- tb->set_sensitive(enabled);
- tb = static_cast<Gtk::RadioButton *>(spw->get_data("bevel join"));
- tb->set_sensitive(enabled);
-
- Inkscape::UI::Widget::SpinButton* sb = NULL;
- sb = static_cast<Inkscape::UI::Widget::SpinButton *>(spw->get_data("miterlimit_sb"));
- sb->set_sensitive(enabled);
-
- tb = static_cast<Gtk::RadioButton *>(spw->get_data("cap butt"));
- tb->set_sensitive(enabled);
- tb = static_cast<Gtk::RadioButton *>(spw->get_data("cap round"));
- tb->set_sensitive(enabled);
- tb = static_cast<Gtk::RadioButton *>(spw->get_data("cap square"));
- tb->set_sensitive(enabled);
-
- dsel->set_sensitive(enabled);
+ joinMiter->set_sensitive(enabled);
+ joinRound->set_sensitive(enabled);
+ joinBevel->set_sensitive(enabled);
+
+ miterLimitSpin->set_sensitive(enabled);
+
+ capButt->set_sensitive(enabled);
+ capRound->set_sensitive(enabled);
+ capSquare->set_sensitive(enabled);
+
+ dashSelector->set_sensitive(enabled);
}
if (result_ml != QUERY_STYLE_NOTHING)
#if WITH_GTKMM_3_0
- (*ml)->set_value(query->stroke_miterlimit.value); // TODO: reflect averagedness?
+ (*miterLimitAdj)->set_value(query->stroke_miterlimit.value); // TODO: reflect averagedness?
#else
- ml->set_value(query->stroke_miterlimit.value); // TODO: reflect averagedness?
+ miterLimitAdj->set_value(query->stroke_miterlimit.value); // TODO: reflect averagedness?
#endif
if (result_join != QUERY_STYLE_MULTIPLE_DIFFERENT) {
- sp_jointype_set(spw, query->stroke_linejoin.value);
+ setJoinType(query->stroke_linejoin.value);
} else {
- sp_stroke_style_set_join_buttons(spw, NULL);
+ setJoinButtons(NULL);
}
if (result_cap != QUERY_STYLE_MULTIPLE_DIFFERENT) {
- sp_captype_set (spw, query->stroke_linecap.value);
+ setCapType (query->stroke_linecap.value);
} else {
- sp_stroke_style_set_cap_buttons(spw, NULL);
+ setCapButtons(NULL);
}
sp_style_unref(query);
@@ -785,21 +698,21 @@ sp_stroke_style_line_update(Gtk::Container *spw, Inkscape::Selection *sel)
SPStyle * const style = object->style;
/* Markers */
- sp_stroke_style_update_marker_combo(spw, objects); // FIXME: make this desktop query too
+ updateAllMarkers(objects); // FIXME: make this desktop query too
/* Dash */
- sp_dash_selector_set_from_style(dsel, style); // FIXME: make this desktop query too
+ setDashSelectorFromStyle(dashSelector, style); // FIXME: make this desktop query too
- sset->set_sensitive(true);
+ table->set_sensitive(true);
- spw->set_data("update", GINT_TO_POINTER(FALSE));
+ update = false;
}
/**
* Sets a line's dash properties in a CSS style object.
*/
-static void
-sp_stroke_style_set_scaled_dash(SPCSSAttr *css,
+void
+StrokeStyle::setScaledDash(SPCSSAttr *css,
int ndash, double *dash, double offset,
double scale)
{
@@ -825,27 +738,15 @@ sp_stroke_style_set_scaled_dash(SPCSSAttr *css,
/**
* Sets line properties like width, dashes, markers, etc. on all currently selected items.
*/
-static void
-sp_stroke_style_scale_line(Gtk::Container *spw)
+void
+StrokeStyle::scaleLine()
{
- if (spw->get_data("update")) {
+ if (update) {
return;
}
- spw->set_data("update", GINT_TO_POINTER(TRUE));
-
-#if WITH_GTKMM_3_0
- Glib::RefPtr<Gtk::Adjustment> *wadj = static_cast<Glib::RefPtr<Gtk::Adjustment> *>(spw->get_data("width"));
- Glib::RefPtr<Gtk::Adjustment> *ml = static_cast<Glib::RefPtr<Gtk::Adjustment> *>(spw->get_data("miterlimit"));
-#else
- Gtk::Adjustment *wadj = static_cast<Gtk::Adjustment *>(spw->get_data("width"));
- Gtk::Adjustment *ml = static_cast<Gtk::Adjustment *>(spw->get_data("miterlimit"));
-#endif
+ update = true;
- SPUnitSelector *us = SP_UNIT_SELECTOR(spw->get_data("units"));
- SPDashSelector *dsel = static_cast<SPDashSelector *>(spw->get_data("dash"));
-
- SPDesktop *desktop = SP_ACTIVE_DESKTOP;
SPDocument *document = sp_desktop_document (desktop);
Inkscape::Selection *selection = sp_desktop_selection (desktop);
@@ -856,18 +757,18 @@ sp_stroke_style_scale_line(Gtk::Container *spw)
if (items) {
#if WITH_GTKMM_3_0
- double width_typed = (*wadj)->get_value();
- double const miterlimit = (*ml)->get_value();
+ double width_typed = (*widthAdj)->get_value();
+ double const miterlimit = (*miterLimitAdj)->get_value();
#else
- double width_typed = wadj->get_value();
- double const miterlimit = ml->get_value();
+ double width_typed = widthAdj->get_value();
+ double const miterlimit = miterLimitAdj->get_value();
#endif
- SPUnit const *const unit = sp_unit_selector_get_unit(SP_UNIT_SELECTOR(us));
+ SPUnit const *const unit = sp_unit_selector_get_unit(SP_UNIT_SELECTOR(unitSelector));
double *dash, offset;
int ndash;
- dsel->get_dash(&ndash, &dash, &offset);
+ dashSelector->get_dash(&ndash, &dash, &offset);
for (GSList const *i = items; i != NULL; i = i->next) {
/* Set stroke width */
@@ -892,7 +793,7 @@ sp_stroke_style_scale_line(Gtk::Container *spw)
}
/* Set dash */
- sp_stroke_style_set_scaled_dash(css, ndash, dash, offset, width);
+ setScaledDash(css, ndash, dash, offset, width);
sp_desktop_apply_css_recursive (SP_OBJECT(i->data), css, true);
}
@@ -902,9 +803,9 @@ sp_stroke_style_scale_line(Gtk::Container *spw)
if (unit->base != SP_UNIT_ABSOLUTE && unit->base != SP_UNIT_DEVICE) {
// reset to 100 percent
#if WITH_GTKMM_3_0
- (*wadj)->set_value(100.0);
+ (*widthAdj)->set_value(100.0);
#else
- wadj->set_value(100.0);
+ widthAdj->set_value(100.0);
#endif
}
@@ -920,35 +821,35 @@ sp_stroke_style_scale_line(Gtk::Container *spw)
DocumentUndo::done(document, SP_VERB_DIALOG_FILL_STROKE,
_("Set stroke style"));
- spw->set_data("update", GINT_TO_POINTER(FALSE));
+ update = false;
}
/**
* Callback for when the stroke style's width changes.
* Causes all line styles to be applied to all selected items.
*/
-static void
-sp_stroke_style_width_changed(Gtk::Container *spw)
+void
+StrokeStyle::widthChangedCB()
{
- if (spw->get_data("update")) {
+ if (update) {
return;
}
- sp_stroke_style_scale_line(spw);
+ scaleLine();
}
/**
* Callback for when the stroke style's miterlimit changes.
* Causes all line styles to be applied to all selected items.
*/
-static void
-sp_stroke_style_miterlimit_changed(Gtk::Container *spw)
+void
+StrokeStyle::miterLimitChangedCB()
{
- if (spw->get_data("update")) {
+ if (update) {
return;
}
- sp_stroke_style_scale_line(spw);
+ scaleLine();
}
/**
@@ -956,14 +857,14 @@ sp_stroke_style_miterlimit_changed(Gtk::Container *spw)
* Causes all line styles to be applied to all selected items.
*/
-static void
-sp_stroke_style_line_dash_changed(Gtk::Container *spw)
+void
+StrokeStyle::lineDashChangedCB()
{
- if (spw->get_data("update")) {
+ if (update) {
return;
}
- sp_stroke_style_scale_line(spw);
+ scaleLine();
}
/**
@@ -973,48 +874,45 @@ sp_stroke_style_line_dash_changed(Gtk::Container *spw)
* calls the respective routines to update css properties, etc.
*
*/
-static void sp_stroke_style_any_toggled(Gtk::ToggleButton *tb, Gtk::Container *spw)
+void StrokeStyle::buttonToggledCB(Gtk::ToggleButton *tb, StrokeStyle *spw)
{
- if (spw->get_data("update")) {
+ if (spw->update) {
return;
}
-
if (tb->get_active()) {
+ // TODO
gchar const *join
= static_cast<gchar const *>(tb->get_data("join"));
gchar const *cap
= static_cast<gchar const *>(tb->get_data("cap"));
if (join) {
- Gtk::SpinButton *ml = static_cast<Gtk::SpinButton *>(spw->get_data("miterlimit_sb"));
- ml->set_sensitive(!strcmp(join, "miter"));
+ spw->miterLimitSpin->set_sensitive(!strcmp(join, "miter"));
}
- SPDesktop *desktop = SP_ACTIVE_DESKTOP;
-
/* TODO: Create some standardized method */
SPCSSAttr *css = sp_repr_css_attr_new();
if (join) {
sp_repr_css_set_property(css, "stroke-linejoin", join);
- sp_desktop_set_style (desktop, css);
+ sp_desktop_set_style (spw->desktop, css);
- sp_stroke_style_set_join_buttons(spw, tb);
+ spw->setJoinButtons(tb);
} else if (cap) {
sp_repr_css_set_property(css, "stroke-linecap", cap);
- sp_desktop_set_style (desktop, css);
+ sp_desktop_set_style (spw->desktop, css);
- sp_stroke_style_set_cap_buttons(spw, tb);
+ spw->setCapButtons(tb);
}
sp_repr_css_attr_unref(css);
css = 0;
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_DIALOG_FILL_STROKE,
+ DocumentUndo::done(sp_desktop_document(spw->desktop), SP_VERB_DIALOG_FILL_STROKE,
_("Set stroke style"));
}
}
@@ -1022,38 +920,24 @@ static void sp_stroke_style_any_toggled(Gtk::ToggleButton *tb, Gtk::Container *s
/**
* Updates the join style toggle buttons
*/
-static void
-sp_stroke_style_set_join_buttons(Gtk::Container *spw, Gtk::ToggleButton *active)
+void
+StrokeStyle::setJoinButtons(Gtk::ToggleButton *active)
{
- Gtk::RadioButton *tb;
-
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-join-miter")));
- tb->set_active(active == tb);
-
- Gtk::SpinButton *ml = static_cast<Gtk::SpinButton *>(spw->get_data("miterlimit_sb"));
- ml->set_sensitive(active == tb);
-
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-join-round")));
- tb->set_active(active == tb);
-
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-join-bevel")));
- tb->set_active(active == tb);
+ joinMiter->set_active(active == joinMiter);
+ miterLimitSpin->set_sensitive(active == joinMiter);
+ joinRound->set_active(active == joinRound);
+ joinBevel->set_active(active == joinBevel);
}
/**
* Updates the cap style toggle buttons
*/
-static void
-sp_stroke_style_set_cap_buttons(Gtk::Container *spw, Gtk::ToggleButton *active)
+void
+StrokeStyle::setCapButtons(Gtk::ToggleButton *active)
{
- Gtk::RadioButton *tb;
-
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-cap-butt")));
- tb->set_active(active == tb);
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-cap-round")));
- tb->set_active(active == tb);
- tb = static_cast<Gtk::RadioButton *>(spw->get_data(INKSCAPE_ICON("stroke-cap-square")));
- tb->set_active(active == tb);
+ capButt->set_active(active == capButt);
+ capRound->set_active(active == capRound);
+ capSquare->set_active(active == capSquare);
}
@@ -1061,13 +945,13 @@ sp_stroke_style_set_cap_buttons(Gtk::Container *spw, Gtk::ToggleButton *active)
* Updates the marker combobox to highlight the appropriate marker and scroll to
* that marker.
*/
-static void
-sp_stroke_style_update_marker_combo(Gtk::Container *spw, GSList const *objects)
+void
+StrokeStyle::updateAllMarkers(GSList const *objects)
{
- struct { char const *key; int loc; } const keyloc[] = {
- { "start_marker_combobox", SP_MARKER_LOC_START },
- { "mid_marker_combobox", SP_MARKER_LOC_MID },
- { "end_marker_combobox", SP_MARKER_LOC_END }
+ struct { MarkerComboBox *key; int loc; } const keyloc[] = {
+ { startMarkerCombo, SP_MARKER_LOC_START },
+ { midMarkerCombo, SP_MARKER_LOC_MID },
+ { endMarkerCombo, SP_MARKER_LOC_END }
};
bool all_texts = true;
@@ -1078,7 +962,7 @@ sp_stroke_style_update_marker_combo(Gtk::Container *spw, GSList const *objects)
}
for (unsigned i = 0; i < G_N_ELEMENTS(keyloc); ++i) {
- MarkerComboBox *combo = static_cast<MarkerComboBox *>(spw->get_data(keyloc[i].key));
+ MarkerComboBox *combo = static_cast<MarkerComboBox *>(keyloc[i].key);
// Per SVG spec, text objects cannot have markers; disable combobox if only texts are selected
combo->set_sensitive(!all_texts);
}
@@ -1091,7 +975,7 @@ sp_stroke_style_update_marker_combo(Gtk::Container *spw, GSList const *objects)
// For all three marker types,
// find the corresponding combobox item
- MarkerComboBox *combo = static_cast<MarkerComboBox *>(spw->get_data(keyloc[i].key));
+ MarkerComboBox *combo = static_cast<MarkerComboBox *>(keyloc[i].key);
// Quit if we're in update state
if (combo->update()) {
@@ -1102,7 +986,7 @@ sp_stroke_style_update_marker_combo(Gtk::Container *spw, GSList const *objects)
// If the object has this type of markers,
// Extract the name of the marker that the object uses
- SPObject *marker = ink_extract_marker_name(object->style->marker[keyloc[i].loc].value, object->document);
+ SPObject *marker = getMarkerName(object->style->marker[keyloc[i].loc].value, object->document);
// Scroll the combobox to that marker
combo->set_current(marker);
@@ -1120,8 +1004,8 @@ sp_stroke_style_update_marker_combo(Gtk::Container *spw, GSList const *objects)
* \return Buffer containing the actual name, allocated from GLib;
* the caller should free the buffer when they no longer need it.
*/
-static SPObject*
-ink_extract_marker_name(gchar const *n, SPDocument *doc)
+SPObject*
+StrokeStyle::getMarkerName(gchar const *n, SPDocument *doc)
{
gchar const *p = n;
while (*p != '\0' && *p != '#') {
@@ -1150,6 +1034,9 @@ ink_extract_marker_name(gchar const *n, SPDocument *doc)
return marker;
}
+} // namespace Inkscape
+
+
/*
Local Variables:
mode:c++