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