summaryrefslogtreecommitdiffstats
path: root/src/ui/toolbar/pencil-toolbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/toolbar/pencil-toolbar.cpp')
-rw-r--r--src/ui/toolbar/pencil-toolbar.cpp605
1 files changed, 322 insertions, 283 deletions
diff --git a/src/ui/toolbar/pencil-toolbar.cpp b/src/ui/toolbar/pencil-toolbar.cpp
index 52cc32637..74c40c44f 100644
--- a/src/ui/toolbar/pencil-toolbar.cpp
+++ b/src/ui/toolbar/pencil-toolbar.cpp
@@ -62,58 +62,228 @@ using Inkscape::UI::UXManager;
using Inkscape::UI::ToolboxFactory;
using Inkscape::UI::PrefPusher;
-//########################
-//## Pen/Pencil ##
-//########################
-static void sp_flatten_spiro_bspline(GtkWidget * /*widget*/, GObject *obj);
-/* This is used in generic functions below to share large portions of code between pen and pencil tool */
-static Glib::ustring const freehand_tool_name(GObject *dataKludge)
+
+/*
+class PencilToleranceObserver : public Inkscape::Preferences::Observer {
+public:
+ PencilToleranceObserver(Glib::ustring const &path, GObject *x) : Observer(path), _obj(x)
+ {
+ g_object_set_data(_obj, "prefobserver", this);
+ }
+ virtual ~PencilToleranceObserver() {
+ if (g_object_get_data(_obj, "prefobserver") == this) {
+ g_object_set_data(_obj, "prefobserver", NULL);
+ }
+ }
+ virtual void notify(Inkscape::Preferences::Entry const &val) {
+ GObject* tbl = _obj;
+ if (g_object_get_data( tbl, "freeze" )) {
+ return;
+ }
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+
+ GtkAdjustment * adj = GTK_ADJUSTMENT(g_object_get_data(tbl, "tolerance"));
+
+ double v = val.getDouble(adj->value);
+ gtk_adjustment_set_value(adj, v);
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
+ }
+private:
+ GObject *_obj;
+};
+*/
+
+namespace Inkscape {
+namespace UI {
+namespace Toolbar {
+
+GtkWidget *
+PencilToolbar::prep_pencil(SPDesktop *desktop, GtkActionGroup* mainActions)
{
- SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(dataKludge, "desktop"));
- return ( tools_isactive(desktop, TOOLS_FREEHAND_PEN)
- ? "/tools/freehand/pen"
- : "/tools/freehand/pencil" );
+ auto toolbar = new PencilToolbar(desktop);
+ toolbar->add_freehand_mode_toggle(mainActions, true);
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+
+ /* min pressure */
+ {
+ toolbar->_minpressure = create_adjustment_action( "MinPressureAction",
+ _("Min pressure"), _("Min:"), _("Min percent of pressure"),
+ "/tools/freehand/pencil/minpressure", 0,
+ GTK_WIDGET(desktop->canvas),
+ nullptr, // dataKludge
+ FALSE, nullptr,
+ 0, 100, 1, 0,
+ nullptr, nullptr, 0,
+ nullptr, // callback
+ nullptr, 0 ,0);
+
+ toolbar->_minpressure_adj = Glib::wrap(ege_adjustment_action_get_adjustment(toolbar->_minpressure));
+ toolbar->_minpressure_adj->signal_value_changed().connect(sigc::mem_fun(*toolbar, &PencilToolbar::minpressure_value_changed));
+ gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_minpressure) );
+ if (prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) == 3) {
+ gtk_action_set_visible( GTK_ACTION(toolbar->_minpressure), true );
+ } else {
+ gtk_action_set_visible( GTK_ACTION(toolbar->_minpressure), false );
+ }
+ }
+ /* max pressure */
+ {
+ toolbar->_maxpressure = create_adjustment_action( "MaxPressureAction",
+ _("Max pressure"), _("Max:"), _("Max percent of pressure"),
+ "/tools/freehand/pencil/maxpressure", 100,
+ GTK_WIDGET(desktop->canvas),
+ nullptr, // dataKludge
+ FALSE, nullptr,
+ 0, 100, 1, 0,
+ nullptr, nullptr, 0,
+ nullptr, // callback
+ nullptr, 0 ,0);
+ toolbar->_maxpressure_adj = Glib::wrap(ege_adjustment_action_get_adjustment(toolbar->_maxpressure));
+ toolbar->_maxpressure_adj->signal_value_changed().connect(sigc::mem_fun(*toolbar, &PencilToolbar::maxpressure_value_changed));
+ gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_maxpressure) );
+ if (prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) == 3) {
+ gtk_action_set_visible( GTK_ACTION(toolbar->_maxpressure), true );
+ } else {
+ gtk_action_set_visible( GTK_ACTION(toolbar->_maxpressure), false );
+ }
+ }
+ /* Use pressure */
+ {
+ InkToggleAction* itact = ink_toggle_action_new( "PencilPressureAction",
+ _("Use pressure input"),
+ _("Use pressure input"),
+ INKSCAPE_ICON("draw-use-pressure"),
+ GTK_ICON_SIZE_SMALL_TOOLBAR );
+ bool pressure = prefs->getBool(toolbar->freehand_tool_name() + "/pressure", false);
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(itact), pressure );
+ g_signal_connect_after( G_OBJECT(itact), "toggled", G_CALLBACK(PencilToolbar::use_pencil_pressure), toolbar);
+ gtk_action_group_add_action( mainActions, GTK_ACTION(itact) );
+ if (pressure) {
+ gtk_action_set_visible( GTK_ACTION( toolbar->_minpressure ), true );
+ gtk_action_set_visible( GTK_ACTION( toolbar->_maxpressure ), true );
+ } else {
+ gtk_action_set_visible( GTK_ACTION( toolbar->_minpressure ), false );
+ gtk_action_set_visible( GTK_ACTION( toolbar->_maxpressure ), false );
+ }
+ }
+ /* Tolerance */
+ {
+ gchar const* labels[] = {_("(many nodes, rough)"), _("(default)"), nullptr, nullptr, nullptr, nullptr, _("(few nodes, smooth)")};
+ gdouble values[] = {1, 10, 20, 30, 50, 75, 100};
+ EgeAdjustmentAction *eact = create_adjustment_action( "PencilToleranceAction",
+ _("Smoothing:"), _("Smoothing: "),
+ _("How much smoothing (simplifying) is applied to the line"),
+ "/tools/freehand/pencil/tolerance",
+ 3.0,
+ GTK_WIDGET(desktop->canvas),
+ nullptr, // dataKludge
+ TRUE, "altx-pencil",
+ 1, 100.0, 0.5, 1.0,
+ labels, values, G_N_ELEMENTS(labels),
+ nullptr, // callback
+ nullptr /*unit tracker*/,
+ 1, 2);
+
+ toolbar->_tolerance_adj = Glib::wrap(ege_adjustment_action_get_adjustment(eact));
+ toolbar->_tolerance_adj->signal_value_changed().connect(sigc::mem_fun(*toolbar, &PencilToolbar::tolerance_value_changed));
+ ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
+ }
+
+ /* advanced shape options */
+ toolbar->freehand_add_advanced_shape_options(mainActions, true);
+
+ /* Reset */
+ {
+ InkAction* inky = ink_action_new( "PencilResetAction",
+ _("Defaults"),
+ _("Reset pencil parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
+ INKSCAPE_ICON("edit-clear"),
+ GTK_ICON_SIZE_SMALL_TOOLBAR );
+ g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(PencilToolbar::defaults), toolbar );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ }
+ /* LPE simplify based tolerance */
+ {
+ toolbar->_simplify = ink_toggle_action_new( "PencilLpeSimplify",
+ _("LPE based interactive simplify"),
+ _("LPE based interactive simplify"),
+ INKSCAPE_ICON("interactive_simplify"),
+ GTK_ICON_SIZE_SMALL_TOOLBAR );
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(toolbar->_simplify), prefs->getInt("/tools/freehand/pencil/simplify", 0) );
+ g_signal_connect_after( G_OBJECT(toolbar->_simplify), "toggled", G_CALLBACK(PencilToolbar::freehand_simplify_lpe), toolbar) ;
+ gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_simplify) );
+ guint freehandMode = prefs->getInt("/tools/freehand/pencil/freehand-mode", 0);
+ if (freehandMode == 2) {
+ gtk_action_set_visible( GTK_ACTION( toolbar->_simplify ), false );
+ } else {
+ gtk_action_set_visible( GTK_ACTION( toolbar->_simplify ), true );
+ }
+ }
+ /* LPE simplify flatten */
+ {
+ toolbar->_flatten_simplify = ink_action_new( "PencilLpeSimplifyFlatten",
+ _("LPE simplify flatten"),
+ _("LPE simplify flatten"),
+ INKSCAPE_ICON("flatten"),
+ GTK_ICON_SIZE_SMALL_TOOLBAR );
+ g_signal_connect_after( G_OBJECT(toolbar->_flatten_simplify), "activate", G_CALLBACK(PencilToolbar::simplify_flatten), toolbar );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(toolbar->_flatten_simplify) );
+ guint freehandMode = prefs->getInt("/tools/freehand/pencil/freehand-mode", 0);
+ if (freehandMode == 2 || !prefs->getInt("/tools/freehand/pencil/simplify", 0)) {
+ gtk_action_set_visible( GTK_ACTION(toolbar->_flatten_simplify), false );
+ } else {
+ gtk_action_set_visible( GTK_ACTION(toolbar->_flatten_simplify), true );
+ }
+ }
+
+ return GTK_WIDGET(toolbar->gobj());
+}
+
+PencilToolbar::~PencilToolbar()
+{
+ if(_repr) {
+ _repr->removeListenerByData(this);
+ GC::release(_repr);
+ _repr = nullptr;
+ }
}
-static void freehand_mode_changed(GObject* tbl, int mode)
+void
+PencilToolbar::freehand_mode_changed(int mode)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setInt(freehand_tool_name(tbl) + "/freehand-mode", mode);
+ prefs->setInt(freehand_tool_name() + "/freehand-mode", mode);
if (mode == 1 || mode == 2) {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "flatten_spiro_bspline") ), true );
+ gtk_action_set_visible( GTK_ACTION( _flatten_spiro_bspline ), true );
} else {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "flatten_spiro_bspline") ), false );
+ gtk_action_set_visible( GTK_ACTION( _flatten_spiro_bspline ), false );
}
- if (mode == 2) {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "flatten_simplify") ), false );
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "simplify") ), false );
- } else {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "flatten_simplify") ), true );
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "simplify") ), true );
+
+ bool visible = (mode != 2);
+
+ if (_flatten_simplify) {
+ gtk_action_set_visible(GTK_ACTION(_flatten_simplify), visible);
}
-}
-static void use_pencil_pressure(InkToggleAction* itact, GObject *dataKludge) {
- bool pressure = gtk_toggle_action_get_active( GTK_TOGGLE_ACTION(itact) );
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setBool(freehand_tool_name(dataKludge) + "/pressure", pressure);
- if (pressure) {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(dataKludge, "minpressure") ), true );
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(dataKludge, "maxpressure") ), true );
- InkSelectOneAction* act =
- static_cast<InkSelectOneAction*>( g_object_get_data( dataKludge, "shape_action" ) );
- act->set_visible (false);
- } else {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(dataKludge, "minpressure") ), false );
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(dataKludge, "maxpressure") ), false );
- InkSelectOneAction* act =
- static_cast<InkSelectOneAction*>( g_object_get_data( dataKludge, "shape_action" ) );
- act->set_visible (true);
+ if (_simplify) {
+ gtk_action_set_visible(GTK_ACTION(_simplify), visible);
}
}
-static void sp_add_freehand_mode_toggle(GtkActionGroup* mainActions, GObject* holder, bool tool_is_pencil)
+/* This is used in generic functions below to share large portions of code between pen and pencil tool */
+Glib::ustring const
+PencilToolbar::freehand_tool_name()
+{
+ return ( tools_isactive(_desktop, TOOLS_FREEHAND_PEN)
+ ? "/tools/freehand/pen"
+ : "/tools/freehand/pencil" );
+}
+
+void
+PencilToolbar::add_freehand_mode_toggle(GtkActionGroup* mainActions,
+ bool tool_is_pencil)
{
/* Freehand mode toggle buttons */
@@ -176,43 +346,69 @@ static void sp_add_freehand_mode_toggle(GtkActionGroup* mainActions, GObject* ho
gtk_action_group_add_action( mainActions, GTK_ACTION( act->gobj() ));
// g_object_set_data( dataKludge, "flat_action", act );
- act->signal_changed().connect(sigc::bind<0>(sigc::ptr_fun(&freehand_mode_changed), holder));
+ act->signal_changed().connect(sigc::mem_fun(*this, &PencilToolbar::freehand_mode_changed));
/* LPE bspline spiro flatten */
- InkAction* inky = ink_action_new( tool_is_pencil ? "FlattenSpiroBsplinePencil" :
- "FlattenSpiroBsplinePen",
- _("LPE spiro or bspline flatten"),
- _("LPE spiro or bspline flatten"),
- INKSCAPE_ICON("flatten"),
- GTK_ICON_SIZE_SMALL_TOOLBAR );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_flatten_spiro_bspline), holder );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
- g_object_set_data( holder, "flatten_spiro_bspline", inky );
+ _flatten_spiro_bspline = ink_action_new( tool_is_pencil ? "FlattenSpiroBsplinePencil" :
+ "FlattenSpiroBsplinePen",
+ _("LPE spiro or bspline flatten"),
+ _("LPE spiro or bspline flatten"),
+ INKSCAPE_ICON("flatten"),
+ GTK_ICON_SIZE_SMALL_TOOLBAR );
+ g_signal_connect_after( G_OBJECT(_flatten_spiro_bspline), "activate", G_CALLBACK(PencilToolbar::flatten_spiro_bspline), this);
+ gtk_action_group_add_action( mainActions, GTK_ACTION(_flatten_spiro_bspline) );
+
if (freehandMode == 1 || freehandMode == 2) {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "flatten_spiro_bspline") ), true );
+ gtk_action_set_visible( GTK_ACTION( _flatten_spiro_bspline ), true );
} else {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "flatten_spiro_bspline") ), false );
+ gtk_action_set_visible( GTK_ACTION( _flatten_spiro_bspline ), false );
}
}
-static void freehand_change_shape(GObject *dataKludge, int shape) {
+void
+PencilToolbar::minpressure_value_changed()
+{
+ // quit if run by the attr_changed listener
+ if (_freeze) {
+ return;
+ }
+
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setInt(freehand_tool_name(dataKludge) + "/shape", shape);
+ prefs->setDouble( "/tools/freehand/pencil/minpressure", _minpressure_adj->get_value());
}
-static void freehand_simplify_lpe(InkToggleAction* itact, GObject *dataKludge) {
- bool simplify = gtk_toggle_action_get_active( GTK_TOGGLE_ACTION(itact) );
+void
+PencilToolbar::maxpressure_value_changed()
+{
+ // quit if run by the attr_changed listener
+ if (_freeze) {
+ return;
+ }
+
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setBool(freehand_tool_name(dataKludge) + "/simplify", simplify);
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(dataKludge, "flatten_simplify") ), simplify );
- if (simplify) {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(dataKludge, "flatten_simplify") ), true );
+ prefs->setDouble( "/tools/freehand/pencil/maxpressure", _maxpressure_adj->get_value());
+}
+
+void
+PencilToolbar::use_pencil_pressure(InkToggleAction* itact, gpointer data) {
+ auto toolbar = reinterpret_cast<PencilToolbar *>(data);
+
+ bool pressure = gtk_toggle_action_get_active( GTK_TOGGLE_ACTION(itact) );
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setBool(toolbar->freehand_tool_name() + "/pressure", pressure);
+ if (pressure) {
+ gtk_action_set_visible( GTK_ACTION( toolbar->_minpressure ), true );
+ gtk_action_set_visible( GTK_ACTION( toolbar->_maxpressure ), true );
+ toolbar->_shape_action->set_visible (false);
} else {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(dataKludge, "flatten_simplify") ), false );
+ gtk_action_set_visible( GTK_ACTION( toolbar->_minpressure ), false );
+ gtk_action_set_visible( GTK_ACTION( toolbar->_maxpressure ), false );
+ toolbar->_shape_action->set_visible (true);
}
}
-static void freehand_add_advanced_shape_options(GtkActionGroup* mainActions, GObject* holder, bool tool_is_pencil)
+void
+PencilToolbar::freehand_add_advanced_shape_options(GtkActionGroup* mainActions, bool tool_is_pencil)
{
/*advanced shape options */
@@ -243,7 +439,7 @@ static void freehand_add_advanced_shape_options(GtkActionGroup* mainActions, GOb
row[columns.col_sensitive] = true;
}
- InkSelectOneAction* act =
+ _shape_action =
InkSelectOneAction::create( tool_is_pencil ?
"SetPencilShapeAction" :
"SetPenShapeAction", // Name
@@ -252,55 +448,68 @@ static void freehand_add_advanced_shape_options(GtkActionGroup* mainActions, GOb
"Not Used", // Icon
store ); // Tree store
- act->use_radio( false );
- act->use_icon( false );
- act->use_label( true );
- act->use_group_label( true );
+ _shape_action->use_radio( false );
+ _shape_action->use_icon( false );
+ _shape_action->use_label( true );
+ _shape_action->use_group_label( true );
int shape = prefs->getInt( (tool_is_pencil ?
"/tools/freehand/pencil/shape" :
"/tools/freehand/pen/shape" ), 0);
- act->set_active( shape );
+ _shape_action->set_active( shape );
- gtk_action_group_add_action( mainActions, GTK_ACTION( act->gobj() ));
- g_object_set_data( holder, "shape_action", act );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( _shape_action->gobj() ));
bool hide = prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) == 3 ||
(tool_is_pencil && prefs->getBool("/tools/freehand/pencil/pressure", false));
- act->set_visible( !hide );
+ _shape_action->set_visible( !hide );
- act->signal_changed().connect(sigc::bind<0>(sigc::ptr_fun(&freehand_change_shape), holder));
+ _shape_action->signal_changed().connect(sigc::mem_fun(*this, &PencilToolbar::freehand_change_shape));
}
-void sp_pen_toolbox_prep(SPDesktop * /*desktop*/, GtkActionGroup* mainActions, GObject* holder)
-{
- sp_add_freehand_mode_toggle(mainActions, holder, false);
- freehand_add_advanced_shape_options(mainActions, holder, false);
+void
+PencilToolbar::freehand_change_shape(int shape) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt(freehand_tool_name() + "/shape", shape);
}
-
-static void sp_pencil_tb_defaults(GtkWidget * /*widget*/, GObject *obj)
+void
+PencilToolbar::defaults(GtkWidget * /*widget*/, GObject *obj)
{
- GtkWidget *tbl = GTK_WIDGET(obj);
-
- GtkAdjustment *adj;
+ auto toolbar = reinterpret_cast<PencilToolbar *>(obj);
// fixme: make settable
gdouble tolerance = 4;
- adj = GTK_ADJUSTMENT(g_object_get_data(obj, "tolerance"));
- gtk_adjustment_set_value(adj, tolerance);
+ toolbar->_tolerance_adj->set_value(tolerance);
#if !GTK_CHECK_VERSION(3,18,0)
- gtk_adjustment_value_changed(adj);
+ toolbar->_tolerance_adj->value_changed();
#endif
- spinbutton_defocus(tbl);
+ if(toolbar->_desktop->canvas) gtk_widget_grab_focus(GTK_WIDGET(toolbar->_desktop->canvas));
}
-static void sp_flatten_spiro_bspline(GtkWidget * /*widget*/, GObject *obj)
+void
+PencilToolbar::freehand_simplify_lpe(InkToggleAction* itact, GObject *data)
{
- SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(obj, "desktop"));
- auto selected = desktop->getSelection()->items();
+ auto toolbar = reinterpret_cast<PencilToolbar *>(data);
+
+ bool simplify = gtk_toggle_action_get_active( GTK_TOGGLE_ACTION(itact) );
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setBool(toolbar->freehand_tool_name() + "/simplify", simplify);
+ gtk_action_set_visible( GTK_ACTION( toolbar->_flatten_simplify ), simplify );
+ if (simplify) {
+ gtk_action_set_visible( GTK_ACTION( toolbar->_flatten_simplify ), true );
+ } else {
+ gtk_action_set_visible( GTK_ACTION( toolbar->_flatten_simplify ), false );
+ }
+}
+
+void
+PencilToolbar::simplify_flatten(GtkWidget * /*widget*/, GObject *data)
+{
+ auto toolbar = reinterpret_cast<PencilToolbar *>(data);
+ auto selected = toolbar->_desktop->getSelection()->items();
SPLPEItem* lpeitem = nullptr;
for (auto it(selected.begin()); it != selected.end(); ++it){
lpeitem = dynamic_cast<SPLPEItem*>(*it);
@@ -311,9 +520,7 @@ static void sp_flatten_spiro_bspline(GtkWidget * /*widget*/, GObject *obj)
LivePathEffectObject *lpeobj = (*i)->lpeobject;
if (lpeobj) {
Inkscape::LivePathEffect::Effect *lpe = lpeobj->get_lpe();
- if (dynamic_cast<Inkscape::LivePathEffect::LPEBSpline *>(lpe) ||
- dynamic_cast<Inkscape::LivePathEffect::LPESpiro *>(lpe))
- {
+ if (dynamic_cast<Inkscape::LivePathEffect::LPESimplify *>(lpe)) {
SPShape * shape = dynamic_cast<SPShape *>(lpeitem);
if(shape){
SPCurve * c = shape->getCurveForEdit();
@@ -334,16 +541,17 @@ static void sp_flatten_spiro_bspline(GtkWidget * /*widget*/, GObject *obj)
}
}
if (lpeitem) {
- desktop->getSelection()->remove(lpeitem->getRepr());
- desktop->getSelection()->add(lpeitem->getRepr());
+ toolbar->_desktop->getSelection()->remove(lpeitem->getRepr());
+ toolbar->_desktop->getSelection()->add(lpeitem->getRepr());
sp_lpe_item_update_patheffect(lpeitem, false, false);
}
}
-static void sp_simplify_flatten(GtkWidget * /*widget*/, GObject *obj)
+void
+PencilToolbar::flatten_spiro_bspline(GtkWidget * /*widget*/, gpointer data)
{
- SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(obj, "desktop"));
- auto selected = desktop->getSelection()->items();
+ auto toolbar = reinterpret_cast<PencilToolbar *>(data);
+ auto selected = toolbar->_desktop->getSelection()->items();
SPLPEItem* lpeitem = nullptr;
for (auto it(selected.begin()); it != selected.end(); ++it){
lpeitem = dynamic_cast<SPLPEItem*>(*it);
@@ -354,7 +562,9 @@ static void sp_simplify_flatten(GtkWidget * /*widget*/, GObject *obj)
LivePathEffectObject *lpeobj = (*i)->lpeobject;
if (lpeobj) {
Inkscape::LivePathEffect::Effect *lpe = lpeobj->get_lpe();
- if (dynamic_cast<Inkscape::LivePathEffect::LPESimplify *>(lpe)) {
+ if (dynamic_cast<Inkscape::LivePathEffect::LPEBSpline *>(lpe) ||
+ dynamic_cast<Inkscape::LivePathEffect::LPESpiro *>(lpe))
+ {
SPShape * shape = dynamic_cast<SPShape *>(lpeitem);
if(shape){
SPCurve * c = shape->getCurveForEdit();
@@ -375,46 +585,36 @@ static void sp_simplify_flatten(GtkWidget * /*widget*/, GObject *obj)
}
}
if (lpeitem) {
- desktop->getSelection()->remove(lpeitem->getRepr());
- desktop->getSelection()->add(lpeitem->getRepr());
+ toolbar->_desktop->getSelection()->remove(lpeitem->getRepr());
+ toolbar->_desktop->getSelection()->add(lpeitem->getRepr());
sp_lpe_item_update_patheffect(lpeitem, false, false);
}
}
-static void sp_minpressure_value_changed(GtkAdjustment *adj, GObject *tbl)
+GtkWidget *
+PencilToolbar::prep_pen(SPDesktop *desktop, GtkActionGroup* mainActions)
{
- // quit if run by the attr_changed listener
- if (g_object_get_data( tbl, "freeze" )) {
- return;
- }
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setDouble( "/tools/freehand/pencil/minpressure", gtk_adjustment_get_value(adj));
+ auto toolbar = new PencilToolbar(desktop);
+ toolbar->add_freehand_mode_toggle(mainActions, false);
+ toolbar->freehand_add_advanced_shape_options(mainActions, false);
+ return GTK_WIDGET(toolbar->gobj());
}
-static void sp_maxpressure_value_changed(GtkAdjustment *adj, GObject *tbl)
+void
+PencilToolbar::tolerance_value_changed()
{
// quit if run by the attr_changed listener
- if (g_object_get_data( tbl, "freeze" )) {
+ if (_freeze) {
return;
}
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setDouble( "/tools/freehand/pencil/maxpressure", gtk_adjustment_get_value(adj));
-}
-static void sp_pencil_tb_tolerance_value_changed(GtkAdjustment *adj, GObject *tbl)
-{
- // quit if run by the attr_changed listener
- if (g_object_get_data( tbl, "freeze" )) {
- return;
- }
// in turn, prevent listener from responding
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+ _freeze = true;
prefs->setDouble("/tools/freehand/pencil/tolerance",
- gtk_adjustment_get_value(adj));
- g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
- SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(tbl, "desktop"));
- auto selected = desktop->getSelection()->items();
+ _tolerance_adj->get_value());
+ _freeze = false;
+ auto selected = _desktop->getSelection()->items();
for (auto it(selected.begin()); it != selected.end(); ++it){
SPLPEItem* lpeitem = dynamic_cast<SPLPEItem*>(*it);
if (lpeitem && lpeitem->hasPathEffect()){
@@ -460,170 +660,9 @@ static void sp_pencil_tb_tolerance_value_changed(GtkAdjustment *adj, GObject *tb
}
}
-/*
-class PencilToleranceObserver : public Inkscape::Preferences::Observer {
-public:
- PencilToleranceObserver(Glib::ustring const &path, GObject *x) : Observer(path), _obj(x)
- {
- g_object_set_data(_obj, "prefobserver", this);
- }
- virtual ~PencilToleranceObserver() {
- if (g_object_get_data(_obj, "prefobserver") == this) {
- g_object_set_data(_obj, "prefobserver", NULL);
- }
- }
- virtual void notify(Inkscape::Preferences::Entry const &val) {
- GObject* tbl = _obj;
- if (g_object_get_data( tbl, "freeze" )) {
- return;
- }
- g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
-
- GtkAdjustment * adj = GTK_ADJUSTMENT(g_object_get_data(tbl, "tolerance"));
-
- double v = val.getDouble(adj->value);
- gtk_adjustment_set_value(adj, v);
- g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
- }
-private:
- GObject *_obj;
-};
-*/
-
-void sp_pencil_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
-{
- sp_add_freehand_mode_toggle(mainActions, holder, true);
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- EgeAdjustmentAction* eact = nullptr;
-
-
- /* min pressure */
- {
- eact = create_adjustment_action( "MinPressureAction",
- _("Min pressure"), _("Min:"), _("Min percent of pressure"),
- "/tools/freehand/pencil/minpressure", 0,
- GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr,
- 0, 100, 1, 0,
- nullptr, nullptr, 0,
- sp_minpressure_value_changed, nullptr, 0 ,0);
-
- gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
- g_object_set_data( holder, "minpressure", eact );
- if (prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) == 3) {
- gtk_action_set_visible( GTK_ACTION(eact), true );
- } else {
- gtk_action_set_visible( GTK_ACTION(eact), false );
- }
- }
- /* max pressure */
- {
- eact = create_adjustment_action( "MaxPressureAction",
- _("Max pressure"), _("Max:"), _("Max percent of pressure"),
- "/tools/freehand/pencil/maxpressure", 100,
- GTK_WIDGET(desktop->canvas), holder, FALSE, nullptr,
- 0, 100, 1, 0,
- nullptr, nullptr, 0,
- sp_maxpressure_value_changed, nullptr, 0 ,0);
- gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
- g_object_set_data( holder, "maxpressure", eact );
- if (prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) == 3) {
- gtk_action_set_visible( GTK_ACTION(eact), true );
- } else {
- gtk_action_set_visible( GTK_ACTION(eact), false );
- }
- }
- /* Use pressure */
- {
- InkToggleAction* itact = ink_toggle_action_new( "PencilPressureAction",
- _("Use pressure input"),
- _("Use pressure input"),
- INKSCAPE_ICON("draw-use-pressure"),
- GTK_ICON_SIZE_SMALL_TOOLBAR );
- bool pressure = prefs->getBool(freehand_tool_name(holder) + "/pressure", false);
- gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(itact), pressure );
- g_signal_connect_after( G_OBJECT(itact), "toggled", G_CALLBACK(use_pencil_pressure), holder) ;
- gtk_action_group_add_action( mainActions, GTK_ACTION(itact) );
- if (pressure) {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "minpressure") ), true );
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "maxpressure") ), true );
- } else {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "minpressure") ), false );
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "maxpressure") ), false );
- }
- }
- /* Tolerance */
- {
- gchar const* labels[] = {_("(many nodes, rough)"), _("(default)"), nullptr, nullptr, nullptr, nullptr, _("(few nodes, smooth)")};
- gdouble values[] = {1, 10, 20, 30, 50, 75, 100};
- eact = create_adjustment_action( "PencilToleranceAction",
- _("Smoothing:"), _("Smoothing: "),
- _("How much smoothing (simplifying) is applied to the line"),
- "/tools/freehand/pencil/tolerance",
- 3.0,
- GTK_WIDGET(desktop->canvas),
- holder, TRUE, "altx-pencil",
- 1, 100.0, 0.5, 1.0,
- labels, values, G_N_ELEMENTS(labels),
- sp_pencil_tb_tolerance_value_changed,
- nullptr /*unit tracker*/,
- 1, 2);
- ege_adjustment_action_set_appearance( eact, TOOLBAR_SLIDER_HINT );
- gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
- }
-
- /* advanced shape options */
- freehand_add_advanced_shape_options(mainActions, holder, true);
-
- /* Reset */
- {
- InkAction* inky = ink_action_new( "PencilResetAction",
- _("Defaults"),
- _("Reset pencil parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
- INKSCAPE_ICON("edit-clear"),
- GTK_ICON_SIZE_SMALL_TOOLBAR );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_pencil_tb_defaults), holder );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
- }
- /* LPE simplify based tolerance */
- {
- InkToggleAction* itact = ink_toggle_action_new( "PencilLpeSimplify",
- _("LPE based interactive simplify"),
- _("LPE based interactive simplify"),
- INKSCAPE_ICON("interactive_simplify"),
- GTK_ICON_SIZE_SMALL_TOOLBAR );
- gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(itact), prefs->getInt("/tools/freehand/pencil/simplify", 0) );
- g_object_set_data( holder, "simplify", itact );
- g_signal_connect_after( G_OBJECT(itact), "toggled", G_CALLBACK(freehand_simplify_lpe), holder) ;
- gtk_action_group_add_action( mainActions, GTK_ACTION(itact) );
- guint freehandMode = prefs->getInt("/tools/freehand/pencil/freehand-mode", 0);
- if (freehandMode == 2) {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "simplify") ), false );
- } else {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "simplify") ), true );
- }
- }
- /* LPE simplify flatten */
- {
- InkAction* inky = ink_action_new( "PencilLpeSimplifyFlatten",
- _("LPE simplify flatten"),
- _("LPE simplify flatten"),
- INKSCAPE_ICON("flatten"),
- GTK_ICON_SIZE_SMALL_TOOLBAR );
- g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_simplify_flatten), holder );
- gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
- g_object_set_data( holder, "flatten_simplify", inky );
- guint freehandMode = prefs->getInt("/tools/freehand/pencil/freehand-mode", 0);
- if (freehandMode == 2 || !prefs->getInt("/tools/freehand/pencil/simplify", 0)) {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "flatten_simplify") ), false );
- } else {
- gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "flatten_simplify") ), true );
- }
- }
-
- g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
-
}
-
+}
+}
/*
Local Variables:
mode:c++