diff options
Diffstat (limited to 'src/ui/toolbar/pencil-toolbar.cpp')
| -rw-r--r-- | src/ui/toolbar/pencil-toolbar.cpp | 605 |
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++ |
