summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 0594f8d)
raw | patch | inline | side by side (parent: 0594f8d)
author | johanengelen <johanengelen@users.sourceforge.net> | |
Sun, 2 Mar 2008 13:38:15 +0000 (13:38 +0000) | ||
committer | johanengelen <johanengelen@users.sourceforge.net> | |
Sun, 2 Mar 2008 13:38:15 +0000 (13:38 +0000) |
13 files changed:
src/desktop-handles.cpp | patch | blob | history | |
src/desktop-handles.h | patch | blob | history | |
src/desktop.cpp | patch | blob | history | |
src/desktop.h | patch | blob | history | |
src/display/Makefile_insert | patch | blob | history | |
src/display/canvas-temporary-item-list.cpp | [new file with mode: 0644] | patch | blob |
src/display/canvas-temporary-item-list.h | [new file with mode: 0644] | patch | blob |
src/display/canvas-temporary-item.cpp | [new file with mode: 0644] | patch | blob |
src/display/canvas-temporary-item.h | [new file with mode: 0644] | patch | blob |
src/live_effects/effect.h | patch | blob | history | |
src/live_effects/lpe-test-doEffect-stack.cpp | patch | blob | history | |
src/live_effects/lpe-test-doEffect-stack.h | patch | blob | history | |
src/live_effects/parameter/point.cpp | patch | blob | history |
index 1241bfa02c7a19bf87c68d96ca52d226c924c527..481bf35ea56ab3cabfbd8b0f30b6b35c6fb9b2be 100644 (file)
--- a/src/desktop-handles.cpp
+++ b/src/desktop-handles.cpp
return desktop->controls;
}
+SPCanvasGroup *
+sp_desktop_tempgroup (SPDesktop const * desktop)
+{
+ g_return_val_if_fail (desktop != NULL, NULL);
+
+ return desktop->tempgroup;
+}
+
Inkscape::MessageStack *
sp_desktop_message_stack (SPDesktop const * desktop)
{
diff --git a/src/desktop-handles.h b/src/desktop-handles.h
index d7e3bfdae1843a211e2b0580787a41492160d5d5..72c943949bc1499007e13c8059e3e37700963625 100644 (file)
--- a/src/desktop-handles.h
+++ b/src/desktop-handles.h
SPCanvasItem *sp_desktop_drawing (SPDesktop const *desktop);
SPCanvasGroup * sp_desktop_sketch (SPDesktop const * desktop);
SPCanvasGroup * sp_desktop_controls (SPDesktop const * desktop);
+SPCanvasGroup * sp_desktop_tempgroup (SPDesktop const * desktop);
Inkscape::MessageStack * sp_desktop_message_stack (SPDesktop const * desktop);
SPNamedView * sp_desktop_namedview (SPDesktop const * desktop);
diff --git a/src/desktop.cpp b/src/desktop.cpp
index d2547f5a60895fce146a486dcc1a286285d646d0..65025027ad9641e7c5395d664eb3d3dfb306ace0 100644 (file)
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
* Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
*
* Copyright (C) 2007 Jon A. Cruz
- * Copyright (C) 2006-2007 Johan Engelen
+ * Copyright (C) 2006-2008 Johan Engelen
* Copyright (C) 2006 John Bintz
* Copyright (C) 2004 MenTaLguY
* Copyright (C) 1999-2002 Lauris Kaplinski
#include "display/gnome-canvas-acetate.h"
#include "display/sodipodi-ctrlrect.h"
#include "display/sp-canvas-util.h"
+#include "display/canvas-temporary-item-list.h"
#include "libnr/nr-matrix-div.h"
#include "libnr/nr-rect-ops.h"
#include "ui/dialog/dialog-manager.h"
event_context( 0 ),
layer_manager( 0 ),
event_log( 0 ),
+ temporary_item_list( 0 ),
acetate( 0 ),
main( 0 ),
gridgroup( 0 ),
drawing( 0 ),
sketch( 0 ),
controls( 0 ),
+ tempgroup ( 0 ),
table( 0 ),
page( 0 ),
page_border( 0 ),
guides = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
sketch = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
controls = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
+ tempgroup = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
/* Push select tool to the bottom of stack */
/** \todo
layer_manager = new Inkscape::LayerManager( this );
showGrids(namedview->grids_visible, false);
+
+ temporary_item_list = new Inkscape::Display::TemporaryItemList( this );
}
void SPDesktop::destroy()
{
+ delete temporary_item_list;
+ temporary_item_list = NULL;
+
namedview->hide(this);
_activate_connection.disconnect();
//--------------------------------------------------------------------
/* Public methods */
+
+/** Note that lifetime is measured in milliseconds
+* it is perfectly safe to ignore the returned pointer: the object is deleted by itself, so don't delete it elsewhere!
+* The return value should only be used as argument for SPDesktop::remove_temporary_canvasitem, because the object might be deleted already.
+*/
+Inkscape::Display::TemporaryItem *
+SPDesktop::add_temporary_canvasitem (SPCanvasItem *item, guint lifetime)
+{
+ return temporary_item_list->add_item(item, lifetime);
+}
+
+/** It is perfectly safe to call this function while the object has already been deleted due to a timeout.
+*/
+void
+SPDesktop::remove_temporary_canvasitem (Inkscape::Display::TemporaryItem * tempitem)
+{
+ temporary_item_list->delete_item(tempitem);
+}
+
void SPDesktop::setDisplayModeNormal()
{
SP_CANVAS_ARENA (drawing)->arena->rendermode = RENDERMODE_NORMAL;
diff --git a/src/desktop.h b/src/desktop.h
index 84b8297268f83672b71f2a3c65e6c86bb1bb7fa9..bb05331b6add722ff1cd3f0565a14736467227e9 100644 (file)
--- a/src/desktop.h
+++ b/src/desktop.h
namespace Whiteboard {
class SessionManager;
}
+ namespace Display {
+ class TemporaryItemList;
+ class TemporaryItem;
+ }
}
/**
Inkscape::LayerManager *layer_manager;
Inkscape::EventLog *event_log;
+ Inkscape::Display::TemporaryItemList *temporary_item_list;
+
SPCanvasItem *acetate;
SPCanvasGroup *main;
SPCanvasGroup *gridgroup;
SPCanvasItem *drawing;
SPCanvasGroup *sketch;
SPCanvasGroup *controls;
+ SPCanvasGroup *tempgroup; ///< contains temporary canvas items
SPCanvasItem *table; ///< outside-of-page background
SPCanvasItem *page; ///< page background
SPCanvasItem *page_border; ///< page border
return _guides_message_context;
}
+ Inkscape::Display::TemporaryItem * add_temporary_canvasitem (SPCanvasItem *item, guint lifetime);
+ void remove_temporary_canvasitem (Inkscape::Display::TemporaryItem * tempitem);
+
void setDisplayModeNormal();
void setDisplayModeOutline();
void displayModeToggle();
index 4994434d73e4158a42fdda4bcef670e45639d0fe..61cb02155b101c0a02fa5647d74194afe6d45767 100644 (file)
display/canvas-grid.h \
display/canvas-axonomgrid.cpp \
display/canvas-axonomgrid.h \
+ display/canvas-temporary-item.cpp \
+ display/canvas-temporary-item.h \
+ display/canvas-temporary-item-list.cpp \
+ display/canvas-temporary-item-list.h \
display/curve.cpp \
display/curve.h \
display/display-forward.h \
diff --git a/src/display/canvas-temporary-item-list.cpp b/src/display/canvas-temporary-item-list.cpp
--- /dev/null
@@ -0,0 +1,83 @@
+/** \file\r
+ * Provides a class that can contain active TemporaryItem's on a desktop\r
+ * Code inspired by message-stack.cpp\r
+ *\r
+ * Authors:\r
+ * Johan Engelen\r
+ *\r
+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include "display/canvas-temporary-item-list.h"\r
+\r
+#include "display/canvas-temporary-item.h"\r
+\r
+namespace Inkscape {\r
+namespace Display {\r
+\r
+TemporaryItemList::TemporaryItemList(SPDesktop *desktop)\r
+ : desktop(desktop)\r
+{\r
+\r
+}\r
+\r
+TemporaryItemList::~TemporaryItemList()\r
+{\r
+ // delete all items in list so the timeouts are removed\r
+ for ( std::list<TemporaryItem*>::iterator it = itemlist.begin(); it != itemlist.end(); ++it ) {\r
+ TemporaryItem * tempitem = *it;\r
+ delete tempitem;\r
+ }\r
+ itemlist.clear();\r
+}\r
+\r
+/* Note that TemporaryItem or TemporaryItemList is responsible for deletion and such, so this return pointer can safely be ignored. */\r
+TemporaryItem *\r
+TemporaryItemList::add_item(SPCanvasItem *item, guint lifetime)\r
+{\r
+ if (lifetime > 100) { // beware of strange things happening due to very short timeouts\r
+ TemporaryItem * tempitem = new TemporaryItem(item, lifetime);\r
+ itemlist.push_back(tempitem);\r
+ tempitem->signal_timeout.connect( sigc::mem_fun(*this, &TemporaryItemList::_item_timeout) );\r
+ }\r
+}\r
+\r
+void\r
+TemporaryItemList::delete_item( TemporaryItem * tempitem )\r
+{\r
+ // check if the item is in the list, if so, delete it. (in other words, don't wait for the item to delete itself)\r
+ bool in_list = false;\r
+ for ( std::list<TemporaryItem*>::iterator it = itemlist.begin(); it != itemlist.end(); ++it ) {\r
+ if ( *it == tempitem ) {\r
+ in_list = true;\r
+ break;\r
+ }\r
+ }\r
+ if (in_list) {\r
+ itemlist.remove(tempitem);\r
+ delete tempitem;\r
+ }\r
+}\r
+\r
+void\r
+TemporaryItemList::_item_timeout(TemporaryItem * tempitem)\r
+{\r
+ itemlist.remove(tempitem);\r
+ // no need to delete the item, it does that itself after signal_timeout.emit() completes\r
+}\r
+\r
+} //namespace Display\r
+} /* namespace Inkscape */\r
+\r
+/*\r
+ Local Variables:\r
+ mode:c++\r
+ c-file-style:"stroustrup"\r
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
+ indent-tabs-mode:nil\r
+ fill-column:99\r
+ End:\r
+*/\r
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
diff --git a/src/display/canvas-temporary-item-list.h b/src/display/canvas-temporary-item-list.h
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef INKSCAPE_CANVAS_TEMPORARY_ITEM_LIST_H\r
+#define INKSCAPE_CANVAS_TEMPORARY_ITEM_LIST_H\r
+\r
+/** \file\r
+ * Provides a class that can contain active TemporaryItem's on a desktop\r
+ *\r
+ * Authors:\r
+ * Johan Engelen\r
+ *\r
+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include "forward.h"\r
+#include "display/display-forward.h"\r
+#include <list>\r
+\r
+namespace Inkscape {\r
+namespace Display {\r
+\r
+class TemporaryItem;\r
+\r
+class TemporaryItemList {\r
+public:\r
+ TemporaryItemList(SPDesktop *desktop);\r
+ virtual ~TemporaryItemList();\r
+\r
+ TemporaryItem* add_item (SPCanvasItem *item, guint lifetime);\r
+ void delete_item (TemporaryItem * tempitem);\r
+\r
+protected:\r
+ SPDesktop *desktop; /** Desktop we are on. */\r
+\r
+ std::list<TemporaryItem *> itemlist; /** list of temp items */ \r
+\r
+ void _item_timeout (TemporaryItem * tempitem);\r
+\r
+private:\r
+ TemporaryItemList(const TemporaryItemList&);\r
+ TemporaryItemList& operator=(const TemporaryItemList&);\r
+};\r
+\r
+} //namespace Display\r
+} //namespace Inkscape\r
+\r
+#endif\r
+\r
+/*\r
+ Local Variables:\r
+ mode:c++\r
+ c-file-style:"stroustrup"\r
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
+ indent-tabs-mode:nil\r
+ fill-column:99\r
+ End:\r
+*/\r
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
diff --git a/src/display/canvas-temporary-item.cpp b/src/display/canvas-temporary-item.cpp
--- /dev/null
@@ -0,0 +1,72 @@
+/** \file\r
+ * Provides a class that can contain active TemporaryItem's on a desktop\r
+ * When the object is deleted, it also deletes the canvasitem it contains!\r
+ * This object should be created/managed by a TemporaryItemList.\r
+ * After its lifetime, it fires the timeout signal, afterwards *it deletes itself*.\r
+ *\r
+ * (part of code inspired by message-stack.cpp)\r
+ *\r
+ * Authors:\r
+ * Johan Engelen\r
+ *\r
+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include "display/canvas-temporary-item.h"\r
+\r
+#include <gtk/gtkobject.h>\r
+\r
+namespace Inkscape {\r
+namespace Display {\r
+\r
+/** lifetime is measured in milliseconds\r
+ */\r
+TemporaryItem::TemporaryItem(SPCanvasItem *item, guint lifetime)\r
+ : canvasitem(item),\r
+ timeout_id(0)\r
+{\r
+ if (lifetime > 0) {\r
+ timeout_id = g_timeout_add(lifetime, &TemporaryItem::_timeout, this);\r
+ }\r
+}\r
+\r
+TemporaryItem::~TemporaryItem()\r
+{\r
+ // when it has not expired yet...\r
+ if (timeout_id) {\r
+ g_source_remove(timeout_id);\r
+ timeout_id = 0;\r
+ }\r
+\r
+ if (canvasitem) {\r
+ // destroying the item automatically hides it\r
+ gtk_object_destroy (GTK_OBJECT (canvasitem));\r
+ canvasitem = NULL;\r
+ }\r
+}\r
+\r
+/* static method*/\r
+gboolean TemporaryItem::_timeout(gpointer data) {\r
+ TemporaryItem *tempitem = reinterpret_cast<TemporaryItem *>(data);\r
+ tempitem->timeout_id = 0;\r
+ tempitem->signal_timeout.emit(tempitem);\r
+ delete tempitem;\r
+ return FALSE;\r
+}\r
+\r
+\r
+} //namespace Display\r
+} /* namespace Inkscape */\r
+\r
+/*\r
+ Local Variables:\r
+ mode:c++\r
+ c-file-style:"stroustrup"\r
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
+ indent-tabs-mode:nil\r
+ fill-column:99\r
+ End:\r
+*/\r
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
diff --git a/src/display/canvas-temporary-item.h b/src/display/canvas-temporary-item.h
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef INKSCAPE_CANVAS_TEMPORARY_ITEM_H\r
+#define INKSCAPE_CANVAS_TEMPORARY_ITEM_H\r
+\r
+/** \file\r
+ * Provides a class to put a canvasitem temporarily on-canvas.\r
+ *\r
+ * Authors:\r
+ * Johan Engelen\r
+ *\r
+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include "display/display-forward.h"\r
+\r
+#include <sigc++/sigc++.h>\r
+\r
+namespace Inkscape {\r
+namespace Display {\r
+\r
+class TemporaryItem {\r
+public:\r
+ TemporaryItem(SPCanvasItem *item, guint lifetime);\r
+ virtual ~TemporaryItem();\r
+\r
+ sigc::signal<void, TemporaryItem *> signal_timeout;\r
+\r
+protected:\r
+ friend class TemporaryItemList;\r
+\r
+ SPCanvasItem * canvasitem; /** The item we are holding on to */\r
+ guint timeout_id; /** ID by which glib knows the timeout event */\r
+\r
+ static gboolean _timeout(gpointer data); ///< callback for when lifetime expired\r
+\r
+private:\r
+ TemporaryItem(const TemporaryItem&);\r
+ TemporaryItem& operator=(const TemporaryItem&);\r
+};\r
+\r
+} //namespace Display\r
+} //namespace Inkscape\r
+\r
+#endif\r
+\r
+/*\r
+ Local Variables:\r
+ mode:c++\r
+ c-file-style:"stroustrup"\r
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
+ indent-tabs-mode:nil\r
+ fill-column:99\r
+ End:\r
+*/\r
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
index fb5e85b1bc60d0c72946521aadcd78f88c7c616f..6b5295071724a32f4bf97435104911ae66758b2a 100644 (file)
#define LPE_CONVERSION_TOLERANCE 0.01 // FIXME: find good solution for this.
-//#define LPE_ENABLE_TEST_EFFECTS
+#define LPE_ENABLE_TEST_EFFECTS
struct SPDocument;
struct SPDesktop;
std::vector<Parameter *> param_vector;
int oncanvasedit_it;
-
Inkscape::UI::Widget::Registry wr;
LivePathEffectObject *lpeobj;
diff --git a/src/live_effects/lpe-test-doEffect-stack.cpp b/src/live_effects/lpe-test-doEffect-stack.cpp
index f6ecad562f13ac37b8246312a814ae3d68a41401..f20ce8cec6f803841a551d91ebb477dab45fad9b 100644 (file)
LPEdoEffectStackTest::LPEdoEffectStackTest(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
- step(_("Stack step"), (""), "step", &wr, this)
+ step(_("Stack step"), (""), "step", &wr, this),
+ point(_("point param"), "", "point_param", &wr, this)
{
registerParameter( dynamic_cast<Parameter *>(&step) );
+ registerParameter( dynamic_cast<Parameter *>(&point) );
}
LPEdoEffectStackTest::~LPEdoEffectStackTest()
diff --git a/src/live_effects/lpe-test-doEffect-stack.h b/src/live_effects/lpe-test-doEffect-stack.h
index 3d853aa8cd2334426dbbfea987ef6f1b69b7c332..1417512d1e13fae6f2571005def85dc6e766f858 100644 (file)
#include "live_effects/effect.h"
#include "live_effects/parameter/parameter.h"
+#include "live_effects/parameter/point.h"
namespace Inkscape {
namespace LivePathEffect {
private:
ScalarParam step;
+ PointParam point;
LPEdoEffectStackTest(const LPEdoEffectStackTest&);
LPEdoEffectStackTest& operator=(const LPEdoEffectStackTest&);
index 1859a0a09749168e4c109c131df2e834da669978..38bf4be57607ddbf7b576a144908ce197f37589e 100644 (file)
#include "ui/widget/point.h"
#include "widgets/icon.h"
#include "ui/widget/registered-widget.h"
-#include "knot.h"
#include "inkscape.h"
#include "verbs.h"
// needed for on-canvas editting:
#include "tools-switch.h"
-#include "shape-editor.h"
#include "node-context.h"
-#include "desktop-handles.h"
-#include "selection.h"
+#include "shape-editor.h"
#include "desktop.h"
+#include "selection.h"
-#define LPEPOINTPARAM_DEBUG // undefine to disable all on-canvas editing code for PointParam
+// temporarily needed for tempitem tryout
+#include "desktop-handles.h"
+#include "display/sodipodi-ctrl.h"
+#include "knot.h"
+#include "display/canvas-temporary-item-list.h"
-#define PRM_KNOT_COLOR_NORMAL 0xffffff00
-#define PRM_KNOT_COLOR_SELECTED 0x0000ff00
+#define LPEPOINTPARAM_DEBUG // undefine to disable all on-canvas editing code for PointParam
namespace Inkscape {
param_effect->getRepr(),
param_effect->getSPDoc() ) );
pointwdg->setValue( (*this)[0], (*this)[1] );
+ pointwdg->clearProgrammatically();
pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change point parameter"));
Gtk::Widget* pIcon = Gtk::manage( sp_icon_get_icon( "draw_node", Inkscape::ICON_SIZE_BUTTON) );
ShapeEditor * shape_editor = SP_NODE_CONTEXT( dt->event_context )->shape_editor;
shape_editor->set_item_lpe_point_parameter(item, SP_OBJECT(param_effect->getLPEObj()), param_key.c_str());
+
+
+ /* TEMPORARY CODE TO TEST TEMPORARY CANVAS ITEMS */
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ SPCanvasItem * canvasitem = sp_canvas_item_new( sp_desktop_tempgroup (desktop),
+ SP_TYPE_CTRL,
+ "anchor", GTK_ANCHOR_CENTER,
+ "size", 8.0,
+ "stroked", TRUE,
+ "stroke_color", 0xf000f0ff,
+ "mode", SP_KNOT_MODE_XOR,
+ "shape", SP_KNOT_SHAPE_CROSS,
+ NULL );
+ SP_CTRL(canvasitem)->moveto ( static_cast<Geom::Point> (*this) );
+ desktop->add_temporary_canvasitem(canvasitem, 2000);
+ /* END ---- TEMPORARY CODE TO TEST TEMPORARY CANVAS ITEMS */
}
@@ -158,9 +176,10 @@ PointParam::param_transform_multiply(Geom::Matrix const& postmul, bool /*set*/)
void
PointParam::on_button_click()
{
- SPItem * item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ SPItem * item = sp_desktop_selection(desktop)->singleItem();
if (item != NULL) {
- param_editOncanvas(item, SP_ACTIVE_DESKTOP);
+ param_editOncanvas(item, desktop);
}
}