summaryrefslogtreecommitdiffstats
path: root/src/ui/toolbar/lpe-toolbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/toolbar/lpe-toolbar.cpp')
-rw-r--r--src/ui/toolbar/lpe-toolbar.cpp484
1 files changed, 245 insertions, 239 deletions
diff --git a/src/ui/toolbar/lpe-toolbar.cpp b/src/ui/toolbar/lpe-toolbar.cpp
index 8ed30d9ac..361144881 100644
--- a/src/ui/toolbar/lpe-toolbar.cpp
+++ b/src/ui/toolbar/lpe-toolbar.cpp
@@ -45,219 +45,30 @@ using Inkscape::DocumentUndo;
using Inkscape::UI::Tools::ToolBase;
using Inkscape::UI::Tools::LpeTool;
-
-//########################
-//## LPETool ##
-//########################
-
-// the subtools from which the toolbar is built automatically are listed in lpe-tool-context.h
-
-// this is called when the mode is changed via the toolbar (i.e., one of the subtool buttons is pressed)
-static void sp_lpetool_mode_changed(GObject *tbl, int mode)
-{
- using namespace Inkscape::LivePathEffect;
-
- SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(tbl, "desktop"));
- ToolBase *ec = desktop->event_context;
- if (!SP_IS_LPETOOL_CONTEXT(ec)) {
- return;
- }
-
- // only take action if run by the attr_changed listener
- if (!g_object_get_data(tbl, "freeze")) {
- // in turn, prevent listener from responding
- g_object_set_data(tbl, "freeze", GINT_TO_POINTER(TRUE));
-
- EffectType type = lpesubtools[mode].type;
-
- LpeTool *lc = SP_LPETOOL_CONTEXT(desktop->event_context);
- bool success = lpetool_try_construction(lc, type);
- if (success) {
- // since the construction was already performed, we set the state back to inactive
- InkSelectOneAction* act =
- static_cast<InkSelectOneAction*>( g_object_get_data( tbl, "lpetool_mode_action" ) );
- act->set_active(0);
- mode = 0;
- } else {
- // switch to the chosen subtool
- SP_LPETOOL_CONTEXT(desktop->event_context)->mode = type;
- }
-
- if (DocumentUndo::getUndoSensitive(desktop->getDocument())) {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setInt( "/tools/lpetool/mode", mode );
- }
-
- g_object_set_data(tbl, "freeze", GINT_TO_POINTER(FALSE));
- }
-}
-
-static void sp_lpetool_toolbox_sel_modified(Inkscape::Selection *selection, guint /*flags*/, GObject * /*tbl*/)
-{
- ToolBase *ec = selection->desktop()->event_context;
- if (SP_IS_LPETOOL_CONTEXT(ec)) {
- lpetool_update_measuring_items(SP_LPETOOL_CONTEXT(ec));
- }
-}
-
-static void sp_lpetool_toolbox_sel_changed(Inkscape::Selection *selection, GObject *tbl)
-{
- using namespace Inkscape::LivePathEffect;
- ToolBase *ec = selection->desktop()->event_context;
- if (!SP_IS_LPETOOL_CONTEXT(ec)) {
- return;
- }
- LpeTool *lc = SP_LPETOOL_CONTEXT(ec);
-
- lpetool_delete_measuring_items(lc);
- lpetool_create_measuring_items(lc, selection);
-
- // activate line segment combo box if a single item with LPELineSegment is selected
- InkSelectOneAction* act =
- static_cast<InkSelectOneAction*>( g_object_get_data( tbl, "lpetool_line_segment_action" ) );
-
- SPItem *item = selection->singleItem();
- if (item && SP_IS_LPE_ITEM(item) && lpetool_item_has_construction(lc, item)) {
-
- SPLPEItem *lpeitem = SP_LPE_ITEM(item);
- Effect* lpe = lpeitem->getCurrentLPE();
- if (lpe && lpe->effectType() == LINE_SEGMENT) {
- LPELineSegment *lpels = static_cast<LPELineSegment*>(lpe);
- g_object_set_data(tbl, "currentlpe", lpe);
- g_object_set_data(tbl, "currentlpeitem", lpeitem);
- act->set_sensitive(true);
- act->set_active( lpels->end_type.get_value() );
- } else {
- g_object_set_data(tbl, "currentlpe", nullptr);
- g_object_set_data(tbl, "currentlpeitem", nullptr);
- act->set_sensitive(false);
- }
-
- } else {
- g_object_set_data(tbl, "currentlpe", nullptr);
- g_object_set_data(tbl, "currentlpeitem", nullptr);
- act->set_sensitive(false);
- }
-}
-
-static void lpetool_toggle_show_bbox(GtkToggleAction *act, gpointer data) {
- SPDesktop *desktop = static_cast<SPDesktop *>(data);
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
-
- bool show = gtk_toggle_action_get_active( act );
- prefs->setBool("/tools/lpetool/show_bbox", show);
-
- if (tools_isactive(desktop, TOOLS_LPETOOL)) {
- LpeTool *lc = SP_LPETOOL_CONTEXT(desktop->event_context);
- lpetool_context_reset_limiting_bbox(lc);
- }
-}
-
-static void lpetool_toggle_show_measuring_info(GtkToggleAction *act, GObject *tbl)
-{
- SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(tbl, "desktop"));
- if (!tools_isactive(desktop, TOOLS_LPETOOL)) {
- return;
- }
-
- bool show = gtk_toggle_action_get_active( act );
-
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setBool("/tools/lpetool/show_measuring_info", show);
-
- LpeTool *lc = SP_LPETOOL_CONTEXT(desktop->event_context);
- lpetool_show_measuring_info(lc, show);
-
- InkSelectOneAction* unitact =
- static_cast<InkSelectOneAction*>(g_object_get_data(tbl, "lpetool_units_action"));
- unitact->set_sensitive( show );
-}
-
-static void lpetool_unit_changed(GObject* tbl, int /* NotUsed */)
-{
- UnitTracker* tracker = reinterpret_cast<UnitTracker*>(g_object_get_data(tbl, "tracker"));
- Unit const *unit = tracker->getActiveUnit();
- g_return_if_fail(unit != nullptr);
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setString("/tools/lpetool/unit", unit->abbr);
-
- SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" ));
- if (SP_IS_LPETOOL_CONTEXT(desktop->event_context)) {
- LpeTool *lc = SP_LPETOOL_CONTEXT(desktop->event_context);
- lpetool_delete_measuring_items(lc);
- lpetool_create_measuring_items(lc);
- }
-}
-
-static void lpetool_toggle_set_bbox(GtkToggleAction *act, gpointer data)
-{
- SPDesktop *desktop = static_cast<SPDesktop *>(data);
- Inkscape::Selection *selection = desktop->selection;
-
- Geom::OptRect bbox = selection->visualBounds();
-
- if (bbox) {
- Geom::Point A(bbox->min());
- Geom::Point B(bbox->max());
-
- A *= desktop->doc2dt();
- B *= desktop->doc2dt();
-
- // TODO: should we provide a way to store points in prefs?
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setDouble("/tools/lpetool/bbox_upperleftx", A[Geom::X]);
- prefs->setDouble("/tools/lpetool/bbox_upperlefty", A[Geom::Y]);
- prefs->setDouble("/tools/lpetool/bbox_lowerrightx", B[Geom::X]);
- prefs->setDouble("/tools/lpetool/bbox_lowerrighty", B[Geom::Y]);
-
- lpetool_context_reset_limiting_bbox(SP_LPETOOL_CONTEXT(desktop->event_context));
- }
-
- gtk_toggle_action_set_active(act, false);
-}
-
-static void sp_lpetool_change_line_segment_type(GObject* tbl, int mode)
+namespace Inkscape {
+namespace UI {
+namespace Toolbar {
+LPEToolbar::LPEToolbar(SPDesktop *desktop)
+ : Toolbar(desktop),
+ _tracker(new UnitTracker(Util::UNIT_TYPE_LINEAR)),
+ _freeze(false),
+ _currentlpe(nullptr),
+ _currentlpeitem(nullptr)
{
- using namespace Inkscape::LivePathEffect;
-
- // quit if run by the attr_changed listener
- if (g_object_get_data(tbl, "freeze")) {
- return;
- }
-
- // in turn, prevent listener from responding
- g_object_set_data(tbl, "freeze", GINT_TO_POINTER(TRUE));
-
- LPELineSegment *lpe = static_cast<LPELineSegment *>(g_object_get_data(tbl, "currentlpe"));
- SPLPEItem *lpeitem = static_cast<SPLPEItem *>(g_object_get_data(tbl, "currentlpeitem"));
- if (lpeitem) {
- SPLPEItem *lpeitem = static_cast<SPLPEItem *>(g_object_get_data(tbl, "currentlpeitem"));
- lpe->end_type.param_set_value(static_cast<Inkscape::LivePathEffect::EndType>(mode));
- sp_lpe_item_update_patheffect(lpeitem, true, true);
- }
-
- g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
+ _tracker->setActiveUnit(_desktop->getNamedView()->display_units);
}
-static void lpetool_open_lpe_dialog(GtkToggleAction *act, gpointer data)
+LPEToolbar::~LPEToolbar()
{
- SPDesktop *desktop = static_cast<SPDesktop *>(data);
-
- if (tools_isactive(desktop, TOOLS_LPETOOL)) {
- sp_action_perform(Inkscape::Verb::get(SP_VERB_DIALOG_LIVE_PATH_EFFECT)->get_action(Inkscape::ActionContext(desktop)), nullptr);
- }
- gtk_toggle_action_set_active(act, false);
+ delete _tracker;
}
-static void lpetool_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
-
-void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
+GtkWidget *
+LPEToolbar::prep(SPDesktop *desktop, GtkActionGroup* mainActions)
{
- UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR);
- tracker->setActiveUnit(desktop->getNamedView()->display_units);
- g_object_set_data(holder, "tracker", tracker);
- Unit const *unit = tracker->getActiveUnit();
- g_return_if_fail(unit != nullptr);
+ auto toolbar = new LPEToolbar(desktop);
+ Unit const *unit = toolbar->_tracker->getActiveUnit();
+ g_return_val_if_fail(unit != nullptr, nullptr);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setString("/tools/lpetool/unit", unit->abbr);
@@ -289,23 +100,22 @@ void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GO
row[columns.col_sensitive] = true;
}
- InkSelectOneAction* act =
+ toolbar->_mode_action =
InkSelectOneAction::create( "LPEToolModeAction", // Name
(""), // Label
(""), // Tooltip
"Not Used", // Icon
store ); // Tree store
- act->use_radio( true );
- act->use_icon( true );
- act->use_label( false );
+ toolbar->_mode_action->use_radio( true );
+ toolbar->_mode_action->use_icon( true );
+ toolbar->_mode_action->use_label( false );
int mode = prefs->getInt("/tools/lpetool/mode", 0);
- act->set_active( mode );
+ toolbar->_mode_action->set_active( mode );
- gtk_action_group_add_action( mainActions, act->gobj() );
- g_object_set_data( holder, "lpetool_mode_action", act );
+ gtk_action_group_add_action( mainActions, toolbar->_mode_action->gobj() );
- act->signal_changed().connect(sigc::bind<0>(sigc::ptr_fun(&sp_lpetool_mode_changed), holder));
+ toolbar->_mode_action->signal_changed().connect(sigc::mem_fun(*toolbar, &LPEToolbar::mode_changed));
}
/* Show limiting bounding box */
@@ -316,7 +126,7 @@ void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GO
"show-bounding-box",
GTK_ICON_SIZE_MENU );
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(lpetool_toggle_show_bbox), desktop );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_show_bbox), desktop );
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool( "/tools/lpetool/show_bbox", true ) );
}
@@ -328,11 +138,10 @@ void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GO
"draw-geometry-set-bounding-box",
GTK_ICON_SIZE_MENU );
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(lpetool_toggle_set_bbox), desktop );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_set_bbox), desktop );
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), FALSE );
}
-
/* Combo box to choose line segment type */
{
InkSelectOneActionColumns columns;
@@ -365,22 +174,21 @@ void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GO
row[columns.col_icon ] = "NotUsed";
row[columns.col_sensitive] = true;
- InkSelectOneAction* act =
+ toolbar->_line_segment_action =
InkSelectOneAction::create( "LPELineSegmentAction", // Name
(""), // Label
_("Choose a line segment type"), // Tooltip
"Not Used", // Icon
store ); // Tree store
- act->use_radio( false );
- act->use_icon( false );
- act->use_label( true );
- act->set_sensitive( false );
+ toolbar->_line_segment_action->use_radio( false );
+ toolbar->_line_segment_action->use_icon( false );
+ toolbar->_line_segment_action->use_label( true );
+ toolbar->_line_segment_action->set_sensitive( false );
- gtk_action_group_add_action( mainActions, GTK_ACTION( act->gobj() ));
- g_object_set_data (holder, "lpetool_line_segment_action", act );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( toolbar->_line_segment_action->gobj() ));
- act->signal_changed().connect(sigc::bind<0>(sigc::ptr_fun(sp_lpetool_change_line_segment_type), holder));
+ toolbar->_line_segment_action->signal_changed().connect(sigc::mem_fun(*toolbar, &LPEToolbar::change_line_segment_type));
}
/* Display measuring info for selected items */
@@ -391,17 +199,16 @@ void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GO
"draw-geometry-show-measuring-info",
GTK_ICON_SIZE_MENU );
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(lpetool_toggle_show_measuring_info), holder );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_show_measuring_info), toolbar );
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool( "/tools/lpetool/show_measuring_info", true ) );
}
// Add the units menu
{
- InkSelectOneAction* act = tracker->createAction( "LPEToolUnitsAction", _("Units"), ("") );
- gtk_action_group_add_action( mainActions, act->gobj() );
- act->signal_changed_after().connect(sigc::bind<0>(sigc::ptr_fun(&lpetool_unit_changed), holder));
- g_object_set_data(holder, "lpetool_units_action", act);
- act->set_sensitive( prefs->getBool("/tools/lpetool/show_measuring_info", true));
+ toolbar->_units_action = toolbar->_tracker->createAction( "LPEToolUnitsAction", _("Units"), ("") );
+ gtk_action_group_add_action( mainActions, toolbar->_units_action->gobj() );
+ toolbar->_units_action->signal_changed_after().connect(sigc::mem_fun(*toolbar, &LPEToolbar::unit_changed));
+ toolbar->_units_action->set_sensitive( prefs->getBool("/tools/lpetool/show_measuring_info", true));
}
/* Open LPE dialog (to adapt parameters numerically) */
@@ -412,23 +219,171 @@ void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GO
"dialog-geometry",
GTK_ICON_SIZE_MENU );
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(lpetool_open_lpe_dialog), desktop );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(open_lpe_dialog), desktop );
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), FALSE );
}
- desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(lpetool_toolbox_watch_ec), holder));
+ desktop->connectEventContextChanged(sigc::mem_fun(*toolbar, &LPEToolbar::watch_ec));
+
+ return GTK_WIDGET(toolbar->gobj());
}
-static void lpetool_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
+// this is called when the mode is changed via the toolbar (i.e., one of the subtool buttons is pressed)
+void
+LPEToolbar::mode_changed(int mode)
{
- static sigc::connection c_selection_modified;
- static sigc::connection c_selection_changed;
+ using namespace Inkscape::LivePathEffect;
+
+ ToolBase *ec = _desktop->event_context;
+ if (!SP_IS_LPETOOL_CONTEXT(ec)) {
+ return;
+ }
+
+ // only take action if run by the attr_changed listener
+ if (!_freeze) {
+ // in turn, prevent listener from responding
+ _freeze = true;
+
+ EffectType type = lpesubtools[mode].type;
+
+ LpeTool *lc = SP_LPETOOL_CONTEXT(_desktop->event_context);
+ bool success = lpetool_try_construction(lc, type);
+ if (success) {
+ // since the construction was already performed, we set the state back to inactive
+ _mode_action->set_active(0);
+ mode = 0;
+ } else {
+ // switch to the chosen subtool
+ SP_LPETOOL_CONTEXT(_desktop->event_context)->mode = type;
+ }
+
+ if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt( "/tools/lpetool/mode", mode );
+ }
+
+ _freeze = false;
+ }
+}
+
+void
+LPEToolbar::toggle_show_bbox(GtkToggleAction *act, gpointer data) {
+ SPDesktop *desktop = static_cast<SPDesktop *>(data);
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+
+ bool show = gtk_toggle_action_get_active( act );
+ prefs->setBool("/tools/lpetool/show_bbox", show);
+
+ if (tools_isactive(desktop, TOOLS_LPETOOL)) {
+ LpeTool *lc = SP_LPETOOL_CONTEXT(desktop->event_context);
+ lpetool_context_reset_limiting_bbox(lc);
+ }
+}
+
+void
+LPEToolbar::toggle_set_bbox(GtkToggleAction *act, gpointer data)
+{
+ SPDesktop *desktop = static_cast<SPDesktop *>(data);
+ Inkscape::Selection *selection = desktop->selection;
+
+ Geom::OptRect bbox = selection->visualBounds();
+
+ if (bbox) {
+ Geom::Point A(bbox->min());
+ Geom::Point B(bbox->max());
+
+ A *= desktop->doc2dt();
+ B *= desktop->doc2dt();
+
+ // TODO: should we provide a way to store points in prefs?
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setDouble("/tools/lpetool/bbox_upperleftx", A[Geom::X]);
+ prefs->setDouble("/tools/lpetool/bbox_upperlefty", A[Geom::Y]);
+ prefs->setDouble("/tools/lpetool/bbox_lowerrightx", B[Geom::X]);
+ prefs->setDouble("/tools/lpetool/bbox_lowerrighty", B[Geom::Y]);
+
+ lpetool_context_reset_limiting_bbox(SP_LPETOOL_CONTEXT(desktop->event_context));
+ }
+
+ gtk_toggle_action_set_active(act, false);
+}
+
+void
+LPEToolbar::change_line_segment_type(int mode)
+{
+ using namespace Inkscape::LivePathEffect;
+
+ // quit if run by the attr_changed listener
+ if (_freeze) {
+ return;
+ }
+
+ // in turn, prevent listener from responding
+ _freeze = true;
+ auto line_seg = dynamic_cast<LPELineSegment *>(_currentlpe);
+
+ if (_currentlpeitem && line_seg) {
+ line_seg->end_type.param_set_value(static_cast<Inkscape::LivePathEffect::EndType>(mode));
+ sp_lpe_item_update_patheffect(_currentlpeitem, true, true);
+ }
+ _freeze = false;
+}
+
+void
+LPEToolbar::toggle_show_measuring_info(GtkToggleAction *act, gpointer data)
+{
+ auto toolbar = reinterpret_cast<LPEToolbar *>(data);
+
+ if (!tools_isactive(toolbar->_desktop, TOOLS_LPETOOL)) {
+ return;
+ }
+
+ bool show = gtk_toggle_action_get_active( act );
+
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setBool("/tools/lpetool/show_measuring_info", show);
+
+ LpeTool *lc = SP_LPETOOL_CONTEXT(toolbar->_desktop->event_context);
+ lpetool_show_measuring_info(lc, show);
+
+ toolbar->_units_action->set_sensitive( show );
+}
+
+void
+LPEToolbar::unit_changed(int /* NotUsed */)
+{
+ Unit const *unit = _tracker->getActiveUnit();
+ g_return_if_fail(unit != nullptr);
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setString("/tools/lpetool/unit", unit->abbr);
+
+ if (SP_IS_LPETOOL_CONTEXT(_desktop->event_context)) {
+ LpeTool *lc = SP_LPETOOL_CONTEXT(_desktop->event_context);
+ lpetool_delete_measuring_items(lc);
+ lpetool_create_measuring_items(lc);
+ }
+}
+
+void
+LPEToolbar::open_lpe_dialog(GtkToggleAction *act, gpointer data)
+{
+ SPDesktop *desktop = static_cast<SPDesktop *>(data);
+
+ if (tools_isactive(desktop, TOOLS_LPETOOL)) {
+ sp_action_perform(Inkscape::Verb::get(SP_VERB_DIALOG_LIVE_PATH_EFFECT)->get_action(Inkscape::ActionContext(desktop)), nullptr);
+ }
+ gtk_toggle_action_set_active(act, false);
+}
+
+void
+LPEToolbar::watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec)
+{
if (SP_IS_LPETOOL_CONTEXT(ec)) {
// Watch selection
- c_selection_modified = desktop->getSelection()->connectModified(sigc::bind(sigc::ptr_fun(sp_lpetool_toolbox_sel_modified), holder));
- c_selection_changed = desktop->getSelection()->connectChanged(sigc::bind(sigc::ptr_fun(sp_lpetool_toolbox_sel_changed), holder));
- sp_lpetool_toolbox_sel_changed(desktop->getSelection(), holder);
+ c_selection_modified = desktop->getSelection()->connectModified(sigc::mem_fun(*this, &LPEToolbar::sel_modified));
+ c_selection_changed = desktop->getSelection()->connectChanged(sigc::mem_fun(*this, &LPEToolbar::sel_changed));
+ sel_changed(desktop->getSelection());
} else {
if (c_selection_modified)
c_selection_modified.disconnect();
@@ -437,6 +392,57 @@ static void lpetool_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::To
}
}
+void
+LPEToolbar::sel_modified(Inkscape::Selection *selection, guint /*flags*/)
+{
+ ToolBase *ec = selection->desktop()->event_context;
+ if (SP_IS_LPETOOL_CONTEXT(ec)) {
+ lpetool_update_measuring_items(SP_LPETOOL_CONTEXT(ec));
+ }
+}
+
+void
+LPEToolbar::sel_changed(Inkscape::Selection *selection)
+{
+ using namespace Inkscape::LivePathEffect;
+ ToolBase *ec = selection->desktop()->event_context;
+ if (!SP_IS_LPETOOL_CONTEXT(ec)) {
+ return;
+ }
+ LpeTool *lc = SP_LPETOOL_CONTEXT(ec);
+
+ lpetool_delete_measuring_items(lc);
+ lpetool_create_measuring_items(lc, selection);
+
+ // activate line segment combo box if a single item with LPELineSegment is selected
+ SPItem *item = selection->singleItem();
+ if (item && SP_IS_LPE_ITEM(item) && lpetool_item_has_construction(lc, item)) {
+
+ SPLPEItem *lpeitem = SP_LPE_ITEM(item);
+ Effect* lpe = lpeitem->getCurrentLPE();
+ if (lpe && lpe->effectType() == LINE_SEGMENT) {
+ LPELineSegment *lpels = static_cast<LPELineSegment*>(lpe);
+ _currentlpe = lpe;
+ _currentlpeitem = lpeitem;
+ _line_segment_action->set_sensitive(true);
+ _line_segment_action->set_active( lpels->end_type.get_value() );
+ } else {
+ _currentlpe = nullptr;
+ _currentlpeitem = nullptr;
+ _line_segment_action->set_sensitive(false);
+ }
+
+ } else {
+ _currentlpe = nullptr;
+ _currentlpeitem = nullptr;
+ _line_segment_action->set_sensitive(false);
+ }
+}
+
+}
+}
+}
+
/*
Local Variables:
mode:c++