summaryrefslogtreecommitdiffstats
path: root/src/desktop.cpp
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2013-11-13 00:00:04 +0000
committerJabiertxof <jtx@jtx.marker.es>2013-11-13 00:00:04 +0000
commit152a0caf7e216e7ceafeed20822500c385e3e2df (patch)
treea3b5d60e08f3bd8221ba2e50eea80b087e5d541a /src/desktop.cpp
parentUpdate to trunk (diff)
parentfix C++11 compilation. There A LOT of const_casts in this file... :-( (diff)
downloadinkscape-152a0caf7e216e7ceafeed20822500c385e3e2df.tar.gz
inkscape-152a0caf7e216e7ceafeed20822500c385e3e2df.zip
Update to trunk
(bzr r12588.1.26)
Diffstat (limited to 'src/desktop.cpp')
-rw-r--r--src/desktop.cpp127
1 files changed, 27 insertions, 100 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp
index ec446e0f0..e24d7eef0 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -33,7 +33,7 @@
#include <2geom/transforms.h>
#include <2geom/rect.h>
-#include "box3d-context.h"
+#include "ui/tools/box3d-tool.h"
#include "color.h"
#include "desktop-events.h"
#include "desktop.h"
@@ -64,19 +64,20 @@
#include "message-stack.h"
#include "preferences.h"
#include "resource-manager.h"
-#include "select-context.h"
+#include "ui/tools/select-tool.h"
#include "selection.h"
#include "sp-item-group.h"
#include "sp-item-group.h"
#include "sp-namedview.h"
#include "sp-root.h"
#include "sp-defs.h"
+#include "tool-factory.h"
#include "widgets/desktop-widget.h"
#include "xml/repr.h"
#include "helper/action.h" //sp_action_perform
// TODO those includes are only for node tool quick zoom. Remove them after fixing it.
-#include "ui/tool/node-tool.h"
+#include "ui/tools/node-tool.h"
#include "ui/tool/control-point-selection.h"
namespace Inkscape { namespace XML { class Node; }}
@@ -229,14 +230,7 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid
tempgroup = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
controls = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
- /* Push select tool to the bottom of stack */
- /** \todo
- * FIXME: this is the only call to this. Everything else seems to just
- * call "set" instead of "push". Can we assume that there is only one
- * context ever?
- */
- //push_event_context (SP_TYPE_SELECT_CONTEXT, "/tools/select", SP_EVENT_CONTEXT_STATIC);
- //set_event_context(SP_TYPE_SELECT_CONTEXT, "/tools/select");
+ // Set the select tool as the active tool.
set_event_context2("/tools/select");
// display rect and zoom are now handled in sp_desktop_widget_realize()
@@ -361,18 +355,10 @@ void SPDesktop::destroy()
g_signal_handlers_disconnect_by_func(G_OBJECT (main), (gpointer) G_CALLBACK(sp_desktop_root_handler), this);
g_signal_handlers_disconnect_by_func(G_OBJECT (drawing), (gpointer) G_CALLBACK(_arena_handler), this);
-// while (event_context) {
-// SPEventContext *ec = event_context;
-// event_context = ec->next;
-// sp_event_context_finish (ec);
-// g_object_unref (G_OBJECT (ec));
-// }
- //sp_event_context_finish(event_context);
- event_context->finish();
- //g_object_unref(G_OBJECT(event_context));
if (event_context) {
+ event_context->finish();
delete event_context;
- event_context = 0;
+ event_context = NULL;
}
delete layers;
@@ -401,7 +387,7 @@ SPDesktop::~SPDesktop()
}
-SPEventContext* SPDesktop::getEventContext() const {
+Inkscape::UI::Tools::ToolBase* SPDesktop::getEventContext() const {
return event_context;
}
@@ -668,92 +654,33 @@ SPDesktop::change_document (SPDocument *theDocument)
_document_replaced_signal.emit (this, theDocument);
}
-
-#include "tool-factory.h"
-
+/**
+ * Replaces the currently active tool with a new one.
+ */
void SPDesktop::set_event_context2(const std::string& toolName) {
- SPEventContext* ec_old = event_context;
-
- if (ec_old) {
- ec_old->deactivate();
- }
-
- SPEventContext* ec_new = ToolFactory::instance().createObject(toolName);
- ec_new->desktop = this;
- ec_new->message_context = new Inkscape::MessageContext(this->messageStack());
+ Inkscape::UI::Tools::ToolBase* new_tool = ToolFactory::instance().createObject(toolName);
+ new_tool->desktop = this;
+ new_tool->message_context = new Inkscape::MessageContext(this->messageStack());
- event_context = ec_new;
+ Inkscape::UI::Tools::ToolBase* old_tool = event_context;
+ event_context = new_tool;
- if (ec_old) {
- ec_old->finish();
- delete ec_old;
+ if (old_tool) {
+ old_tool->finish();
+ delete old_tool;
}
- ec_new->setup();
+ new_tool->setup();
- sp_event_context_activate(event_context);
+ // Make sure no delayed snapping events are carried over after switching tools
+ // (this is only an additional safety measure against sloppy coding, because each
+ // tool should take care of this by itself)
+ sp_event_context_discard_delayed_snap_event(event_context);
_event_context_changed_signal.emit(this, event_context);
}
/**
- * Make desktop switch event contexts.
- */
-//void
-//SPDesktop::set_event_context (GType type, const gchar *config)
-//{
-// //SPEventContext *ec;
-// //while (event_context) {
-// //ec = event_context;
-// sp_event_context_deactivate (event_context);
-// // we have to keep event_context valid during destruction - otherwise writing
-// // destructors is next to impossible
-// // SPEventContext *next = ec->next;
-// sp_event_context_finish (event_context);
-// g_object_unref (G_OBJECT (event_context));
-// // event_context = next;
-// //}
-//
-// // The event_context will be null. This means that it will be impossible
-// // to process any event invoked by the lines below. See for example bug
-// // LP #622350. Cutting and undoing again in the node tool resets the event
-// // context to the node tool. In this bug the line bellow invokes GDK_LEAVE_NOTIFY
-// // events which cannot be handled and must be discarded.
-// event_context = sp_event_context_new (type, this, config, SP_EVENT_CONTEXT_STATIC);
-// // ec->next = event_context;
-// //event_context = ec;
-// // Now the event_context has been set again and we can process all events again
-// sp_event_context_activate (event_context);
-// _event_context_changed_signal.emit (this, event_context);
-//}
-
-/**
- * Push event context onto desktop's context stack.
- */
-//void
-//SPDesktop::push_event_context (GType type, const gchar *config, unsigned int key)
-//{
-// SPEventContext *ref, *ec;
-//
-// if (event_context && event_context->key == key) return;
-// ref = event_context;
-// while (ref && ref->next && ref->next->key != key) ref = ref->next;
-// if (ref && ref->next) {
-// ec = ref->next;
-// ref->next = ec->next;
-// sp_event_context_finish (ec);
-// g_object_unref (G_OBJECT (ec));
-// }
-//
-// if (event_context) sp_event_context_deactivate (event_context);
-// ec = sp_event_context_new (type, this, config, key);
-// ec->next = event_context;
-// event_context = ec;
-// sp_event_context_activate (ec);
-// _event_context_changed_signal.emit (this, ec);
-//}
-
-/**
* Sets the coordinate status to a given point
*/
void
@@ -976,7 +903,7 @@ void SPDesktop::zoom_quick(bool enable)
// TODO This needs to migrate into the node tool, but currently the design
// of this method is sufficiently wrong to prevent this.
if (!zoomed && INK_IS_NODE_TOOL(event_context)) {
- InkNodeTool *nt = static_cast<InkNodeTool*>(event_context);
+ Inkscape::UI::Tools::NodeTool *nt = static_cast<Inkscape::UI::Tools::NodeTool*>(event_context);
if (!nt->_selected_nodes->empty()) {
Geom::Rect nodes = *nt->_selected_nodes->bounds();
double area = nodes.area();
@@ -1945,7 +1872,7 @@ SPDesktop::show_dialogs()
// void
// SPDesktop::pop_event_context (unsigned int key)
// {
-// SPEventContext *ec = NULL;
+// ToolBase *ec = NULL;
//
// if (event_context && event_context->key == key) {
// g_return_if_fail (event_context);
@@ -1957,7 +1884,7 @@ SPDesktop::show_dialogs()
// _event_context_changed_signal.emit (this, ec);
// }
//
-// SPEventContext *ref = event_context;
+// ToolBase *ref = event_context;
// while (ref && ref->next && ref->next->key != key)
// ref = ref->next;
//