From e58cac52b258e64c2cc88b0044bf9cfbaecedce2 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Tue, 9 Apr 2013 00:23:07 +0200 Subject: Started conversion of SPEventContext tree; added virtual pads to all classes. (bzr r11608.1.89) --- src/mesh-context.cpp | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index 36712d15d..78cc49396 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -74,8 +74,16 @@ static void sp_mesh_context_class_init(SPMeshContextClass *klass) event_context_class->root_handler = sp_mesh_context_root_handler; } +CMeshContext::CMeshContext(SPMeshContext* meshcontext) : CEventContext(meshcontext) { + this->spmeshcontext = meshcontext; +} + static void sp_mesh_context_init(SPMeshContext *gr_context) { + gr_context->cmeshcontext = new CMeshContext(gr_context); + delete gr_context->ceventcontext; + gr_context->ceventcontext = gr_context->cmeshcontext; + SPEventContext *event_context = SP_EVENT_CONTEXT(gr_context); gr_context->cursor_addnode = false; @@ -244,11 +252,18 @@ mesh_subselection_changed (gpointer, gpointer data) static void sp_mesh_context_setup(SPEventContext *ec) { + ec->ceventcontext->setup(); +} + +void CMeshContext::setup() { + SPEventContext* ec = this->speventcontext; + SPMeshContext *rc = SP_MESH_CONTEXT(ec); - if (((SPEventContextClass *) sp_mesh_context_parent_class)->setup) { - ((SPEventContextClass *) sp_mesh_context_parent_class)->setup(ec); - } +// if (((SPEventContextClass *) sp_mesh_context_parent_class)->setup) { +// ((SPEventContextClass *) sp_mesh_context_parent_class)->setup(ec); +// } + CEventContext::setup(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (prefs->getBool("/tools/mesh/selcue", true)) { @@ -455,6 +470,12 @@ Handles all keyboard and mouse input for meshs. static gint sp_mesh_context_root_handler(SPEventContext *event_context, GdkEvent *event) { + return event_context->ceventcontext->root_handler(event); +} + +gint CMeshContext::root_handler(GdkEvent* event) { + SPEventContext* event_context = this->speventcontext; + // static int count = 0; // std::cout << "sp_mesh_context_root_handler: " << count++ << std::endl; static bool dragging; @@ -924,15 +945,17 @@ sp_mesh_context_root_handler(SPEventContext *event_context, GdkEvent *event) } if (!ret) { - if (((SPEventContextClass *) sp_mesh_context_parent_class)->root_handler) { - ret = ((SPEventContextClass *) sp_mesh_context_parent_class)->root_handler(event_context, event); - } +// if (((SPEventContextClass *) sp_mesh_context_parent_class)->root_handler) { +// ret = ((SPEventContextClass *) sp_mesh_context_parent_class)->root_handler(event_context, event); +// } + ret = CEventContext::root_handler(event); } return ret; } + static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const /*pt*/, guint /*state*/, guint32 /*etime*/) { -- cgit v1.2.3 From 1d8f1753cd8cab38d19fcc26a4ad70ba2e794ac8 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Tue, 9 Apr 2013 22:12:07 +0200 Subject: Added constructors to EventContext tree / some missing virtual pads. (bzr r11608.1.90) --- src/mesh-context.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index 78cc49396..6c7fe05d8 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -70,20 +70,26 @@ static void sp_mesh_context_class_init(SPMeshContextClass *klass) object_class->dispose = sp_mesh_context_dispose; - event_context_class->setup = sp_mesh_context_setup; - event_context_class->root_handler = sp_mesh_context_root_handler; +// event_context_class->setup = sp_mesh_context_setup; +// event_context_class->root_handler = sp_mesh_context_root_handler; } CMeshContext::CMeshContext(SPMeshContext* meshcontext) : CEventContext(meshcontext) { this->spmeshcontext = meshcontext; } -static void sp_mesh_context_init(SPMeshContext *gr_context) -{ +SPMeshContext::SPMeshContext() : SPEventContext() { + SPMeshContext* gr_context = this; + gr_context->cmeshcontext = new CMeshContext(gr_context); delete gr_context->ceventcontext; gr_context->ceventcontext = gr_context->cmeshcontext; + gr_context->selcon = 0; + gr_context->_message_context = 0; + gr_context->node_added = false; + gr_context->subselcon = 0; + SPEventContext *event_context = SP_EVENT_CONTEXT(gr_context); gr_context->cursor_addnode = false; @@ -97,6 +103,11 @@ static void sp_mesh_context_init(SPMeshContext *gr_context) event_context->item_to_select = NULL; } +static void sp_mesh_context_init(SPMeshContext *gr_context) +{ + new (gr_context) SPMeshContext(); +} + static void sp_mesh_context_dispose(GObject *object) { SPMeshContext *rc = SP_MESH_CONTEXT(object); -- cgit v1.2.3 From fbb85064cfaaf03cc09bacedb16a8561f61f2b3d Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 13 Apr 2013 00:37:18 +0200 Subject: Added prefPaths to contexts; modified SPFactory (bzr r11608.1.94) --- src/mesh-context.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index 6c7fe05d8..ecfceae20 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -61,6 +61,8 @@ static gint sp_mesh_context_root_handler(SPEventContext *event_context, GdkEvent static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const pt, guint state, guint32 etime); +const std::string SPMeshContext::prefsPath = "/tools/mesh"; + G_DEFINE_TYPE(SPMeshContext, sp_mesh_context, SP_TYPE_EVENT_CONTEXT); static void sp_mesh_context_class_init(SPMeshContextClass *klass) -- cgit v1.2.3 From fbdc8b84ff670c684dafc7d7d403ed01e7077e70 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 13 Apr 2013 18:13:17 +0200 Subject: Replaced casting macros for EventContext tree; added contructors. (bzr r11608.1.96) --- src/mesh-context.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index ecfceae20..ac26a6d23 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -61,6 +61,21 @@ static gint sp_mesh_context_root_handler(SPEventContext *event_context, GdkEvent static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const pt, guint state, guint32 etime); + +#include "sp-factory.h" + +namespace { + SPEventContext* createMeshContext() { + return new SPMeshContext(); + } + + bool meshContextRegistered = ToolFactory::instance().registerObject("/tools/mesh", createMeshContext); +} + +const std::string& CMeshContext::getPrefsPath() { + return SPMeshContext::prefsPath; +} + const std::string SPMeshContext::prefsPath = "/tools/mesh"; G_DEFINE_TYPE(SPMeshContext, sp_mesh_context, SP_TYPE_EVENT_CONTEXT); @@ -86,6 +101,7 @@ SPMeshContext::SPMeshContext() : SPEventContext() { gr_context->cmeshcontext = new CMeshContext(gr_context); delete gr_context->ceventcontext; gr_context->ceventcontext = gr_context->cmeshcontext; + types.insert(typeid(SPMeshContext)); gr_context->selcon = 0; gr_context->_message_context = 0; -- cgit v1.2.3 From 65ba6ad9a82f8f47974eb10665478fd783692bb5 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 20 Apr 2013 23:19:46 +0200 Subject: Merging of EventContext classes complete. (bzr r11608.1.98) --- src/mesh-context.cpp | 68 +++++++++------------------------------------------- 1 file changed, 11 insertions(+), 57 deletions(-) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index ac26a6d23..73e477a35 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -53,12 +53,6 @@ using Inkscape::DocumentUndo; -static void sp_mesh_context_dispose(GObject *object); - -static void sp_mesh_context_setup(SPEventContext *ec); - -static gint sp_mesh_context_root_handler(SPEventContext *event_context, GdkEvent *event); - static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const pt, guint state, guint32 etime); @@ -72,37 +66,15 @@ namespace { bool meshContextRegistered = ToolFactory::instance().registerObject("/tools/mesh", createMeshContext); } -const std::string& CMeshContext::getPrefsPath() { +const std::string& SPMeshContext::getPrefsPath() { return SPMeshContext::prefsPath; } const std::string SPMeshContext::prefsPath = "/tools/mesh"; -G_DEFINE_TYPE(SPMeshContext, sp_mesh_context, SP_TYPE_EVENT_CONTEXT); - -static void sp_mesh_context_class_init(SPMeshContextClass *klass) -{ - GObjectClass *object_class = (GObjectClass *) klass; - SPEventContextClass *event_context_class = (SPEventContextClass *) klass; - - object_class->dispose = sp_mesh_context_dispose; - -// event_context_class->setup = sp_mesh_context_setup; -// event_context_class->root_handler = sp_mesh_context_root_handler; -} - -CMeshContext::CMeshContext(SPMeshContext* meshcontext) : CEventContext(meshcontext) { - this->spmeshcontext = meshcontext; -} - SPMeshContext::SPMeshContext() : SPEventContext() { SPMeshContext* gr_context = this; - gr_context->cmeshcontext = new CMeshContext(gr_context); - delete gr_context->ceventcontext; - gr_context->ceventcontext = gr_context->cmeshcontext; - types.insert(typeid(SPMeshContext)); - gr_context->selcon = 0; gr_context->_message_context = 0; gr_context->node_added = false; @@ -121,15 +93,9 @@ SPMeshContext::SPMeshContext() : SPEventContext() { event_context->item_to_select = NULL; } -static void sp_mesh_context_init(SPMeshContext *gr_context) -{ - new (gr_context) SPMeshContext(); -} - -static void sp_mesh_context_dispose(GObject *object) -{ - SPMeshContext *rc = SP_MESH_CONTEXT(object); - SPEventContext *ec = SP_EVENT_CONTEXT(object); +SPMeshContext::~SPMeshContext() { + SPMeshContext *rc = SP_MESH_CONTEXT(this); + SPEventContext *ec = SP_EVENT_CONTEXT(this); ec->enableGrDrag(false); @@ -142,7 +108,7 @@ static void sp_mesh_context_dispose(GObject *object) rc->subselcon->disconnect(); delete rc->subselcon; - G_OBJECT_CLASS(sp_mesh_context_parent_class)->dispose(object); + //G_OBJECT_CLASS(sp_mesh_context_parent_class)->dispose(object); } const gchar *ms_handle_descr [] = { @@ -278,21 +244,15 @@ mesh_subselection_changed (gpointer, gpointer data) mesh_selection_changed (NULL, data); } - -static void sp_mesh_context_setup(SPEventContext *ec) -{ - ec->ceventcontext->setup(); -} - -void CMeshContext::setup() { - SPEventContext* ec = this->speventcontext; +void SPMeshContext::setup() { + SPEventContext* ec = this; SPMeshContext *rc = SP_MESH_CONTEXT(ec); // if (((SPEventContextClass *) sp_mesh_context_parent_class)->setup) { // ((SPEventContextClass *) sp_mesh_context_parent_class)->setup(ec); // } - CEventContext::setup(); + SPEventContext::setup(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (prefs->getBool("/tools/mesh/selcue", true)) { @@ -496,14 +456,8 @@ sp_mesh_context_corner_operation (SPMeshContext *rc, MeshCornerOperation operati /** Handles all keyboard and mouse input for meshs. */ -static gint -sp_mesh_context_root_handler(SPEventContext *event_context, GdkEvent *event) -{ - return event_context->ceventcontext->root_handler(event); -} - -gint CMeshContext::root_handler(GdkEvent* event) { - SPEventContext* event_context = this->speventcontext; +gint SPMeshContext::root_handler(GdkEvent* event) { + SPEventContext* event_context = this; // static int count = 0; // std::cout << "sp_mesh_context_root_handler: " << count++ << std::endl; @@ -977,7 +931,7 @@ gint CMeshContext::root_handler(GdkEvent* event) { // if (((SPEventContextClass *) sp_mesh_context_parent_class)->root_handler) { // ret = ((SPEventContextClass *) sp_mesh_context_parent_class)->root_handler(event_context, event); // } - ret = CEventContext::root_handler(event); + ret = SPEventContext::root_handler(event); } return ret; -- cgit v1.2.3 From 5512f857e2f33f1aa40124dc82b353e5f2e5a0b0 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sat, 20 Apr 2013 23:58:53 +0200 Subject: Moved factories to different files. (bzr r11608.1.100) --- src/mesh-context.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index 73e477a35..a39aa3853 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -56,7 +56,7 @@ using Inkscape::DocumentUndo; static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const pt, guint state, guint32 etime); -#include "sp-factory.h" +#include "tool-factory.h" namespace { SPEventContext* createMeshContext() { -- cgit v1.2.3 From 9b2956fbaefb4e12bad3fc359c47e5923f33bb41 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sun, 28 Apr 2013 00:05:16 +0200 Subject: various changes (bzr r11608.1.105) --- src/mesh-context.cpp | 340 +++++++++++++++++++++++++-------------------------- 1 file changed, 168 insertions(+), 172 deletions(-) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index a39aa3853..c7cf60d06 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -73,42 +73,34 @@ const std::string& SPMeshContext::getPrefsPath() { const std::string SPMeshContext::prefsPath = "/tools/mesh"; SPMeshContext::SPMeshContext() : SPEventContext() { - SPMeshContext* gr_context = this; - - gr_context->selcon = 0; - gr_context->_message_context = 0; - gr_context->node_added = false; - gr_context->subselcon = 0; - - SPEventContext *event_context = SP_EVENT_CONTEXT(gr_context); - - gr_context->cursor_addnode = false; - event_context->cursor_shape = cursor_gradient_xpm; - event_context->hot_x = 4; - event_context->hot_y = 4; - event_context->xp = 0; - event_context->yp = 0; - event_context->tolerance = 6; - event_context->within_tolerance = false; - event_context->item_to_select = NULL; + this->selcon = 0; + this->_message_context = 0; + this->node_added = false; + this->subselcon = 0; + + this->cursor_addnode = false; + this->cursor_shape = cursor_gradient_xpm; + this->hot_x = 4; + this->hot_y = 4; + this->xp = 0; + this->yp = 0; + this->tolerance = 6; + this->within_tolerance = false; + this->item_to_select = NULL; } SPMeshContext::~SPMeshContext() { - SPMeshContext *rc = SP_MESH_CONTEXT(this); - SPEventContext *ec = SP_EVENT_CONTEXT(this); + this->enableGrDrag(false); - ec->enableGrDrag(false); - - if (rc->_message_context) { - delete rc->_message_context; + if (this->_message_context) { + delete this->_message_context; } - rc->selcon->disconnect(); - delete rc->selcon; - rc->subselcon->disconnect(); - delete rc->subselcon; - - //G_OBJECT_CLASS(sp_mesh_context_parent_class)->dispose(object); + this->selcon->disconnect(); + delete this->selcon; + + this->subselcon->disconnect(); + delete this->subselcon; } const gchar *ms_handle_descr [] = { @@ -117,20 +109,20 @@ const gchar *ms_handle_descr [] = { N_("Mesh gradient tensor") }; -static void -mesh_selection_changed (Inkscape::Selection *, gpointer data) -{ - SPMeshContext *rc = (SPMeshContext *) data; +void SPMeshContext::selection_changed(Inkscape::Selection* sel) { + GrDrag *drag = this->_grdrag; + Inkscape::Selection *selection = sp_desktop_selection(this->desktop); - GrDrag *drag = rc->_grdrag; - Inkscape::Selection *selection = sp_desktop_selection(SP_EVENT_CONTEXT(rc)->desktop); if (selection == NULL) { return; } + guint n_obj = g_slist_length((GSList *) selection->itemList()); - if (!drag->isNonEmpty() || selection->isEmpty()) + if (!drag->isNonEmpty() || selection->isEmpty()) { return; + } + guint n_tot = drag->numDraggers(); guint n_sel = drag->numSelected(); @@ -143,7 +135,7 @@ mesh_selection_changed (Inkscape::Selection *, gpointer data) //TRANSLATORS: Mind the space in front. This is part of a compound message ngettext(" out of %d mesh handle"," out of %d mesh handles",n_tot), ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); - rc->_message_context->setF(Inkscape::NORMAL_MESSAGE, + this->_message_context->setF(Inkscape::NORMAL_MESSAGE, message,_(ms_handle_descr[drag->singleSelectedDraggerSingleDraggableType()]), n_tot, n_obj); } else { gchar * message = @@ -154,7 +146,7 @@ mesh_selection_changed (Inkscape::Selection *, gpointer data) drag->singleSelectedDraggerNumDraggables()), ngettext(" out of %d mesh handle"," out of %d mesh handles",n_tot), ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); - rc->_message_context->setF(Inkscape::NORMAL_MESSAGE,message,drag->singleSelectedDraggerNumDraggables(), n_tot, n_obj); + this->_message_context->setF(Inkscape::NORMAL_MESSAGE,message,drag->singleSelectedDraggerNumDraggables(), n_tot, n_obj); } } else if (n_sel > 1) { //TRANSLATORS: The plural refers to number of selected mesh handles. This is part of a compound message (part two indicates selected object count) @@ -162,9 +154,9 @@ mesh_selection_changed (Inkscape::Selection *, gpointer data) g_strconcat(ngettext("%d mesh handle selected out of %d","%d mesh handles selected out of %d",n_sel), //TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); - rc->_message_context->setF(Inkscape::NORMAL_MESSAGE,message, n_sel, n_tot, n_obj); + this->_message_context->setF(Inkscape::NORMAL_MESSAGE,message, n_sel, n_tot, n_obj); } else if (n_sel == 0) { - rc->_message_context->setF(Inkscape::NORMAL_MESSAGE, + this->_message_context->setF(Inkscape::NORMAL_MESSAGE, //TRANSLATORS: The plural refers to number of selected objects ngettext("No mesh handles selected out of %d on %d selected object", "No mesh handles selected out of %d on %d selected objects",n_obj), n_tot, n_obj); @@ -237,36 +229,31 @@ mesh_selection_changed (Inkscape::Selection *, gpointer data) // } } - -static void -mesh_subselection_changed (gpointer, gpointer data) -{ - mesh_selection_changed (NULL, data); -} - void SPMeshContext::setup() { - SPEventContext* ec = this; - - SPMeshContext *rc = SP_MESH_CONTEXT(ec); - -// if (((SPEventContextClass *) sp_mesh_context_parent_class)->setup) { -// ((SPEventContextClass *) sp_mesh_context_parent_class)->setup(ec); -// } SPEventContext::setup(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (prefs->getBool("/tools/mesh/selcue", true)) { - ec->enableSelectionCue(); + this->enableSelectionCue(); } - ec->enableGrDrag(); - Inkscape::Selection *selection = sp_desktop_selection(ec->desktop); + this->enableGrDrag(); + Inkscape::Selection *selection = sp_desktop_selection(this->desktop); - rc->_message_context = new Inkscape::MessageContext(sp_desktop_message_stack(ec->desktop)); + this->_message_context = new Inkscape::MessageContext(sp_desktop_message_stack(this->desktop)); - rc->selcon = new sigc::connection (selection->connectChanged( sigc::bind (sigc::ptr_fun(&mesh_selection_changed), rc))); - rc->subselcon = new sigc::connection (ec->desktop->connectToolSubselectionChanged(sigc::bind (sigc::ptr_fun(&mesh_subselection_changed), rc))); - mesh_selection_changed(selection, rc); + this->selcon = new sigc::connection(selection->connectChanged( + sigc::mem_fun(this, &SPMeshContext::selection_changed) + )); + + this->subselcon = new sigc::connection(this->desktop->connectToolSubselectionChanged( + sigc::hide(sigc::bind( + sigc::mem_fun(*this, &SPMeshContext::selection_changed), + (Inkscape::Selection*)NULL) + ) + )); + + this->selection_changed(selection); } void @@ -457,27 +444,20 @@ sp_mesh_context_corner_operation (SPMeshContext *rc, MeshCornerOperation operati Handles all keyboard and mouse input for meshs. */ gint SPMeshContext::root_handler(GdkEvent* event) { - SPEventContext* event_context = this; - - // static int count = 0; - // std::cout << "sp_mesh_context_root_handler: " << count++ << std::endl; static bool dragging; - SPDesktop *desktop = event_context->desktop; Inkscape::Selection *selection = sp_desktop_selection (desktop); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - SPMeshContext *rc = SP_MESH_CONTEXT(event_context); - - event_context->tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100); + this->tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100); double const nudge = prefs->getDoubleLimited("/options/nudgedistance/value", 2, 0, 1000, "px"); // in px - GrDrag *drag = event_context->_grdrag; + GrDrag *drag = this->_grdrag; g_assert (drag); gint ret = FALSE; - switch (event->type) { + switch (event->type) { case GDK_2BUTTON_PRESS: #ifdef DEBUG_MESH @@ -489,27 +469,24 @@ gint SPMeshContext::root_handler(GdkEvent* event) { // If not over a line, create new gradients for selected objects. if ( event->button.button == 1 ) { - // Are we over a mesh line? bool over_line = false; SPCtrlCurve *line = NULL; + if (drag->lines) { for (GSList *l = drag->lines; (l != NULL) && (!over_line); l = l->next) { line = (SPCtrlCurve*) l->data; - over_line |= sp_mesh_context_is_over_line (rc, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); + over_line |= sp_mesh_context_is_over_line (this, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); } } if (over_line) { // We take the first item in selection, because with doubleclick, the first click // always resets selection to the single object under cursor - sp_mesh_context_split_near_point(rc, SP_ITEM(selection->itemList()->data), rc->mousepoint_doc, event->button.time); - + sp_mesh_context_split_near_point(this, SP_ITEM(selection->itemList()->data), this->mousepoint_doc, event->button.time); } else { // Create a new gradient with default coordinates. - for (GSList const* i = selection->itemList(); i != NULL; i = i->next) { - SPItem *item = SP_ITEM(i->data); SPGradientType new_type = SP_GRADIENT_TYPE_MESH; Inkscape::PaintTarget fsmode = (prefs->getInt("/tools/gradient/newfillorstroke", 1) != 0) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE; @@ -526,6 +503,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { DocumentUndo::done(sp_desktop_document (desktop), SP_VERB_CONTEXT_MESH, _("Create default mesh")); } + ret = TRUE; } break; @@ -538,14 +516,13 @@ gint SPMeshContext::root_handler(GdkEvent* event) { // Button down // If Shift key down: do rubber band selection // Else set origin for drag. A drag creates a new gradient if one does not exist - - if ( event->button.button == 1 && !event_context->space_panning ) { + if ( event->button.button == 1 && !this->space_panning ) { Geom::Point button_w(event->button.x, event->button.y); // save drag origin - event_context->xp = (gint) button_w[Geom::X]; - event_context->yp = (gint) button_w[Geom::Y]; - event_context->within_tolerance = true; + this->xp = (gint) button_w[Geom::X]; + this->yp = (gint) button_w[Geom::Y]; + this->within_tolerance = true; dragging = true; @@ -555,8 +532,9 @@ gint SPMeshContext::root_handler(GdkEvent* event) { } else { // remember clicked item, disregarding groups, honoring Alt; do nothing with Crtl to // enable Ctrl+doubleclick of exactly the selected item(s) - if (!(event->button.state & GDK_CONTROL_MASK)) - event_context->item_to_select = sp_event_context_find_item (desktop, button_w, event->button.state & GDK_MOD1_MASK, TRUE); + if (!(event->button.state & GDK_CONTROL_MASK)) { + this->item_to_select = sp_event_context_find_item (desktop, button_w, event->button.state & GDK_MOD1_MASK, TRUE); + } if (!selection->isEmpty()) { SnapManager &m = desktop->namedview->snap_manager; @@ -564,7 +542,8 @@ gint SPMeshContext::root_handler(GdkEvent* event) { m.freeSnapReturnByRef(button_dt, Inkscape::SNAPSOURCE_NODE_HANDLE); m.unSetup(); } - rc->origin = button_dt; + + this->origin = button_dt; } ret = TRUE; @@ -572,41 +551,37 @@ gint SPMeshContext::root_handler(GdkEvent* event) { break; case GDK_MOTION_NOTIFY: - // Mouse move - - if ( dragging - && ( event->motion.state & GDK_BUTTON1_MASK ) && !event_context->space_panning ) - { + if ( dragging && ( event->motion.state & GDK_BUTTON1_MASK ) && !this->space_panning ) { #ifdef DEBUG_MESH std::cout << "sp_mesh_context_root_handler: GDK_MOTION_NOTIFY: Dragging" << std::endl; #endif - if ( event_context->within_tolerance - && ( abs( (gint) event->motion.x - event_context->xp ) < event_context->tolerance ) - && ( abs( (gint) event->motion.y - event_context->yp ) < event_context->tolerance ) ) { + if ( this->within_tolerance + && ( abs( (gint) event->motion.x - this->xp ) < this->tolerance ) + && ( abs( (gint) event->motion.y - this->yp ) < this->tolerance ) ) { break; // do not drag if we're within tolerance from origin } // Once the user has moved farther than tolerance from the original location // (indicating they intend to draw, not click), then always process the // motion notify coordinates as given (no snapping back to origin) - event_context->within_tolerance = false; + this->within_tolerance = false; Geom::Point const motion_w(event->motion.x, event->motion.y); - Geom::Point const motion_dt = event_context->desktop->w2d(motion_w); + Geom::Point const motion_dt = this->desktop->w2d(motion_w); if (Inkscape::Rubberband::get(desktop)->is_started()) { Inkscape::Rubberband::get(desktop)->move(motion_dt); - event_context->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, _("Draw around handles to select them")); + this->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, _("Draw around handles to select them")); } else { // Create new gradient with coordinates determined by drag. - sp_mesh_drag(*rc, motion_dt, event->motion.state, event->motion.time); + sp_mesh_drag(*this, motion_dt, event->motion.state, event->motion.time); } + gobble_motion_events(GDK_BUTTON1_MASK); ret = TRUE; - } else { // Not dragging @@ -616,7 +591,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { m.setup(desktop); Geom::Point const motion_w(event->motion.x, event->motion.y); - Geom::Point const motion_dt = event_context->desktop->w2d(motion_w); + Geom::Point const motion_dt = this->desktop->w2d(motion_w); m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_OTHER_HANDLE)); m.unSetup(); @@ -631,20 +606,21 @@ gint SPMeshContext::root_handler(GdkEvent* event) { // Change cursor shape if over line bool over_line = false; + if (drag->lines) { for (GSList *l = drag->lines; l != NULL; l = l->next) { - over_line |= sp_mesh_context_is_over_line (rc, (SPItem*) l->data, Geom::Point(event->motion.x, event->motion.y)); + over_line |= sp_mesh_context_is_over_line (this, (SPItem*) l->data, Geom::Point(event->motion.x, event->motion.y)); } } - if (rc->cursor_addnode && !over_line) { - event_context->cursor_shape = cursor_gradient_xpm; - sp_event_context_update_cursor(event_context); - rc->cursor_addnode = false; - } else if (!rc->cursor_addnode && over_line) { - event_context->cursor_shape = cursor_gradient_add_xpm; - sp_event_context_update_cursor(event_context); - rc->cursor_addnode = true; + if (this->cursor_addnode && !over_line) { + this->cursor_shape = cursor_gradient_xpm; + sp_event_context_update_cursor(this); + this->cursor_addnode = false; + } else if (!this->cursor_addnode && over_line) { + this->cursor_shape = cursor_gradient_add_xpm; + sp_event_context_update_cursor(this); + this->cursor_addnode = true; } } break; @@ -655,29 +631,30 @@ gint SPMeshContext::root_handler(GdkEvent* event) { std::cout << "sp_mesh_context_root_handler: GDK_BUTTON_RELEASE" << std::endl; #endif - event_context->xp = event_context->yp = 0; - if ( event->button.button == 1 && !event_context->space_panning ) { + this->xp = this->yp = 0; + if ( event->button.button == 1 && !this->space_panning ) { // Check if over line bool over_line = false; SPCtrlLine *line = NULL; + if (drag->lines) { for (GSList *l = drag->lines; (l != NULL) && (!over_line); l = l->next) { line = (SPCtrlLine*) l->data; - over_line = sp_mesh_context_is_over_line (rc, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); - if (over_line) + over_line = sp_mesh_context_is_over_line (this, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); + + if (over_line) { break; + } } } if ( (event->button.state & GDK_CONTROL_MASK) && (event->button.state & GDK_MOD1_MASK ) ) { if (over_line && line) { - sp_mesh_context_split_near_point(rc, line->item, rc->mousepoint_doc, 0); + sp_mesh_context_split_near_point(this, line->item, this->mousepoint_doc, 0); ret = TRUE; } - } else { - dragging = false; // unless clicked with Ctrl (to enable Ctrl+doubleclick). @@ -686,29 +663,28 @@ gint SPMeshContext::root_handler(GdkEvent* event) { break; } - if (!event_context->within_tolerance) { + if (!this->within_tolerance) { // we've been dragging, either do nothing (grdrag handles that), // or rubberband-select if we have rubberband Inkscape::Rubberband *r = Inkscape::Rubberband::get(desktop); - if (r->is_started() && !event_context->within_tolerance) { + + if (r->is_started() && !this->within_tolerance) { // this was a rubberband drag if (r->getMode() == RUBBERBAND_MODE_RECT) { Geom::OptRect const b = r->getRectangle(); drag->selectRect(*b); } } - - } else if (event_context->item_to_select) { + } else if (this->item_to_select) { if (over_line && line) { // Clicked on an existing mesh line, don't change selection. This stops // possible change in selection during a double click with overlapping objects - } - else { + } else { // no dragging, select clicked item if any if (event->button.state & GDK_SHIFT_MASK) { - selection->toggle(event_context->item_to_select); + selection->toggle(this->item_to_select); } else { - selection->set(event_context->item_to_select); + selection->set(this->item_to_select); } } } else { @@ -720,9 +696,10 @@ gint SPMeshContext::root_handler(GdkEvent* event) { } } - event_context->item_to_select = NULL; + this->item_to_select = NULL; ret = TRUE; } + Inkscape::Rubberband::get(desktop)->stop(); } break; @@ -743,7 +720,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_Shift_R: case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt (at least on my machine) case GDK_KEY_Meta_R: - sp_event_show_modifier_tip (event_context->defaultMessageContext(), event, + sp_event_show_modifier_tip (this->defaultMessageContext(), event, _("FIXMECtrl: snap mesh angle"), _("FIXMEShift: draw mesh around the starting point"), NULL); @@ -763,6 +740,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { } else { selection->clear(); } + ret = TRUE; //TODO: make dragging escapable by Esc break; @@ -771,33 +749,46 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_KP_Left: case GDK_KEY_KP_4: if (!MOD__CTRL) { // not ctrl - gint mul = 1 + gobble_key_events( - get_group0_keyval(&event->key), 0); // with any mask + gint mul = 1 + gobble_key_events(get_group0_keyval(&event->key), 0); // with any mask + if (MOD__ALT) { // alt - if (MOD__SHIFT) drag->selected_move_screen(mul*-10, 0); // shift - else drag->selected_move_screen(mul*-1, 0); // no shift - } - else { // no alt - if (MOD__SHIFT) drag->selected_move(mul*-10*nudge, 0); // shift - else drag->selected_move(mul*-nudge, 0); // no shift + if (MOD__SHIFT) { + drag->selected_move_screen(mul*-10, 0); // shift + } else { + drag->selected_move_screen(mul*-1, 0); // no shift + } + } else { // no alt + if (MOD__SHIFT) { + drag->selected_move(mul*-10*nudge, 0); // shift + } else { + drag->selected_move(mul*-nudge, 0); // no shift + } } + ret = TRUE; } break; + case GDK_KEY_Up: // move handle up case GDK_KEY_KP_Up: case GDK_KEY_KP_8: if (!MOD__CTRL) { // not ctrl - gint mul = 1 + gobble_key_events( - get_group0_keyval(&event->key), 0); // with any mask + gint mul = 1 + gobble_key_events(get_group0_keyval(&event->key), 0); // with any mask + if (MOD__ALT) { // alt - if (MOD__SHIFT) drag->selected_move_screen(0, mul*10); // shift - else drag->selected_move_screen(0, mul*1); // no shift - } - else { // no alt - if (MOD__SHIFT) drag->selected_move(0, mul*10*nudge); // shift - else drag->selected_move(0, mul*nudge); // no shift + if (MOD__SHIFT) { + drag->selected_move_screen(0, mul*10); // shift + } else { + drag->selected_move_screen(0, mul*1); // no shift + } + } else { // no alt + if (MOD__SHIFT) { + drag->selected_move(0, mul*10*nudge); // shift + } else { + drag->selected_move(0, mul*nudge); // no shift + } } + ret = TRUE; } break; @@ -806,16 +797,22 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_KP_Right: case GDK_KEY_KP_6: if (!MOD__CTRL) { // not ctrl - gint mul = 1 + gobble_key_events( - get_group0_keyval(&event->key), 0); // with any mask + gint mul = 1 + gobble_key_events(get_group0_keyval(&event->key), 0); // with any mask + if (MOD__ALT) { // alt - if (MOD__SHIFT) drag->selected_move_screen(mul*10, 0); // shift - else drag->selected_move_screen(mul*1, 0); // no shift - } - else { // no alt - if (MOD__SHIFT) drag->selected_move(mul*10*nudge, 0); // shift - else drag->selected_move(mul*nudge, 0); // no shift + if (MOD__SHIFT) { + drag->selected_move_screen(mul*10, 0); // shift + } else { + drag->selected_move_screen(mul*1, 0); // no shift + } + } else { // no alt + if (MOD__SHIFT) { + drag->selected_move(mul*10*nudge, 0); // shift + } else { + drag->selected_move(mul*nudge, 0); // no shift + } } + ret = TRUE; } break; @@ -824,16 +821,22 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_KP_Down: case GDK_KEY_KP_2: if (!MOD__CTRL) { // not ctrl - gint mul = 1 + gobble_key_events( - get_group0_keyval(&event->key), 0); // with any mask + gint mul = 1 + gobble_key_events(get_group0_keyval(&event->key), 0); // with any mask + if (MOD__ALT) { // alt - if (MOD__SHIFT) drag->selected_move_screen(0, mul*-10); // shift - else drag->selected_move_screen(0, mul*-1); // no shift - } - else { // no alt - if (MOD__SHIFT) drag->selected_move(0, mul*-10*nudge); // shift - else drag->selected_move(0, mul*-nudge); // no shift + if (MOD__SHIFT) { + drag->selected_move_screen(0, mul*-10); // shift + } else { + drag->selected_move_screen(0, mul*-1); // no shift + } + } else { // no alt + if (MOD__SHIFT) { + drag->selected_move(0, mul*-10*nudge); // shift + } else { + drag->selected_move(0, mul*-nudge); // no shift + } } + ret = TRUE; } break; @@ -860,7 +863,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_b: // Toggle mesh side between lineto and curveto. case GDK_KEY_B: if (MOD__ALT && drag->isNonEmpty() && drag->hasSelection()) { - sp_mesh_context_corner_operation ( rc, MG_CORNER_SIDE_TOGGLE ); + sp_mesh_context_corner_operation ( this, MG_CORNER_SIDE_TOGGLE ); ret = TRUE; } break; @@ -868,7 +871,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_c: // Convert mesh side from generic Bezier to Bezier approximating arc, case GDK_KEY_C: // preserving handle direction. if (MOD__ALT && drag->isNonEmpty() && drag->hasSelection()) { - sp_mesh_context_corner_operation ( rc, MG_CORNER_SIDE_ARC ); + sp_mesh_context_corner_operation ( this, MG_CORNER_SIDE_ARC ); ret = TRUE; } break; @@ -876,7 +879,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_g: // Toggle mesh tensor points on/off case GDK_KEY_G: if (MOD__ALT && drag->isNonEmpty() && drag->hasSelection()) { - sp_mesh_context_corner_operation ( rc, MG_CORNER_TENSOR_TOGGLE ); + sp_mesh_context_corner_operation ( this, MG_CORNER_TENSOR_TOGGLE ); ret = TRUE; } break; @@ -884,7 +887,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_j: // Smooth corner color case GDK_KEY_J: if (MOD__ALT && drag->isNonEmpty() && drag->hasSelection()) { - sp_mesh_context_corner_operation ( rc, MG_CORNER_COLOR_SMOOTH ); + sp_mesh_context_corner_operation ( this, MG_CORNER_COLOR_SMOOTH ); ret = TRUE; } break; @@ -892,7 +895,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_k: // Pick corner color case GDK_KEY_K: if (MOD__ALT && drag->isNonEmpty() && drag->hasSelection()) { - sp_mesh_context_corner_operation ( rc, MG_CORNER_COLOR_PICK ); + sp_mesh_context_corner_operation ( this, MG_CORNER_COLOR_PICK ); ret = TRUE; } break; @@ -917,7 +920,7 @@ gint SPMeshContext::root_handler(GdkEvent* event) { case GDK_KEY_Shift_R: case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt case GDK_KEY_Meta_R: - event_context->defaultMessageContext()->clear(); + this->defaultMessageContext()->clear(); break; default: break; @@ -928,20 +931,13 @@ gint SPMeshContext::root_handler(GdkEvent* event) { } if (!ret) { -// if (((SPEventContextClass *) sp_mesh_context_parent_class)->root_handler) { -// ret = ((SPEventContextClass *) sp_mesh_context_parent_class)->root_handler(event_context, event); -// } ret = SPEventContext::root_handler(event); } return ret; } - - -static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const /*pt*/, guint /*state*/, guint32 /*etime*/) -{ - +static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const /*pt*/, guint /*state*/, guint32 /*etime*/) { SPDesktop *desktop = SP_EVENT_CONTEXT(&rc)->desktop; Inkscape::Selection *selection = sp_desktop_selection(desktop); SPDocument *document = sp_desktop_document(desktop); -- cgit v1.2.3 From b2dd3583e7372d23d18bbc6e861f4f645ec3dc37 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Tue, 30 Jul 2013 23:17:21 +0200 Subject: Further refactoring of EventContexts. (bzr r11608.1.109) --- src/mesh-context.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index fce4cbb9a..915ac0f7f 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -443,7 +443,7 @@ sp_mesh_context_corner_operation (SPMeshContext *rc, MeshCornerOperation operati /** Handles all keyboard and mouse input for meshs. */ -gint SPMeshContext::root_handler(GdkEvent* event) { +bool SPMeshContext::root_handler(GdkEvent* event) { static bool dragging; Inkscape::Selection *selection = sp_desktop_selection (desktop); @@ -615,11 +615,11 @@ gint SPMeshContext::root_handler(GdkEvent* event) { if (this->cursor_addnode && !over_line) { this->cursor_shape = cursor_gradient_xpm; - sp_event_context_update_cursor(this); + this->sp_event_context_update_cursor(); this->cursor_addnode = false; } else if (!this->cursor_addnode && over_line) { this->cursor_shape = cursor_gradient_add_xpm; - sp_event_context_update_cursor(this); + this->sp_event_context_update_cursor(); this->cursor_addnode = true; } } -- cgit v1.2.3 From 989abbac025a8b3349748d19a613a08586c5fdcd Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Wed, 31 Jul 2013 21:11:20 +0200 Subject: Fixed SPObject ctor and dtor; removed singleton.h; some smaller changes. (bzr r11608.1.110) --- src/mesh-context.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'src/mesh-context.cpp') diff --git a/src/mesh-context.cpp b/src/mesh-context.cpp index 915ac0f7f..ecd847fa4 100644 --- a/src/mesh-context.cpp +++ b/src/mesh-context.cpp @@ -74,7 +74,6 @@ const std::string SPMeshContext::prefsPath = "/tools/mesh"; SPMeshContext::SPMeshContext() : SPEventContext() { this->selcon = 0; - this->_message_context = 0; this->node_added = false; this->subselcon = 0; @@ -92,10 +91,6 @@ SPMeshContext::SPMeshContext() : SPEventContext() { SPMeshContext::~SPMeshContext() { this->enableGrDrag(false); - if (this->_message_context) { - delete this->_message_context; - } - this->selcon->disconnect(); delete this->selcon; @@ -135,7 +130,7 @@ void SPMeshContext::selection_changed(Inkscape::Selection* sel) { //TRANSLATORS: Mind the space in front. This is part of a compound message ngettext(" out of %d mesh handle"," out of %d mesh handles",n_tot), ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); - this->_message_context->setF(Inkscape::NORMAL_MESSAGE, + this->message_context->setF(Inkscape::NORMAL_MESSAGE, message,_(ms_handle_descr[drag->singleSelectedDraggerSingleDraggableType()]), n_tot, n_obj); } else { gchar * message = @@ -146,7 +141,7 @@ void SPMeshContext::selection_changed(Inkscape::Selection* sel) { drag->singleSelectedDraggerNumDraggables()), ngettext(" out of %d mesh handle"," out of %d mesh handles",n_tot), ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); - this->_message_context->setF(Inkscape::NORMAL_MESSAGE,message,drag->singleSelectedDraggerNumDraggables(), n_tot, n_obj); + this->message_context->setF(Inkscape::NORMAL_MESSAGE,message,drag->singleSelectedDraggerNumDraggables(), n_tot, n_obj); } } else if (n_sel > 1) { //TRANSLATORS: The plural refers to number of selected mesh handles. This is part of a compound message (part two indicates selected object count) @@ -154,9 +149,9 @@ void SPMeshContext::selection_changed(Inkscape::Selection* sel) { g_strconcat(ngettext("%d mesh handle selected out of %d","%d mesh handles selected out of %d",n_sel), //TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); - this->_message_context->setF(Inkscape::NORMAL_MESSAGE,message, n_sel, n_tot, n_obj); + this->message_context->setF(Inkscape::NORMAL_MESSAGE,message, n_sel, n_tot, n_obj); } else if (n_sel == 0) { - this->_message_context->setF(Inkscape::NORMAL_MESSAGE, + this->message_context->setF(Inkscape::NORMAL_MESSAGE, //TRANSLATORS: The plural refers to number of selected objects ngettext("No mesh handles selected out of %d on %d selected object", "No mesh handles selected out of %d on %d selected objects",n_obj), n_tot, n_obj); @@ -240,8 +235,6 @@ void SPMeshContext::setup() { this->enableGrDrag(); Inkscape::Selection *selection = sp_desktop_selection(this->desktop); - this->_message_context = new Inkscape::MessageContext(sp_desktop_message_stack(this->desktop)); - this->selcon = new sigc::connection(selection->connectChanged( sigc::mem_fun(this, &SPMeshContext::selection_changed) )); @@ -995,7 +988,7 @@ static void sp_mesh_drag(SPMeshContext &rc, Geom::Point const /*pt*/, guint /*st // status text; we do not track coords because this branch is run once, not all the time // during drag int n_objects = g_slist_length((GSList *) selection->itemList()); - rc._message_context->setF(Inkscape::NORMAL_MESSAGE, + rc.message_context->setF(Inkscape::NORMAL_MESSAGE, ngettext("Gradient for %d object; with Ctrl to snap angle", "Gradient for %d objects; with Ctrl to snap angle", n_objects), n_objects); -- cgit v1.2.3