diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/desktop.cpp | 52 | ||||
| -rw-r--r-- | src/desktop.h | 5 | ||||
| -rw-r--r-- | src/inkscape.cpp | 2 | ||||
| -rw-r--r-- | src/sp-mesh-array.cpp | 27 | ||||
| -rw-r--r-- | src/ui/tools-switch.cpp | 2 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.cpp | 3 |
6 files changed, 37 insertions, 54 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp index 1264e0184..f798079fd 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -228,7 +228,7 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid controls = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL); // Set the select tool as the active tool. - set_event_context2("/tools/select"); + setEventContext("/tools/select"); // display rect and zoom are now handled in sp_desktop_widget_realize() @@ -322,7 +322,6 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas, Inkscape::UI::View::EditWid // canvas_debug = sp_canvas_item_new (main, SP_TYPE_CANVAS_DEBUG, NULL); } - void SPDesktop::destroy() { _destroy_signal.emit(this); @@ -331,6 +330,7 @@ void SPDesktop::destroy() delete snapindicator; snapindicator = NULL; } + if (temporary_item_list) { delete temporary_item_list; temporary_item_list = NULL; @@ -356,12 +356,6 @@ 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); - if (event_context) { - event_context->finish(); - delete event_context; - event_context = NULL; - } - delete layers; if (layer_manager) { @@ -656,34 +650,34 @@ SPDesktop::change_document (SPDocument *theDocument) } /** - * Replaces the currently active tool with a new one. + * Replaces the currently active tool with a new one. Pass the empty string to + * unset and free the current tool. */ -void SPDesktop::set_event_context2(const std::string& toolName) +void SPDesktop::setEventContext(const std::string& toolName) { - Inkscape::UI::Tools::ToolBase* old_tool = event_context; - - if (old_tool) { - if (toolName.compare(old_tool->pref_observer->observed_path) != 0) { - //g_message("Old tool: %s", old_tool->pref_observer->observed_path.c_str()); - //g_message("New tool: %s", toolName.c_str()); - old_tool->finish(); - delete old_tool; + if (event_context) { + if (toolName.compare(event_context->pref_observer->observed_path) != 0) { + event_context->finish(); + delete event_context; } else { _event_context_changed_signal.emit(this, event_context); return; } } - - Inkscape::UI::Tools::ToolBase* new_tool = ToolFactory::createObject(toolName); - new_tool->desktop = this; - new_tool->message_context = new Inkscape::MessageContext(this->messageStack()); - event_context = new_tool; - new_tool->setup(); - - // 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); + + if (toolName.empty()) { + event_context = nullptr; + } else { + event_context = ToolFactory::createObject(toolName); + event_context->desktop = this; + event_context->message_context = new Inkscape::MessageContext(this->messageStack()); + event_context->setup(); + + // 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); } diff --git a/src/desktop.h b/src/desktop.h index 330d95607..0ddf3805b 100644 --- a/src/desktop.h +++ b/src/desktop.h @@ -310,10 +310,7 @@ public: void change_document (SPDocument *document); - void set_event_context2(const std::string& toolName); - - //void set_event_context (GType type, const gchar *config); - //void push_event_context (GType type, const gchar *config, unsigned int key); + void setEventContext(const std::string& toolName); void set_coordinate_status (Geom::Point p); SPItem *getItemFromListAtPointBottom(const std::vector<SPItem*> &list, Geom::Point const &p) const; diff --git a/src/inkscape.cpp b/src/inkscape.cpp index e7e93929b..b30d06168 100644 --- a/src/inkscape.cpp +++ b/src/inkscape.cpp @@ -864,6 +864,8 @@ Application::remove_desktop (SPDesktop * desktop) g_error("Attempted to remove desktop not in list."); } + desktop->setEventContext(""); + if (DESKTOP_IS_ACTIVE (desktop)) { signal_deactivate_desktop.emit(desktop); if (_desktops->size() > 1) { diff --git a/src/sp-mesh-array.cpp b/src/sp-mesh-array.cpp index a8d9e589c..905ad97eb 100644 --- a/src/sp-mesh-array.cpp +++ b/src/sp-mesh-array.cpp @@ -935,27 +935,18 @@ void SPMeshNodeArray::write( SPMeshGradient *mg ) { mg_array = mg; } - // First we must delete reprs for old mesh rows and patches. - std::vector<SPObject*> descendant_objects; - std::vector<Inkscape::XML::Node *> descendant_reprs; - for (auto& row: mg_array->children) { - descendant_reprs.push_back(row.getRepr()); - descendant_objects.push_back(&row); - for (auto& patch: row.children) { - descendant_reprs.push_back(patch.getRepr()); - descendant_objects.push_back(&patch); - for (auto& stop: patch.children) { - descendant_reprs.push_back(stop.getRepr()); - descendant_objects.push_back(&stop); - } - } + // First we must delete reprs for old mesh rows and patches. We only need to call the + // deleteObject() method, which in turn calls sp_repr_unparent. Since iterators do not play + // well with boost::intrusive::list (which ChildrenList derive from) we need to iterate over a + // copy of the pointers to the objects. + std::vector<SPObject*> children_pointers; + for (auto& row : mg_array->children) { + children_pointers.push_back(&row); } - for (auto i:descendant_objects) + for (auto i : children_pointers) { i->deleteObject(); - - for (auto i:descendant_reprs) - sp_repr_unparent(i); + } // Now we build new reprs Inkscape::XML::Node *mesh = mg->getRepr(); diff --git a/src/ui/tools-switch.cpp b/src/ui/tools-switch.cpp index d87bcc51d..e2803ccfd 100644 --- a/src/ui/tools-switch.cpp +++ b/src/ui/tools-switch.cpp @@ -157,7 +157,7 @@ tools_switch(SPDesktop *dt, int num) dt->_tool_changed.emit(num); } - dt->set_event_context2(tool_names[num]); + dt->setEventContext(tool_names[num]); /* fixme: This is really ugly hack. We should bind and unbind class methods */ /* First 4 tools use guides, first is undefined but we don't care */ dt->activate_guides(num < 5); diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index 571f920bf..f9c8e4ac6 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -736,10 +736,9 @@ static void sp_desktop_widget_dispose(GObject *object) g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->canvas), (gpointer) G_CALLBACK (sp_desktop_widget_event), dtw); g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->canvas_tbl), (gpointer) G_CALLBACK (canvas_tbl_size_allocate), dtw); - dtw->layer_selector->setDesktop(NULL); dtw->layer_selector->unreference(); - INKSCAPE.remove_desktop (dtw->desktop); // clears selection too + INKSCAPE.remove_desktop(dtw->desktop); // clears selection and event_context dtw->modified_connection.disconnect(); dtw->desktop->destroy(); Inkscape::GC::release (dtw->desktop); |
