diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2017-08-28 20:56:45 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2017-08-28 20:56:45 +0000 |
| commit | 2060b51388328fb188cdb05825a9a10d9c230878 (patch) | |
| tree | 1ea993a878d521f3bdeae1aa4a9f8cac548c04b1 /src | |
| parent | Minnor tweak on powerstroke LPE (diff) | |
| download | inkscape-2060b51388328fb188cdb05825a9a10d9c230878.tar.gz inkscape-2060b51388328fb188cdb05825a9a10d9c230878.zip | |
Allow pressure in pencil in the tree modes, bezier, bspline and spiro
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/tools/freehand-base.cpp | 5 | ||||
| -rw-r--r-- | src/ui/tools/freehand-base.h | 2 | ||||
| -rw-r--r-- | src/ui/tools/pen-tool.cpp | 1 | ||||
| -rw-r--r-- | src/ui/tools/pencil-tool.cpp | 21 | ||||
| -rw-r--r-- | src/ui/tools/pencil-tool.h | 1 | ||||
| -rw-r--r-- | src/widgets/pencil-toolbar.cpp | 99 |
6 files changed, 78 insertions, 51 deletions
diff --git a/src/ui/tools/freehand-base.cpp b/src/ui/tools/freehand-base.cpp index f7663d062..072500144 100644 --- a/src/ui/tools/freehand-base.cpp +++ b/src/ui/tools/freehand-base.cpp @@ -94,6 +94,7 @@ FreehandBase::FreehandBase(gchar const *const *cursor_shape) , waiting_LPE_type(Inkscape::LivePathEffect::INVALID_LPE) , red_curve_is_valid(false) , anchor_statusbar(false) + , input_has_pressure(false) , pressure(DEFAULT_PRESSURE) { } @@ -235,7 +236,7 @@ static void spdc_apply_powerstroke_shape(std::vector<Geom::Point> points, Freeha if (SP_IS_PENCIL_CONTEXT(dc)) { PencilTool *pt = SP_PENCIL_CONTEXT(dc); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 3) { + if (dc->input_has_pressure) { SPShape *sp_shape = dynamic_cast<SPShape *>(item); if (sp_shape) { SPCurve * c = sp_shape->getCurve(); @@ -401,7 +402,7 @@ static void spdc_check_for_and_apply_waiting_LPE(FreehandBase *dc, SPItem *item, swidth = swidth/2; } if (SP_IS_PENCIL_CONTEXT(dc)) { - if (prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 3) { + if (dc->input_has_pressure) { std::vector<Geom::Point> points; spdc_apply_powerstroke_shape(points, dc, item); shape = NONE; diff --git a/src/ui/tools/freehand-base.h b/src/ui/tools/freehand-base.h index 11c5ac124..8759e6647 100644 --- a/src/ui/tools/freehand-base.h +++ b/src/ui/tools/freehand-base.h @@ -99,6 +99,8 @@ public: bool anchor_statusbar; + bool input_has_pressure; + gdouble pressure; virtual void set(const Inkscape::Preferences::Entry& val); diff --git a/src/ui/tools/pen-tool.cpp b/src/ui/tools/pen-tool.cpp index b3497d006..dcdbe1220 100644 --- a/src/ui/tools/pen-tool.cpp +++ b/src/ui/tools/pen-tool.cpp @@ -99,6 +99,7 @@ PenTool::PenTool() , cl1(NULL) , events_disabled(false) { + input_has_pressure = false; } PenTool::PenTool(gchar const *const *cursor_shape) diff --git a/src/ui/tools/pencil-tool.cpp b/src/ui/tools/pencil-tool.cpp index c26ff8e8c..7fcbaa31e 100644 --- a/src/ui/tools/pencil-tool.cpp +++ b/src/ui/tools/pencil-tool.cpp @@ -94,9 +94,17 @@ PencilTool::~PencilTool() { void PencilTool::_extinput(GdkEvent *event) { if (gdk_event_get_axis (event, GDK_AXIS_PRESSURE, &this->pressure)) { - this->pressure = CLAMP (this->pressure, DDC_MIN_PRESSURE, DDC_MAX_PRESSURE); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (prefs->getBool("/tools/freehand/pencil/pressure", true)) { + this->pressure = CLAMP (this->pressure, DDC_MIN_PRESSURE, DDC_MAX_PRESSURE); + input_has_pressure = true; + } else { + this->pressure = DDC_DEFAULT_PRESSURE; + input_has_pressure = false; + } } else { this->pressure = DDC_DEFAULT_PRESSURE; + input_has_pressure = false; } } @@ -121,14 +129,13 @@ void PencilTool::_endpointSnap(Geom::Point &p, guint const state) { */ bool PencilTool::root_handler(GdkEvent* event) { bool ret = false; - + this->_extinput(event); switch (event->type) { case GDK_BUTTON_PRESS: ret = this->_handleButtonPress(event->button); break; case GDK_MOTION_NOTIFY: - this->_extinput(event); ret = this->_handleMotionNotify(event->motion); break; @@ -184,7 +191,7 @@ bool PencilTool::_handleButtonPress(GdkEventButton const &bevent) { pencil_drag_origin_w = Geom::Point(bevent.x,bevent.y); pencil_within_tolerance = true; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) == 3) { + if (input_has_pressure) { this->state = SP_PENCIL_CONTEXT_FREEHAND; } switch (this->state) { @@ -281,7 +288,7 @@ bool PencilTool::_handleMotionNotify(GdkEventMotion const &mevent) { switch (this->state) { case SP_PENCIL_CONTEXT_ADDLINE: /* Set red endpoint */ - if (prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) == 3) { + if (input_has_pressure) { this->state = SP_PENCIL_CONTEXT_FREEHAND; return true; } @@ -410,7 +417,7 @@ bool PencilTool::_handleButtonRelease(GdkEventButton const &revent) { } else { Geom::Point p_end = p; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) != 3) { + if (!input_has_pressure) { this->_endpointSnap(p_end, revent.state); if (p_end != p) { // then we must have snapped! @@ -806,7 +813,7 @@ void PencilTool::_addFreehandPoint(Geom::Point const &p, guint /*state*/) { this->ps.push_back(p); this->wps.push_back(this->pressure); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (prefs->getInt("/tools/freehand/pencil/freehand-mode", 0) == 3) { + if (input_has_pressure) { this->addPowerStrokePencil(NULL); } } diff --git a/src/ui/tools/pencil-tool.h b/src/ui/tools/pencil-tool.h index dd8f14fd9..32eac2272 100644 --- a/src/ui/tools/pencil-tool.h +++ b/src/ui/tools/pencil-tool.h @@ -45,6 +45,7 @@ public: bool is_drawing; std::vector<Geom::Point> ps; + std::vector<Geom::Point> points; std::vector<double> wps; diff --git a/src/widgets/pencil-toolbar.cpp b/src/widgets/pencil-toolbar.cpp index f33a33ecd..d86203ff8 100644 --- a/src/widgets/pencil-toolbar.cpp +++ b/src/widgets/pencil-toolbar.cpp @@ -78,22 +78,6 @@ static void freehand_mode_changed(EgeSelectOneAction* act, GObject* tbl) prefs->setInt(freehand_tool_name(tbl) + "/freehand-mode", mode); SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(tbl, "desktop")); - // in pen tool we have more options than in pencil tool; if one of them was chosen, we do any - // preparatory work here - if (SP_IS_PEN_CONTEXT(desktop->event_context)) { - Inkscape::UI::Tools::PenTool *pc = SP_PEN_CONTEXT(desktop->event_context); - pc->setPolylineMode(); - } else { - if (mode == 3) { - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "shape_action") ), false ); - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "minpressure") ), true ); - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "maxpressure") ), true ); - } else { - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "shape_action") ), true ); - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "minpressure") ), false ); - gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "maxpressure") ), false ); - } - } if (mode == 1 || mode == 2) { gtk_action_set_visible( GTK_ACTION( g_object_get_data(tbl, "flatten_spiro_bspline") ), true ); } else { @@ -101,6 +85,19 @@ static void freehand_mode_changed(EgeSelectOneAction* act, GObject* tbl) } } +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 ); + } 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 ); + } +} + static void sp_add_freehand_mode_toggle(GtkActionGroup* mainActions, GObject* holder, bool tool_is_pencil) { /* Freehand mode toggle buttons */ @@ -146,15 +143,7 @@ static void sp_add_freehand_mode_toggle(GtkActionGroup* mainActions, GObject* ho 1, _("Create a sequence of paraxial line segments"), 2, INKSCAPE_ICON("path-mode-polyline-paraxial"), -1 ); - } else { - gtk_list_store_append( model, &iter ); - gtk_list_store_set( model, &iter, - 0, _("PowerStroke"), - 1, _("Create a variable with with power stroke"), - 2, INKSCAPE_ICON("draw-use-pressure"), - -1 ); - } - + } EgeSelectOneAction* act = ege_select_one_action_new(tool_is_pencil ? "FreehandModeActionPencil" : "FreehandModeActionPen", @@ -171,20 +160,46 @@ static void sp_add_freehand_mode_toggle(GtkActionGroup* mainActions, GObject* ho ege_select_one_action_set_active( act, freehandMode); g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(freehand_mode_changed), holder); } - /* 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 ); - if (freehandMode == 1 || freehandMode == 2) { - gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "flatten_spiro_bspline") ), true ); - } else { - gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "flatten_spiro_bspline") ), false ); + { + if (tool_is_pencil) { + /* Use pressure */ + { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + 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", true); + 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 ); + } + } + } + } + { + /* 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 ); + if (freehandMode == 1 || freehandMode == 2) { + gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "flatten_spiro_bspline") ), true ); + } else { + gtk_action_set_visible( GTK_ACTION( g_object_get_data(holder, "flatten_spiro_bspline") ), false ); + } } } } @@ -196,9 +211,9 @@ static void freehand_change_shape(EgeSelectOneAction* act, GObject *dataKludge) } static void freehand_simplify_lpe(InkToggleAction* itact, GObject *dataKludge) { - gint simplify = gtk_toggle_action_get_active( GTK_TOGGLE_ACTION(itact) ); + bool simplify = gtk_toggle_action_get_active( GTK_TOGGLE_ACTION(itact) ); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt(freehand_tool_name(dataKludge) + "/simplify", simplify); + 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 ); @@ -556,7 +571,7 @@ void sp_pencil_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb _("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) ); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(itact), prefs->getBool("/tools/freehand/pencil/simplify", false) ); g_signal_connect_after( G_OBJECT(itact), "toggled", G_CALLBACK(freehand_simplify_lpe), holder) ; gtk_action_group_add_action( mainActions, GTK_ACTION(itact) ); } |
