summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2017-08-28 20:56:45 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2017-08-28 20:56:45 +0000
commit2060b51388328fb188cdb05825a9a10d9c230878 (patch)
tree1ea993a878d521f3bdeae1aa4a9f8cac548c04b1 /src
parentMinnor tweak on powerstroke LPE (diff)
downloadinkscape-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.cpp5
-rw-r--r--src/ui/tools/freehand-base.h2
-rw-r--r--src/ui/tools/pen-tool.cpp1
-rw-r--r--src/ui/tools/pencil-tool.cpp21
-rw-r--r--src/ui/tools/pencil-tool.h1
-rw-r--r--src/widgets/pencil-toolbar.cpp99
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) );
}