diff options
| author | Alexander Valavanis <valavanisalex@gmail.com> | 2019-02-04 23:17:44 +0000 |
|---|---|---|
| committer | Alexander Valavanis <valavanisalex@gmail.com> | 2019-02-04 23:17:44 +0000 |
| commit | a04d9b7aa050920b7d98beac013e94e54fc2414a (patch) | |
| tree | 1f871112bc6ac0b179c0a0fa4447907b0da67414 /src/ui/toolbar/node-toolbar.cpp | |
| parent | rm unused InkRadioAction (diff) | |
| download | inkscape-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.cpp | 732 |
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()); +} + } } } |
