diff options
Diffstat (limited to 'src/desktop.cpp')
| -rw-r--r-- | src/desktop.cpp | 127 |
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; // |
