File indexing completed on 2025-02-02 04:11:25
0001 /* 0002 * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best> 0003 * 0004 * SPDX-License-Identifier: GPL-3.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <memory> 0010 #include <vector> 0011 0012 #include <QObject> 0013 #include <QUndoGroup> 0014 0015 #include "model/document.hpp" 0016 #include "model/shapes/shape.hpp" 0017 #include "model/assets/brush_style.hpp" 0018 #include "model/assets/composition.hpp" 0019 0020 #include "io/mime/mime_serializer.hpp" 0021 0022 class QWidget; 0023 0024 0025 namespace glaxnimate::gui::item_models { 0026 class DocumentNodeModel; 0027 } // namespace item_models 0028 0029 0030 namespace glaxnimate::gui::tools { 0031 class Tool; 0032 } // namespace glaxnimate::gui::tools 0033 0034 namespace glaxnimate::gui { 0035 0036 class SelectionManager 0037 { 0038 public: 0039 // SelectionManager(); 0040 virtual ~SelectionManager() = default; 0041 0042 virtual model::Document* document() const = 0; 0043 0044 virtual model::VisualNode* current_document_node() const = 0; 0045 virtual void set_current_document_node(model::VisualNode* node) = 0; 0046 0047 virtual model::Composition* current_composition() const = 0; 0048 virtual void set_current_composition(model::Composition* comp) = 0; 0049 0050 model::ShapeElement* current_shape() const; 0051 /** 0052 * @brief Returns the property to add shapes into (never null) 0053 */ 0054 model::ShapeListProperty* current_shape_container() const; 0055 0056 virtual QColor current_color() const = 0; 0057 virtual void set_current_color(const QColor& c) = 0; 0058 virtual QColor secondary_color() const = 0; 0059 virtual void set_secondary_color(const QColor& c) = 0; 0060 virtual QWidget* as_widget() = 0; 0061 virtual QPen current_pen_style() const = 0; 0062 virtual qreal current_zoom() const = 0; 0063 0064 virtual model::BrushStyle* linked_brush_style(bool secondary) const = 0; 0065 0066 virtual void switch_tool(tools::Tool* tool) = 0; 0067 virtual std::vector<model::VisualNode*> cleaned_selection() const = 0; 0068 0069 void delete_selected(); 0070 0071 std::vector<model::VisualNode*> copy() const; 0072 void cut(); 0073 void paste(); 0074 void paste_as_composition(); 0075 void paste_document(model::Document* document, const QString& macro_name, bool as_comp); 0076 0077 virtual void set_selection(const std::vector<model::VisualNode*>& selected) = 0; 0078 virtual void update_selection(const std::vector<model::VisualNode*>& selected, const std::vector<model::VisualNode*>& deselected) = 0; 0079 0080 QUndoGroup& undo_group() { return undo_group_; } 0081 0082 virtual item_models::DocumentNodeModel* model() const = 0; 0083 0084 protected: 0085 virtual std::vector<io::mime::MimeSerializer*> supported_mimes() const = 0; 0086 void layer_new_impl(std::unique_ptr<model::ShapeElement> layer); 0087 model::PreCompLayer *layer_new_comp(model::Composition *comp); 0088 void delete_shapes_impl(const QString& undo_string, const std::vector<model::VisualNode *> &selection); 0089 0090 private: 0091 void paste_impl(bool as_comp); 0092 0093 QUndoGroup undo_group_; 0094 }; 0095 0096 0097 } // namespace glaxnimate::gui