summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMaximilian Albert <maximilian.albert@gmail.com>2008-06-08 18:47:19 +0000
committercilix42 <cilix42@users.sourceforge.net>2008-06-08 18:47:19 +0000
commita666ce5dbb16e68dbeacf45148aee6c24a6a0efb (patch)
tree280f62e1fe8b6c7e3c6f52a063982d6333381b4b /src
parentsimplify code that puts anchors at start and end of paths in draw context. (diff)
downloadinkscape-a666ce5dbb16e68dbeacf45148aee6c24a6a0efb.tar.gz
inkscape-a666ce5dbb16e68dbeacf45148aee6c24a6a0efb.zip
Add option to either suppress path flash for items with LPE (e.g., spiro splines use this) or display it permanently while the item is selected.
(bzr r5860)
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/effect.h7
-rw-r--r--src/live_effects/lpe-spiro.cpp2
-rw-r--r--src/live_effects/lpe-spiro.h2
-rw-r--r--src/live_effects/lpe-tangent_to_curve.h2
-rw-r--r--src/node-context.cpp102
-rw-r--r--src/node-context.h2
6 files changed, 88 insertions, 29 deletions
diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h
index 21d86f80a..f0d0ffdd5 100644
--- a/src/live_effects/effect.h
+++ b/src/live_effects/effect.h
@@ -77,6 +77,12 @@ enum EffectType {
extern const Util::EnumData<EffectType> LPETypeData[INVALID_LPE];
extern const Util::EnumDataConverter<EffectType> LPETypeConverter;
+enum LPEPathFlashType {
+ SUPPRESS_FLASH,
+ PERMANENT_FLASH,
+ DEFAULT
+};
+
class Effect {
public:
static Effect* New(EffectType lpenr, LivePathEffectObject *lpeobj);
@@ -102,6 +108,7 @@ public:
virtual void transform_multiply(Geom::Matrix const& postmul, bool set);
bool providesKnotholder() { return (kh_entity_vector.size() > 0); }
+ virtual LPEPathFlashType pathFlashType() { return DEFAULT; }
void addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
Glib::ustring getName();
diff --git a/src/live_effects/lpe-spiro.cpp b/src/live_effects/lpe-spiro.cpp
index e4a0af741..bbf952e19 100644
--- a/src/live_effects/lpe-spiro.cpp
+++ b/src/live_effects/lpe-spiro.cpp
@@ -88,7 +88,7 @@ void
LPESpiro::setup_nodepath(Inkscape::NodePath::Path *np)
{
sp_nodepath_show_handles(np, false);
- sp_nodepath_show_helperpath(np, false);
+// sp_nodepath_show_helperpath(np, false);
}
void
diff --git a/src/live_effects/lpe-spiro.h b/src/live_effects/lpe-spiro.h
index 292b07fb8..7256665a2 100644
--- a/src/live_effects/lpe-spiro.h
+++ b/src/live_effects/lpe-spiro.h
@@ -22,6 +22,8 @@ public:
LPESpiro(LivePathEffectObject *lpeobject);
virtual ~LPESpiro();
+ virtual LPEPathFlashType pathFlashType() { return SUPPRESS_FLASH; }
+
virtual void setup_nodepath(Inkscape::NodePath::Path *np);
virtual void doEffect(SPCurve * curve);
diff --git a/src/live_effects/lpe-tangent_to_curve.h b/src/live_effects/lpe-tangent_to_curve.h
index 8fe54335c..8d9622c67 100644
--- a/src/live_effects/lpe-tangent_to_curve.h
+++ b/src/live_effects/lpe-tangent_to_curve.h
@@ -38,6 +38,8 @@ public:
virtual Geom::Piecewise<Geom::D2<Geom::SBasis> >
doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in);
+ virtual LPEPathFlashType pathFlashType() { return PERMANENT_FLASH; }
+
/* the knotholder entity classes must be declared friends */
friend class TtC::KnotHolderEntityLeftEnd;
friend class TtC::KnotHolderEntityRightEnd;
diff --git a/src/node-context.cpp b/src/node-context.cpp
index c3523e3c5..286f55c4b 100644
--- a/src/node-context.cpp
+++ b/src/node-context.cpp
@@ -35,6 +35,7 @@
#include "style.h"
#include "splivarot.h"
#include "shape-editor.h"
+#include "live_effects/effect.h"
// needed for flash nodepath upon mouseover:
#include "display/canvas-bpath.h"
@@ -115,6 +116,12 @@ sp_node_context_dispose(GObject *object)
ec->enableGrDrag(false);
+ if (nc->flash_permitem) {
+ // hack!!! (we add a temporary canvasitem with life time 1 ms)
+ nc->flash_tempitem = nc->event_context.desktop->add_temporary_canvasitem (nc->flash_permitem, 1);
+ nc->flash_permitem = NULL;
+ }
+
nc->sel_changed_connection.disconnect();
nc->sel_changed_connection.~connection();
@@ -170,6 +177,44 @@ sp_node_context_setup(SPEventContext *ec)
nc->shape_editor->update_statusbar();
}
+static SPCanvasItem *
+sp_node_context_generate_helperpath(SPDesktop *desktop, SPPath *path) {
+ // This should be put somewhere else under the name of "generate helperpath" or something. Because basically this is copied of code from nodepath...
+ SPCurve *curve_new = sp_path_get_curve_for_edit(path);
+ SPCurve *flash_curve = curve_new->copy();
+ flash_curve->transform(sp_item_i2d_affine(SP_ITEM(path)));
+ SPCanvasItem * canvasitem = sp_canvas_bpath_new(sp_desktop_tempgroup(desktop), flash_curve);
+ // would be nice if its color could be XORed or something, now it is invisible for red stroked objects...
+ // unless we also flash the nodes...
+ guint32 color = prefs_get_int_attribute("tools.nodes", "highlight_color", 0xff0000ff);
+ sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(canvasitem), color, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
+ sp_canvas_bpath_set_fill(SP_CANVAS_BPATH(canvasitem), 0, SP_WIND_RULE_NONZERO);
+ sp_canvas_item_show(canvasitem);
+ flash_curve->unref();
+ return canvasitem;
+}
+
+static void
+sp_node_context_flash_path(SPEventContext *event_context, SPItem *item, guint timeout) {
+ SPNodeContext *nc = SP_NODE_CONTEXT(event_context);
+
+ nc->remove_flash_counter = 3; // for some reason root_handler is called twice after each item_handler...
+ if (nc->flashed_item != item) {
+ // we entered a new item
+ nc->flashed_item = item;
+ SPDesktop *desktop = event_context->desktop;
+ if (nc->flash_tempitem) {
+ desktop->remove_temporary_canvasitem(nc->flash_tempitem);
+ nc->flash_tempitem = NULL;
+ }
+
+ if (SP_IS_PATH(item)) {
+ SPCanvasItem *canvasitem = sp_node_context_generate_helperpath(desktop, SP_PATH(item));
+ nc->flash_tempitem = desktop->add_temporary_canvasitem (canvasitem, timeout);
+ }
+ }
+}
+
/**
\brief Callback that processes the "changed" signal on the selection;
destroys old and creates new nodepath and reassigns listeners to the new selected item's repr
@@ -184,6 +229,21 @@ sp_node_context_selection_changed(Inkscape::Selection *selection, gpointer data)
SPItem *item = selection->singleItem();
nc->shape_editor->set_item(item);
+ if (nc->flash_permitem) {
+ // hack!!! (we add a temporary canvasitem with life time 1 ms)
+ nc->flash_tempitem = nc->event_context.desktop->add_temporary_canvasitem (nc->flash_permitem, 1);
+ nc->flash_permitem = NULL;
+ }
+ if (SP_IS_LPE_ITEM(item)) {
+ Inkscape::LivePathEffect::Effect *lpe = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
+ if (lpe && lpe->pathFlashType() == Inkscape::LivePathEffect::PERMANENT_FLASH) {
+ if (SP_IS_PATH(item)) {
+ SPCanvasItem *canvasitem = sp_node_context_generate_helperpath(nc->event_context.desktop, SP_PATH(item));
+ nc->flash_permitem = canvasitem;
+ }
+ }
+ }
+
nc->shape_editor->update_statusbar();
}
@@ -197,41 +257,27 @@ sp_node_context_show_modifier_tip(SPEventContext *event_context, GdkEvent *event
_("<b>Alt</b>: lock handle length; <b>Ctrl+Alt</b>: move along handles"));
}
-
static gint
sp_node_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event)
{
gint ret = FALSE;
- SPNodeContext *nc = SP_NODE_CONTEXT(event_context);
-
- if ( prefs_get_int_attribute ("tools.nodes", "pathflash_enabled", 0) == 1 ) {
- nc->remove_flash_counter = 3; // for some reason root_handler is called twice after each item_handler...
- if (nc->flashed_item != item) {
- // we entered a new item
- nc->flashed_item = item;
- SPDesktop *desktop = event_context->desktop;
- if (nc->flash_tempitem) {
- desktop->remove_temporary_canvasitem(nc->flash_tempitem);
- nc->flash_tempitem = NULL;
- }
- if (SP_IS_PATH(item)) {
- // This should be put somewhere else under the name of "generate helperpath" or something. Because basically this is copied of code from nodepath...
- SPCurve *curve_new = sp_path_get_curve_for_edit(SP_PATH(item));
- SPCurve *flash_curve = curve_new->copy();
- flash_curve->transform(sp_item_i2d_affine(item) );
- SPCanvasItem * canvasitem = sp_canvas_bpath_new(sp_desktop_tempgroup(desktop), flash_curve);
- // would be nice if its color could be XORed or something, now it is invisible for red stroked objects...
- // unless we also flash the nodes...
- guint32 color = prefs_get_int_attribute("tools.nodes", "highlight_color", 0xff0000ff);
- sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(canvasitem), color, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
- sp_canvas_bpath_set_fill(SP_CANVAS_BPATH(canvasitem), 0, SP_WIND_RULE_NONZERO);
- sp_canvas_item_show(canvasitem);
- flash_curve->unref();
- guint timeout = prefs_get_int_attribute("tools.nodes", "pathflash_timeout", 500);
- nc->flash_tempitem = desktop->add_temporary_canvasitem (canvasitem, timeout);
+ if (prefs_get_int_attribute ("tools.nodes", "pathflash_enabled", 0) == 1) {
+ guint timeout = prefs_get_int_attribute("tools.nodes", "pathflash_timeout", 500);
+ if (SP_IS_LPE_ITEM(item)) {
+ Inkscape::LivePathEffect::Effect *lpe = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
+ if (lpe) {
+ if (lpe->pathFlashType() == Inkscape::LivePathEffect::SUPPRESS_FLASH) {
+ // return if flash is suppressed or if we want a permanent "flash" (this is handled
+ // in sp_node_context_selection_changed()
+ return ret;
+ }
+ if (lpe->pathFlashType() == Inkscape::LivePathEffect::PERMANENT_FLASH) {
+ timeout = 0;
+ }
}
}
+ sp_node_context_flash_path(event_context, item, timeout);
}
if (((SPEventContextClass *) parent_class)->item_handler)
diff --git a/src/node-context.h b/src/node-context.h
index 4a52c28a0..baa37af91 100644
--- a/src/node-context.h
+++ b/src/node-context.h
@@ -32,6 +32,7 @@ class SPNodeContext;
class SPNodeContextClass;
struct SPNodeContext {
+ // FIXME: shouldn't this be a pointer???
SPEventContext event_context;
guint drag : 1;
@@ -58,6 +59,7 @@ struct SPNodeContext {
SPItem * flashed_item;
Inkscape::Display::TemporaryItem * flash_tempitem;
+ SPCanvasItem * flash_permitem;
int remove_flash_counter;
};