From b0e55916f2f8100a3b71c781982ea4e6c8636116 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Fri, 29 Sep 2023 19:54:59 +0200 Subject: [PATCH] Remove desktop from layer manager --- src/actions/actions-layer.cpp | 79 +++++++++++++------------ src/conn-avoid-ref.cpp | 13 ++-- src/context-fns.cpp | 4 +- src/desktop.cpp | 50 ++-------------- src/desktop.h | 9 --- src/document.cpp | 53 +++++++++++++++-- src/document.h | 14 +++-- src/extension/internal/grid.cpp | 2 +- src/extension/plugins/grid2/grid.cpp | 2 +- src/file.cpp | 6 +- src/inkscape-application.cpp | 1 + src/layer-manager.cpp | 55 ++++++++--------- src/layer-manager.h | 9 +-- src/object/sp-flowtext.cpp | 2 +- src/object/sp-namedview.cpp | 6 +- src/object/sp-symbol.cpp | 2 +- src/object/sp-text.cpp | 4 +- src/selection-chemistry.cpp | 68 ++++++++++----------- src/selection-describer.cpp | 5 +- src/selection.cpp | 10 ++-- src/ui/contextmenu.cpp | 2 +- src/ui/dialog/export-batch.cpp | 2 +- src/ui/dialog/filter-effects-dialog.cpp | 4 +- src/ui/dialog/find.cpp | 10 ++-- src/ui/dialog/layer-properties.cpp | 16 ++--- src/ui/dialog/objects.cpp | 18 +++--- src/ui/dialog/spellcheck.cpp | 2 +- src/ui/dialog/svg-fonts-dialog.cpp | 12 ++-- src/ui/dialog/xml-tree.cpp | 4 +- src/ui/drag-and-drop.cpp | 2 +- src/ui/toolbar/connector-toolbar.cpp | 2 +- src/ui/tools/eraser-tool.cpp | 2 +- src/ui/tools/flood-tool.cpp | 2 +- src/ui/tools/freehand-base.cpp | 2 +- src/ui/tools/measure-tool.cpp | 20 +++---- src/ui/tools/pencil-tool.cpp | 2 +- src/ui/tools/select-tool.cpp | 8 +-- src/ui/tools/tool-base.cpp | 2 +- src/ui/widget/layer-selector.cpp | 11 ++-- 39 files changed, 258 insertions(+), 259 deletions(-) diff --git a/src/actions/actions-layer.cpp b/src/actions/actions-layer.cpp index 9f77a1a925..703908ad88 100644 --- a/src/actions/actions-layer.cpp +++ b/src/actions/actions-layer.cpp @@ -20,6 +20,7 @@ #include "actions-helper.h" #include "desktop.h" +#include "document.h" #include "document-undo.h" #include "inkscape-application.h" #include "inkscape-window.h" @@ -44,7 +45,7 @@ layer_new(InkscapeWindow* win) SPDesktop* dt = win->get_desktop(); // New Layer - Inkscape::UI::Dialog::LayerPropertiesDialog::showCreate(dt, dt->layerManager().currentLayer()); + Inkscape::UI::Dialog::LayerPropertiesDialog::showCreate(dt, dt->getDocument()->layerManager().currentLayer()); } void @@ -52,7 +53,7 @@ layer_duplicate (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - if (!dt->layerManager().isRoot()) { + if (!dt->getDocument()->layerManager().isRoot()) { dt->getSelection()->duplicate(true, true); // This requires the selection to be a layer! Inkscape::DocumentUndo::done(dt->getDocument(), _("Duplicate layer"), INKSCAPE_ICON("layer-duplicate")); @@ -67,12 +68,12 @@ void layer_delete (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - auto root = dt->layerManager().currentRoot(); + auto root = dt->getDocument()->layerManager().currentRoot(); - if (!dt->layerManager().isRoot()) { + if (!dt->getDocument()->layerManager().isRoot()) { dt->getSelection()->clear(); - SPObject *old_layer = dt->layerManager().currentLayer(); + SPObject *old_layer = dt->getDocument()->layerManager().currentLayer(); SPObject *old_parent = old_layer->parent; SPObject *old_parent_parent = (old_parent != nullptr) ? old_parent->parent : nullptr; @@ -104,7 +105,7 @@ layer_delete (InkscapeWindow* win) old_layer->deleteObject(); if (survivor) { - dt->layerManager().setCurrentLayer(survivor); + dt->getDocument()->layerManager().setCurrentLayer(survivor); } Inkscape::DocumentUndo::done(dt->getDocument(), _("Delete layer"), INKSCAPE_ICON("layer-delete")); @@ -121,14 +122,14 @@ layer_rename (InkscapeWindow* win) SPDesktop* dt = win->get_desktop(); // Rename Layer - Inkscape::UI::Dialog::LayerPropertiesDialog::showRename(dt, dt->layerManager().currentLayer()); + Inkscape::UI::Dialog::LayerPropertiesDialog::showRename(dt, dt->getDocument()->layerManager().currentLayer()); } void layer_hide_all (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - dt->layerManager().toggleHideAllLayers(true); + dt->getDocument()->layerManager().toggleHideAllLayers(true); Inkscape::DocumentUndo::maybeDone(dt->getDocument(), "layer:hideall", _("Hide all layers"), ""); } @@ -136,7 +137,7 @@ void layer_unhide_all (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - dt->layerManager().toggleHideAllLayers(false); + dt->getDocument()->layerManager().toggleHideAllLayers(false); Inkscape::DocumentUndo::maybeDone(dt->getDocument(), "layer:showall", _("Show all layers"), ""); } @@ -144,9 +145,9 @@ void layer_hide_toggle (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - auto layer = dt->layerManager().currentLayer(); + auto layer = dt->getDocument()->layerManager().currentLayer(); - if (!layer || dt->layerManager().isRoot()) { + if (!layer || dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); } else { layer->setHidden(!layer->isHidden()); @@ -157,12 +158,12 @@ void layer_hide_toggle_others (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - auto layer = dt->layerManager().currentLayer(); + auto layer = dt->getDocument()->layerManager().currentLayer(); - if (!layer || dt->layerManager().isRoot()) { + if (!layer || dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); } else { - dt->layerManager().toggleLayerSolo( layer ); // Weird name! + dt->getDocument()->layerManager().toggleLayerSolo( layer ); // Weird name! Inkscape::DocumentUndo::done(dt->getDocument(), _("Hide other layers"), ""); } } @@ -171,7 +172,7 @@ void layer_lock_all (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - dt->layerManager().toggleLockAllLayers(true); + dt->getDocument()->layerManager().toggleLockAllLayers(true); Inkscape::DocumentUndo::maybeDone(dt->getDocument(), "layer:lockall", _("Lock all layers"), ""); } @@ -179,7 +180,7 @@ void layer_unlock_all (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - dt->layerManager().toggleLockAllLayers(false); + dt->getDocument()->layerManager().toggleLockAllLayers(false); Inkscape::DocumentUndo::maybeDone(dt->getDocument(), "layer:unlockall", _("Unlock all layers"), ""); } @@ -187,9 +188,9 @@ void layer_lock_toggle (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - auto layer = dt->layerManager().currentLayer(); + auto layer = dt->getDocument()->layerManager().currentLayer(); - if (!layer || dt->layerManager().isRoot()) { + if (!layer || dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); } else { layer->setLocked(!layer->isLocked()); @@ -200,12 +201,12 @@ void layer_lock_toggle_others (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - auto layer = dt->layerManager().currentLayer(); + auto layer = dt->getDocument()->layerManager().currentLayer(); - if (!layer || dt->layerManager().isRoot()) { + if (!layer || dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); } else { - dt->layerManager().toggleLockOtherLayers( layer ); + dt->getDocument()->layerManager().toggleLockOtherLayers( layer ); Inkscape::DocumentUndo::done(dt->getDocument(), _("Lock other layers"), ""); } } @@ -215,9 +216,9 @@ layer_previous (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - SPObject *next = Inkscape::next_layer(dt->layerManager().currentRoot(), dt->layerManager().currentLayer()); + SPObject *next = Inkscape::next_layer(dt->getDocument()->layerManager().currentRoot(), dt->getDocument()->layerManager().currentLayer()); if (next) { - dt->layerManager().setCurrentLayer(next); + dt->getDocument()->layerManager().setCurrentLayer(next); Inkscape::DocumentUndo::done(dt->getDocument(), _("Switch to next layer"), INKSCAPE_ICON("layer-previous")); dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Switched to next layer.")); } else { @@ -230,9 +231,9 @@ layer_next (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - SPObject *prev=Inkscape::previous_layer(dt->layerManager().currentRoot(), dt->layerManager().currentLayer()); + SPObject *prev=Inkscape::previous_layer(dt->getDocument()->layerManager().currentRoot(), dt->getDocument()->layerManager().currentLayer()); if (prev) { - dt->layerManager().setCurrentLayer(prev); + dt->getDocument()->layerManager().setCurrentLayer(prev); Inkscape::DocumentUndo::done(dt->getDocument(), _("Switch to previous layer") ,INKSCAPE_ICON("layer-next")); dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Switched to previous layer.")); } else { @@ -264,7 +265,7 @@ selection_move_to_layer (InkscapeWindow* win) SPDesktop* dt = win->get_desktop(); // Selection move to layer - Inkscape::UI::Dialog::LayerPropertiesDialog::showMove(dt, dt->layerManager().currentLayer()); + Inkscape::UI::Dialog::LayerPropertiesDialog::showMove(dt, dt->getDocument()->layerManager().currentLayer()); } void @@ -272,12 +273,12 @@ layer_top (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - if (dt->layerManager().isRoot()) { + if (dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); return; } - SPItem *layer = dt->layerManager().currentLayer(); + SPItem *layer = dt->getDocument()->layerManager().currentLayer(); g_return_if_fail(layer != nullptr); SPObject *old_pos = layer->getNext(); layer->raiseToTop(); @@ -299,12 +300,12 @@ layer_raise (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - if (dt->layerManager().isRoot()) { + if (dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); return; } - SPItem *layer = dt->layerManager().currentLayer(); + SPItem *layer = dt->getDocument()->layerManager().currentLayer(); g_return_if_fail(layer != nullptr); SPObject *old_pos = layer->getNext(); @@ -330,12 +331,12 @@ layer_lower (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - if (dt->layerManager().isRoot()) { + if (dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); return; } - SPItem *layer = dt->layerManager().currentLayer(); + SPItem *layer = dt->getDocument()->layerManager().currentLayer(); g_return_if_fail(layer != nullptr); SPObject *old_pos = layer->getNext(); layer->lowerOne(); @@ -357,12 +358,12 @@ layer_bottom (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - if (dt->layerManager().isRoot()) { + if (dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); return; } - SPItem *layer = dt->layerManager().currentLayer(); + SPItem *layer = dt->getDocument()->layerManager().currentLayer(); g_return_if_fail(layer != nullptr); SPObject *old_pos = layer->getNext(); layer->lowerToBottom(); @@ -383,9 +384,9 @@ void layer_to_group (InkscapeWindow* win) { SPDesktop* dt = win->get_desktop(); - auto layer = dt->layerManager().currentLayer(); + auto layer = dt->getDocument()->layerManager().currentLayer(); - if (!layer || dt->layerManager().isRoot()) { + if (!layer || dt->getDocument()->layerManager().isRoot()) { dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer.")); return; } @@ -432,7 +433,7 @@ group_enter (InkscapeWindow* win) std::vector items(selection->items().begin(), selection->items().end()); if (items.size() == 1 && cast(items[0])) { // Only one item and it is a group! - dt->layerManager().setCurrentLayer(items[0]); + dt->getDocument()->layerManager().setCurrentLayer(items[0]); selection->clear(); } } @@ -444,8 +445,8 @@ group_exit (InkscapeWindow* win) SPDesktop* dt = win->get_desktop(); auto selection = dt->getSelection(); - auto parent = dt->layerManager().currentLayer()->parent; - dt->layerManager().setCurrentLayer(parent); + auto parent = dt->getDocument()->layerManager().currentLayer()->parent; + dt->getDocument()->layerManager().setCurrentLayer(parent); std::vector items(selection->items().begin(), selection->items().end()); if (items.size() == 1 && cast(items[0]->parent) ) { diff --git a/src/conn-avoid-ref.cpp b/src/conn-avoid-ref.cpp index f3ffa1dba8..bc9cddae21 100644 --- a/src/conn-avoid-ref.cpp +++ b/src/conn-avoid-ref.cpp @@ -24,7 +24,6 @@ #include "document-undo.h" #include "document.h" #include "inkscape.h" -#include "layer-manager.h" #include "display/curve.h" @@ -33,6 +32,8 @@ #include "object/sp-namedview.h" #include "object/sp-shape.h" +#include "object/sp-item-group.h" +#include "object/sp-root.h" #include "svg/stringstream.h" @@ -337,8 +338,12 @@ std::vector get_avoided_items(SPObject *from, SPDesktop *desktop, bool static inline void get_avoided_items_rec(std::vector &list, SPObject *from, SPDesktop *desktop, bool initialised) { for (auto &child: from->children) { + SPGroup *group = nullptr; + if (is(&child)) { + group = cast(&child); + } if (is(&child) && - !desktop->layerManager().isLayer(cast(&child)) && + (!group || group->layerMode() != SPGroup::LAYER) && !cast_unsafe(&child)->isLocked() && !desktop->itemIsHidden(cast(&child)) && (!initialised || cast(&child)->getAvoidRef().shapeRef) @@ -347,7 +352,7 @@ static inline void get_avoided_items_rec(std::vector &list, SPObject * list.push_back(cast(&child)); } - if (is(&child) && desktop->layerManager().isLayer(cast(&child))) { + if (group && group->layerMode() == SPGroup::LAYER) { get_avoided_items_rec(list, &child, desktop, initialised); } } @@ -375,7 +380,7 @@ void init_avoided_shape_geometry(SPDesktop *desktop) DocumentUndo::ScopedInsensitive _no_undo(document); bool initialised = false; - auto items = get_avoided_items(desktop->layerManager().currentRoot(), desktop, initialised); + auto items = get_avoided_items(document->getRoot(), desktop, initialised); for (auto item : items) { item->getAvoidRef().handleSettingChange(); diff --git a/src/context-fns.cpp b/src/context-fns.cpp index fbd88f7eee..1d9b896354 100644 --- a/src/context-fns.cpp +++ b/src/context-fns.cpp @@ -41,7 +41,7 @@ static const double midpt_goldenratio_2 = (goldenratio + 2) / 2; bool Inkscape::have_viable_layer(SPDesktop *desktop, MessageContext *message) { - auto layer = desktop->layerManager().currentLayer(); + auto layer = desktop->getDocument()->layerManager().currentLayer(); if ( !layer || desktop->itemIsHidden(layer) ) { message->flash(Inkscape::ERROR_MESSAGE, @@ -70,7 +70,7 @@ bool Inkscape::have_viable_layer(SPDesktop *desktop, MessageContext *message) bool Inkscape::have_viable_layer(SPDesktop *desktop, MessageStack *message) { - auto layer = desktop->layerManager().currentLayer(); + auto layer = desktop->getDocument()->layerManager().currentLayer(); if ( !layer || desktop->itemIsHidden(layer) ) { message->flash(Inkscape::WARNING_MESSAGE, diff --git a/src/desktop.cpp b/src/desktop.cpp index 4ee9738731..084f41fe95 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -68,8 +68,6 @@ namespace Inkscape { namespace XML { class Node; }} // Callback declarations static bool _drawing_handler(Inkscape::CanvasEvent const &event, Inkscape::DrawingItem *item, SPDesktop *desktop); -static void _reconstruction_start(SPDesktop * desktop); -static void _reconstruction_finish(SPDesktop * desktop); template static void delete_then_null(std::unique_ptr &uptr) @@ -94,15 +92,11 @@ SPDesktop::SPDesktop() , gr_point_type(POINT_LG_BEGIN) , gr_point_i(0) , gr_fill_or_stroke(Inkscape::FOR_FILL) - , _reconstruction_old_layer_id() // an id attribute is not allowed to be the empty string , _widget(nullptr) // DesktopWidget , _guides_message_context(nullptr) , _active(false) { - // Moving this into the list initializer breaks the application because this->_document_replaced_signal - // is accessed before it is initialized - _layer_manager = std::make_unique(this); _selection = std::make_unique(this); // Formerly in View::View VVVVVVVVVVVVVVVVVVV @@ -157,7 +151,7 @@ SPDesktop::init (SPNamedView *nv, Inkscape::UI::Widget::Canvas *acanvas, SPDeskt document->ensureUpToDate(); } dkey = SPItem::display_key_new(1); - + /* Connect document */ setDocument (document); @@ -235,7 +229,6 @@ SPDesktop::init (SPNamedView *nv, Inkscape::UI::Widget::Canvas *acanvas, SPDeskt // Set the select tool as the active tool. setTool("/tools/select"); - // display rect and zoom are now handled in sp_desktop_widget_realize() // pinch zoom @@ -243,14 +236,6 @@ SPDesktop::init (SPNamedView *nv, Inkscape::UI::Widget::Canvas *acanvas, SPDeskt (*canvas, *this); Inkscape::UI::Controller::add_zoom<&SPDesktop::on_zoom_begin, &SPDesktop::on_zoom_scale, &SPDesktop::on_zoom_end> (*canvas, *this, Gtk::PHASE_CAPTURE); - - /* Set up notification of rebuilding the document, this allows - for saving object related settings in the document. */ - _reconstruction_start_connection = - document->connectReconstructionStart(sigc::bind(&_reconstruction_start, this)); - _reconstruction_finish_connection = - document->connectReconstructionFinish(sigc::bind(&_reconstruction_finish, this)); - _reconstruction_old_layer_id.clear(); } void SPDesktop::destroy() @@ -267,8 +252,6 @@ void SPDesktop::destroy() namedview->hide(this); - _reconstruction_start_connection.disconnect(); - _reconstruction_finish_connection.disconnect(); _schedule_zoom_from_document_connection.disconnect(); if (_canvas_drawing) { @@ -373,7 +356,6 @@ SPDesktop::change_document (SPDocument *theDocument) } else { std::cerr << "SPDesktop::change_document: failed to get desktop widget!" << std::endl; } - } /** @@ -1338,7 +1320,9 @@ SPDesktop::setDocument (SPDocument *doc) } _selection->setDocument(doc); - + unsigned int * dk = &dkey; + doc->setDkey(dk); + doc->setLayerManager(); /// \todo fixme: This condition exists to make sure the code /// inside is NOT called on initialization, only on replacement. But there /// are surely more safe methods to accomplish this. @@ -1427,32 +1411,6 @@ static bool _drawing_handler(Inkscape::CanvasEvent const &event, Inkscape::Drawi return tool->start_root_handler(event); } -/// Called when document is starting to be rebuilt. -static void _reconstruction_start(SPDesktop * desktop) -{ - auto layer = desktop->layerManager().currentLayer(); - desktop->_reconstruction_old_layer_id = layer->getId() ? layer->getId() : ""; - desktop->layerManager().reset(); - - desktop->getSelection()->clear(); -} - -/// Called when document rebuild is finished. -static void _reconstruction_finish(SPDesktop * desktop) -{ - g_debug("Desktop, finishing reconstruction\n"); - if (!desktop->_reconstruction_old_layer_id.empty()) { - if (auto const newLayer = desktop->getNamedView()->document - ->getObjectById(desktop->_reconstruction_old_layer_id)) - { - desktop->layerManager().setCurrentLayer(newLayer); - } - - desktop->_reconstruction_old_layer_id.clear(); - } - g_debug("Desktop, finishing reconstruction end\n"); -} - Geom::Affine SPDesktop::w2d() const { return _current_affine.w2d(); diff --git a/src/desktop.h b/src/desktop.h index a690ad6208..9e992b23b9 100644 --- a/src/desktop.h +++ b/src/desktop.h @@ -98,7 +98,6 @@ struct InkscapeApplication; namespace Inkscape { -class LayerManager; class PageManager; class MessageContext; class MessageStack; @@ -236,8 +235,6 @@ public: guint gr_point_i; Inkscape::PaintTarget gr_fill_or_stroke; - Glib::ustring _reconstruction_old_layer_id; - sigc::signal::accumulated _set_style_signal; sigc::signal::accumulated _query_style_signal; @@ -294,9 +291,6 @@ public: void emit_control_point_selected(void* sender, Inkscape::UI::ControlPointSelection* selection); void emit_text_cursor_moved(void* sender, Inkscape::UI::Tools::TextTool* tool); - Inkscape::LayerManager& layerManager() { return *_layer_manager; } - const Inkscape::LayerManager& layerManager() const { return *_layer_manager; } - Inkscape::MessageContext *guidesMessageContext() const { return _guides_message_context.get(); } @@ -555,7 +549,6 @@ private: bool _overlays_visible = true; ///< Whether the overlays are temporarily hidden bool _saved_guides_visible = false; ///< Remembers guides' visibility when hiding overlays - std::unique_ptr _layer_manager; sigc::signal _destroy_signal; sigc::signal _document_replaced_signal; @@ -565,8 +558,6 @@ private: sigc::signal _control_point_selected; sigc::signal _text_cursor_moved; - Inkscape::auto_connection _reconstruction_start_connection; - Inkscape::auto_connection _reconstruction_finish_connection; Inkscape::auto_connection _schedule_zoom_from_document_connection; // pinch zoom diff --git a/src/document.cpp b/src/document.cpp index adaa1cddf2..89647985ae 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -96,6 +96,33 @@ using Inkscape::Util::unit_table; // since we want it to happen when there are no more updates. #define SP_DOCUMENT_REROUTING_PRIORITY (G_PRIORITY_HIGH_IDLE - 1) + +/// Called when document is starting to be rebuilt. +static void _reconstruction_start(SPDocument * document) +{ + auto layer = document->layerManager().currentLayer(); + document->_reconstruction_old_layer_id = layer->getId() ? layer->getId() : ""; + document->layerManager().reset(); + if (auto desktop = SP_ACTIVE_DESKTOP) { + desktop->getSelection()->clear(); + } +} + +/// Called when document rebuild is finished. +static void _reconstruction_finish(SPDocument * document) +{ + g_debug("document, finishing reconstruction\n"); + if (!document->_reconstruction_old_layer_id.empty()) { + if (auto const newLayer = document->getObjectById(document->_reconstruction_old_layer_id)) + { + document->layerManager().setCurrentLayer(newLayer); + } + + document->_reconstruction_old_layer_id.clear(); + } + g_debug("document, finishing reconstruction end\n"); +} + bool sp_no_convert_text_baseline_spacing = false; //gboolean sp_document_resource_list_free(gpointer key, gpointer value, gpointer data); @@ -122,7 +149,8 @@ SPDocument::SPDocument() : current_persp3d_impl(nullptr), _parent_document(nullptr), _node_cache_valid(false), - _activexmltree(nullptr) + _activexmltree(nullptr), + _reconstruction_old_layer_id() { // This is kept here so that members are not accessed before they are initialized @@ -168,6 +196,10 @@ SPDocument::SPDocument() : add_actions_undo_document(this); _page_manager = std::make_unique(this); + /* Set up notification of rebuilding the document, this allows + for saving object related settings in the document. */ + _reconstruction_old_layer_id.clear(); + _layer_manager = nullptr; } SPDocument::~SPDocument() { @@ -229,6 +261,13 @@ SPDocument::~SPDocument() { collectOrphans(); } +void SPDocument::setLayerManager() { + _layer_manager = std::make_unique(this); +} +void SPDocument::setDkey(unsigned int *dkey) { + _dkey = dkey; +}; + gint SPDocument::get_new_doc_number() { return ++doc_count; } @@ -1747,14 +1786,14 @@ std::vector SPDocument::getItemsAtPoints(unsigned const key, std::vecto SPObject *current_layer = nullptr; SPDesktop *desktop = SP_ACTIVE_DESKTOP; if(desktop){ - current_layer = desktop->layerManager().currentLayer(); + current_layer = desktop->getDocument()->layerManager().currentLayer(); } size_t item_counter = 0; for(auto point : points) { std::vector items = find_items_at_point(_node_cache, key, point, topmost_only); for (SPItem *item : items) { if (item && result.end()==find(result.begin(), result.end(), item)) - if(all_layers || (desktop && desktop->layerManager().layerForObject(item) == current_layer)){ + if(all_layers || (desktop && desktop->getDocument()->layerManager().layerForObject(item) == current_layer)){ result.push_back(item); item_counter++; //limit 0 = no limit @@ -2222,13 +2261,17 @@ sigc::connection SPDocument::connectResourcesChanged(gchar const *key, sigc::connection SPDocument::connectReconstructionStart(SPDocument::ReconstructionStart::slot_type slot) { - return _reconstruction_start_signal.connect(slot); + auto ret = _reconstruction_start_signal.connect(slot); + _reconstruction_start(this); + return ret; } sigc::connection SPDocument::connectReconstructionFinish(SPDocument::ReconstructionFinish::slot_type slot) { - return _reconstruction_finish_signal.connect(slot); + auto ret = _reconstruction_finish_signal.connect(slot); + _reconstruction_finish(this); + return ret; } void SPDocument::_emitModified() { diff --git a/src/document.h b/src/document.h index 109b9d38de..795e66d79e 100644 --- a/src/document.h +++ b/src/document.h @@ -82,6 +82,7 @@ namespace Inkscape { class EventLog; class ProfileManager; class PageManager; + class LayerManager; namespace XML { struct Document; class Node; @@ -172,26 +173,30 @@ public: void changeFilenameAndHrefs(char const *filename); void setXMLDialogSelectedObject(SPObject *activexmltree) { _activexmltree = activexmltree; } SPObject *getXMLDialogSelectedObject() { return _activexmltree; } - Inkscape::EventLog *get_event_log() { return _event_log.get(); } Inkscape::PageManager& getPageManager() { return *_page_manager; } const Inkscape::PageManager& getPageManager() const { return *_page_manager; } - - + void setDkey(unsigned int *dkey); + void setLayerManager(); + unsigned int *getDkey() const { return _dkey; }; private: + unsigned int *_dkey = nullptr; void _importDefsNode(SPDocument *source, Inkscape::XML::Node *defs, Inkscape::XML::Node *target_defs); SPObject *_activexmltree; - std::unique_ptr _page_manager; std::queue pending_resource_changes; + std::unique_ptr _layer_manager; public: void importDefs(SPDocument *source); unsigned int vacuumDocument(); + Inkscape::LayerManager& layerManager() { return *_layer_manager; } + const Inkscape::LayerManager& layerManager() const { return *_layer_manager; } + Glib::ustring _reconstruction_old_layer_id; /******** Getters and Setters **********/ // Document structure ----------------- @@ -499,7 +504,6 @@ public: sigc::connection connectResourcesChanged(char const *key, SPDocument::ResourcesChangedSignal::slot_type slot); sigc::connection connectReconstructionStart(ReconstructionStart::slot_type slot); sigc::connection connectReconstructionFinish(ReconstructionFinish::slot_type slot); - /* Resources */ std::map > resources; ResourcesChangedSignalMap resources_changed_signals; // Used by Extension::Internal::Filter diff --git a/src/extension/internal/grid.cpp b/src/extension/internal/grid.cpp index ca710d7629..9772e3f693 100644 --- a/src/extension/internal/grid.cpp +++ b/src/extension/internal/grid.cpp @@ -116,7 +116,7 @@ Grid::effect (Inkscape::Extension::Effect *module, SPDesktop *desktop, Inkscape: Inkscape::XML::Document * xml_doc = doc->getReprDoc(); //XML Tree being used directly here while it shouldn't be. - Inkscape::XML::Node * current_layer = desktop->layerManager().currentLayer()->getRepr(); + Inkscape::XML::Node * current_layer = doc->layerManager().currentLayer()->getRepr(); Inkscape::XML::Node * path = xml_doc->createElement("svg:path"); path->setAttribute("d", path_data); diff --git a/src/extension/plugins/grid2/grid.cpp b/src/extension/plugins/grid2/grid.cpp index cb2cf1d501..8a9aea8993 100644 --- a/src/extension/plugins/grid2/grid.cpp +++ b/src/extension/plugins/grid2/grid.cpp @@ -127,7 +127,7 @@ Grid::effect (Inkscape::Extension::Effect *module, SPDesktop *desktop, Inkscape: Inkscape::XML::Document * xml_doc = desktop->doc()->getReprDoc(); //XML Tree being used directly here while it shouldn't be. - Inkscape::XML::Node * current_layer = desktop->layerManager().currentLayer()->getRepr(); + Inkscape::XML::Node * current_layer = desktop->doc()->layerManager().currentLayer()->getRepr(); Inkscape::XML::Node * path = xml_doc->createElement("svg:path"); path->setAttribute("d", path_data); diff --git a/src/file.cpp b/src/file.cpp index 6c051479c0..d0e8b34fdb 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -897,7 +897,7 @@ void sp_import_document(SPDesktop *desktop, SPDocument *clipdoc, bool in_place, SPDocument *target_document = desktop->getDocument(); Inkscape::XML::Node *root = clipdoc->getReprRoot(); - Inkscape::XML::Node *target_parent = desktop->layerManager().currentLayer()->getRepr(); + Inkscape::XML::Node *target_parent = target_document->layerManager().currentLayer()->getRepr(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); @@ -955,7 +955,7 @@ void sp_import_document(SPDesktop *desktop, SPDocument *clipdoc, bool in_place, } std::vector pasted_objects_not; - auto layer = desktop->layerManager().currentLayer(); + auto layer = target_document->layerManager().currentLayer(); Geom::Affine doc2parent = layer->i2doc_affine().inverse(); Geom::OptRect from_page; @@ -1127,7 +1127,7 @@ file_import(SPDocument *in_doc, const Glib::ustring &uri, // For now, we just use the root in this case. SPObject *place_to_insert; if (desktop) { - place_to_insert = desktop->layerManager().currentLayer(); + place_to_insert = desktop->getDocument()->layerManager().currentLayer(); } else { place_to_insert = in_doc->getRoot(); } diff --git a/src/inkscape-application.cpp b/src/inkscape-application.cpp index e791013705..435d0fa0d9 100644 --- a/src/inkscape-application.cpp +++ b/src/inkscape-application.cpp @@ -1004,6 +1004,7 @@ InkscapeApplication::process_document(SPDocument* document, std::string output_p _active_window = nullptr; _active_desktop = nullptr; _active_selection = document->getSelection(); + document->setLayerManager(); } document->ensureUpToDate(); // Or queries don't work! diff --git a/src/layer-manager.cpp b/src/layer-manager.cpp index 364f106e7f..c2891fb567 100644 --- a/src/layer-manager.cpp +++ b/src/layer-manager.cpp @@ -2,7 +2,7 @@ /* * Inkscape::LayerManager * - * Owned by the Desktop, this manager tracks layer objects as + * Owned by the Document, this manager tracks layer objects as * distinct entities from groups, providing a comprehensive set * of utilities, signals and other Layer based organisation. * @@ -26,11 +26,10 @@ #include -#include "desktop.h" #include "document.h" #include "layer-manager.h" #include "selection.h" - +#include "preferences.h" #include "object-hierarchy.h" #include "object/sp-defs.h" @@ -41,17 +40,17 @@ namespace Inkscape { -LayerManager::LayerManager(SPDesktop *desktop) - : _desktop(desktop) - , _document(nullptr) +LayerManager::LayerManager(SPDocument *document) + : _document(document) { _layer_hierarchy = std::make_unique(nullptr); _layer_hierarchy->connectAdded(sigc::mem_fun(*this, &LayerManager::_layer_activated)); _layer_hierarchy->connectRemoved(sigc::mem_fun(*this, &LayerManager::_layer_deactivated)); _layer_hierarchy->connectChanged(sigc::mem_fun(*this, &LayerManager::_selectedLayerChanged)); - _document_connection = desktop->connectDocumentReplaced(sigc::mem_fun(*this, &LayerManager::_setDocument)); - _setDocument(desktop, desktop->doc()); -} + _resource_connection = _document->connectResourcesChanged("layer", sigc::mem_fun(*this, &LayerManager::_rebuild)); + _layer_hierarchy->setTop(_document->getRoot()); + _rebuild(); +}; LayerManager::~LayerManager() { @@ -63,28 +62,21 @@ LayerManager::~LayerManager() _document = nullptr; } -void LayerManager::_setDocument(SPDesktop *, SPDocument *document) { - _layer_hierarchy->clear(); - _resource_connection.disconnect(); - _document = document; - if (document) { - _resource_connection = document->connectResourcesChanged("layer", sigc::mem_fun(*this, &LayerManager::_rebuild)); - _layer_hierarchy->setTop(document->getRoot()); - } - _rebuild(); -} - void LayerManager::_layer_activated(SPObject *layer) { - if (auto group = cast(layer)) { - group->setLayerDisplayMode(_desktop->dkey, SPGroup::LAYER); + if (auto dkey = _document->getDkey()) { + if (auto group = cast(layer)) { + group->setLayerDisplayMode(*dkey, SPGroup::LAYER); + } } } void LayerManager::_layer_deactivated(SPObject *layer) { - if (auto group = cast(layer)) { - group->setLayerDisplayMode(_desktop->dkey, SPGroup::GROUP); + if (auto dkey = _document->getDkey()) { + if (auto group = cast(layer)) { + group->setLayerDisplayMode(*dkey, SPGroup::GROUP); + } } } @@ -175,7 +167,7 @@ void LayerManager::renameLayer( SPObject* obj, gchar const *label, bool uniquify } /** - * Sets the current layer of the desktop. + * Sets the current layer of the document. * * Make \a object the top layer. */ @@ -188,7 +180,7 @@ void LayerManager::setCurrentLayer(SPObject *object, bool clear) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (clear && prefs->getBool("/options/selection/layerdeselect", true)) { - _desktop->getSelection()->clear(); + _document->getSelection()->clear(); } } } @@ -221,12 +213,13 @@ void LayerManager::_rebuild() { _clear(); - if (!_document || !_desktop) + if (!_document) return; std::vector layers = _document->getResourceList("layer"); - if (auto root = _desktop->layerManager().currentRoot()) { + if (auto root = _oninit ? _document->getRoot() : _document->layerManager().currentRoot()) { + _oninit = false; _addOne(root); std::set layersToAdd; @@ -545,7 +538,11 @@ SPObject *LayerManager::layerForObject(SPObject *object) { bool LayerManager::isLayer(SPObject *object) const { if (auto group = cast(object)) { - return group->effectiveLayerMode(_desktop->dkey) == SPGroup::LAYER; + if (auto dkey = _document->getDkey()) { + return group->effectiveLayerMode(*dkey) == SPGroup::LAYER; + } else { + return group->layerMode() == SPGroup::LAYER; + } } return false; } diff --git a/src/layer-manager.h b/src/layer-manager.h index f0fb03b418..9a94650549 100644 --- a/src/layer-manager.h +++ b/src/layer-manager.h @@ -18,17 +18,17 @@ #include "document-subset.h" #include "object/sp-item-group.h" -class SPDesktop; class SPDocument; namespace Inkscape { +class Selection; class ObjectHierarchy; class LayerManager : public DocumentSubset { public: - LayerManager(SPDesktop *desktop); + LayerManager(SPDocument *document); ~LayerManager(); void renameLayer( SPObject* obj, char const *label, bool uniquify ); @@ -57,10 +57,9 @@ public: bool isRoot() const { return currentLayer() == currentRoot(); } private: - void _objectModified( SPObject* obj, unsigned int flags ); - void _setDocument(SPDesktop *, SPDocument *document); void _rebuild(); + bool _oninit = true; void _selectedLayerChanged(SPObject *top, SPObject *bottom); void _layer_activated(SPObject *layer); @@ -72,9 +71,7 @@ private: sigc::connection _document_connection; sigc::connection _resource_connection; - SPDesktop *_desktop; SPDocument *_document; - std::unique_ptr _layer_hierarchy; sigc::signal _layer_changed_signal; }; diff --git a/src/object/sp-flowtext.cpp b/src/object/sp-flowtext.cpp index 4f7afbdd80..d233ba338b 100644 --- a/src/object/sp-flowtext.cpp +++ b/src/object/sp-flowtext.cpp @@ -651,7 +651,7 @@ bool SPFlowtext::has_internal_frame() const SPItem *create_flowtext_with_internal_frame (SPDesktop *desktop, Geom::Point p0, Geom::Point p1) { SPDocument *doc = desktop->getDocument(); - auto const parent = desktop->layerManager().currentLayer(); + auto const parent = doc->layerManager().currentLayer(); assert(parent); Inkscape::XML::Document *xml_doc = doc->getReprDoc(); diff --git a/src/object/sp-namedview.cpp b/src/object/sp-namedview.cpp index 130459c879..06a3212e1c 100644 --- a/src/object/sp-namedview.cpp +++ b/src/object/sp-namedview.cpp @@ -680,13 +680,13 @@ void sp_namedview_update_layers_from_document (SPDesktop *desktop) // if that didn't work out, look for the topmost layer if (!layer) { for (auto& iter: document->getRoot()->children) { - if (desktop->layerManager().isLayer(&iter)) { + if (document->layerManager().isLayer(&iter)) { layer = &iter; } } } if (layer) { - desktop->layerManager().setCurrentLayer(layer); + document->layerManager().setCurrentLayer(layer); } // FIXME: find a better place to do this @@ -723,7 +723,7 @@ void sp_namedview_document_from_window(SPDesktop *desktop) view->setAttributeInt("inkscape:window-maximized", desktop->is_maximized()); } - view->setAttribute("inkscape:current-layer", desktop->layerManager().currentLayer()->getId()); + view->setAttribute("inkscape:current-layer", desktop->getDocument()->layerManager().currentLayer()->getId()); } void SPNamedView::hide(SPDesktop const *desktop) diff --git a/src/object/sp-symbol.cpp b/src/object/sp-symbol.cpp index cb5893d5e7..e96ecc13dd 100644 --- a/src/object/sp-symbol.cpp +++ b/src/object/sp-symbol.cpp @@ -126,7 +126,7 @@ void SPSymbol::unSymbol() //TODO: Better handle if no desktop, currently go to defs without it SPDesktop *desktop = SP_ACTIVE_DESKTOP; if(desktop && desktop->doc() == doc) { - desktop->layerManager().currentLayer()->getRepr()->appendChild(group); + doc->layerManager().currentLayer()->getRepr()->appendChild(group); } else { parent->getRepr()->appendChild(group); } diff --git a/src/object/sp-text.cpp b/src/object/sp-text.cpp index 66c719f0cd..25d665a4a3 100644 --- a/src/object/sp-text.cpp +++ b/src/object/sp-text.cpp @@ -1238,7 +1238,7 @@ SPItem *create_text_with_inline_size (SPDesktop *desktop, Geom::Point p0, Geom:: Inkscape::XML::Node *text_repr = xml_doc->createElement("svg:text"); text_repr->setAttribute("xml:space", "preserve"); // we preserve spaces in the text objects we create - auto layer = desktop->layerManager().currentLayer(); + auto layer = doc->layerManager().currentLayer(); g_assert(layer != nullptr); auto text_object = cast(layer->appendChildRepr(text_repr)); @@ -1275,7 +1275,7 @@ SPItem *create_text_with_inline_size (SPDesktop *desktop, Geom::Point p0, Geom:: SPItem *create_text_with_rectangle (SPDesktop *desktop, Geom::Point p0, Geom::Point p1) { SPDocument *doc = desktop->getDocument(); - auto const parent = desktop->layerManager().currentLayer(); + auto const parent = doc->layerManager().currentLayer(); assert(parent); Inkscape::XML::Document *xml_doc = doc->getReprDoc(); diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 07ee0ffd3d..9270341098 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -245,7 +245,7 @@ void SelectionHelper::fixSelection(SPDesktop *dt) for(auto i = boost::rbegin(selList); i != boost::rend(selList); ++i) { SPItem *item = *i; if( item && - !dt->layerManager().isLayer(item) && + !item->document->layerManager().isLayer(item) && (!item->isLocked())) { items.push_back(item); @@ -363,7 +363,7 @@ void ObjectSet::deleteItems(bool skip_undo) } if (SPDesktop *dt = desktop()) { - dt->layerManager().currentLayer()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + dt->getDocument()->layerManager().currentLayer()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); /* A tool may have set up private information in its selection context * that depends on desktop items. I think the only sane way to deal with @@ -418,7 +418,7 @@ void ObjectSet::duplicate(bool suppressDone, bool duplicateLayer) if(duplicateLayer){ reprs.clear(); - reprs.push_back(desktop()->layerManager().currentLayer()->getRepr()); + reprs.push_back(doc->layerManager().currentLayer()->getRepr()); } clear(); @@ -604,7 +604,7 @@ void ObjectSet::duplicate(bool suppressDone, bool duplicateLayer) if (auto label = new_layer->label()) { if (std::string(label).find("copy") == std::string::npos) { gchar* name = g_strdup_printf(_("%s copy"), label); - desktop()->layerManager().renameLayer( new_layer, name, TRUE ); + doc->layerManager().renameLayer( new_layer, name, TRUE ); g_free(name); } } @@ -621,7 +621,7 @@ void sp_edit_clear_all(Inkscape::Selection *selection) SPDocument *doc = desktop->getDocument(); selection->clear(); - auto group = desktop->layerManager().currentLayer(); + auto group = doc->layerManager().currentLayer(); g_return_if_fail(group != nullptr); std::vector items = group->item_list(); @@ -647,7 +647,7 @@ static void get_all_items_recursive(std::vector &list, SPObject *from, for (auto &child : from->children) { auto item = cast(&child); if (item && - !desktop->layerManager().isLayer(item) && + !item->document->layerManager().isLayer(item) && (!onlysensitive || !item->isLocked()) && (!onlyvisible || !desktop->itemIsHidden(item)) && (exclude.empty() || std::find(exclude.begin(), exclude.end(), &child) == exclude.end())) @@ -655,7 +655,7 @@ static void get_all_items_recursive(std::vector &list, SPObject *from, list.emplace_back(item); } - if (ingroups || (item && desktop->layerManager().isLayer(item))) { + if (ingroups || (item && item->document->layerManager().isLayer(item))) { get_all_items_recursive(list, &child, desktop, onlyvisible, onlysensitive, ingroups, exclude); } } @@ -676,7 +676,7 @@ static void sp_edit_select_all_full(SPDesktop *dt, bool force_all_layers, bool i Inkscape::Selection *selection = dt->getSelection(); - auto layer = dt->layerManager().currentLayer(); + auto layer = dt->getDocument()->layerManager().currentLayer(); g_return_if_fail(layer); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); @@ -706,7 +706,7 @@ static void sp_edit_select_all_full(SPDesktop *dt, bool force_all_layers, bool i if (item && (!onlysensitive || !item->isLocked())) { if (!onlyvisible || !dt->itemIsHidden(item)) { - if (!dt->layerManager().isLayer(item)) { + if (!item->document->layerManager().isLayer(item)) { if (!invert || exclude.end() == std::find(exclude.begin(),exclude.end(),item)) { items.push_back(item); // leave it in the list } @@ -718,11 +718,11 @@ static void sp_edit_select_all_full(SPDesktop *dt, bool force_all_layers, bool i break; } case PREFS_SELECTION_LAYER_RECURSIVE: { - items = get_all_items(dt->layerManager().currentLayer(), dt, onlyvisible, onlysensitive, FALSE, exclude); + items = get_all_items(dt->getDocument()->layerManager().currentLayer(), dt, onlyvisible, onlysensitive, FALSE, exclude); break; } default: { - items = get_all_items(dt->layerManager().currentRoot(), dt, onlyvisible, onlysensitive, FALSE, exclude); + items = get_all_items(dt->getDocument()->layerManager().currentRoot(), dt, onlyvisible, onlysensitive, FALSE, exclude); break; } } @@ -1462,23 +1462,23 @@ void ObjectSet::toNextLayer(bool skip_undo) std::vector items_copy(items().begin(), items().end()); bool no_more = false; // Set to true, if no more layers above - SPObject *next=Inkscape::next_layer(dt->layerManager().currentRoot(), dt->layerManager().currentLayer()); + SPObject *next=Inkscape::next_layer(dt->getDocument()->layerManager().currentRoot(), dt->getDocument()->layerManager().currentLayer()); if (next) { clear(); sp_selection_change_layer_maintain_clones(items_copy,next); std::vector temp_clip; - sp_selection_copy_impl(items_copy, temp_clip, dt->doc()->getReprDoc()); + sp_selection_copy_impl(items_copy, temp_clip, dt->getDocument()->getReprDoc()); sp_selection_delete_impl(items_copy, false, false); - next=Inkscape::next_layer(dt->layerManager().currentRoot(), dt->layerManager().currentLayer()); // Fixes bug 1482973: crash while moving layers + next=Inkscape::next_layer(dt->getDocument()->layerManager().currentRoot(), dt->getDocument()->layerManager().currentLayer()); // Fixes bug 1482973: crash while moving layers std::vector copied; if (next) { copied = sp_selection_paste_impl(dt->getDocument(), next, temp_clip); } else { - copied = sp_selection_paste_impl(dt->getDocument(), dt->layerManager().currentLayer(), temp_clip); + copied = sp_selection_paste_impl(dt->getDocument(), dt->getDocument()->layerManager().currentLayer(), temp_clip); no_more = true; } setReprList(copied); - if (next) dt->layerManager().setCurrentLayer(next); + if (next) dt->getDocument()->layerManager().setCurrentLayer(next); if ( !skip_undo ) { DocumentUndo::done(dt->getDocument(), _("Raise to next layer"), INKSCAPE_ICON("selection-move-to-layer-above")); } @@ -1508,23 +1508,23 @@ void ObjectSet::toPrevLayer(bool skip_undo) std::vector items_copy(items().begin(), items().end()); bool no_more = false; // Set to true, if no more layers below - SPObject *next=Inkscape::previous_layer(dt->layerManager().currentRoot(), dt->layerManager().currentLayer()); + SPObject *next=Inkscape::previous_layer(dt->getDocument()->layerManager().currentRoot(), dt->getDocument()->layerManager().currentLayer()); if (next) { clear(); sp_selection_change_layer_maintain_clones(items_copy,next); std::vector temp_clip; - sp_selection_copy_impl(items_copy, temp_clip, dt->doc()->getReprDoc()); // we're in the same doc, so no need to copy defs + sp_selection_copy_impl(items_copy, temp_clip, dt->getDocument()->getReprDoc()); // we're in the same doc, so no need to copy defs sp_selection_delete_impl(items_copy, false, false); - next=Inkscape::previous_layer(dt->layerManager().currentRoot(), dt->layerManager().currentLayer()); // Fixes bug 1482973: crash while moving layers + next=Inkscape::previous_layer(dt->getDocument()->layerManager().currentRoot(), dt->getDocument()->layerManager().currentLayer()); // Fixes bug 1482973: crash while moving layers std::vector copied; if (next) { copied = sp_selection_paste_impl(dt->getDocument(), next, temp_clip); } else { - copied = sp_selection_paste_impl(dt->getDocument(), dt->layerManager().currentLayer(), temp_clip); + copied = sp_selection_paste_impl(dt->getDocument(), dt->getDocument()->layerManager().currentLayer(), temp_clip); no_more = true; } setReprList( copied); - if (next) dt->layerManager().setCurrentLayer(next); + if (next) dt->getDocument()->layerManager().setCurrentLayer(next); if ( !skip_undo ) { DocumentUndo::done(dt->getDocument(), _("Lower to previous layer"), INKSCAPE_ICON("selection-move-to-layer-below")); } @@ -1597,7 +1597,7 @@ void ObjectSet::toLayer(SPObject *moveto, Inkscape::XML::Node *after) setReprList(copied); if (!temp_clip.empty()) temp_clip.clear(); - if (moveto && dt) dt->layerManager().setCurrentLayer(moveto); + if (moveto && dt) document()->layerManager().setCurrentLayer(moveto); } } @@ -1995,7 +1995,7 @@ void sp_select_same_fill_stroke_style(SPDesktop *desktop, gboolean fill, gboolea bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true); bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true); - SPObject *root = desktop->layerManager().currentRoot(); + SPObject *root = desktop->getDocument()->layerManager().currentRoot(); bool ingroup = true; // Apply the same layer logic to select same as used for select all. @@ -2061,7 +2061,7 @@ void sp_select_same_object_type(SPDesktop *desktop) bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true); bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true); bool ingroups = TRUE; - auto matches = get_all_items(desktop->layerManager().currentRoot(), desktop, onlyvisible, onlysensitive, ingroups); + auto matches = get_all_items(desktop->getDocument()->layerManager().currentRoot(), desktop, onlyvisible, onlysensitive, ingroups); Inkscape::Selection *selection = desktop->getSelection(); @@ -2517,7 +2517,7 @@ SPItem *next_item(SPDesktop *desktop, std::vector &path, SPObject *r SPObject *object=path.back(); path.pop_back(); g_assert(object->parent == root); - if (desktop->layerManager().isLayer(object)) { + if (desktop->getDocument()->layerManager().isLayer(object)) { found = next_item(desktop, path, object, only_in_viewport, inlayer, onlyvisible, onlysensitive); } iter = children = D::siblings_after(object); @@ -2527,7 +2527,7 @@ SPItem *next_item(SPDesktop *desktop, std::vector &path, SPObject *r while ( !D::isNull(iter) && !found ) { SPObject *object=D::object(iter); - if (desktop->layerManager().isLayer(object)) { + if (desktop->getDocument()->layerManager().isLayer(object)) { if (PREFS_SELECTION_LAYER != inlayer) { // recurse into sublayers std::vector empt; found = next_item(desktop, empt, object, only_in_viewport, inlayer, onlyvisible, onlysensitive); @@ -2538,7 +2538,7 @@ SPItem *next_item(SPDesktop *desktop, std::vector &path, SPObject *r ( !only_in_viewport || desktop->isWithinViewport(item) ) && ( !onlyvisible || !desktop->itemIsHidden(item)) && ( !onlysensitive || !item->isLocked()) && - !desktop->layerManager().isLayer(item) ) + !desktop->getDocument()->layerManager().isLayer(item) ) { found = item; } @@ -2599,7 +2599,7 @@ sp_selection_item_next(SPDesktop *desktop) if (PREFS_SELECTION_ALL != inlayer) { root = selection->activeContext(); } else { - root = desktop->layerManager().currentRoot(); + root = desktop->getDocument()->layerManager().currentRoot(); } std::vector vec(selection->items().begin(), selection->items().end()); @@ -2630,7 +2630,7 @@ sp_selection_item_prev(SPDesktop *desktop) if (PREFS_SELECTION_ALL != inlayer) { root = selection->activeContext(); } else { - root = desktop->layerManager().currentRoot(); + root = desktop->getDocument()->layerManager().currentRoot(); } std::vector vec(selection->items().begin(), selection->items().end()); @@ -3914,7 +3914,7 @@ void ObjectSet::setClipGroup() if (apply_to_layer) { // all selected items are used for mask, which is applied to a layer - apply_to_items.push_back(desktop()->layerManager().currentLayer()); + apply_to_items.push_back(desktop()->getDocument()->layerManager().currentLayer()); } for (std::vector::const_iterator i=items_.begin();i!=items_.end();++i) { @@ -4412,14 +4412,14 @@ static void itemtree_map(void (*f)(SPItem *, SPDesktop *), SPObject *root, SPDes // don't operate on layers { auto item = cast(root); - if (item && !desktop->layerManager().isLayer(item)) { + if (item && !desktop->getDocument()->layerManager().isLayer(item)) { f(item, desktop); } } for (auto& child: root->children) { //don't recurse into locked layers auto item = cast(&child); - if (!(item && desktop->layerManager().isLayer(item) && item->isLocked())) { + if (!(item && desktop->getDocument()->layerManager().isLayer(item) && item->isLocked())) { itemtree_map(f, &child, desktop); } } @@ -4442,9 +4442,9 @@ static void process_all(void (*f)(SPItem *, SPDesktop *), SPDesktop *dt, bool la SPObject *root; if (layer_only) { - root = dt->layerManager().currentLayer(); + root = dt->getDocument()->layerManager().currentLayer(); } else { - root = dt->layerManager().currentRoot(); + root = dt->getDocument()->layerManager().currentRoot(); } itemtree_map(f, root, dt); diff --git a/src/selection-describer.cpp b/src/selection-describer.cpp index 6540a7eec8..108c9c9eb0 100644 --- a/src/selection-describer.cpp +++ b/src/selection-describer.cpp @@ -24,6 +24,7 @@ #include "layer-manager.h" #include "selection.h" #include "desktop.h" +#include "document.h" #include "object/sp-flowtext.h" #include "object/sp-image.h" @@ -110,8 +111,8 @@ void SelectionDescriber::updateMessage(Inkscape::Selection *selection) { } else { SPItem *item = items[0]; g_assert(item != nullptr); - SPObject *layer = selection->desktop()->layerManager().layerForObject(item); - SPObject *root = selection->desktop()->layerManager().currentRoot(); + SPObject *layer = selection->desktop()->getDocument()->layerManager().layerForObject(item); + SPObject *root = selection->desktop()->getDocument()->layerManager().currentRoot(); // Layer name gchar *layer_name; diff --git a/src/selection.cpp b/src/selection.cpp index d648018166..d770fc4bac 100644 --- a/src/selection.cpp +++ b/src/selection.cpp @@ -132,7 +132,7 @@ void Selection::_emitChanged(bool persist_selection_context/* = false */) { ObjectSet::_emitChanged(); if (persist_selection_context) { if (nullptr == _selection_context) { - _selection_context = _desktop->layerManager().currentLayer(); + _selection_context = _desktop->getDocument()->layerManager().currentLayer(); sp_object_ref(_selection_context, nullptr); _context_release_connection = _selection_context->connectRelease(sigc::mem_fun(*this, &Selection::_releaseContext)); } @@ -146,9 +146,9 @@ void Selection::_emitChanged(bool persist_selection_context/* = false */) { if (_document && _desktop) { if (auto item = singleItem()) { if (_change_layer) { - auto layer = _desktop->layerManager().layerForObject(item); + auto layer = _document->layerManager().layerForObject(item); if (layer && layer != _selection_context) { - _desktop->layerManager().setCurrentLayer(layer); + _document->layerManager().setCurrentLayer(layer); } } if (_change_page) { @@ -183,7 +183,7 @@ void Selection::_releaseContext(SPObject *obj) SPObject *Selection::activeContext() { if (nullptr != _selection_context) return _selection_context; - return _desktop->layerManager().currentLayer(); + return _desktop->getDocument()->layerManager().currentLayer(); } std::vector Selection::getSnapPoints(SnapPreferences const *snapprefs) const { @@ -252,7 +252,7 @@ size_t Selection::numberOfLayers() { auto items = this->items(); std::set layers; for (auto iter = items.begin(); iter != items.end(); ++iter) { - SPObject *layer = _desktop->layerManager().layerForObject(*iter); + SPObject *layer = _desktop->getDocument()->layerManager().layerForObject(*iter); layers.insert(layer); } diff --git a/src/ui/contextmenu.cpp b/src/ui/contextmenu.cpp index e3a4bbe014..b5247913ac 100644 --- a/src/ui/contextmenu.cpp +++ b/src/ui/contextmenu.cpp @@ -116,7 +116,7 @@ ContextMenu::ContextMenu(SPDesktop *desktop, SPObject *object, bool hide_layers_ auto gmenu_section = Gio::Menu::create(); // Section (used multiple times) auto layer = Inkscape::LayerManager::asLayer(item); // Layers have their own context menu in the Object and Layers dialog. - auto root = desktop->layerManager().currentRoot(); + auto root = desktop->getDocument()->layerManager().currentRoot(); // Get a list of items under the cursor, used for unhiding and unlocking. auto point_win = desktop->point() * desktop->d2w(); diff --git a/src/ui/dialog/export-batch.cpp b/src/ui/dialog/export-batch.cpp index 2a0d1ce645..dd91a8d728 100644 --- a/src/ui/dialog/export-batch.cpp +++ b/src/ui/dialog/export-batch.cpp @@ -402,7 +402,7 @@ void BatchExport::refreshItems() break; } case SELECTION_LAYER: { - for (auto layer : _desktop->layerManager().getAllLayers()) { + for (auto layer : _desktop->getDocument()->layerManager().getAllLayers()) { // Ignore empty layers, they have no size. if (layer->geometricBounds()) { itemsList.insert(layer); diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp index 014ec08e54..50856f4c27 100644 --- a/src/ui/dialog/filter-effects-dialog.cpp +++ b/src/ui/dialog/filter-effects-dialog.cpp @@ -1651,7 +1651,7 @@ void FilterEffectsDialog::FilterModifier::remove_filter() SPDocument* doc = filter->document; // Delete all references to this filter - auto all = get_all_items(desktop->layerManager().currentRoot(), desktop, false, false, true); + auto all = get_all_items(desktop->getDocument()->layerManager().currentRoot(), desktop, false, false, true); for (auto item : all) { if (!item) { continue; @@ -1714,7 +1714,7 @@ void FilterEffectsDialog::FilterModifier::select_filter_elements() return; std::vector items; - auto all = get_all_items(desktop->layerManager().currentRoot(), desktop, false, false, true); + auto all = get_all_items(desktop->getDocument()->layerManager().currentRoot(), desktop, false, false, true); for(SPItem *item: all) { if (!item->style) { continue; diff --git a/src/ui/dialog/find.cpp b/src/ui/dialog/find.cpp index 7648f22dd8..81a99b62c9 100644 --- a/src/ui/dialog/find.cpp +++ b/src/ui/dialog/find.cpp @@ -856,7 +856,7 @@ bool Find::item_type_match (SPItem *item) return (all || check_texts.get_active()); } else if (is(item) && - !getDesktop()->layerManager().isLayer(item)) { // never select layers! + !getDesktop()->getDocument()->layerManager().isLayer(item)) { // never select layers! return (all || check_groups.get_active()); } else if (is(item)) { @@ -907,7 +907,7 @@ std::vector &Find::all_items (SPObject *r, std::vector &l, boo auto desktop = getDesktop(); for (auto& child: r->children) { auto item = cast(&child); - if (item && !child.cloned && !desktop->layerManager().isLayer(item)) { + if (item && !child.cloned && !desktop->getDocument()->layerManager().isLayer(item)) { if ((hidden || !desktop->itemIsHidden(item)) && (locked || !item->isLocked())) { l.insert(l.begin(),(SPItem*)&child); } @@ -925,7 +925,7 @@ std::vector &Find::all_selection_items (Inkscape::Selection *s, std::ve SPObject *obj = *i; auto item = cast(obj); g_assert(item != nullptr); - if (item && !item->cloned && !desktop->layerManager().isLayer(item)) { + if (item && !item->cloned && !desktop->getDocument()->layerManager().isLayer(item)) { if (!ancestor || ancestor->isAncestorOf(item)) { if ((hidden || !desktop->itemIsHidden(item)) && (locked || !item->isLocked())) { l.push_back(*i); @@ -979,13 +979,13 @@ void Find::onAction() std::vector l; if (check_scope_selection.get_active()) { if (check_scope_layer.get_active()) { - l = all_selection_items (desktop->getSelection(), l, desktop->layerManager().currentLayer(), hidden, locked); + l = all_selection_items (desktop->getSelection(), l, desktop->getDocument()->layerManager().currentLayer(), hidden, locked); } else { l = all_selection_items (desktop->getSelection(), l, nullptr, hidden, locked); } } else { if (check_scope_layer.get_active()) { - l = all_items (desktop->layerManager().currentLayer(), l, hidden, locked); + l = all_items (desktop->getDocument()->layerManager().currentLayer(), l, hidden, locked); } else { l = all_items(desktop->getDocument()->getRoot(), l, hidden, locked); } diff --git a/src/ui/dialog/layer-properties.cpp b/src/ui/dialog/layer-properties.cpp index 12c7f70308..447c0f4de1 100644 --- a/src/ui/dialog/layer-properties.cpp +++ b/src/ui/dialog/layer-properties.cpp @@ -153,10 +153,10 @@ void LayerPropertiesDialog::_doCreate() SPObject *new_layer = Inkscape::create_layer(root, _layer, position); if (!name.empty()) { - _desktop->layerManager().renameLayer(new_layer, name.c_str(), true); + _desktop->getDocument()->layerManager().renameLayer(new_layer, name.c_str(), true); } _desktop->getSelection()->clear(); - _desktop->layerManager().setCurrentLayer(new_layer); + _desktop->getDocument()->layerManager().setCurrentLayer(new_layer); DocumentUndo::done(_desktop->getDocument(), _("Add layer"), INKSCAPE_ICON("layer-new")); _desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("New layer created.")); } @@ -177,7 +177,7 @@ void LayerPropertiesDialog::_doRename() if (name.empty()) { return; } - LayerManager &layman = _desktop->layerManager(); + LayerManager &layman = _desktop->getDocument()->layerManager(); layman.renameLayer(layman.currentLayer(), name.c_str(), false); DocumentUndo::done(_desktop->getDocument(), _("Rename layer"), INKSCAPE_ICON("layer-rename")); @@ -189,7 +189,7 @@ void LayerPropertiesDialog::_doRename() void LayerPropertiesDialog::_setup() { g_assert(_desktop != nullptr); - LayerManager &layman = _desktop->layerManager(); + LayerManager &layman = _desktop->getDocument()->layerManager(); switch (_type) { case LayerPropertiesDialogType::CREATE: { @@ -311,10 +311,10 @@ void LayerPropertiesDialog::_setup_layers_controls() _scroller.set_shadow_type(Gtk::SHADOW_IN); _scroller.set_size_request(220, 180); - SPDocument* document = _desktop->doc(); + SPDocument* document = _desktop->getDocument(); SPRoot* root = document->getRoot(); if (root) { - SPObject* target = _desktop->layerManager().currentLayer(); + SPObject* target = _desktop->getDocument()->layerManager().currentLayer(); _store->clear(); _addLayer(root, nullptr, target, 0); } @@ -342,10 +342,10 @@ void LayerPropertiesDialog::_addLayer(SPObject* layer, Gtk::TreeModel::Row* pare g_warn_message("Inkscape", __FILE__, __LINE__, __func__, "Maximum layer nesting reached."); return; } - LayerManager &layman = _desktop->layerManager(); + LayerManager &layman = _desktop->getDocument()->layerManager(); unsigned int counter = layman.childCount(layer); for (unsigned int i = 0; i < counter; i++) { - SPObject *child = _desktop->layerManager().nthChildOf(layer, i); + SPObject *child = _desktop->getDocument()->layerManager().nthChildOf(layer, i); if (!child) { continue; } diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp index 618fb72e9e..059b8737c1 100644 --- a/src/ui/dialog/objects.cpp +++ b/src/ui/dialog/objects.cpp @@ -987,7 +987,7 @@ void ObjectsPanel::desktopReplaced() layer_changed.disconnect(); if (auto desktop = getDesktop()) { - layer_changed = desktop->layerManager().connectCurrentLayerChanged(sigc::mem_fun(*this, &ObjectsPanel::layerChanged)); + layer_changed = desktop->doc()->layerManager().connectCurrentLayerChanged(sigc::mem_fun(*this, &ObjectsPanel::layerChanged)); } } @@ -1010,7 +1010,7 @@ void ObjectsPanel::setRootWatcher() // Filtering disables creating dummy children and instead processes entire trees. root_watcher = std::make_unique(this, document->getRoot(), nullptr, filtered); root_watcher->rememberExtendedItems(); - layerChanged(getDesktop()->layerManager().currentLayer()); + layerChanged(getDesktop()->doc()->layerManager().currentLayer()); _selectionChanged(); } @@ -1193,8 +1193,8 @@ bool ObjectsPanel::toggleVisible(unsigned int state, Gtk::TreeModel::Row row) if (SPItem* item = getItem(row)) { if (state & GDK_SHIFT_MASK) { // Toggle Visible for layers (hide all other layers) - if (desktop->layerManager().isLayer(item)) { - desktop->layerManager().toggleLayerSolo(item); + if (desktop->doc()->layerManager().isLayer(item)) { + desktop->doc()->layerManager().toggleLayerSolo(item); DocumentUndo::done(getDocument(), _("Hide other layers"), ""); } return true; @@ -1258,8 +1258,8 @@ bool ObjectsPanel::toggleLocked(unsigned int state, Gtk::TreeModel::Row row) if (SPItem* item = getItem(row)) { if (state & GDK_SHIFT_MASK) { // Toggle lock for layers (lock all other layers) - if (desktop->layerManager().isLayer(item)) { - desktop->layerManager().toggleLockOtherLayers(item); + if (desktop->doc()->layerManager().isLayer(item)) { + desktop->doc()->layerManager().toggleLockOtherLayers(item); DocumentUndo::done(getDocument(), _("Lock other layers"), ""); } return true; @@ -1629,7 +1629,7 @@ Gtk::EventSequenceState ObjectsPanel::on_click(Gtk::GestureMultiPress const &ges if (context_menu) { // if right-clicking on a layer, make it current for context menu actions to work correctly if (layer && !selection->includes(layer)) { - getDesktop()->layerManager().setCurrentLayer(item, true); + getDesktop()->doc()->layerManager().setCurrentLayer(item, true); } // true == hide menu item for opening this dialog! @@ -1637,7 +1637,7 @@ Gtk::EventSequenceState ObjectsPanel::on_click(Gtk::GestureMultiPress const &ges UI::popup_at(*menu, *this, ex, ey); UI::on_hide_reset(std::move(menu)); } else if (should_set_current_layer()) { - getDesktop()->layerManager().setCurrentLayer(item, true); + getDesktop()->doc()->layerManager().setCurrentLayer(item, true); } else { selectCursorItem(state); } @@ -1877,7 +1877,7 @@ void ObjectsPanel::on_drag_end(const Glib::RefPtr &context) */ bool ObjectsPanel::selectCursorItem(unsigned int state) { - auto &layers = getDesktop()->layerManager(); + auto &layers = getDesktop()->doc()->layerManager(); auto selection = getSelection(); if (!selection) return false; diff --git a/src/ui/dialog/spellcheck.cpp b/src/ui/dialog/spellcheck.cpp index 9a832a7b95..9e09a07a81 100644 --- a/src/ui/dialog/spellcheck.cpp +++ b/src/ui/dialog/spellcheck.cpp @@ -236,7 +236,7 @@ void SpellCheck::allTextItems (SPObject *r, std::vector &l, bool hidde if (auto desktop = getDesktop()) { for (auto& child: r->children) { if (auto item = cast(&child)) { - if (!child.cloned && !desktop->layerManager().isLayer(item)) { + if (!child.cloned && !desktop->doc()->layerManager().isLayer(item)) { if ((hidden || !desktop->itemIsHidden(item)) && (locked || !item->isLocked())) { if (is(item) || is(item)) l.push_back(item); diff --git a/src/ui/dialog/svg-fonts-dialog.cpp b/src/ui/dialog/svg-fonts-dialog.cpp index 59308f9f0f..2a0e266cf6 100644 --- a/src/ui/dialog/svg-fonts-dialog.cpp +++ b/src/ui/dialog/svg-fonts-dialog.cpp @@ -355,7 +355,7 @@ Glib::ustring get_glyph_full_name(const SPGlyph& glyph) { SPItem* find_layer(SPDesktop* desktop, SPObject* root_layer, const Glib::ustring& name) { if (!desktop) return nullptr; - const auto& layers = desktop->layerManager(); + const auto& layers = desktop->doc()->layerManager(); auto root = root_layer == nullptr ? layers.currentRoot() : root_layer; if (!root) return nullptr; @@ -386,7 +386,7 @@ std::vector get_direct_sublayers(SPObject* layer) { void rename_glyph_layer(SPDesktop* desktop, SPItem* layer, const Glib::ustring& font, const Glib::ustring& name) { if (!desktop || !layer || font.empty() || name.empty()) return; - auto parent_layer = find_layer(desktop, desktop->layerManager().currentRoot(), font); + auto parent_layer = find_layer(desktop, desktop->doc()->layerManager().currentRoot(), font); if (!parent_layer) return; // before renaming the layer find new place to move it into to keep sorted order intact @@ -409,13 +409,13 @@ void rename_glyph_layer(SPDesktop* desktop, SPItem* layer, const Glib::ustring& parent_layer->getRepr()->changeOrder(layer->getRepr(), after ? after->getRepr() : nullptr); } - desktop->layerManager().renameLayer(layer, name.c_str(), false); + desktop->doc()->layerManager().renameLayer(layer, name.c_str(), false); } SPItem* get_layer_for_glyph(SPDesktop* desktop, const Glib::ustring& font, const Glib::ustring& name) { if (!desktop || name.empty() || font.empty()) return nullptr; - auto parent_layer = find_layer(desktop, desktop->layerManager().currentRoot(), font); + auto parent_layer = find_layer(desktop, desktop->doc()->layerManager().currentRoot(), font); if (!parent_layer) return nullptr; return find_layer(desktop, parent_layer, name); @@ -424,7 +424,7 @@ SPItem* get_layer_for_glyph(SPDesktop* desktop, const Glib::ustring& font, const SPItem* get_or_create_layer_for_glyph(SPDesktop* desktop, const Glib::ustring& font, const Glib::ustring& name) { if (!desktop || name.empty() || font.empty()) return nullptr; - auto& layers = desktop->layerManager(); + auto& layers = desktop->doc()->layerManager(); auto parent_layer = find_layer(desktop, layers.currentRoot(), font); if (!parent_layer) { // create a new layer for a font @@ -1264,7 +1264,7 @@ void SvgFontsDialog::edit_glyph(SPGlyph* glyph) { } } - auto& layers = desktop->layerManager(); + auto& layers = desktop->doc()->layerManager(); // set layer as "solo" - only one visible and unlocked if (layers.isLayer(layer) && layer != layers.currentRoot()) { layers.setCurrentLayer(layer, true); diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp index 5ab3df0008..388f889de0 100644 --- a/src/ui/dialog/xml-tree.cpp +++ b/src/ui/dialog/xml-tree.cpp @@ -443,10 +443,10 @@ void XmlTree::set_dt_select(Inkscape::XML::Node *repr) if (!object || !in_dt_coordsys(*object)) { // object not on canvas } else if (isRealLayer(object)) { - getDesktop()->layerManager().setCurrentLayer(object); + getDesktop()->doc()->layerManager().setCurrentLayer(object); } else { if (is(object->parent)) { - getDesktop()->layerManager().setCurrentLayer(object->parent); + getDesktop()->doc()->layerManager().setCurrentLayer(object->parent); } getSelection()->set(cast(object)); diff --git a/src/ui/drag-and-drop.cpp b/src/ui/drag-and-drop.cpp index 30bab7b467..d8e6bf930b 100644 --- a/src/ui/drag-and-drop.cpp +++ b/src/ui/drag-and-drop.cpp @@ -303,7 +303,7 @@ static void ink_drag_data_received(GtkWidget *widget, // Greg's edits to add intelligent positioning of svg drops SPObject *new_obj = nullptr; - new_obj = desktop->layerManager().currentLayer()->appendChildRepr(newgroup); + new_obj = desktop->doc()->layerManager().currentLayer()->appendChildRepr(newgroup); Inkscape::Selection *selection = desktop->getSelection(); selection->set(cast(new_obj)); diff --git a/src/ui/toolbar/connector-toolbar.cpp b/src/ui/toolbar/connector-toolbar.cpp index 0473203ae1..fb047d7e1d 100644 --- a/src/ui/toolbar/connector-toolbar.cpp +++ b/src/ui/toolbar/connector-toolbar.cpp @@ -264,7 +264,7 @@ void ConnectorToolbar::spacing_changed() _desktop->getNamedView()->updateRepr(); bool modmade = false; - auto items = get_avoided_items(_desktop->layerManager().currentRoot(), _desktop); + auto items = get_avoided_items(_desktop->doc()->layerManager().currentRoot(), _desktop); for (auto item : items) { Geom::Affine m = Geom::identity(); avoid_item_move(&m, item); diff --git a/src/ui/tools/eraser-tool.cpp b/src/ui/tools/eraser-tool.cpp index a377dc6631..5b79f80deb 100644 --- a/src/ui/tools/eraser-tool.cpp +++ b/src/ui/tools/eraser-tool.cpp @@ -564,7 +564,7 @@ bool EraserTool::_handleKeypress(KeyPressEvent const &key) */ SPItem *EraserTool::_insertAcidIntoDocument(SPDocument *document) { - auto *top_layer = _desktop->layerManager().currentRoot(); + auto *top_layer = _desktop->doc()->layerManager().currentRoot(); auto *eraser_item = cast(top_layer->appendChildRepr(repr)); Inkscape::GC::release(repr); eraser_item->updateRepr(); diff --git a/src/ui/tools/flood-tool.cpp b/src/ui/tools/flood-tool.cpp index cbaa4bb9a2..8fc1f71276 100644 --- a/src/ui/tools/flood-tool.cpp +++ b/src/ui/tools/flood-tool.cpp @@ -397,7 +397,7 @@ static void do_trace(BitmapCoordsInfo const &bci, unsigned char *trace_px, SPDes pathRepr->setAttribute("d", path.svg_dump_path().c_str()); } - auto layer = desktop->layerManager().currentLayer(); + auto layer = desktop->doc()->layerManager().currentLayer(); layer->addChild(pathRepr, nullptr); SPObject *reprobj = document->getObjectByRepr(pathRepr); diff --git a/src/ui/tools/freehand-base.cpp b/src/ui/tools/freehand-base.cpp index fc59bc3b86..9011b6e79b 100644 --- a/src/ui/tools/freehand-base.cpp +++ b/src/ui/tools/freehand-base.cpp @@ -878,7 +878,7 @@ void spdc_create_single_dot(ToolBase *tool, Geom::Point const &pt, char const *p Glib::ustring tool_path = path; SPDesktop *desktop = tool->getDesktop(); - Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); + Inkscape::XML::Document *xml_doc = desktop->getDocument()->getReprDoc(); Inkscape::XML::Node *repr = xml_doc->createElement("svg:path"); repr->setAttribute("sodipodi:type", "arc"); auto layer = tool->currentLayer(); diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index 73155fab0a..57d433d1e6 100644 --- a/src/ui/tools/measure-tool.cpp +++ b/src/ui/tools/measure-tool.cpp @@ -265,7 +265,7 @@ void MeasureTool::createAngleDisplayCurve(Geom::Point const ¢er, Geom::Point path.start(_desktop->doc2dt(p1)); path.appendNew(_desktop->doc2dt(p2), _desktop->doc2dt(p3), _desktop->doc2dt(p4)); pathv.push_back(path); - auto layer = _desktop->layerManager().currentLayer(); + auto layer = _desktop->doc()->layerManager().currentLayer(); pathv *= layer->i2doc_affine().inverse(); if (!pathv.empty()) { setMeasureItem(pathv, true, false, 0xff00007f, measure_repr); @@ -624,7 +624,7 @@ void MeasureTool::toGuides() } setGuide(start,ray.angle(), _("Measure")); if(explicit_base) { - auto layer = _desktop->layerManager().currentLayer(); + auto layer = _desktop->doc()->layerManager().currentLayer(); explicit_base = *explicit_base * layer->i2doc_affine().inverse(); ray.setPoints(start, *explicit_base); if(ray.angle() != 0) { @@ -667,7 +667,7 @@ void MeasureTool::toItem() Inkscape::XML::Node *rgroup = xml_doc->createElement("svg:g"); showCanvasItems(false, true, false, rgroup); setLine(start_p,end_p, false, line_color_primary, rgroup); - auto measure_item = cast(_desktop->layerManager().currentLayer()->appendChildRepr(rgroup)); + auto measure_item = cast(_desktop->doc()->layerManager().currentLayer()->appendChildRepr(rgroup)); Inkscape::GC::release(rgroup); measure_item->updateRepr(); doc->ensureUpToDate(); @@ -766,7 +766,7 @@ void MeasureTool::setLine(Geom::Point start_point,Geom::Point end_point, bool ma path.start(_desktop->doc2dt(start_point)); path.appendNew(_desktop->doc2dt(end_point)); pathv.push_back(path); - pathv *= _desktop->layerManager().currentLayer()->i2doc_affine().inverse(); + pathv *= _desktop->getDocument()->layerManager().currentLayer()->i2doc_affine().inverse(); if(!pathv.empty()) { setMeasureItem(pathv, false, markers, color, measure_repr); } @@ -785,7 +785,7 @@ void MeasureTool::setPoint(Geom::Point origin, Inkscape::XML::Node *measure_repr pathv *= scale; pathv *= Geom::Translate(Geom::Point() - (scale.vector() * 0.5)); pathv *= Geom::Translate(_desktop->doc2dt(origin)); - pathv *= _desktop->layerManager().currentLayer()->i2doc_affine().inverse(); + pathv *= _desktop->getDocument()->layerManager().currentLayer()->i2doc_affine().inverse(); if (!pathv.empty()) { guint32 line_color_secondary = 0xff0000ff; setMeasureItem(pathv, false, false, line_color_secondary, measure_repr); @@ -795,7 +795,7 @@ void MeasureTool::setPoint(Geom::Point origin, Inkscape::XML::Node *measure_repr void MeasureTool::setLabelText(Glib::ustring const &value, Geom::Point pos, double fontsize, Geom::Coord angle, guint32 background, Inkscape::XML::Node *measure_repr) { - Inkscape::XML::Document *xml_doc = _desktop->doc()->getReprDoc(); + Inkscape::XML::Document *xml_doc = _desktop->getDocument()->getReprDoc(); /* Create */ pos = _desktop->doc2dt(pos); Inkscape::XML::Node *rtext = xml_doc->createElement("svg:text"); @@ -848,7 +848,7 @@ void MeasureTool::setLabelText(Glib::ustring const &value, Geom::Point pos, doub Inkscape::XML::Node *rstring = xml_doc->createTextNode(value.c_str()); rtspan->addChild(rstring, nullptr); Inkscape::GC::release(rstring); - auto layer = _desktop->layerManager().currentLayer(); + auto layer = _desktop->getDocument()->layerManager().currentLayer(); auto text_item = cast(layer->appendChildRepr(rtext)); Inkscape::GC::release(rtext); text_item->rebuildLayout(); @@ -1152,7 +1152,7 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, bool to_phantom, SPDocument *doc = _desktop->getDocument(); Geom::Rect rect(start_p_doc, end_p_doc); items = doc->getItemsPartiallyInBox(_desktop->dkey, rect, false, true, false, true); - SPGroup *current_layer = _desktop->layerManager().currentLayer(); + SPGroup *current_layer = _desktop->getDocument()->layerManager().currentLayer(); std::vector intersection_times; bool only_selected = prefs->getBool("/tools/measure/only_selected", false); @@ -1161,7 +1161,7 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, bool to_phantom, if (!_desktop->getSelection()->includes(i) && only_selected) { continue; } - if (all_layers || _desktop->layerManager().layerForObject(item) == current_layer) { + if (all_layers || _desktop->getDocument()->layerManager().layerForObject(item) == current_layer) { if (auto shape = cast(item)) { calculate_intersections(_desktop, item, lineseg, *shape->curve(), intersection_times); } else { @@ -1332,7 +1332,7 @@ void MeasureTool::setMeasureItem(Geom::PathVector pathv, bool is_curve, bool mar repr = xml_doc->createElement("svg:path"); auto str = sp_svg_write_path(pathv); SPCSSAttr *css = sp_repr_css_attr_new(); - auto layer = _desktop->layerManager().currentLayer(); + auto layer = _desktop->getDocument()->layerManager().currentLayer(); Geom::Coord strokewidth = layer->i2doc_affine().inverse().expansionX(); std::stringstream stroke_width; stroke_width.imbue(std::locale::classic()); diff --git a/src/ui/tools/pencil-tool.cpp b/src/ui/tools/pencil-tool.cpp index 7324f7c851..696accbd7c 100644 --- a/src/ui/tools/pencil-tool.cpp +++ b/src/ui/tools/pencil-tool.cpp @@ -1138,7 +1138,7 @@ void PencilTool::_fitAndSplit() { /// \todo fixme: - auto layer = _desktop->layerManager().currentLayer(); + auto layer = _desktop->doc()->layerManager().currentLayer(); this->highlight_color = layer->highlight_color(); if((unsigned int)prefs->getInt("/tools/nodes/highlight_color", 0xff0000ff) == this->highlight_color){ this->green_color = 0x00ff007f; diff --git a/src/ui/tools/select-tool.cpp b/src/ui/tools/select-tool.cpp index 54ff77e7f9..da04552757 100644 --- a/src/ui/tools/select-tool.cpp +++ b/src/ui/tools/select-tool.cpp @@ -187,7 +187,7 @@ sp_select_context_up_one_layer(SPDesktop *desktop) * document), we might consider further restricting the below to disallow * leaving a layer to go to a non-layer. */ - if (SPObject *const current_layer = desktop->layerManager().currentLayer()) { + if (SPObject *const current_layer = desktop->doc()->layerManager().currentLayer()) { SPObject *const parent = current_layer->parent; auto current_group = cast(current_layer); if ( parent @@ -195,7 +195,7 @@ sp_select_context_up_one_layer(SPDesktop *desktop) || !( current_group && ( SPGroup::LAYER == current_group->layerMode() ) ) ) ) { - desktop->layerManager().setCurrentLayer(parent); + desktop->doc()->layerManager().setCurrentLayer(parent); if (current_group && (SPGroup::LAYER != current_group->layerMode())) { desktop->getSelection()->set(current_layer); } @@ -421,7 +421,7 @@ bool SelectTool::root_handler(CanvasEvent const &event) SPItem *clicked_item = selection->items().front(); if (is(clicked_item) && !is(clicked_item)) { // enter group if it's not a 3D box - _desktop->layerManager().setCurrentLayer(clicked_item); + _desktop->doc()->layerManager().setCurrentLayer(clicked_item); _desktop->getSelection()->clear(); dragging = false; discard_delayed_snap_event(); @@ -939,7 +939,7 @@ bool SelectTool::root_handler(CanvasEvent const &event) SPItem *clicked_item = selection->singleItem(); auto clickedGroup = cast(clicked_item); if ( (clickedGroup && (clickedGroup->layerMode() != SPGroup::LAYER)) || is(clicked_item)) { // enter group or a 3D box - _desktop->layerManager().setCurrentLayer(clicked_item); + _desktop->doc()->layerManager().setCurrentLayer(clicked_item); _desktop->getSelection()->clear(); } else { _desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Selected object is not a group. Cannot enter.")); diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp index b659a611e3..f212246249 100644 --- a/src/ui/tools/tool-base.cpp +++ b/src/ui/tools/tool-base.cpp @@ -136,7 +136,7 @@ void ToolBase::set(Inkscape::Preferences::Entry const &value) SPGroup *ToolBase::currentLayer() const { - return _desktop->layerManager().currentLayer(); + return _desktop->doc()->layerManager().currentLayer(); } /** diff --git a/src/ui/widget/layer-selector.cpp b/src/ui/widget/layer-selector.cpp index ef664a28f3..59b7fcfc88 100644 --- a/src/ui/widget/layer-selector.cpp +++ b/src/ui/widget/layer-selector.cpp @@ -22,6 +22,7 @@ #include #include "desktop.h" +#include "document.h" #include "document-undo.h" #include "layer-manager.h" #include "object/sp-item-group.h" @@ -131,8 +132,8 @@ void LayerSelector::setDesktop(SPDesktop *desktop) { _desktop = desktop; if (_desktop) { - _layer_changed = _desktop->layerManager().connectCurrentLayerChanged(sigc::mem_fun(*this, &LayerSelector::_layerChanged)); - _layerChanged(_desktop->layerManager().currentLayer()); + _layer_changed = _desktop->doc()->layerManager().connectCurrentLayerChanged(sigc::mem_fun(*this, &LayerSelector::_layerChanged)); + _layerChanged(_desktop->doc()->layerManager().currentLayer()); } } @@ -151,7 +152,7 @@ void LayerSelector::_layerChanged(SPGroup *layer) */ void LayerSelector::_layerModified() { - auto root = _desktop->layerManager().currentRoot(); + auto root = _desktop->doc()->layerManager().currentRoot(); bool active = _layer && _layer != root; auto color_str = std::string("white"); @@ -182,7 +183,7 @@ void LayerSelector::_layerModified() void LayerSelector::_lockLayer() { bool lock = _lock_toggle.get_active(); - if (auto layer = _desktop->layerManager().currentLayer()) { + if (auto layer = _desktop->doc()->layerManager().currentLayer()) { layer->setLocked(lock); DocumentUndo::done(_desktop->getDocument(), lock ? _("Lock layer") : _("Unlock layer"), ""); } @@ -191,7 +192,7 @@ void LayerSelector::_lockLayer() void LayerSelector::_hideLayer() { bool hide = _eye_toggle.get_active(); - if (auto layer = _desktop->layerManager().currentLayer()) { + if (auto layer = _desktop->doc()->layerManager().currentLayer()) { layer->setHidden(hide); DocumentUndo::done(_desktop->getDocument(), hide ? _("Hide layer") : _("Unhide layer"), ""); } -- GitLab