summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlexander Valavanis <valavanisalex@gmail.com>2019-02-10 14:20:08 +0000
committerAlexander Valavanis <valavanisalex@gmail.com>2019-02-10 14:20:08 +0000
commitbef3ac7c63137da8228946e803f65cb850455459 (patch)
tree3c0ff7992d2526c6a91d6b358003dd20d5859fad /src
parentToolbox: Move deprecated VerbAction to separate file (diff)
downloadinkscape-bef3ac7c63137da8228946e803f65cb850455459.tar.gz
inkscape-bef3ac7c63137da8228946e803f65cb850455459.zip
SprayToolbar: GtkAction migration
Diffstat (limited to 'src')
-rw-r--r--src/ui/toolbar/spray-toolbar.cpp694
-rw-r--r--src/ui/toolbar/spray-toolbar.h74
-rw-r--r--src/ui/tools/spray-tool.cpp10
-rw-r--r--src/widgets/toolbox.cpp2
4 files changed, 325 insertions, 455 deletions
diff --git a/src/ui/toolbar/spray-toolbar.cpp b/src/ui/toolbar/spray-toolbar.cpp
index 1a69af8b8..a2c9f2b55 100644
--- a/src/ui/toolbar/spray-toolbar.cpp
+++ b/src/ui/toolbar/spray-toolbar.cpp
@@ -28,33 +28,28 @@
#include "spray-toolbar.h"
+#include <glibmm/i18n.h>
+
+#include <gtkmm/radiotoolbutton.h>
+#include <gtkmm/separatortoolitem.h>
#include "desktop.h"
#include "inkscape.h"
-#include "widgets/ege-adjustment-action.h"
-#include "widgets/ink-toggle-action.h"
-#include "widgets/toolbox.h"
+
+#include "ui/icon-names.h"
+#include "ui/simple-pref-pusher.h"
+
#include "ui/dialog/clonetiler.h"
#include "ui/dialog/dialog-manager.h"
#include "ui/dialog/panel-dialog.h"
-#include "ui/pref-pusher.h"
-#include "ui/widget/ink-select-one-action.h"
-#include "ui/icon-names.h"
-
-#include <glibmm/i18n.h>
-using Inkscape::UI::ToolboxFactory;
-using Inkscape::UI::PrefPusher;
+#include "ui/widget/spin-button-tool-item.h"
// Disabled in 0.91 because of Bug #1274831 (crash, spraying an object
// with the mode: spray object in single path)
// Please enable again when working on 1.0
#define ENABLE_SPRAY_MODE_SINGLE_PATH
-//########################
-//## Spray ##
-//########################
-
Inkscape::UI::Dialog::CloneTiler *get_clone_tiler_panel(SPDesktop *desktop)
{
if (Inkscape::UI::Dialog::PanelDialogBase *panel_dialog =
@@ -69,348 +64,306 @@ Inkscape::UI::Dialog::CloneTiler *get_clone_tiler_panel(SPDesktop *desktop)
return nullptr;
}
-
namespace Inkscape {
namespace UI {
namespace Toolbar {
SprayToolbar::SprayToolbar(SPDesktop *desktop) :
Toolbar(desktop)
-{}
-
-GtkWidget *
-SprayToolbar::prep(SPDesktop *desktop, GtkActionGroup* mainActions)
{
- auto holder = new SprayToolbar(desktop);
-
- GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- {
- /* Width */
- gchar const* labels[] = {_("(narrow spray)"), nullptr, nullptr, nullptr, _("(default)"), nullptr, nullptr, nullptr, nullptr, _("(broad spray)")};
- gdouble values[] = {1, 3, 5, 10, 15, 20, 30, 50, 75, 100};
- EgeAdjustmentAction *eact = create_adjustment_action( "SprayWidthAction",
- _("Width"), _("Width:"), _("The width of the spray area (relative to the visible canvas area)"),
- "/tools/spray/width", 15,
- true, "altx-spray",
- 1, 100, 1.0, 10.0,
- labels, values, G_N_ELEMENTS(labels),
- nullptr /*unit tracker*/, 1, 0 );
- ege_adjustment_action_set_focuswidget(eact, GTK_WIDGET(desktop->canvas));
- holder->_width_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact));
- holder->_width_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &SprayToolbar::width_value_changed));
- ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT );
- gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
- gtk_action_set_sensitive( GTK_ACTION(eact), true );
- }
-
- /* Use Pressure Width button */
- {
- InkToggleAction* act = ink_toggle_action_new( "SprayPressureWidthAction",
- _("Pressure"),
- _("Use the pressure of the input device to alter the width of spray area"),
- INKSCAPE_ICON("draw-use-pressure"),
- GTK_ICON_SIZE_MENU );
- gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
- holder->_usepressurewidth_pusher.reset(new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/spray/usepressurewidth"));
- }
-
- {
- /* Mean */
- gchar const* labels[] = {_("(default)"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, _("(maximum mean)")};
- gdouble values[] = {0, 5, 10, 20, 30, 50, 70, 100};
- EgeAdjustmentAction *eact = create_adjustment_action( "SprayMeanAction",
- _("Focus"), _("Focus:"), _("0 to spray a spot; increase to enlarge the ring radius"),
- "/tools/spray/mean", 0,
- true, "spray-mean",
- 0, 100, 1.0, 10.0,
- labels, values, G_N_ELEMENTS(labels),
- nullptr /*unit tracker*/, 1, 0 );
- ege_adjustment_action_set_focuswidget(eact, GTK_WIDGET(desktop->canvas));
- holder->_mean_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact));
- holder->_mean_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &SprayToolbar::mean_value_changed));
- ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT );
- gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
- gtk_action_set_sensitive( GTK_ACTION(eact), true );
- }
-
- {
- /* Standard_deviation */
- gchar const* labels[] = {_("(minimum scatter)"), nullptr, nullptr, nullptr, nullptr, nullptr, _("(default)"), _("(maximum scatter)")};
- gdouble values[] = {1, 5, 10, 20, 30, 50, 70, 100};
- EgeAdjustmentAction *eact = create_adjustment_action( "SprayStandard_deviationAction",
- C_("Spray tool", "Scatter"), C_("Spray tool", "Scatter:"), _("Increase to scatter sprayed objects"),
- "/tools/spray/standard_deviation", 70,
- true, "spray-standard_deviation",
- 1, 100, 1.0, 10.0,
- labels, values, G_N_ELEMENTS(labels),
- nullptr /*unit tracker*/, 1, 0 );
- ege_adjustment_action_set_focuswidget(eact, GTK_WIDGET(desktop->canvas));
- holder->_sd_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact));
- holder->_sd_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &SprayToolbar::standard_deviation_value_changed));
- ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT );
- gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
- gtk_action_set_sensitive( GTK_ACTION(eact), true );
- }
/* Mode */
{
- InkSelectOneActionColumns columns;
+ add_label(_("Mode:"));
- Glib::RefPtr<Gtk::ListStore> store = Gtk::ListStore::create(columns);
+ Gtk::RadioToolButton::Group mode_group;
- Gtk::TreeModel::Row row;
+ auto copy_mode_btn = Gtk::manage(new Gtk::RadioToolButton(mode_group, _("Spray with copies")));
+ copy_mode_btn->set_tooltip_text(_("Spray copies of the initial selection"));
+ copy_mode_btn->set_icon_name(INKSCAPE_ICON("spray-mode-copy"));
+ _mode_buttons.push_back(copy_mode_btn);
- row = *(store->append());
- row[columns.col_label ] = _("Spray with copies");
- row[columns.col_tooltip ] = _("Spray copies of the initial selection");
- row[columns.col_icon ] = INKSCAPE_ICON("spray-mode-copy");
- row[columns.col_sensitive] = true;
-
- row = *(store->append());
- row[columns.col_label ] = _("Spray with clones");
- row[columns.col_tooltip ] = _("Spray clones of the initial selection");
- row[columns.col_icon ] = INKSCAPE_ICON("spray-mode-clone");
- row[columns.col_sensitive] = true;
+ auto clone_mode_btn = Gtk::manage(new Gtk::RadioToolButton(mode_group, _("Spray with clones")));
+ clone_mode_btn->set_tooltip_text(_("Spray clones of the initial selection"));
+ clone_mode_btn->set_icon_name(INKSCAPE_ICON("spray-mode-clone"));
+ _mode_buttons.push_back(clone_mode_btn);
#ifdef ENABLE_SPRAY_MODE_SINGLE_PATH
- row = *(store->append());
- row[columns.col_label ] = _("Spray single path");
- row[columns.col_tooltip ] = _("Spray objects in a single path");
- row[columns.col_icon ] = INKSCAPE_ICON("spray-mode-union");
- row[columns.col_sensitive] = true;
+ auto union_mode_btn = Gtk::manage(new Gtk::RadioToolButton(mode_group, _("Spray single path")));
+ union_mode_btn->set_tooltip_text(_("Spray objects in a single path"));
+ union_mode_btn->set_icon_name(INKSCAPE_ICON("spray-mode-union"));
+ _mode_buttons.push_back(union_mode_btn);
#endif
- row = *(store->append());
- row[columns.col_label ] = _("Delete sprayed items");
- row[columns.col_tooltip ] = _("Delete sprayed items from selection");
- row[columns.col_icon ] = INKSCAPE_ICON("draw-eraser");
- row[columns.col_sensitive] = true;
-
- holder->_spray_tool_mode =
- InkSelectOneAction::create( "SprayModeAction", // Name
- _("Mode"), // Label
- "", // Tooltip
- "Not Used", // Icon
- store ); // Tree store
-
- holder->_spray_tool_mode->use_radio( true );
- holder->_spray_tool_mode->use_group_label( true );
- gint mode = prefs->getInt("/tools/spray/mode", 1);
- holder->_spray_tool_mode->set_active( mode );
- gtk_action_group_add_action( mainActions, GTK_ACTION( holder->_spray_tool_mode->gobj() ));
- holder->_spray_tool_mode->signal_changed().connect(sigc::mem_fun(*holder, &SprayToolbar::mode_changed));
+ auto eraser_mode_btn = Gtk::manage(new Gtk::RadioToolButton(mode_group, _("Delete sprayed items")));
+ eraser_mode_btn->set_tooltip_text(_("Delete sprayed items from selection"));
+ eraser_mode_btn->set_icon_name(INKSCAPE_ICON("draw-eraser"));
+ _mode_buttons.push_back(eraser_mode_btn);
+
+ int btn_idx = 0;
+ for (auto btn : _mode_buttons) {
+ btn->set_sensitive(true);
+ add(*btn);
+ btn->signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::mode_changed), btn_idx++));
+ }
+ }
+
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
+ {
+ /* Width */
+ std::vector<Glib::ustring> labels = {_("(narrow spray)"), "", "", "", _("(default)"), "", "", "", "", _("(broad spray)")};
+ std::vector<double> values = { 1, 3, 5, 10, 15, 20, 30, 50, 75, 100};
+ auto width_val = prefs->getDouble("/tools/spray/width", 15);
+ _width_adj = Gtk::Adjustment::create(width_val, 1, 100, 1.0, 10.0);
+ auto width_item = Gtk::manage(new UI::Widget::SpinButtonToolItem("spray-width", _("Width:"), _width_adj, 1, 0));
+ width_item->set_tooltip_text(_("The width of the spray area (relative to the visible canvas area)"));
+ width_item->set_custom_numeric_menu_data(values, labels);
+ width_item->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _width_adj->signal_value_changed().connect(sigc::mem_fun(*this, &SprayToolbar::width_value_changed));
+ // ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT );
+ add(*width_item);
+ width_item->set_sensitive(true);
+ }
+
+ /* Use Pressure Width button */
+ {
+ auto pressure_item = add_toggle_button(_("Pressure"),
+ _("Use the pressure of the input device to alter the width of spray area"));
+ pressure_item->set_icon_name(INKSCAPE_ICON("draw-use-pressure"));
+ _usepressurewidth_pusher.reset(new UI::SimplePrefPusher(pressure_item, "/tools/spray/usepressurewidth"));
+ pressure_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ pressure_item,
+ "/tools/spray/usepressurewidth"));
}
{ /* Population */
- gchar const* labels[] = {_("(low population)"), nullptr, nullptr, nullptr, _("(default)"), nullptr, _("(high population)")};
- gdouble values[] = {5, 20, 35, 50, 70, 85, 100};
- holder->_spray_population = create_adjustment_action( "SprayPopulationAction",
- _("Amount"), _("Amount:"),
- _("Adjusts the number of items sprayed per click"),
- "/tools/spray/population", 70,
- true, "spray-population",
- 1, 100, 1.0, 10.0,
- labels, values, G_N_ELEMENTS(labels),
- nullptr /*unit tracker*/, 1, 0 );
- ege_adjustment_action_set_focuswidget(holder->_spray_population, GTK_WIDGET(desktop->canvas));
- holder->_population_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_spray_population));
- holder->_population_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &SprayToolbar::population_value_changed));
- ege_adjustment_action_set_appearance( holder->_spray_population, TOOLBAR_SLIDER_HINT );
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_spray_population) );
- gtk_action_set_sensitive( GTK_ACTION(holder->_spray_population), true );
+ std::vector<Glib::ustring> labels = {_("(low population)"), "", "", "", _("(default)"), "", _("(high population)")};
+ std::vector<double> values = { 5, 20, 35, 50, 70, 85, 100};
+ auto population_val = prefs->getDouble("/tools/spray/population", 70);
+ _population_adj = Gtk::Adjustment::create(population_val, 1, 100, 1.0, 10.0);
+ _spray_population = Gtk::manage(new UI::Widget::SpinButtonToolItem("spray-population", _("Amount:"), _population_adj, 1, 0));
+ _spray_population->set_tooltip_text(_("Adjusts the number of items sprayed per click"));
+ _spray_population->set_custom_numeric_menu_data(values, labels);
+ _spray_population->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _population_adj->signal_value_changed().connect(sigc::mem_fun(*this, &SprayToolbar::population_value_changed));
+ //ege_adjustment_action_set_appearance( holder->_spray_population, TOOLBAR_SLIDER_HINT );
+ add(*_spray_population);
+ _spray_population->set_sensitive(true);
}
/* Use Pressure Population button */
{
- InkToggleAction* act = ink_toggle_action_new( "SprayPressurePopulationAction",
- _("Pressure"),
- _("Use the pressure of the input device to alter the amount of sprayed objects"),
- INKSCAPE_ICON("draw-use-pressure"),
- GTK_ICON_SIZE_MENU );
- gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
- holder->_usepressurepopulation_pusher.reset(new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/spray/usepressurepopulation"));
+ auto pressure_population_item = add_toggle_button(_("Pressure"),
+ _("Use the pressure of the input device to alter the amount of sprayed objects"));
+ pressure_population_item->set_icon_name(INKSCAPE_ICON("draw-use-pressure"));
+ _usepressurepopulation_pusher.reset(new UI::SimplePrefPusher(pressure_population_item, "/tools/spray/usepressurepopulation"));
+ pressure_population_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ pressure_population_item,
+ "/tools/spray/usepressurepopulation"));
}
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
{ /* Rotation */
- gchar const* labels[] = {_("(default)"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, _("(high rotation variation)")};
- gdouble values[] = {0, 10, 25, 35, 50, 60, 80, 100};
- holder->_spray_rotation = create_adjustment_action( "SprayRotationAction",
- _("Rotation"), _("Rotation:"),
- // xgettext:no-c-format
- _("Variation of the rotation of the sprayed objects; 0% for the same rotation than the original object"),
- "/tools/spray/rotation_variation", 0,
- true, "spray-rotation",
- 0, 100, 1.0, 10.0,
- labels, values, G_N_ELEMENTS(labels),
- nullptr /*unit tracker*/, 1, 0 );
- ege_adjustment_action_set_focuswidget(holder->_spray_rotation, GTK_WIDGET(desktop->canvas));
- holder->_rotation_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_spray_rotation));
- holder->_rotation_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &SprayToolbar::rotation_value_changed));
- ege_adjustment_action_set_appearance(holder->_spray_rotation, TOOLBAR_SLIDER_HINT );
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_spray_rotation) );
- gtk_action_set_sensitive( GTK_ACTION(holder->_spray_rotation), true );
+ std::vector<Glib::ustring> labels = {_("(default)"), "", "", "", "", "", "", _("(high rotation variation)")};
+ std::vector<double> values = { 0, 10, 25, 35, 50, 60, 80, 100};
+ auto rotation_val = prefs->getDouble("/tools/spray/rotation_variation", 0);
+ _rotation_adj = Gtk::Adjustment::create(rotation_val, 0, 100, 1.0, 10.0);
+ _spray_rotation = Gtk::manage(new UI::Widget::SpinButtonToolItem("spray-rotation", _("Rotation:"), _rotation_adj, 1, 0));
+ // xgettext:no-c-format
+ _spray_rotation->set_tooltip_text(_("Variation of the rotation of the sprayed objects; 0% for the same rotation than the original object"));
+ _spray_rotation->set_custom_numeric_menu_data(values, labels);
+ _spray_rotation->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _rotation_adj->signal_value_changed().connect(sigc::mem_fun(*this, &SprayToolbar::rotation_value_changed));
+ // ege_adjustment_action_set_appearance(holder->_spray_rotation, TOOLBAR_SLIDER_HINT );
+ add(*_spray_rotation);
+ _spray_rotation->set_sensitive();
}
{ /* Scale */
- gchar const* labels[] = {_("(default)"), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, _("(high scale variation)")};
- gdouble values[] = {0, 10, 25, 35, 50, 60, 80, 100};
- holder->_spray_scale = create_adjustment_action( "SprayScaleAction",
- C_("Spray tool", "Scale"), C_("Spray tool", "Scale:"),
- // xgettext:no-c-format
- _("Variation in the scale of the sprayed objects; 0% for the same scale than the original object"),
- "/tools/spray/scale_variation", 0,
- true, "spray-scale",
- 0, 100, 1.0, 10.0,
- labels, values, G_N_ELEMENTS(labels),
- nullptr /*unit tracker*/, 1, 0 );
- ege_adjustment_action_set_focuswidget(holder->_spray_scale, GTK_WIDGET(desktop->canvas));
- holder->_scale_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_spray_scale));
- holder->_scale_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &SprayToolbar::scale_value_changed));
- ege_adjustment_action_set_appearance( holder->_spray_scale, TOOLBAR_SLIDER_HINT );
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_spray_scale) );
- gtk_action_set_sensitive( GTK_ACTION(holder->_spray_scale), true );
+ std::vector<Glib::ustring> labels = {_("(default)"), "", "", "", "", "", "", _("(high scale variation)")};
+ std::vector<double> values = { 0, 10, 25, 35, 50, 60, 80, 100};
+ auto scale_val = prefs->getDouble("/tools/spray/scale_variation", 0);
+ _scale_adj = Gtk::Adjustment::create(scale_val, 0, 100, 1.0, 10.0);
+ _spray_scale = Gtk::manage(new UI::Widget::SpinButtonToolItem("spray-scale", C_("Spray tool", "Scale:"), _scale_adj, 1, 0));
+ // xgettext:no-c-format
+ _spray_scale->set_tooltip_text(_("Variation in the scale of the sprayed objects; 0% for the same scale than the original object"));
+ _spray_scale->set_custom_numeric_menu_data(values, labels);
+ _spray_scale->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _scale_adj->signal_value_changed().connect(sigc::mem_fun(*this, &SprayToolbar::scale_value_changed));
+ // ege_adjustment_action_set_appearance( holder->_spray_scale, TOOLBAR_SLIDER_HINT );
+ add(*_spray_scale);
+ _spray_scale->set_sensitive(true);
}
/* Use Pressure Scale button */
{
- holder->_usepressurescale = ink_toggle_action_new( "SprayPressureScaleAction",
- _("Pressure"),
- _("Use the pressure of the input device to alter the scale of new items"),
- INKSCAPE_ICON("draw-use-pressure"),
- GTK_ICON_SIZE_MENU);
- gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(holder->_usepressurescale), prefs->getBool("/tools/spray/usepressurescale", false));
- g_signal_connect(G_OBJECT(holder->_usepressurescale), "toggled", G_CALLBACK(&SprayToolbar::toggle_pressure_scale), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_usepressurescale) );
+ _usepressurescale = add_toggle_button(_("Pressure"),
+ _("Use the pressure of the input device to alter the scale of new items"));
+ _usepressurescale->set_icon_name(INKSCAPE_ICON("draw-use-pressure"));
+ _usepressurescale->set_active(prefs->getBool("/tools/spray/usepressurescale", false));
+ _usepressurescale->signal_toggled().connect(sigc::mem_fun(*this, &SprayToolbar::toggle_pressure_scale));
}
- /* Picker */
- {
- holder->_picker = ink_toggle_action_new( "SprayPickColorAction",
- _("Pick color from the drawing. You can use clonetiler trace dialog for advanced effects. In clone mode original fill or stroke colors must be unset."),
- _("Pick color from the drawing. You can use clonetiler trace dialog for advanced effects. In clone mode original fill or stroke colors must be unset."),
- INKSCAPE_ICON("color-picker"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_picker), prefs->getBool("/tools/spray/picker", false) );
- g_signal_connect(G_OBJECT(holder->_picker), "toggled", G_CALLBACK(&SprayToolbar::toggle_picker), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_picker) );
- }
-
- /* Pick from center */
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
{
- holder->_pick_center = ink_toggle_action_new( "SprayPickCenterAction",
- _("Pick from center instead average area."),
- _("Pick from center instead average area."),
- INKSCAPE_ICON("snap-bounding-box-center"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_pick_center), prefs->getBool("/tools/spray/pick_center", true) );
- g_signal_connect(G_OBJECT(holder->_pick_center), "toggled", G_CALLBACK(&SprayToolbar::toggle_pick_center), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_pick_center) );
+ /* Standard_deviation */
+ std::vector<Glib::ustring> labels = {_("(minimum scatter)"), "", "", "", "", "", _("(default)"), _("(maximum scatter)")};
+ std::vector<double> values = { 1, 5, 10, 20, 30, 50, 70, 100};
+ auto sd_val = prefs->getDouble("/tools/spray/standard_deviation", 70);
+ _sd_adj = Gtk::Adjustment::create(sd_val, 1, 100, 1.0, 10.0);
+ auto sd_item = Gtk::manage(new UI::Widget::SpinButtonToolItem("spray-standard-deviation", C_("Spray tool", "Scatter:"), _sd_adj, 1, 0));
+ sd_item->set_tooltip_text(_("Increase to scatter sprayed objects"));
+ sd_item->set_custom_numeric_menu_data(values, labels);
+ sd_item->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _sd_adj->signal_value_changed().connect(sigc::mem_fun(*this, &SprayToolbar::standard_deviation_value_changed));
+ // ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT );
+ add(*sd_item);
+ sd_item->set_sensitive(true);
}
- /* Inverse Value Size */
{
- holder->_pick_inverse_value = ink_toggle_action_new( "SprayPickInverseValueAction",
- _("Inverted pick value, retaining color in advanced trace mode"),
- _("Inverted pick value, retaining color in advanced trace mode"),
- INKSCAPE_ICON("object-tweak-shrink"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_pick_inverse_value), prefs->getBool("/tools/spray/pick_inverse_value", false) );
- g_signal_connect(G_OBJECT(holder->_pick_inverse_value), "toggled", G_CALLBACK(&SprayToolbar::toggle_pick_inverse_value), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_pick_inverse_value) );
+ /* Mean */
+ std::vector<Glib::ustring> labels = {_("(default)"), "", "", "", "", "", "", _("(maximum mean)")};
+ std::vector<double> values = { 0, 5, 10, 20, 30, 50, 70, 100};
+ auto mean_val = prefs->getDouble("/tools/spray/mean", 0);
+ _mean_adj = Gtk::Adjustment::create(mean_val, 0, 100, 1.0, 10.0);
+ auto mean_item = Gtk::manage(new UI::Widget::SpinButtonToolItem("spray-mean", _("Focus:"), _mean_adj, 1, 0));
+ mean_item->set_tooltip_text(_("0 to spray a spot; increase to enlarge the ring radius"));
+ mean_item->set_custom_numeric_menu_data(values, labels);
+ mean_item->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _mean_adj->signal_value_changed().connect(sigc::mem_fun(*this, &SprayToolbar::mean_value_changed));
+ // ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT );
+ add(*mean_item);
+ mean_item->set_sensitive(true);
}
- /* Pick Fill */
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
+ /* Over No Transparent */
{
- holder->_pick_fill = ink_toggle_action_new( "SprayPickFillAction",
- _("Apply picked color to fill"),
- _("Apply picked color to fill"),
- INKSCAPE_ICON("paint-solid"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_pick_fill), prefs->getBool("/tools/spray/pick_fill", false) );
- g_signal_connect(G_OBJECT(holder->_pick_fill), "toggled", G_CALLBACK(&SprayToolbar::toggle_pick_fill), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_pick_fill) );
+ _over_no_transparent = add_toggle_button(_("Apply over no transparent areas"),
+ _("Apply over no transparent areas"));
+ _over_no_transparent->set_icon_name(INKSCAPE_ICON("object-visible"));
+ _over_no_transparent->set_active(prefs->getBool("/tools/spray/over_no_transparent", true));
+ _over_no_transparent->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ _over_no_transparent,
+ "/tools/spray/over_no_transparent"));
}
- /* Pick Stroke */
+ /* Over Transparent */
{
- holder->_pick_stroke = ink_toggle_action_new( "SprayPickStrokeAction",
- _("Apply picked color to stroke"),
- _("Apply picked color to stroke"),
- INKSCAPE_ICON("no-marker"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_pick_stroke), prefs->getBool("/tools/spray/pick_stroke", false) );
- g_signal_connect(G_OBJECT(holder->_pick_stroke), "toggled", G_CALLBACK(&SprayToolbar::toggle_pick_stroke), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_pick_stroke) );
+ _over_transparent = add_toggle_button(_("Apply over transparent areas"),
+ _("Apply over transparent areas"));
+ _over_transparent->set_icon_name(INKSCAPE_ICON("object-hidden"));
+ _over_transparent->set_active(prefs->getBool("/tools/spray/over_transparent", true));
+ _over_transparent->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ _over_transparent,
+ "/tools/spray/over_transparent"));
}
/* Pick No Overlap */
{
- holder->_pick_no_overlap = ink_toggle_action_new( "SprayPickNoOverlapAction",
- _("No overlap between colors"),
- _("No overlap between colors"),
- INKSCAPE_ICON("symbol-bigger"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_pick_no_overlap), prefs->getBool("/tools/spray/pick_no_overlap", false) );
- g_signal_connect(G_OBJECT(holder->_pick_no_overlap), "toggled", G_CALLBACK(&SprayToolbar::toggle_pick_no_overlap), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_pick_no_overlap) );
+ _pick_no_overlap = add_toggle_button(_("No overlap between colors"),
+ _("No overlap between colors"));
+ _pick_no_overlap->set_icon_name(INKSCAPE_ICON("symbol-bigger"));
+ _pick_no_overlap->set_active(prefs->getBool("/tools/spray/pick_no_overlap", false));
+ _pick_no_overlap->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ _pick_no_overlap,
+ "/tools/spray/pick_no_overlap"));
}
- /* Over Transparent */
+ /* Overlap */
{
- holder->_over_transparent = ink_toggle_action_new( "SprayOverTransparentAction",
- _("Apply over transparent areas"),
- _("Apply over transparent areas"),
- INKSCAPE_ICON("object-hidden"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_over_transparent), prefs->getBool("/tools/spray/over_transparent", true) );
- g_signal_connect(G_OBJECT(holder->_over_transparent), "toggled", G_CALLBACK(&SprayToolbar::toggle_over_transparent), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_over_transparent) );
+ _no_overlap = add_toggle_button(_("Prevent overlapping objects"),
+ _("Prevent overlapping objects"));
+ _no_overlap->set_icon_name(INKSCAPE_ICON("distribute-randomize"));
+ _no_overlap->set_active(prefs->getBool("/tools/spray/no_overlap", false));
+ _no_overlap->signal_toggled().connect(sigc::mem_fun(*this, &SprayToolbar::toggle_no_overlap));
}
- /* Over No Transparent */
+ /* Offset */
{
- holder->_over_no_transparent = ink_toggle_action_new( "SprayOverNoTransparentAction",
- _("Apply over no transparent areas"),
- _("Apply over no transparent areas"),
- INKSCAPE_ICON("object-visible"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_over_no_transparent), prefs->getBool("/tools/spray/over_no_transparent", true) );
- g_signal_connect(G_OBJECT(holder->_over_no_transparent), "toggled", G_CALLBACK(&SprayToolbar::toggle_over_no_transparent), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_over_no_transparent) );
+ std::vector<Glib::ustring> labels = {_("(minimum offset)"), "", "", "", _("(default)"), "", "", _("(maximum offset)")};
+ std::vector<double> values = { 0, 25, 50, 75, 100, 150, 200, 1000};
+ auto offset_val = prefs->getDouble("/tools/spray/offset", 100);
+ _offset_adj = Gtk::Adjustment::create(offset_val, 0, 1000, 1, 4);
+ _offset = Gtk::manage(new UI::Widget::SpinButtonToolItem("spray-offset", _("Offset %:"), _offset_adj, 0, 0));
+ _offset->set_tooltip_text(_("Increase to segregate objects more (value in percent)"));
+ _offset->set_custom_numeric_menu_data(values, labels);
+ _offset->set_focus_widget(Glib::wrap(GTK_WIDGET(desktop->canvas)));
+ _offset_adj->signal_value_changed().connect(sigc::mem_fun(*this, &SprayToolbar::offset_value_changed));
+ add(*_offset);
}
- /* Overlap */
+ add(* Gtk::manage(new Gtk::SeparatorToolItem()));
+
+ /* Picker */
{
- holder->_no_overlap = ink_toggle_action_new( "SprayNoOverlapAction",
- _("Prevent overlapping objects"),
- _("Prevent overlapping objects"),
- INKSCAPE_ICON("distribute-randomize"),
- secondarySize );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(holder->_no_overlap), prefs->getBool("/tools/spray/no_overlap", false) );
- g_signal_connect(G_OBJECT(holder->_no_overlap), "toggled", G_CALLBACK(&SprayToolbar::toggle_no_overlap), holder);
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_no_overlap) );
+ _picker = add_toggle_button(_("Pick color from the drawing. You can use clonetiler trace dialog for advanced effects. In clone mode original fill or stroke colors must be unset."),
+ _("Pick color from the drawing. You can use clonetiler trace dialog for advanced effects. In clone mode original fill or stroke colors must be unset."));
+ _picker->set_icon_name(INKSCAPE_ICON("color-picker"));
+ _picker->set_active(prefs->getBool("/tools/spray/picker", false));
+ _picker->signal_toggled().connect(sigc::mem_fun(*this, &SprayToolbar::toggle_picker));
}
- /* Offset */
+ /* Pick Fill */
+ {
+ _pick_fill = add_toggle_button(_("Apply picked color to fill"),
+ _("Apply picked color to fill"));
+ _pick_fill->set_icon_name(INKSCAPE_ICON("paint-solid"));
+ _pick_fill->set_active(prefs->getBool("/tools/spray/pick_fill", false));
+ _pick_fill->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ _pick_fill,
+ "/tools/spray/pick_fill"));
+ }
+
+ /* Pick Stroke */
+ {
+ _pick_stroke = add_toggle_button(_("Apply picked color to stroke"),
+ _("Apply picked color to stroke"));
+ _pick_stroke->set_icon_name(INKSCAPE_ICON("no-marker"));
+ _pick_stroke->set_active(prefs->getBool("/tools/spray/pick_stroke", false));
+ _pick_stroke->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ _pick_stroke,
+ "/tools/spray/pick_stroke"));
+ }
+
+ /* Inverse Value Size */
{
- gchar const* labels[] = {_("(minimum offset)"), nullptr, nullptr, nullptr, _("(default)"), nullptr, nullptr, _("(maximum offset)")};
- gdouble values[] = {0, 25, 50, 75, 100, 150, 200, 1000};
- holder->_offset = create_adjustment_action( "SprayToolOffsetAction",
- _("Offset %"), _("Offset %:"),
- _("Increase to segregate objects more (value in percent)"),
- "/tools/spray/offset", 100,
- FALSE, nullptr,
- 0, 1000, 1, 4,
- labels, values, G_N_ELEMENTS(labels),
- nullptr, 0 , 0);
- ege_adjustment_action_set_focuswidget(holder->_offset, GTK_WIDGET(desktop->canvas));
- holder->_offset_adj = Glib::wrap(ege_adjustment_action_get_adjustment(holder->_offset));
- holder->_offset_adj->signal_value_changed().connect(sigc::mem_fun(*holder, &SprayToolbar::offset_value_changed));
- gtk_action_group_add_action( mainActions, GTK_ACTION(holder->_offset) );
+ _pick_inverse_value = add_toggle_button(_("Inverted pick value, retaining color in advanced trace mode"),
+ _("Inverted pick value, retaining color in advanced trace mode"));
+ _pick_inverse_value->set_icon_name(INKSCAPE_ICON("object-tweak-shrink"));
+ _pick_inverse_value->set_active(prefs->getBool("/tools/spray/pick_inverse_value", false));
+ _pick_inverse_value->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ _pick_inverse_value,
+ "/tools/spray/pick_inverse_value"));
}
- holder->init();
- return GTK_WIDGET(holder->gobj());
+ /* Pick from center */
+ {
+ _pick_center = add_toggle_button(_("Pick from center instead of average area."),
+ _("Pick from center instead of average area."));
+ _pick_center->set_icon_name(INKSCAPE_ICON("snap-bounding-box-center"));
+ _pick_center->set_active(prefs->getBool("/tools/spray/pick_center", true));
+ _pick_center->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SprayToolbar::on_pref_toggled),
+ _pick_center,
+ "/tools/spray/pick_center"));
+ }
+
+ gint mode = prefs->getInt("/tools/spray/mode", 1);
+ _mode_buttons[mode]->set_active();
+ init();
+ show_all();
+}
+
+GtkWidget *
+SprayToolbar::create(SPDesktop *desktop)
+{
+ auto toolbar = new SprayToolbar(desktop);
+ return GTK_WIDGET(toolbar->gobj());
}
void
@@ -454,24 +407,24 @@ SprayToolbar::init(){
if(mode == 3 || mode == 2){
show = false;
}
- gtk_action_set_visible( GTK_ACTION(_no_overlap), show );
- gtk_action_set_visible( GTK_ACTION(_over_no_transparent), show );
- gtk_action_set_visible( GTK_ACTION(_over_transparent), show );
- gtk_action_set_visible( GTK_ACTION(_pick_no_overlap), show );
- gtk_action_set_visible( GTK_ACTION(_pick_stroke), show );
- gtk_action_set_visible( GTK_ACTION(_pick_fill), show );
- gtk_action_set_visible( GTK_ACTION(_pick_inverse_value), show );
- gtk_action_set_visible( GTK_ACTION(_pick_center), show );
- gtk_action_set_visible( GTK_ACTION(_picker), show );
- gtk_action_set_visible( GTK_ACTION(_offset), show );
- gtk_action_set_visible( GTK_ACTION(_pick_fill), show );
- gtk_action_set_visible( GTK_ACTION(_pick_stroke), show );
- gtk_action_set_visible( GTK_ACTION(_pick_inverse_value), show );
- gtk_action_set_visible( GTK_ACTION(_pick_center), show );
+ _no_overlap->set_visible(show);
+ _over_no_transparent->set_visible(show);
+ _over_transparent->set_visible(show);
+ _pick_no_overlap->set_visible(show);
+ _pick_stroke->set_visible(show);
+ _pick_fill->set_visible(show);
+ _pick_inverse_value->set_visible(show);
+ _pick_center->set_visible(show);
+ _picker->set_visible(show);
+ _offset->set_visible(show);
+ _pick_fill->set_visible(show);
+ _pick_stroke->set_visible(show);
+ _pick_inverse_value->set_visible(show);
+ _pick_center->set_visible(show);
if(mode == 2){
show = true;
}
- gtk_action_set_visible( GTK_ACTION(_spray_rotation), show );
+ _spray_rotation->set_visible(show);
update_widgets();
}
@@ -496,42 +449,29 @@ SprayToolbar::update_widgets()
{
_offset_adj->set_value(100.0);
- if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(_no_overlap)) &&
- gtk_action_get_visible(GTK_ACTION(_no_overlap)))
- {
- gtk_action_set_visible( GTK_ACTION(_offset), true );
- } else {
- gtk_action_set_visible( GTK_ACTION(_offset), false );
- }
- if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(_usepressurescale))) {
+ bool no_overlap_is_active = _no_overlap->get_active() && _no_overlap->get_visible();
+ _offset->set_visible(no_overlap_is_active);
+ if (_usepressurescale->get_active()) {
_scale_adj->set_value(0.0);
- gtk_action_set_sensitive( GTK_ACTION(_spray_scale), false );
- } else {
- gtk_action_set_sensitive( GTK_ACTION(_spray_scale), true );
- }
- if(gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(_picker)) &&
- gtk_action_get_visible(GTK_ACTION(_picker))){
- gtk_action_set_visible( GTK_ACTION(_pick_fill), true );
- gtk_action_set_visible( GTK_ACTION(_pick_stroke), true );
- gtk_action_set_visible( GTK_ACTION(_pick_inverse_value), true );
- gtk_action_set_visible( GTK_ACTION(_pick_center), true );
+ _spray_scale->set_sensitive(false);
} else {
- gtk_action_set_visible( GTK_ACTION(_pick_fill), false );
- gtk_action_set_visible( GTK_ACTION(_pick_stroke), false );
- gtk_action_set_visible( GTK_ACTION(_pick_inverse_value), false );
- gtk_action_set_visible( GTK_ACTION(_pick_center), false );
+ _spray_scale->set_sensitive(true);
}
+
+ bool picker_is_active = _picker->get_active() && _picker->get_visible();
+ _pick_fill->set_visible(picker_is_active);
+ _pick_stroke->set_visible(picker_is_active);
+ _pick_inverse_value->set_visible(picker_is_active);
+ _pick_center->set_visible(picker_is_active);
}
void
-SprayToolbar::toggle_no_overlap(GtkToggleAction *toggleaction,
- gpointer user_data)
+SprayToolbar::toggle_no_overlap()
{
- auto toolbar = reinterpret_cast<SprayToolbar *>(user_data);
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
+ auto prefs = Inkscape::Preferences::get();
+ bool active = _no_overlap->get_active();
prefs->setBool("/tools/spray/no_overlap", active);
- toolbar->update_widgets();
+ update_widgets();
}
void
@@ -551,44 +491,22 @@ SprayToolbar::offset_value_changed()
}
void
-SprayToolbar::toggle_pressure_scale(GtkToggleAction *toggleaction,
- gpointer user_data)
+SprayToolbar::toggle_pressure_scale()
{
- auto toolbar = reinterpret_cast<SprayToolbar *>(user_data);
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
+ auto prefs = Inkscape::Preferences::get();
+ bool active = _usepressurescale->get_active();
prefs->setBool("/tools/spray/usepressurescale", active);
if(active){
prefs->setDouble("/tools/spray/scale_variation", 0);
}
- toolbar->update_widgets();
-}
-
-void
-SprayToolbar::toggle_over_no_transparent(GtkToggleAction *toggleaction,
- gpointer /* user_data */)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
- prefs->setBool("/tools/spray/over_no_transparent", active);
-}
-
-void
-SprayToolbar::toggle_over_transparent(GtkToggleAction *toggleaction,
- gpointer /* user_data */)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
- prefs->setBool("/tools/spray/over_transparent", active);
+ update_widgets();
}
void
-SprayToolbar::toggle_picker(GtkToggleAction *toggleaction,
- gpointer user_data)
+SprayToolbar::toggle_picker()
{
- auto toolbar = reinterpret_cast<SprayToolbar *>(user_data);
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
+ auto prefs = Inkscape::Preferences::get();
+ bool active = _picker->get_active();
prefs->setBool("/tools/spray/picker", active);
if(active){
prefs->setBool("/dialogs/clonetiler/dotrace", false);
@@ -598,52 +516,16 @@ SprayToolbar::toggle_picker(GtkToggleAction *toggleaction,
ct->show_page_trace();
}
}
- toolbar->update_widgets();
-}
-
-void
-SprayToolbar::toggle_pick_center(GtkToggleAction *toggleaction,
- gpointer /* user_data */)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
- prefs->setBool("/tools/spray/pick_center", active);
-}
-
-void
-SprayToolbar::toggle_pick_fill(GtkToggleAction *toggleaction,
- gpointer /* user_data */)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
- prefs->setBool("/tools/spray/pick_fill", active);
-}
-
-void
-SprayToolbar::toggle_pick_stroke(GtkToggleAction *toggleaction,
- gpointer /* user_data */)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
- prefs->setBool("/tools/spray/pick_stroke", active);
-}
-
-void
-SprayToolbar::toggle_pick_no_overlap(GtkToggleAction *toggleaction,
- gpointer /* user_data */)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
- prefs->setBool("/tools/spray/pick_no_overlap", active);
+ update_widgets();
}
void
-SprayToolbar::toggle_pick_inverse_value(GtkToggleAction *toggleaction,
- gpointer /* user_data */)
+SprayToolbar::on_pref_toggled(Gtk::ToggleToolButton *btn,
+ const Glib::ustring& path)
{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gboolean active = gtk_toggle_action_get_active(toggleaction);
- prefs->setBool("/tools/spray/pick_inverse_value", active);
+ auto prefs = Inkscape::Preferences::get();
+ bool active = btn->get_active();
+ prefs->setBool(path, active);
}
}
diff --git a/src/ui/toolbar/spray-toolbar.h b/src/ui/toolbar/spray-toolbar.h
index 7d6cad56d..8c8d9172b 100644
--- a/src/ui/toolbar/spray-toolbar.h
+++ b/src/ui/toolbar/spray-toolbar.h
@@ -32,16 +32,19 @@
#include <gtkmm/adjustment.h>
-class InkSelectOneAction;
class SPDesktop;
-typedef struct _EgeAdjustmentAction EgeAdjustmentAction;
-typedef struct _GtkActionGroup GtkActionGroup;
-typedef struct _InkToggleAction InkToggleAction;
+namespace Gtk {
+class RadioToolButton;
+}
namespace Inkscape {
namespace UI {
-class PrefPusher;
+class SimplePrefPusher;
+
+namespace Widget {
+class SpinButtonToolItem;
+}
namespace Toolbar {
class SprayToolbar : public Toolbar {
@@ -54,24 +57,24 @@ private:
Glib::RefPtr<Gtk::Adjustment> _offset_adj;
Glib::RefPtr<Gtk::Adjustment> _scale_adj;
- std::unique_ptr<PrefPusher> _usepressurewidth_pusher;
- std::unique_ptr<PrefPusher> _usepressurepopulation_pusher;
+ std::unique_ptr<SimplePrefPusher> _usepressurewidth_pusher;
+ std::unique_ptr<SimplePrefPusher> _usepressurepopulation_pusher;
- InkSelectOneAction *_spray_tool_mode;
- EgeAdjustmentAction *_spray_population;
- EgeAdjustmentAction *_spray_rotation;
- EgeAdjustmentAction *_spray_scale;
- InkToggleAction * _usepressurescale;
- InkToggleAction *_picker;
- InkToggleAction *_pick_center;
- InkToggleAction *_pick_inverse_value;
- InkToggleAction *_pick_fill;
- InkToggleAction *_pick_stroke;
- InkToggleAction *_pick_no_overlap;
- InkToggleAction *_over_transparent;
- InkToggleAction *_over_no_transparent;
- InkToggleAction *_no_overlap;
- EgeAdjustmentAction *_offset;
+ std::vector<Gtk::RadioToolButton *> _mode_buttons;
+ UI::Widget::SpinButtonToolItem *_spray_population;
+ UI::Widget::SpinButtonToolItem *_spray_rotation;
+ UI::Widget::SpinButtonToolItem *_spray_scale;
+ Gtk::ToggleToolButton *_usepressurescale;
+ Gtk::ToggleToolButton *_picker;
+ Gtk::ToggleToolButton *_pick_center;
+ Gtk::ToggleToolButton *_pick_inverse_value;
+ Gtk::ToggleToolButton *_pick_fill;
+ Gtk::ToggleToolButton *_pick_stroke;
+ Gtk::ToggleToolButton *_pick_no_overlap;
+ Gtk::ToggleToolButton *_over_transparent;
+ Gtk::ToggleToolButton *_over_no_transparent;
+ Gtk::ToggleToolButton *_no_overlap;
+ UI::Widget::SpinButtonToolItem *_offset;
void width_value_changed();
void mean_value_changed();
@@ -83,32 +86,17 @@ private:
void update_widgets();
void scale_value_changed();
void offset_value_changed();
- static void toggle_no_overlap (GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_pressure_scale (GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_over_no_transparent(GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_over_transparent (GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_picker (GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_pick_center (GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_pick_fill (GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_pick_stroke (GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_pick_no_overlap (GtkToggleAction *toggleaction,
- gpointer user_data);
- static void toggle_pick_inverse_value (GtkToggleAction *toggleaction,
- gpointer user_data);
+ void on_pref_toggled(Gtk::ToggleToolButton *btn,
+ const Glib::ustring& path);
+ void toggle_no_overlap();
+ void toggle_pressure_scale();
+ void toggle_picker();
protected:
SprayToolbar(SPDesktop *desktop);
public:
- static GtkWidget * prep(SPDesktop *desktop, GtkActionGroup* mainActions);
+ static GtkWidget * create(SPDesktop *desktop);
};
}
}
diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp
index 907b04a9a..4ae36ed23 100644
--- a/src/ui/tools/spray-tool.cpp
+++ b/src/ui/tools/spray-tool.cpp
@@ -1422,7 +1422,7 @@ bool SprayTool::root_handler(GdkEvent* event) {
this->width = 1.0;
}
// The same spinbutton is for alt+x
- desktop->setToolboxAdjustmentValue("altx-spray", this->width * 100);
+ desktop->setToolboxAdjustmentValue("spray-width", this->width * 100);
sp_spray_update_area(this);
ret = TRUE;
}
@@ -1434,7 +1434,7 @@ bool SprayTool::root_handler(GdkEvent* event) {
if (this->width < 0.01) {
this->width = 0.01;
}
- desktop->setToolboxAdjustmentValue("altx-spray", this->width * 100);
+ desktop->setToolboxAdjustmentValue("spray-width", this->width * 100);
sp_spray_update_area(this);
ret = TRUE;
}
@@ -1442,21 +1442,21 @@ bool SprayTool::root_handler(GdkEvent* event) {
case GDK_KEY_Home:
case GDK_KEY_KP_Home:
this->width = 0.01;
- desktop->setToolboxAdjustmentValue("altx-spray", this->width * 100);
+ desktop->setToolboxAdjustmentValue("spray-width", this->width * 100);
sp_spray_update_area(this);
ret = TRUE;
break;
case GDK_KEY_End:
case GDK_KEY_KP_End:
this->width = 1.0;
- desktop->setToolboxAdjustmentValue("altx-spray", this->width * 100);
+ desktop->setToolboxAdjustmentValue("spray-width", this->width * 100);
sp_spray_update_area(this);
ret = TRUE;
break;
case GDK_KEY_x:
case GDK_KEY_X:
if (MOD__ALT_ONLY(event)) {
- desktop->setToolboxFocusTo("altx-spray");
+ desktop->setToolboxFocusTo("spray-width");
ret = TRUE;
}
break;
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 472a2c11b..61aadf202 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -195,7 +195,7 @@ static struct {
SP_VERB_INVALID, nullptr, nullptr},
{ "/tools/tweak", "tweak_toolbox", Inkscape::UI::Toolbar::TweakToolbar::create, nullptr, "TweakToolbar",
SP_VERB_CONTEXT_TWEAK_PREFS, "/tools/tweak", N_("Color/opacity used for color tweaking")},
- { "/tools/spray", "spray_toolbox", nullptr, Inkscape::UI::Toolbar::SprayToolbar::prep, "SprayToolbar",
+ { "/tools/spray", "spray_toolbox", Inkscape::UI::Toolbar::SprayToolbar::create, nullptr, "SprayToolbar",
SP_VERB_INVALID, nullptr, nullptr},
{ "/tools/zoom", "zoom_toolbox", Inkscape::UI::Toolbar::ZoomToolbar::create, nullptr, "ZoomToolbar",
SP_VERB_INVALID, nullptr, nullptr},