diff options
| author | Alexander Valavanis <valavanisalex@gmail.com> | 2019-01-19 13:58:46 +0000 |
|---|---|---|
| committer | Alexander Valavanis <valavanisalex@gmail.com> | 2019-01-19 13:58:46 +0000 |
| commit | e77e650354daef5ced80adddf6d5a334bb6216d3 (patch) | |
| tree | ac1237a3194056ac457b5a9a7468b0d61c3a7335 /src/ui/toolbar/eraser-toolbar.cpp | |
| parent | Merge branch 'master' of gitlab.com:inkscape/inkscape (diff) | |
| download | inkscape-e77e650354daef5ced80adddf6d5a334bb6216d3.tar.gz inkscape-e77e650354daef5ced80adddf6d5a334bb6216d3.zip | |
derive all toolbars from Inkscape::Toolbar
Diffstat (limited to 'src/ui/toolbar/eraser-toolbar.cpp')
| -rw-r--r-- | src/ui/toolbar/eraser-toolbar.cpp | 379 |
1 files changed, 213 insertions, 166 deletions
diff --git a/src/ui/toolbar/eraser-toolbar.cpp b/src/ui/toolbar/eraser-toolbar.cpp index ee28c127b..8950b6a58 100644 --- a/src/ui/toolbar/eraser-toolbar.cpp +++ b/src/ui/toolbar/eraser-toolbar.cpp @@ -48,89 +48,19 @@ using Inkscape::UI::PrefPusher; //## Eraser ## //######################## -// A dummy function for PrefPusher. -// The code was calling the update_presets_list function in the calligraphy tool -// which was immediately returning. TODO: Investigate this further. -void eraser_update_presets_list(GObject *tbl) -{ - return; -} - -static void sp_erc_width_value_changed( GtkAdjustment *adj, GObject *tbl ) -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble( "/tools/eraser/width", gtk_adjustment_get_value(adj) ); -} - -static void sp_erc_mass_value_changed( GtkAdjustment *adj, GObject* tbl ) -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble( "/tools/eraser/mass", gtk_adjustment_get_value(adj) ); -} - -static void sp_erc_velthin_value_changed( GtkAdjustment *adj, GObject* tbl ) -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/tools/eraser/thinning", gtk_adjustment_get_value(adj) ); -} - -static void sp_erc_cap_rounding_value_changed( GtkAdjustment *adj, GObject* tbl ) -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble( "/tools/eraser/cap_rounding", gtk_adjustment_get_value(adj) ); -} - -static void sp_erc_tremor_value_changed( GtkAdjustment *adj, GObject* tbl ) -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble( "/tools/eraser/tremor", gtk_adjustment_get_value(adj) ); -} - -static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint eraser_mode) -{ - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "split") ), (eraser_mode == ERASER_MODE_CUT)); - - const gboolean visibility = (eraser_mode != ERASER_MODE_DELETE); - const std::array<const gchar *, 6> arr = {"cap_rounding", "mass", "thinning", "tremor", "usepressure", "width"}; - for (const gchar * str : arr) { - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, str) ), visibility ); - } -} - -static void sp_erasertb_mode_changed( GObject *tbl, int mode ) -{ - SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" )); - if (DocumentUndo::getUndoSensitive(desktop->getDocument())) { - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt( "/tools/eraser/mode", mode ); - } - sp_set_tbl_eraser_mode_visibility(tbl, mode); - - // only take action if run by the attr_changed listener - if (!g_object_get_data( tbl, "freeze" )) { - // in turn, prevent listener from responding - g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) ); - - /* - if ( eraser_mode != ERASER_MODE_DELETE ) { - } else { - } - */ - // TODO finish implementation - - g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); - } -} -static void sp_toggle_break_apart( GtkToggleAction* act, gpointer data ) +namespace Inkscape { +namespace UI { +namespace Toolbar { +EraserToolbar::~EraserToolbar() { - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - gboolean active = gtk_toggle_action_get_active(act); - prefs->setBool("/tools/eraser/break_apart", active); + if(_pressure_pusher) delete _pressure_pusher; } -void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) +GtkWidget * +EraserToolbar::prep(SPDesktop *desktop, GtkActionGroup* mainActions) { + auto toolbar = new EraserToolbar(desktop); GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); gint eraser_mode = ERASER_MODE_DELETE; @@ -160,21 +90,20 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb row[columns.col_icon ] = INKSCAPE_ICON("path-intersection"); row[columns.col_sensitive] = true; - InkSelectOneAction* act = + toolbar->_eraser_mode_action = InkSelectOneAction::create( "EraserModeAction", // Name _("Mode"), // Label "", // Tooltip "Not Used", // Icon store ); // Tree store - act->use_radio( true ); - act->use_group_label( true ); + toolbar->_eraser_mode_action->use_radio( true ); + toolbar->_eraser_mode_action->use_group_label( true ); eraser_mode = prefs->getInt("/tools/eraser/mode", ERASER_MODE_CLIP); // Used at end - act->set_active( eraser_mode ); + toolbar->_eraser_mode_action->set_active( eraser_mode ); - gtk_action_group_add_action( mainActions, GTK_ACTION( act->gobj() )); - g_object_set_data( holder, "EraserModeAction", act ); + gtk_action_group_add_action( mainActions, GTK_ACTION( toolbar->_eraser_mode_action->gobj() )); - act->signal_changed().connect(sigc::bind<0>(sigc::ptr_fun(&sp_erasertb_mode_changed), holder)); + toolbar->_eraser_mode_action->signal_changed().connect(sigc::mem_fun(*toolbar, &EraserToolbar::mode_changed)); } @@ -182,32 +111,34 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb { gchar const* labels[] = {_("(no width)"),_("(hairline)"), nullptr, nullptr, nullptr, _("(default)"), nullptr, nullptr, nullptr, nullptr, _("(broad stroke)")}; gdouble values[] = {0, 1, 3, 5, 10, 15, 20, 30, 50, 75, 100}; - EgeAdjustmentAction *eact = create_adjustment_action( "EraserWidthAction", - _("Pen Width"), _("Width:"), - _("The width of the eraser pen (relative to the visible canvas area)"), - "/tools/eraser/width", 15, - GTK_WIDGET(desktop->canvas), holder, TRUE, "altx-eraser", - 0, 100, 1.0, 10.0, - labels, values, G_N_ELEMENTS(labels), - sp_erc_width_value_changed, nullptr /*unit tracker*/, 1, 0); - ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - g_object_set_data( holder, "width", eact ); - gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); + toolbar->_width = create_adjustment_action( "EraserWidthAction", + _("Pen Width"), _("Width:"), + _("The width of the eraser pen (relative to the visible canvas area)"), + "/tools/eraser/width", 15, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + TRUE, "altx-eraser", + 0, 100, 1.0, 10.0, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + nullptr /*unit tracker*/, 1, 0); + toolbar->_width_adj = Glib::wrap(ege_adjustment_action_get_adjustment(toolbar->_width)); + toolbar->_width_adj->signal_value_changed().connect(sigc::mem_fun(*toolbar, &EraserToolbar::width_value_changed)); + ege_adjustment_action_set_appearance( toolbar->_width, TOOLBAR_SLIDER_HINT ); + gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_width) ); + gtk_action_set_sensitive( GTK_ACTION(toolbar->_width), TRUE ); } /* Use Pressure button */ { - InkToggleAction* act = ink_toggle_action_new( "EraserPressureAction", - _("Eraser Pressure"), - _("Use the pressure of the input device to alter the width of the pen"), - INKSCAPE_ICON("draw-use-pressure"), - GTK_ICON_SIZE_MENU ); - gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); - PrefPusher *pusher = new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/eraser/usepressure", eraser_update_presets_list, holder); - g_signal_connect( holder, "destroy", G_CALLBACK(delete_prefspusher), pusher); - g_object_set_data( holder, "usepressure", act ); + toolbar->_usepressure = ink_toggle_action_new( "EraserPressureAction", + _("Eraser Pressure"), + _("Use the pressure of the input device to alter the width of the pen"), + INKSCAPE_ICON("draw-use-pressure"), + GTK_ICON_SIZE_MENU ); + gtk_action_group_add_action( mainActions, GTK_ACTION( toolbar->_usepressure ) ); + toolbar->_pressure_pusher = new PrefPusher(GTK_TOGGLE_ACTION(toolbar->_usepressure), "/tools/eraser/usepressure", update_presets_list, (gpointer)toolbar); } @@ -215,17 +146,21 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb { gchar const* labels[] = {_("(speed blows up stroke)"), nullptr, nullptr, _("(slight widening)"), _("(constant width)"), _("(slight thinning, default)"), nullptr, nullptr, _("(speed deflates stroke)")}; gdouble values[] = {-100, -40, -20, -10, 0, 10, 20, 40, 100}; - EgeAdjustmentAction* eact = create_adjustment_action( "EraserThinningAction", - _("Eraser Stroke Thinning"), _("Thinning:"), - _("How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 makes them broader, 0 makes width independent of velocity)"), - "/tools/eraser/thinning", 10, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - -100, 100, 1, 10.0, - labels, values, G_N_ELEMENTS(labels), - sp_erc_velthin_value_changed, nullptr /*unit tracker*/, 1, 0); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - g_object_set_data( holder, "thinning", eact ); - gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); + toolbar->_thinning = create_adjustment_action( "EraserThinningAction", + _("Eraser Stroke Thinning"), _("Thinning:"), + _("How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 makes them broader, 0 makes width independent of velocity)"), + "/tools/eraser/thinning", 10, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + -100, 100, 1, 10.0, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + nullptr /*unit tracker*/, 1, 0); + toolbar->_thinning_adj = Glib::wrap(ege_adjustment_action_get_adjustment(toolbar->_thinning)); + toolbar->_thinning_adj->signal_value_changed().connect(sigc::mem_fun(*toolbar, &EraserToolbar::velthin_value_changed)); + gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_thinning) ); + gtk_action_set_sensitive( GTK_ACTION(toolbar->_thinning), TRUE ); } @@ -234,17 +169,21 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb gchar const* labels[] = {_("(blunt caps, default)"), _("(slightly bulging)"), nullptr, nullptr, _("(approximately round)"), _("(long protruding caps)")}; gdouble values[] = {0, 0.3, 0.5, 1.0, 1.4, 5.0}; // TRANSLATORS: "cap" means "end" (both start and finish) here - EgeAdjustmentAction* eact = create_adjustment_action( "EraserCapRoundingAction", - _("Eraser Cap rounding"), _("Caps:"), - _("Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = round caps)"), - "/tools/eraser/cap_rounding", 0.0, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - 0.0, 5.0, 0.01, 0.1, - labels, values, G_N_ELEMENTS(labels), - sp_erc_cap_rounding_value_changed, nullptr /*unit tracker*/, 0.01, 2 ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - g_object_set_data( holder, "cap_rounding", eact ); - gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); + toolbar->_cap_rounding = create_adjustment_action( "EraserCapRoundingAction", + _("Eraser Cap rounding"), _("Caps:"), + _("Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = round caps)"), + "/tools/eraser/cap_rounding", 0.0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0.0, 5.0, 0.01, 0.1, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + nullptr /*unit tracker*/, 0.01, 2 ); + toolbar->_cap_rounding_adj = Glib::wrap(ege_adjustment_action_get_adjustment(toolbar->_cap_rounding)); + toolbar->_cap_rounding_adj->signal_value_changed().connect(sigc::mem_fun(*toolbar, &EraserToolbar::cap_rounding_value_changed)); + gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_cap_rounding) ); + gtk_action_set_sensitive( GTK_ACTION(toolbar->_cap_rounding), TRUE ); } @@ -252,55 +191,163 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb { gchar const* labels[] = {_("(smooth line)"), _("(slight tremor)"), _("(noticeable tremor)"), nullptr, nullptr, _("(maximum tremor)")}; gdouble values[] = {0, 10, 20, 40, 60, 100}; - EgeAdjustmentAction* eact = create_adjustment_action( "EraserTremorAction", - _("EraserStroke Tremor"), _("Tremor:"), - _("Increase to make strokes rugged and trembling"), - "/tools/eraser/tremor", 0.0, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - 0.0, 100, 1, 10.0, - labels, values, G_N_ELEMENTS(labels), - sp_erc_tremor_value_changed, nullptr /*unit tracker*/, 1, 0); - - ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT ); - g_object_set_data( holder, "tremor", eact ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); + toolbar->_tremor = create_adjustment_action( "EraserTremorAction", + _("EraserStroke Tremor"), _("Tremor:"), + _("Increase to make strokes rugged and trembling"), + "/tools/eraser/tremor", 0.0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0.0, 100, 1, 10.0, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + nullptr /*unit tracker*/, 1, 0); + toolbar->_tremor_adj = Glib::wrap(ege_adjustment_action_get_adjustment(toolbar->_tremor)); + toolbar->_tremor_adj->signal_value_changed().connect(sigc::mem_fun(*toolbar, &EraserToolbar::tremor_value_changed)); + + ege_adjustment_action_set_appearance( toolbar->_tremor, TOOLBAR_SLIDER_HINT ); + gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_tremor) ); + gtk_action_set_sensitive( GTK_ACTION(toolbar->_tremor), TRUE ); } - /* Mass */ { - gchar const* labels[] = {_("(no inertia)"), _("(slight smoothing, default)"), _("(noticeable lagging)"), nullptr, nullptr, _("(maximum inertia)")}; + gchar const* labels[] = {_("(no inertia)"), _("(slight smoothing, default)"), _("(noticeable lagging)"), nullptr, nullptr, _("(maximum inertia)")}; gdouble values[] = {0.0, 2, 10, 20, 50, 100}; - EgeAdjustmentAction* eact = create_adjustment_action( "EraserMassAction", - _("Eraser Mass"), _("Mass:"), - _("Increase to make the eraser drag behind, as if slowed by inertia"), - "/tools/eraser/mass", 10.0, - GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr, - 0.0, 100, 1, 10.0, - labels, values, G_N_ELEMENTS(labels), - sp_erc_mass_value_changed, nullptr /*unit tracker*/, 1, 0); - ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT ); - g_object_set_data( holder, "mass", eact ); - gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); - gtk_action_set_sensitive( GTK_ACTION(eact), TRUE ); + toolbar->_mass = create_adjustment_action( "EraserMassAction", + _("Eraser Mass"), _("Mass:"), + _("Increase to make the eraser drag behind, as if slowed by inertia"), + "/tools/eraser/mass", 10.0, + GTK_WIDGET(desktop->canvas), + nullptr, // dataKludge + FALSE, nullptr, + 0.0, 100, 1, 10.0, + labels, values, G_N_ELEMENTS(labels), + nullptr, // callback + nullptr /*unit tracker*/, 1, 0); + toolbar->_mass_adj = Glib::wrap(ege_adjustment_action_get_adjustment(toolbar->_mass)); + toolbar->_mass_adj->signal_value_changed().connect(sigc::mem_fun(*toolbar, &EraserToolbar::mass_value_changed)); + ege_adjustment_action_set_appearance( toolbar->_mass, TOOLBAR_SLIDER_HINT ); + gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_mass) ); + gtk_action_set_sensitive( GTK_ACTION(toolbar->_mass), TRUE ); } - /* Overlap */ { - InkToggleAction* act = ink_toggle_action_new( "EraserBreakAppart", - _("Break apart cut items"), - _("Break apart cut items"), - INKSCAPE_ICON("distribute-randomize"), - secondarySize ); - gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/eraser/break_apart", false) ); - g_object_set_data( holder, "split", act ); - g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_toggle_break_apart), holder) ; - gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); + toolbar->_split = ink_toggle_action_new( "EraserBreakAppart", + _("Break apart cut items"), + _("Break apart cut items"), + INKSCAPE_ICON("distribute-randomize"), + secondarySize ); + gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(toolbar->_split), prefs->getBool("/tools/eraser/break_apart", false) ); + g_signal_connect_after( G_OBJECT(toolbar->_split), "toggled", G_CALLBACK(toggle_break_apart), (gpointer)toolbar); + gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_split) ); } - sp_set_tbl_eraser_mode_visibility(holder, eraser_mode); + toolbar->set_eraser_mode_visibility(eraser_mode); + + return GTK_WIDGET(toolbar->gobj()); +} + +void +EraserToolbar::mode_changed(int mode) +{ + if (DocumentUndo::getUndoSensitive(_desktop->getDocument())) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setInt( "/tools/eraser/mode", mode ); + } + + set_eraser_mode_visibility(mode); + + // only take action if run by the attr_changed listener + if (!_freeze) { + // in turn, prevent listener from responding + _freeze = true; + + /* + if ( eraser_mode != ERASER_MODE_DELETE ) { + } else { + } + */ + // TODO finish implementation + + _freeze = false; + } +} + +void +EraserToolbar::set_eraser_mode_visibility(const guint eraser_mode) +{ + gtk_action_set_visible( GTK_ACTION(_split), (eraser_mode == ERASER_MODE_CUT)); + + const gboolean visibility = (eraser_mode != ERASER_MODE_DELETE); + + const std::array<GtkAction *, 6> arr = {GTK_ACTION(_cap_rounding), + GTK_ACTION(_mass), + GTK_ACTION(_thinning), + GTK_ACTION(_tremor), + GTK_ACTION(_usepressure), + GTK_ACTION(_width)}; + for (auto act : arr) { + gtk_action_set_visible( act, visibility ); + } +} + +void +EraserToolbar::width_value_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble( "/tools/eraser/width", _width_adj->get_value() ); +} + +void +EraserToolbar::mass_value_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble( "/tools/eraser/mass", _mass_adj->get_value() ); +} + +void +EraserToolbar::velthin_value_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/tools/eraser/thinning", _thinning_adj->get_value() ); +} + +void +EraserToolbar::cap_rounding_value_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble( "/tools/eraser/cap_rounding", _cap_rounding_adj->get_value() ); +} + +void +EraserToolbar::tremor_value_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble( "/tools/eraser/tremor", _tremor_adj->get_value() ); +} + +// A dummy function for PrefPusher. +// The code was calling the update_presets_list function in the calligraphy tool +// which was immediately returning. TODO: Investigate this further. +void +EraserToolbar::update_presets_list(gpointer data) +{ + return; +} + +void +EraserToolbar::toggle_break_apart(GtkToggleAction *act, + gpointer data) +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + gboolean active = gtk_toggle_action_get_active(act); + prefs->setBool("/tools/eraser/break_apart", active); +} + +} +} } /* |
