summaryrefslogtreecommitdiffstats
path: root/src/ui/toolbar/node-toolbar.cpp
diff options
context:
space:
mode:
authorAlexander Valavanis <valavanisalex@gmail.com>2019-02-04 23:17:44 +0000
committerAlexander Valavanis <valavanisalex@gmail.com>2019-02-04 23:17:44 +0000
commita04d9b7aa050920b7d98beac013e94e54fc2414a (patch)
tree1f871112bc6ac0b179c0a0fa4447907b0da67414 /src/ui/toolbar/node-toolbar.cpp
parentrm unused InkRadioAction (diff)
downloadinkscape-a04d9b7aa050920b7d98beac013e94e54fc2414a.tar.gz
inkscape-a04d9b7aa050920b7d98beac013e94e54fc2414a.zip
NodeToolbar: GtkAction migration
Diffstat (limited to 'src/ui/toolbar/node-toolbar.cpp')
-rw-r--r--src/ui/toolbar/node-toolbar.cpp732
1 files changed, 370 insertions, 362 deletions
diff --git a/src/ui/toolbar/node-toolbar.cpp b/src/ui/toolbar/node-toolbar.cpp
index 7fd28185e..9aa83286a 100644
--- a/src/ui/toolbar/node-toolbar.cpp
+++ b/src/ui/toolbar/node-toolbar.cpp
@@ -30,42 +30,38 @@
#include <glibmm/i18n.h>
#include <gtkmm/adjustment.h>
+#include <gtkmm/image.h>
+#include <gtkmm/menutoolbutton.h>
+#include <gtkmm/separatortoolitem.h>
#include "desktop.h"
#include "document-undo.h"
-#include "widgets/ink-toggle-action.h"
-#include "widgets/ink-tool-menu-action.h"
-#include "widgets/toolbox.h"
#include "inkscape.h"
#include "selection-chemistry.h"
#include "verbs.h"
+#include "helper/action.h"
+
#include "object/sp-namedview.h"
#include "ui/icon-names.h"
-#include "ui/pref-pusher.h"
+#include "ui/simple-pref-pusher.h"
#include "ui/tool/control-point-selection.h"
#include "ui/tool/multi-path-manipulator.h"
#include "ui/tools/node-tool.h"
-#include "ui/widget/ink-select-one-action.h"
+#include "ui/widget/combo-tool-item.h"
+#include "ui/widget/spin-button-tool-item.h"
#include "ui/widget/unit-tracker.h"
-#include "widgets/ege-adjustment-action.h"
#include "widgets/widget-sizes.h"
using Inkscape::UI::Widget::UnitTracker;
using Inkscape::Util::Unit;
using Inkscape::Util::Quantity;
using Inkscape::DocumentUndo;
-using Inkscape::UI::ToolboxFactory;
-using Inkscape::UI::PrefPusher;
using Inkscape::Util::unit_table;
using Inkscape::UI::Tools::NodeTool;
-//####################################
-//# node editing callbacks
-//####################################
-
/** Temporary hack: Returns the node tool in the active desktop.
* Will go away during tool refactoring. */
static NodeTool *get_node_tool()
@@ -80,136 +76,6 @@ static NodeTool *get_node_tool()
return tool;
}
-static void sp_node_path_edit_add()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->insertNodes();
- }
-}
-
-static void sp_node_path_edit_add_min_x()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->insertNodesAtExtrema(Inkscape::UI::PointManipulator::EXTR_MIN_X);
- }
-}
-static void sp_node_path_edit_add_max_x()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->insertNodesAtExtrema(Inkscape::UI::PointManipulator::EXTR_MAX_X);
- }
-}
-static void sp_node_path_edit_add_min_y()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->insertNodesAtExtrema(Inkscape::UI::PointManipulator::EXTR_MIN_Y);
- }
-}
-static void sp_node_path_edit_add_max_y()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->insertNodesAtExtrema(Inkscape::UI::PointManipulator::EXTR_MAX_Y);
- }
-}
-
-static void sp_node_path_edit_delete()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- nt->_multipath->deleteNodes(prefs->getBool("/tools/nodes/delete_preserves_shape", true));
- }
-}
-
-static void sp_node_path_edit_delete_segment()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->deleteSegments();
- }
-}
-
-static void sp_node_path_edit_break()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->breakNodes();
- }
-}
-
-static void sp_node_path_edit_join()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->joinNodes();
- }
-}
-
-static void sp_node_path_edit_join_segment()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->joinSegments();
- }
-}
-
-static void sp_node_path_edit_toline()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->setSegmentType(Inkscape::UI::SEGMENT_STRAIGHT);
- }
-}
-
-static void sp_node_path_edit_tocurve()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->setSegmentType(Inkscape::UI::SEGMENT_CUBIC_BEZIER);
- }
-}
-
-static void sp_node_path_edit_cusp()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->setNodeType(Inkscape::UI::NODE_CUSP);
- }
-}
-
-static void sp_node_path_edit_smooth()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->setNodeType(Inkscape::UI::NODE_SMOOTH);
- }
-}
-
-static void sp_node_path_edit_symmetrical()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->setNodeType(Inkscape::UI::NODE_SYMMETRIC);
- }
-}
-
-static void sp_node_path_edit_auto()
-{
- NodeTool *nt = get_node_tool();
- if (nt) {
- nt->_multipath->setNodeType(Inkscape::UI::NODE_AUTO);
- }
-}
-
-static void sp_node_path_edit_nextLPEparam(GtkAction * /*act*/, gpointer data) {
- sp_selection_next_patheffect_param( reinterpret_cast<SPDesktop*>(data) );
-}
-
namespace Inkscape {
namespace UI {
namespace Toolbar {
@@ -218,292 +84,281 @@ NodeToolbar::NodeToolbar(SPDesktop *desktop)
: Toolbar(desktop),
_tracker(new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR)),
_freeze(false)
-{}
-
-GtkWidget *
-NodeToolbar::prep(SPDesktop *desktop, GtkActionGroup* mainActions)
{
- auto holder = new NodeToolbar(desktop);
- Unit doc_units = *desktop->getNamedView()->display_units;
- holder->_tracker->setActiveUnit(&doc_units);
+ auto prefs = Inkscape::Preferences::get();
- GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1);
+ Unit doc_units = *desktop->getNamedView()->display_units;
+ _tracker->setActiveUnit(&doc_units);
{
- InkToolMenuAction* inky = ink_tool_menu_action_new( "NodeInsertAction",
- _("Insert node"),
- _("Insert new nodes into selected segments"),
- INKSCAPE_ICON("node-add"),
- secondarySize );
- gtk_action_set_short_label(GTK_ACTION(inky), _("Insert"));
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_add), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
- GtkToolItem *menu_tool_button = gtk_menu_tool_button_new (nullptr, nullptr);
- gtk_activatable_set_related_action (GTK_ACTIVATABLE (menu_tool_button), GTK_ACTION(inky));
- // also create dummy menu action:
- gtk_action_group_add_action( mainActions, gtk_action_new("NodeInsertActionMenu", nullptr, nullptr, nullptr) );
- }
+ auto insert_node_item = Gtk::manage(new Gtk::MenuToolButton());
+ insert_node_item->set_icon_name(INKSCAPE_ICON("node-add"));
+ insert_node_item->set_label(_("Insert node"));
+ insert_node_item->set_tooltip_text(_("Insert new nodes into selected segments"));
+ insert_node_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_add));
+
+ auto insert_node_menu = Gtk::manage(new Gtk::Menu());
+
+ {
+ // TODO: Consider moving back to icons in menu?
+ //auto insert_min_x_icon = Gtk::manage(new Gtk::Image());
+ //insert_min_x_icon->set_from_icon_name(INKSCAPE_ICON("node_insert_min_x"), Gtk::ICON_SIZE_MENU);
+ //auto insert_min_x_item = Gtk::manage(new Gtk::MenuItem(*insert_min_x_icon));
+ auto insert_min_x_item = Gtk::manage(new Gtk::MenuItem(_("Insert node at min X")));
+ insert_min_x_item->set_tooltip_text(_("Insert new nodes at min X into selected segments"));
+ insert_min_x_item->signal_activate().connect(sigc::mem_fun(*this, &NodeToolbar::edit_add_min_x));
+ insert_node_menu->append(*insert_min_x_item);
+ }
+ {
+ //auto insert_max_x_icon = Gtk::manage(new Gtk::Image());
+ //insert_max_x_icon->set_from_icon_name(INKSCAPE_ICON("node_insert_max_x"), Gtk::ICON_SIZE_MENU);
+ //auto insert_max_x_item = Gtk::manage(new Gtk::MenuItem(*insert_max_x_icon));
+ auto insert_max_x_item = Gtk::manage(new Gtk::MenuItem(_("Insert node at max X")));
+ insert_max_x_item->set_tooltip_text(_("Insert new nodes at max X into selected segments"));
+ insert_max_x_item->signal_activate().connect(sigc::mem_fun(*this, &NodeToolbar::edit_add_max_x));
+ insert_node_menu->append(*insert_max_x_item);
+ }
+ {
+ //auto insert_min_y_icon = Gtk::manage(new Gtk::Image());
+ //insert_min_y_icon->set_from_icon_name(INKSCAPE_ICON("node_insert_min_y"), Gtk::ICON_SIZE_MENU);
+ //auto insert_min_y_item = Gtk::manage(new Gtk::MenuItem(*insert_min_y_icon));
+ auto insert_min_y_item = Gtk::manage(new Gtk::MenuItem(_("Insert node at min Y")));
+ insert_min_y_item->set_tooltip_text(_("Insert new nodes at min Y into selected segments"));
+ insert_min_y_item->signal_activate().connect(sigc::mem_fun(*this, &NodeToolbar::edit_add_min_y));
+ insert_node_menu->append(*insert_min_y_item);
+ }
+ {
+ //auto insert_max_y_icon = Gtk::manage(new Gtk::Image());
+ //insert_max_y_icon->set_from_icon_name(INKSCAPE_ICON("node_insert_max_y"), Gtk::ICON_SIZE_MENU);
+ //auto insert_max_y_item = Gtk::manage(new Gtk::MenuItem(*insert_max_y_icon));
+ auto insert_max_y_item = Gtk::manage(new Gtk::MenuItem(_("Insert node at max Y")));
+ insert_max_y_item->set_tooltip_text(_("Insert new nodes at max Y into selected segments"));
+ insert_max_y_item->signal_activate().connect(sigc::mem_fun(*this, &NodeToolbar::edit_add_max_y));
+ insert_node_menu->append(*insert_max_y_item);
+ }
- {
- InkAction* inky = ink_action_new( "NodeInsertActionMinX",
- _("Insert node at min X"),
- _("Insert new nodes at min X into selected segments"),
- INKSCAPE_ICON("node_insert_min_x"),
- secondarySize );
- gtk_action_set_short_label( GTK_ACTION(inky), _("Insert min X"));
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_add_min_x), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
- }
- {
- InkAction* inky = ink_action_new( "NodeInsertActionMaxX",
- _("Insert node at max X"),
- _("Insert new nodes at max X into selected segments"),
- INKSCAPE_ICON("node_insert_max_x"),
- secondarySize );
- g_object_set( inky, "short_label", _("Insert max X"), NULL );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_add_max_x), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ insert_node_menu->show_all();
+ insert_node_item->set_menu(*insert_node_menu);
+ add(*insert_node_item);
}
+
{
- InkAction* inky = ink_action_new( "NodeInsertActionMinY",
- _("Insert node at min Y"),
- _("Insert new nodes at min Y into selected segments"),
- INKSCAPE_ICON("node_insert_min_y"),
- secondarySize );
- g_object_set( inky, "short_label", _("Insert min Y"), NULL );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_add_min_y), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto delete_item = Gtk::manage(new Gtk::ToolButton(_("Delete node")));
+ delete_item->set_tooltip_text(_("Delete selected nodes"));
+ delete_item->set_icon_name(INKSCAPE_ICON("node-delete"));
+ delete_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_delete));
+ add(*delete_item);
}
+
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
{
- InkAction* inky = ink_action_new( "NodeInsertActionMaxY",
- _("Insert node at max Y"),
- _("Insert new nodes at max Y into selected segments"),
- INKSCAPE_ICON("node_insert_max_y"),
- secondarySize );
- g_object_set( inky, "short_label", _("Insert max Y"), NULL );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_add_max_y), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto join_item = Gtk::manage(new Gtk::ToolButton(_("Join nodes")));
+ join_item->set_tooltip_text(_("Join selected nodes"));
+ join_item->set_icon_name(INKSCAPE_ICON("node-join"));
+ join_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_join));
+ add(*join_item);
}
{
- InkAction* inky = ink_action_new( "NodeDeleteAction",
- _("Delete node"),
- _("Delete selected nodes"),
- INKSCAPE_ICON("node-delete"),
- secondarySize );
- g_object_set( inky, "short_label", _("Delete"), NULL );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_delete), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto break_item = Gtk::manage(new Gtk::ToolButton(_("Break nodes")));
+ break_item->set_tooltip_text(_("Break path at selected nodes"));
+ break_item->set_icon_name(INKSCAPE_ICON("node-break"));
+ break_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_break));
+ add(*break_item);
}
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
{
- InkAction* inky = ink_action_new( "NodeJoinAction",
- _("Join nodes"),
- _("Join selected nodes"),
- INKSCAPE_ICON("node-join"),
- secondarySize );
- g_object_set( inky, "short_label", _("Join"), NULL );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_join), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto join_segment_item = Gtk::manage(new Gtk::ToolButton(_("Join with segment")));
+ join_segment_item->set_tooltip_text(_("Join selected endnodes with a new segment"));
+ join_segment_item->set_icon_name(INKSCAPE_ICON("node-join-segment"));
+ join_segment_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_join_segment));
+ add(*join_segment_item);
}
{
- InkAction* inky = ink_action_new( "NodeBreakAction",
- _("Break nodes"),
- _("Break path at selected nodes"),
- INKSCAPE_ICON("node-break"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_break), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto delete_segment_item = Gtk::manage(new Gtk::ToolButton(_("Delete segment")));
+ delete_segment_item->set_tooltip_text(_("Delete segment between two non-endpoint nodes"));
+ delete_segment_item->set_icon_name(INKSCAPE_ICON("node-delete-segment"));
+ delete_segment_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_delete_segment));
+ add(*delete_segment_item);
}
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
{
- InkAction* inky = ink_action_new( "NodeJoinSegmentAction",
- _("Join with segment"),
- _("Join selected endnodes with a new segment"),
- INKSCAPE_ICON("node-join-segment"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_join_segment), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto cusp_item = Gtk::manage(new Gtk::ToolButton(_("Node Cusp")));
+ cusp_item->set_tooltip_text(_("Make selected nodes corner"));
+ cusp_item->set_icon_name(INKSCAPE_ICON("node-type-cusp"));
+ cusp_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_cusp));
+ add(*cusp_item);
}
{
- InkAction* inky = ink_action_new( "NodeDeleteSegmentAction",
- _("Delete segment"),
- _("Delete segment between two non-endpoint nodes"),
- INKSCAPE_ICON("node-delete-segment"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_delete_segment), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto smooth_item = Gtk::manage(new Gtk::ToolButton(_("Node Smooth")));
+ smooth_item->set_tooltip_text(_("Make selected nodes smooth"));
+ smooth_item->set_icon_name(INKSCAPE_ICON("node-type-smooth"));
+ smooth_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_smooth));
+ add(*smooth_item);
}
{
- InkAction* inky = ink_action_new( "NodeCuspAction",
- _("Node Cusp"),
- _("Make selected nodes corner"),
- INKSCAPE_ICON("node-type-cusp"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_cusp), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto symmetric_item = Gtk::manage(new Gtk::ToolButton(_("Node Symmetric")));
+ symmetric_item->set_tooltip_text(_("Make selected nodes symmetric"));
+ symmetric_item->set_icon_name(INKSCAPE_ICON("node-type-symmetric"));
+ symmetric_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_symmetrical));
+ add(*symmetric_item);
}
{
- InkAction* inky = ink_action_new( "NodeSmoothAction",
- _("Node Smooth"),
- _("Make selected nodes smooth"),
- INKSCAPE_ICON("node-type-smooth"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_smooth), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto auto_item = Gtk::manage(new Gtk::ToolButton(_("Node Auto")));
+ auto_item->set_tooltip_text(_("Make selected nodes auto-smooth"));
+ auto_item->set_icon_name(INKSCAPE_ICON("node-type-auto-smooth"));
+ auto_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_auto));
+ add(*auto_item);
}
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
{
- InkAction* inky = ink_action_new( "NodeSymmetricAction",
- _("Node Symmetric"),
- _("Make selected nodes symmetric"),
- INKSCAPE_ICON("node-type-symmetric"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_symmetrical), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto line_item = Gtk::manage(new Gtk::ToolButton(_("Node Line")));
+ line_item->set_tooltip_text(_("Make selected segments lines"));
+ line_item->set_icon_name(INKSCAPE_ICON("node-segment-line"));
+ line_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_toline));
+ add(*line_item);
}
{
- InkAction* inky = ink_action_new( "NodeAutoAction",
- _("Node Auto"),
- _("Make selected nodes auto-smooth"),
- INKSCAPE_ICON("node-type-auto-smooth"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_auto), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto curve_item = Gtk::manage(new Gtk::ToolButton(_("Node Curve")));
+ curve_item->set_tooltip_text(_("Make selected segments curves"));
+ curve_item->set_icon_name(INKSCAPE_ICON("node-segment-curve"));
+ curve_item->signal_clicked().connect(sigc::mem_fun(*this, &NodeToolbar::edit_tocurve));
+ add(*curve_item);
}
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
+ auto context = Inkscape::ActionContext(_desktop);
+
{
- InkAction* inky = ink_action_new( "NodeLineAction",
- _("Node Line"),
- _("Make selected segments lines"),
- INKSCAPE_ICON("node-segment-line"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_toline), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto object_to_path_item = SPAction::create_toolbutton_for_verb(SP_VERB_OBJECT_TO_CURVE, context);
+ add(*object_to_path_item);
}
{
- InkAction* inky = ink_action_new( "NodeCurveAction",
- _("Node Curve"),
- _("Make selected segments curves"),
- INKSCAPE_ICON("node-segment-curve"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_tocurve), 0 );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ auto stroke_to_path_item = SPAction::create_toolbutton_for_verb(SP_VERB_SELECTION_OUTLINE, context);
+ add(*stroke_to_path_item);
}
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
+ /* X coord of selected node(s) */
{
- InkToggleAction* act = ink_toggle_action_new( "NodesShowTransformHandlesAction",
- _("Show Transform Handles"),
- _("Show transformation handles for selected nodes"),
- "node-transform",
- secondarySize );
- gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- holder->_pusher_show_transform_handles.reset(new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/nodes/show_transform_handles"));
+ std::vector<double> values = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
+ auto nodes_x_val = prefs->getDouble("/tools/nodes/Xcoord", 0);
+ _nodes_x_adj = Gtk::Adjustment::create(nodes_x_val, -1e6, 1e6, SPIN_STEP, SPIN_PAGE_STEP);
+ _nodes_x_item = Gtk::manage(new UI::Widget::SpinButtonToolItem("node-x", _("X:"), _nodes_x_adj));
+ _nodes_x_item->set_tooltip_text(_("X coordinate of selected node(s)"));
+ _nodes_x_item->set_custom_numeric_menu_data(values);
+ _tracker->addAdjustment(_nodes_x_adj->gobj());
+ _nodes_x_item->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _nodes_x_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*this, &NodeToolbar::value_changed), Geom::X));
+ _nodes_x_item->set_sensitive(false);
+ add(*_nodes_x_item);
}
+ /* Y coord of selected node(s) */
{
- InkToggleAction* act = ink_toggle_action_new( "NodesShowHandlesAction",
- _("Show Handles"),
- _("Show Bezier handles of selected nodes"),
- INKSCAPE_ICON("show-node-handles"),
- secondarySize );
- gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- holder->_pusher_show_handles.reset(new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/nodes/show_handles"));
+ std::vector<double> values = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
+ auto nodes_y_val = prefs->getDouble("/tools/nodes/Ycoord", 0);
+ _nodes_y_adj = Gtk::Adjustment::create(nodes_y_val, -1e6, 1e6, SPIN_STEP, SPIN_PAGE_STEP);
+ _nodes_y_item = Gtk::manage(new UI::Widget::SpinButtonToolItem("node-y", _("Y:"), _nodes_y_adj));
+ _nodes_y_item->set_tooltip_text(_("Y coordinate of selected node(s)"));
+ _nodes_y_item->set_custom_numeric_menu_data(values);
+ _tracker->addAdjustment(_nodes_y_adj->gobj());
+ _nodes_y_item->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _nodes_y_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*this, &NodeToolbar::value_changed), Geom::Y));
+ _nodes_y_item->set_sensitive(false);
+ add(*_nodes_y_item);
}
+ // add the units menu
{
- InkToggleAction* act = ink_toggle_action_new( "NodesShowHelperpath",
- _("Show Outline"),
- _("Show path outline (without path effects)"),
- INKSCAPE_ICON("show-path-outline"),
- secondarySize );
- gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- holder->_pusher_show_outline.reset(new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/nodes/show_outline"));
+ auto unit_menu = _tracker->create_tool_item(_("Units"), (""));
+ add(*unit_menu);
}
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
{
- Inkscape::Verb* verb = Inkscape::Verb::get(SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER);
- holder->_nodes_lpeedit = ink_action_new( verb->get_id(),
- verb->get_name(),
- verb->get_tip(),
- INKSCAPE_ICON("path-effect-parameter-next"),
- secondarySize );
- g_signal_connect_after( G_OBJECT(holder->_nodes_lpeedit), "activate", G_CALLBACK(sp_node_path_edit_nextLPEparam), desktop );
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_nodes_lpeedit) );
+ _object_edit_clip_path_item = add_toggle_button(_("Edit clipping paths"),
+ _("Show clipping path(s) of selected object(s)"));
+ _object_edit_clip_path_item->set_icon_name(INKSCAPE_ICON("path-clip-edit"));
+ _pusher_edit_clipping_paths.reset(new SimplePrefPusher(_object_edit_clip_path_item, "/tools/nodes/edit_clipping_paths"));
+ _object_edit_clip_path_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &NodeToolbar::on_pref_toggled),
+ _object_edit_clip_path_item,
+ "/tools/nodes/edit_clipping_paths"));
}
{
- InkToggleAction* inky = ink_toggle_action_new( "ObjectEditClipPathAction",
- _("Edit clipping paths"),
- _("Show clipping path(s) of selected object(s)"),
- INKSCAPE_ICON("path-clip-edit"),
- secondarySize );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
- holder->_pusher_edit_clipping_paths.reset(new PrefPusher(GTK_TOGGLE_ACTION(inky), "/tools/nodes/edit_clipping_paths"));
+ _object_edit_mask_path_item = add_toggle_button(_("Edit masks"),
+ _("Show mask(s) of selected object(s)"));
+ _object_edit_mask_path_item->set_icon_name(INKSCAPE_ICON("path-mask-edit"));
+ _pusher_edit_masks.reset(new SimplePrefPusher(_object_edit_mask_path_item, "/tools/nodes/edit_masks"));
+ _object_edit_mask_path_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &NodeToolbar::on_pref_toggled),
+ _object_edit_mask_path_item,
+ "/tools/nodes/edit_masks"));
}
{
- InkToggleAction* inky = ink_toggle_action_new( "ObjectEditMaskPathAction",
- _("Edit masks"),
- _("Show mask(s) of selected object(s)"),
- INKSCAPE_ICON("path-mask-edit"),
- secondarySize );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
- holder->_pusher_edit_masks.reset(new PrefPusher(GTK_TOGGLE_ACTION(inky), "/tools/nodes/edit_masks"));
+ _nodes_lpeedit_item = SPAction::create_toolbutton_for_verb(SP_VERB_EDIT_NEXT_PATHEFFECT_PARAMETER, context);
+ add(*_nodes_lpeedit_item);
}
- /* X coord of selected node(s) */
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
{
- gchar const* labels[] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
- gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
- holder->_nodes_x_action = create_adjustment_action( "NodeXAction",
- _("X coordinate:"), _("X:"), _("X coordinate of selected node(s)"),
- "/tools/nodes/Xcoord", 0,
- TRUE, "altx-nodes",
- -1e6, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
- labels, values, G_N_ELEMENTS(labels),
- holder->_tracker.get() );
- ege_adjustment_action_set_focuswidget(holder->_nodes_x_action, GTK_WIDGET(desktop->canvas));
- holder->_nodes_x_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_nodes_x_action));
- holder->_nodes_x_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*holder, &NodeToolbar::value_changed), Geom::X));
- gtk_action_set_sensitive( GTK_ACTION(holder->_nodes_x_action), FALSE );
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_nodes_x_action) );
+ _show_transform_handles_item = add_toggle_button(_("Show Transform Handles"),
+ _("Show transformation handles for selected nodes"));
+ _show_transform_handles_item->set_icon_name(INKSCAPE_ICON("node-transform"));
+ _pusher_show_transform_handles.reset(new UI::SimplePrefPusher(_show_transform_handles_item, "/tools/nodes/show_transform_handles"));
+ _show_transform_handles_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &NodeToolbar::on_pref_toggled),
+ _show_transform_handles_item,
+ "/tools/nodes/show_transform_handles"));
}
- /* Y coord of selected node(s) */
{
- gchar const* labels[] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
- gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
- holder->_nodes_y_action = create_adjustment_action( "NodeYAction",
- _("Y coordinate:"), _("Y:"), _("Y coordinate of selected node(s)"),
- "/tools/nodes/Ycoord", 0,
- FALSE, nullptr,
- -1e6, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
- labels, values, G_N_ELEMENTS(labels),
- holder->_tracker.get() );
- ege_adjustment_action_set_focuswidget(holder->_nodes_y_action, GTK_WIDGET(desktop->canvas));
- holder->_nodes_y_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_nodes_y_action));
- holder->_nodes_y_adj->signal_value_changed().connect(sigc::bind(sigc::mem_fun(*holder, &NodeToolbar::value_changed), Geom::Y));
- gtk_action_set_sensitive( GTK_ACTION(holder->_nodes_y_action), FALSE );
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_nodes_y_action) );
+ _show_handles_item = add_toggle_button(_("Show Handles"),
+ _("Show Bezier handles of selected nodes"));
+ _show_handles_item->set_icon_name(INKSCAPE_ICON("show-node-handles"));
+ _pusher_show_handles.reset(new UI::SimplePrefPusher(_show_handles_item, "/tools/nodes/show_handles"));
+ _show_handles_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &NodeToolbar::on_pref_toggled),
+ _show_handles_item,
+ "/tools/nodes/show_handles"));
}
- // add the units menu
{
- InkSelectOneAction* act = holder->_tracker->createAction( "NodeUnitsAction", _("Units"), ("") );
- gtk_action_group_add_action( mainActions, act->gobj() );
+ _show_helper_path_item = add_toggle_button(_("Show Outline"),
+ _("Show path outline (without path effects)"));
+ _show_helper_path_item->set_icon_name(INKSCAPE_ICON("show-path-outline"));
+ _pusher_show_outline.reset(new UI::SimplePrefPusher(_show_helper_path_item, "/tools/nodes/show_outline"));
+ _show_helper_path_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &NodeToolbar::on_pref_toggled),
+ _show_helper_path_item,
+ "/tools/nodes/show_outline"));
}
- holder->sel_changed(desktop->getSelection());
- desktop->connectEventContextChanged(sigc::mem_fun(*holder, &NodeToolbar::watch_ec));
+ sel_changed(desktop->getSelection());
+ desktop->connectEventContextChanged(sigc::mem_fun(*this, &NodeToolbar::watch_ec));
+ show_all();
+}
+
+GtkWidget *
+NodeToolbar::create(SPDesktop *desktop)
+{
+ auto holder = new NodeToolbar(desktop);
return GTK_WIDGET(holder->gobj());
} // NodeToolbar::prep()
@@ -551,12 +406,12 @@ NodeToolbar::sel_changed(Inkscape::Selection *selection)
SPItem *item = selection->singleItem();
if (item && SP_IS_LPE_ITEM(item)) {
if (SP_LPE_ITEM(item)->hasPathEffect()) {
- gtk_action_set_sensitive(GTK_ACTION(_nodes_lpeedit), TRUE);
+ _nodes_lpeedit_item->set_sensitive(true);
} else {
- gtk_action_set_sensitive(GTK_ACTION(_nodes_lpeedit), FALSE);
+ _nodes_lpeedit_item->set_sensitive(false);
}
} else {
- gtk_action_set_sensitive(GTK_ACTION(_nodes_lpeedit), FALSE);
+ _nodes_lpeedit_item->set_sensitive(false);
}
}
@@ -607,11 +462,11 @@ NodeToolbar::coord_changed(gpointer /*shape_editor*/)
NodeTool *nt = get_node_tool();
if (!nt || !(nt->_selected_nodes) ||nt->_selected_nodes->empty()) {
// no path selected
- gtk_action_set_sensitive(GTK_ACTION(_nodes_x_action), FALSE);
- gtk_action_set_sensitive(GTK_ACTION(_nodes_y_action), FALSE);
+ _nodes_x_item->set_sensitive(false);
+ _nodes_y_item->set_sensitive(false);
} else {
- gtk_action_set_sensitive(GTK_ACTION(_nodes_x_action), TRUE);
- gtk_action_set_sensitive(GTK_ACTION(_nodes_y_action), TRUE);
+ _nodes_x_item->set_sensitive(true);
+ _nodes_y_item->set_sensitive(true);
Geom::Coord oldx = Quantity::convert(_nodes_x_adj->get_value(), unit, "px");
Geom::Coord oldy = Quantity::convert(_nodes_y_adj->get_value(), unit, "px");
Geom::Point mid = nt->_selected_nodes->pointwiseBounds()->midpoint();
@@ -627,6 +482,159 @@ NodeToolbar::coord_changed(gpointer /*shape_editor*/)
_freeze = false;
}
+void
+NodeToolbar::edit_add()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->insertNodes();
+ }
+}
+
+void
+NodeToolbar::edit_add_min_x()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->insertNodesAtExtrema(Inkscape::UI::PointManipulator::EXTR_MIN_X);
+ }
+}
+
+void
+NodeToolbar::edit_add_max_x()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->insertNodesAtExtrema(Inkscape::UI::PointManipulator::EXTR_MAX_X);
+ }
+}
+
+void
+NodeToolbar::edit_add_min_y()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->insertNodesAtExtrema(Inkscape::UI::PointManipulator::EXTR_MIN_Y);
+ }
+}
+
+void
+NodeToolbar::edit_add_max_y()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->insertNodesAtExtrema(Inkscape::UI::PointManipulator::EXTR_MAX_Y);
+ }
+}
+
+void
+NodeToolbar::edit_delete()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ nt->_multipath->deleteNodes(prefs->getBool("/tools/nodes/delete_preserves_shape", true));
+ }
+}
+
+void
+NodeToolbar::edit_join()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->joinNodes();
+ }
+}
+
+void
+NodeToolbar::edit_break()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->breakNodes();
+ }
+}
+
+void
+NodeToolbar::edit_delete_segment()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->deleteSegments();
+ }
+}
+
+void
+NodeToolbar::edit_join_segment()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->joinSegments();
+ }
+}
+
+void
+NodeToolbar::edit_cusp()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->setNodeType(Inkscape::UI::NODE_CUSP);
+ }
+}
+
+void
+NodeToolbar::edit_smooth()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->setNodeType(Inkscape::UI::NODE_SMOOTH);
+ }
+}
+
+void
+NodeToolbar::edit_symmetrical()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->setNodeType(Inkscape::UI::NODE_SYMMETRIC);
+ }
+}
+
+void
+NodeToolbar::edit_auto()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->setNodeType(Inkscape::UI::NODE_AUTO);
+ }
+}
+
+void
+NodeToolbar::edit_toline()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->setSegmentType(Inkscape::UI::SEGMENT_STRAIGHT);
+ }
+}
+
+void
+NodeToolbar::edit_tocurve()
+{
+ NodeTool *nt = get_node_tool();
+ if (nt) {
+ nt->_multipath->setSegmentType(Inkscape::UI::SEGMENT_CUBIC_BEZIER);
+ }
+}
+
+void
+NodeToolbar::on_pref_toggled(Gtk::ToggleToolButton *item,
+ const Glib::ustring& path)
+{
+ auto prefs = Inkscape::Preferences::get();
+ prefs->setBool(path, item->get_active());
+}
+
}
}
}