summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTavmjong Bah <tavmjong@free.fr>2018-01-08 11:26:03 +0000
committerTavmjong Bah <tavmjong@free.fr>2018-01-08 11:26:03 +0000
commit6f3389b589e203e5ee656bc792e6ab881ccd8576 (patch)
treee2e3b8dca6219c478f7336c0b2e25d495076a27a /src
parentMerge branch 'master' into fixSlowDefsOperationsWhithSymbols (diff)
downloadinkscape-6f3389b589e203e5ee656bc792e6ab881ccd8576.tar.gz
inkscape-6f3389b589e203e5ee656bc792e6ab881ccd8576.zip
onvert eraser and calligraphy tools to use ink-select-one-action.
Diffstat (limited to 'src')
-rw-r--r--src/ui/widget/ink-select-one-action.cpp7
-rw-r--r--src/ui/widget/ink-select-one-action.h1
-rw-r--r--src/widgets/calligraphy-toolbar.cpp112
-rw-r--r--src/widgets/eraser-toolbar.cpp141
4 files changed, 132 insertions, 129 deletions
diff --git a/src/ui/widget/ink-select-one-action.cpp b/src/ui/widget/ink-select-one-action.cpp
index dedfb8894..ecd0e8e3d 100644
--- a/src/ui/widget/ink-select-one-action.cpp
+++ b/src/ui/widget/ink-select-one-action.cpp
@@ -80,6 +80,13 @@ void InkSelectOneAction::set_active (gint active) {
}
}
+Glib::ustring InkSelectOneAction::get_active_text () {
+ Gtk::TreeModel::Row row = _store->children()[_active];
+ InkSelectOneActionColumns columns;
+ Glib::ustring label = row[columns.col_label];
+ return label;
+}
+
Gtk::Widget* InkSelectOneAction::create_menu_item_vfunc() {
if (_menuitem == nullptr) {
diff --git a/src/ui/widget/ink-select-one-action.h b/src/ui/widget/ink-select-one-action.h
index 0b1b08de4..a50242bad 100644
--- a/src/ui/widget/ink-select-one-action.h
+++ b/src/ui/widget/ink-select-one-action.h
@@ -64,6 +64,7 @@ public:
void use_group_label( bool use_group_label ) { _use_group_label = use_group_label; }
gint get_active() { return _active; }
+ Glib::ustring get_active_text();
void set_active( gint active );
void set_icon_size( Gtk::BuiltinIconSize size ) { _icon_size = size; }
diff --git a/src/widgets/calligraphy-toolbar.cpp b/src/widgets/calligraphy-toolbar.cpp
index 7dabee11b..ed9779f1a 100644
--- a/src/widgets/calligraphy-toolbar.cpp
+++ b/src/widgets/calligraphy-toolbar.cpp
@@ -35,12 +35,12 @@
#include "desktop.h"
#include "document-undo.h"
#include "widgets/ege-adjustment-action.h"
-#include "widgets/ege-select-one-action.h"
#include "widgets/ink-action.h"
#include "widgets/ink-toggle-action.h"
#include "toolbox.h"
#include "ui/icon-names.h"
#include "ui/uxmanager.h"
+#include "ui/widget/ink-select-one-action.h"
using Inkscape::UI::UXManager;
using Inkscape::DocumentUndo;
@@ -68,17 +68,12 @@ void update_presets_list(GObject *tbl)
return;
}
- EgeSelectOneAction *sel = static_cast<EgeSelectOneAction *>(g_object_get_data(tbl, "profile_selector"));
- if (!sel) {
- // WTF!? This will cause a segfault if ever reached
- //ege_select_one_action_set_active(sel, 0);
- return;
- }
+ InkSelectOneAction *act = static_cast<InkSelectOneAction *>(g_object_get_data(tbl, "profile_selector"));
std::vector<Glib::ustring> presets = get_presets_list();
- int ege_index = 1;
- for (std::vector<Glib::ustring>::iterator i = presets.begin(); i != presets.end(); ++i, ++ege_index) {
+ int index = 1; // 0 is for no preset.
+ for (std::vector<Glib::ustring>::iterator i = presets.begin(); i != presets.end(); ++i, ++index) {
bool match = true;
std::vector<Inkscape::Preferences::Entry> preset = prefs->getAllEntries(*i);
@@ -113,14 +108,14 @@ void update_presets_list(GObject *tbl)
if (match) {
// newly added item is at the same index as the
// save command, so we need to change twice for it to take effect
- ege_select_one_action_set_active(sel, 0);
- ege_select_one_action_set_active(sel, ege_index); // one-based index
+ act->set_active(0);
+ act->set_active(index);
return;
}
}
// no match found
- ege_select_one_action_set_active(sel, 0);
+ act->set_active(0);
}
static void sp_ddc_mass_value_changed( GtkAdjustment *adj, GObject* tbl )
@@ -208,15 +203,18 @@ static void sp_dcc_build_presets_list(GObject *tbl)
{
g_object_set_data(tbl, "presets_blocked", GINT_TO_POINTER(TRUE));
- EgeSelectOneAction* selector = static_cast<EgeSelectOneAction *>(g_object_get_data(tbl, "profile_selector"));
- GtkListStore* model = GTK_LIST_STORE(ege_select_one_action_get_model(selector));
- gtk_list_store_clear (model);
+ InkSelectOneAction* act = static_cast<InkSelectOneAction *>(g_object_get_data(tbl, "profile_selector"));
- {
- GtkTreeIter iter;
- gtk_list_store_append( model, &iter );
- gtk_list_store_set( model, &iter, 0, _("No preset"), 1, 0, -1 );
- }
+ Glib::RefPtr<Gtk::ListStore> store = act->get_store();
+ store->clear();
+
+ InkSelectOneActionColumns columns;
+
+ Gtk::TreeModel::Row row;
+
+ row = *(store->append());
+ row[columns.col_label ] = _("No preset");
+ row[columns.col_sensitive] = true;
// iterate over all presets to populate the list
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
@@ -226,19 +224,14 @@ static void sp_dcc_build_presets_list(GObject *tbl)
for (std::vector<Glib::ustring>::iterator i = presets.begin(); i != presets.end(); ++i) {
GtkTreeIter iter;
Glib::ustring preset_name = prefs->getString(*i + "/name");
+
if (!preset_name.empty()) {
- gtk_list_store_append( model, &iter );
- gtk_list_store_set( model, &iter, 0, _(preset_name.data()), 1, ii++, -1 );
+ row = *(store->append());
+ row[columns.col_label ] = _(preset_name.data());
+ row[columns.col_sensitive] = true;
}
}
-/* {
- GtkTreeIter iter;
- gtk_list_store_append( model, &iter );
- gtk_list_store_set( model, &iter, 0, _("Save..."), 1, ii, -1 );
- g_object_set_data(tbl, "save_presets_index", GINT_TO_POINTER(ii));
- }*/
-
g_object_set_data(tbl, "presets_blocked", GINT_TO_POINTER(FALSE));
update_presets_list (tbl);
@@ -257,16 +250,14 @@ static void sp_dcc_save_profile(GtkWidget * /*widget*/, GObject *tbl)
return;
}
- EgeSelectOneAction *sel = static_cast<EgeSelectOneAction *>(g_object_get_data(tbl, "profile_selector"));
- //gint preset_index = ege_select_one_action_get_active( sel );
- Glib::ustring current_profile_name = _("No preset");
- if (ege_select_one_action_get_active_text( sel )) {
- current_profile_name = ege_select_one_action_get_active_text( sel );
- }
+ InkSelectOneAction *act = static_cast<InkSelectOneAction *>(g_object_get_data(tbl, "profile_selector"));
+
+ Glib::ustring current_profile_name = act->get_active_text();
if (current_profile_name == _("No preset")) {
current_profile_name = "";
}
+
CalligraphicProfileRename::show(desktop, current_profile_name);
if ( !CalligraphicProfileRename::applied()) {
// dialog cancelled
@@ -341,38 +332,20 @@ static void sp_dcc_save_profile(GtkWidget * /*widget*/, GObject *tbl)
}
-static void sp_ddc_change_profile(EgeSelectOneAction* act, GObject* tbl)
+static void sp_ddc_change_profile(GObject* tbl, int mode)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- guint preset_index = ege_select_one_action_get_active( act );
- // This is necessary because EgeSelectOneAction spams us with GObject "changed" signal calls
- // even when the preset is not changed. It would be good to replace it with something more
- // modern. Index 0 means "No preset", so we don't do anything.
- if (preset_index == 0) {
- return;
- }
-
-/*
- gint save_presets_index = GPOINTER_TO_INT(g_object_get_data(tbl, "save_presets_index"));
-
- if (preset_index == save_presets_index) {
- // this is the Save command
- sp_dcc_save_profile(NULL, tbl);
- return;
- }
-*/
-
if (g_object_get_data(tbl, "presets_blocked")) {
return;
}
- // preset_index is one-based so we subtract 1
+ // mode is one-based so we subtract 1
std::vector<Glib::ustring> presets = get_presets_list();
Glib::ustring preset_path = "";
- if (preset_index - 1 < presets.size()) {
- preset_path = presets.at(preset_index - 1);
+ if (mode - 1 < presets.size()) {
+ preset_path = presets.at(mode - 1);
}
if (!preset_path.empty()) {
@@ -404,8 +377,6 @@ static void sp_ddc_change_profile(EgeSelectOneAction* act, GObject* tbl)
}
}
g_object_set_data(tbl, "presets_blocked", GINT_TO_POINTER(FALSE));
- } else {
- ege_select_one_action_set_active(act, 0);
}
}
@@ -603,17 +574,26 @@ void sp_calligraphy_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions
/*calligraphic profile */
{
- GtkListStore* model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
- EgeSelectOneAction* act1 = ege_select_one_action_new ("SetProfileAction", "" , (_("Choose a preset")), NULL, GTK_TREE_MODEL(model));
- ege_select_one_action_set_appearance (act1, "compact");
- g_object_set_data (holder, "profile_selector", act1 );
+ InkSelectOneActionColumns columns;
- g_object_set_data(holder, "presets_blocked", GINT_TO_POINTER(FALSE));
+ Glib::RefPtr<Gtk::ListStore> store = Gtk::ListStore::create(columns);
+
+ InkSelectOneAction* act =
+ InkSelectOneAction::create( "SetProfileAction", // Name
+ "", // Label
+ _("Choose a preset"), // Tooltip
+ "NotUsed", // Icon
+ store ); // Tree store
+ act->use_radio( false );
+ act->use_label( true );
+
+ g_object_set_data (holder, "profile_selector", act);
sp_dcc_build_presets_list (holder);
- g_signal_connect(G_OBJECT(act1), "changed", G_CALLBACK(sp_ddc_change_profile), holder);
- gtk_action_group_add_action(mainActions, GTK_ACTION(act1));
+ gtk_action_group_add_action(mainActions, GTK_ACTION( act->gobj() ));
+
+ act->signal_changed().connect(sigc::bind<0>(sigc::ptr_fun(&sp_ddc_change_profile), holder));
}
/*calligraphic profile editor */
diff --git a/src/widgets/eraser-toolbar.cpp b/src/widgets/eraser-toolbar.cpp
index b592b8ace..ddda02c59 100644
--- a/src/widgets/eraser-toolbar.cpp
+++ b/src/widgets/eraser-toolbar.cpp
@@ -31,18 +31,17 @@
#include <glibmm/i18n.h>
#include "eraser-toolbar.h"
-#include "calligraphy-toolbar.h" // TODO: needed for update_presets_list
#include <array>
#include "desktop.h"
#include "document-undo.h"
#include "widgets/ege-adjustment-action.h"
-#include "widgets/ege-select-one-action.h"
#include "ink-action.h"
#include "ink-radio-action.h"
#include "ink-toggle-action.h"
#include "toolbox.h"
+#include "ui/widget/ink-select-one-action.h"
#include "ui/icon-names.h"
#include "ui/tools/eraser-tool.h"
@@ -54,39 +53,42 @@ 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) );
- update_presets_list(tbl);
}
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) );
- update_presets_list(tbl);
}
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) );
- update_presets_list(tbl);
}
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) );
- update_presets_list(tbl);
}
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) );
- update_presets_list(tbl);
}
static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint eraser_mode)
@@ -100,15 +102,15 @@ static void sp_set_tbl_eraser_mode_visibility(GObject *const tbl, const guint er
}
}
-static void sp_erasertb_mode_changed( EgeSelectOneAction *act, GObject *tbl )
+static void sp_erasertb_mode_changed( GObject *tbl, int mode )
{
SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" ));
- guint eraser_mode = ege_select_one_action_get_active( act );
if (DocumentUndo::getUndoSensitive(desktop->getDocument())) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setInt( "/tools/eraser/mode", eraser_mode );
+ prefs->setInt( "/tools/eraser/mode", mode );
}
- sp_set_tbl_eraser_mode_visibility(tbl, eraser_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
@@ -136,51 +138,53 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
{
GtkIconSize secondarySize = ToolboxFactory::prefToSize("/toolbox/secondary", 1);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gint eraser_mode = FALSE;
+ gint eraser_mode = ERASER_MODE_DELETE;
+
{
- GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
- GtkTreeIter iter;
- gtk_list_store_append( model, &iter );
- gtk_list_store_set( model, &iter,
- 0, _("Delete"),
- 1, _("Delete objects touched by the eraser"),
- 2, INKSCAPE_ICON("draw-eraser-delete-objects"),
- -1 );
-
- gtk_list_store_append( model, &iter );
- gtk_list_store_set( model, &iter,
- 0, _("Cut"),
- 1, _("Cut out from paths and shapes"),
- 2, INKSCAPE_ICON("path-difference"),
- -1 );
-
- gtk_list_store_append( model, &iter );
- gtk_list_store_set( model, &iter,
- 0, _("Clip"),
- 1, _("Clip from objects"),
- 2, INKSCAPE_ICON("path-intersection"),
- -1 );
-
- EgeSelectOneAction* act = ege_select_one_action_new( "EraserModeAction", (""), (""), NULL, GTK_TREE_MODEL(model) );
- g_object_set( act, "short_label", _("Mode:"), NULL );
- gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
- g_object_set_data( holder, "eraser_mode_action", act );
+ InkSelectOneActionColumns columns;
- ege_select_one_action_set_appearance( act, "full" );
- ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
- g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
- ege_select_one_action_set_icon_column( act, 2);
- ege_select_one_action_set_icon_size( act, secondarySize );
- ege_select_one_action_set_tooltip_column( act, 1);
+ Glib::RefPtr<Gtk::ListStore> store = Gtk::ListStore::create(columns);
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- eraser_mode = prefs->getInt("/tools/eraser/mode", ERASER_MODE_CLIP);
- ege_select_one_action_set_active( act, eraser_mode );
- g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_erasertb_mode_changed), holder );
+ Gtk::TreeModel::Row row;
+
+ row = *(store->append());
+ row[columns.col_label ] = _("Delete");
+ row[columns.col_tooltip ] = _("Delete objects touched by eraser");
+ row[columns.col_icon ] = INKSCAPE_ICON("draw-eraser-delete-objects");
+ row[columns.col_sensitive] = true;
+
+ row = *(store->append());
+ row[columns.col_label ] = _("Cut");
+ row[columns.col_tooltip ] = _("Cut out from paths and shapes");
+ row[columns.col_icon ] = INKSCAPE_ICON("path-difference");
+ row[columns.col_sensitive] = true;
+
+ row = *(store->append());
+ row[columns.col_label ] = _("Clip");
+ row[columns.col_tooltip ] = _("Clip from objects");
+ row[columns.col_icon ] = INKSCAPE_ICON("path-intersection");
+ row[columns.col_sensitive] = true;
+
+ InkSelectOneAction* act =
+ InkSelectOneAction::create( "EraserModeAction", // Name
+ _("Mode"), // Label
+ "", // Tooltip
+ "Not Used", // Icon
+ store ); // Tree store
+ act->use_radio( true );
+ act->use_group_label( true );
+ eraser_mode = prefs->getInt("/tools/eraser/mode", ERASER_MODE_CLIP); // Used at end
+ act->set_active( eraser_mode );
+
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act->gobj() ));
+ g_object_set_data( holder, "EraserModeAction", act );
+
+ act->signal_changed().connect(sigc::bind<0>(sigc::ptr_fun(&sp_erasertb_mode_changed), holder));
}
+
+ /* Width */
{
- /* Width */
gchar const* labels[] = {_("(no width)"),_("(hairline)"), 0, 0, 0, _("(default)"), 0, 0, 0, 0, _("(broad stroke)")};
gdouble values[] = {0, 1, 3, 5, 10, 15, 20, 30, 50, 75, 100};
EgeAdjustmentAction *eact = create_adjustment_action( "EraserWidthAction",
@@ -196,6 +200,8 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
g_object_set_data( holder, "width", eact );
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
}
+
+
/* Use Pressure button */
{
InkToggleAction* act = ink_toggle_action_new( "EraserPressureAction",
@@ -204,15 +210,16 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
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", update_presets_list, holder);
+ 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 );
}
- {
-
+
+
/* Thinning */
+ {
gchar const* labels[] = {_("(speed blows up stroke)"), 0, 0, _("(slight widening)"), _("(constant width)"), _("(slight thinning, default)"), 0, 0, _("(speed deflates stroke)")};
- gdouble values[] = {-100, -40, -20, -10, 0, 10, 20, 40, 100};
+ 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)"),
@@ -224,9 +231,11 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
g_object_set_data( holder, "thinning", eact );
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
- }
- {
- /* Cap Rounding */
+ }
+
+
+ /* Cap Rounding */
+ {
gchar const* labels[] = {_("(blunt caps, default)"), _("(slightly bulging)"), 0, 0, _("(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
@@ -241,11 +250,12 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
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 );
- }
+ }
- {
- /* Tremor */
- gchar const* labels[] = {_("(smooth line)"), _("(slight tremor)"), _("(noticeable tremor)"), 0, 0, _("(maximum tremor)")};
+
+ /* Tremor */
+ {
+ gchar const* labels[] = {_("(smooth line)"), _("(slight tremor)"), _("(noticeable tremor)"), 0, 0, _("(maximum tremor)")};
gdouble values[] = {0, 10, 20, 40, 60, 100};
EgeAdjustmentAction* eact = create_adjustment_action( "EraserTremorAction",
_("EraserStroke Tremor"), _("Tremor:"),
@@ -260,9 +270,11 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
g_object_set_data( holder, "tremor", eact );
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
- }
+ }
+
+
+ /* Mass */
{
- /* Mass */
gchar const* labels[] = {_("(no inertia)"), _("(slight smoothing, default)"), _("(noticeable lagging)"), 0, 0, _("(maximum inertia)")};
gdouble values[] = {0.0, 2, 10, 20, 50, 100};
EgeAdjustmentAction* eact = create_adjustment_action( "EraserMassAction",
@@ -278,6 +290,8 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
}
+
+
/* Overlap */
{
InkToggleAction* act = ink_toggle_action_new( "EraserBreakAppart",
@@ -290,6 +304,7 @@ void sp_eraser_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_toogle_break_apart), holder) ;
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
}
+
sp_set_tbl_eraser_mode_visibility(holder, eraser_mode);
}