Warning, file /graphics/glaxnimate/src/gui/item_models/property_model_private.hpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

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 #include "property_model_base.hpp"
0009 
0010 #include <unordered_map>
0011 
0012 #include <QFont>
0013 #include <QPalette>
0014 
0015 #include "model/property/option_list_property.hpp"
0016 
0017 #include "app/application.hpp"
0018 
0019 #include "widgets/enum_combo.hpp"
0020 
0021 
0022 class glaxnimate::gui::item_models::PropertyModelBase::Private
0023 {
0024 public:
0025     using id_type = quintptr;
0026 
0027     struct Subtree
0028     {
0029         Subtree(model::Object* object, id_type parent)
0030             : object{object}, parent{parent}, visual_node{object->cast<model::VisualNode>()}
0031         {}
0032 
0033         Subtree(model::BaseProperty* prop, id_type parent)
0034             : prop{prop}, parent{parent}
0035         {}
0036 
0037         int child_index(Subtree* child) const
0038         {
0039             for ( int i = 0; i < int(children.size()); i++ )
0040                 if ( children[i] == child )
0041                     return i;
0042             return -1;
0043         }
0044 
0045         model::Object* object = nullptr;
0046         model::BaseProperty* prop = nullptr;
0047         id_type parent = 0;
0048         std::vector<Subtree*> children;
0049         id_type id = 0;
0050         model::VisualNode* visual_node = nullptr;
0051         bool expand_referenced = false;
0052         /// When showing children directly, offset by this much
0053         int merged_children_offset = 0;
0054     };
0055 
0056     using ReferencedPropertiesMap = std::unordered_map<model::BaseProperty*, std::vector<id_type>>;
0057 
0058     explicit Private(PropertyModelBase* parent)
0059         : model(parent)
0060     {
0061     }
0062 
0063     virtual ~Private() {}
0064 
0065 
0066     void add_object(model::Object* object, Subtree* parent, bool insert_row, int index = -1);
0067 
0068     Subtree* do_add_node(Subtree st, Subtree* parent, int index);
0069 
0070     Subtree* add_node(Subtree st);
0071 
0072     void clear();
0073 
0074     Subtree* node_from_index(const QModelIndex& index);
0075 
0076     Subtree* node(id_type id);
0077 
0078     QVariant data_name(Subtree* tree, int role);
0079 
0080     QVariant data_value(Subtree* tree, int role);
0081     QVariant data_value(model::BaseProperty* prop, model::Object* object, int role);
0082 
0083     virtual void on_connect(model::Object* object, Subtree* tree, bool insert_row, ReferencedPropertiesMap* referenced) = 0;
0084 
0085     void connect_recursive(Subtree* this_node, bool insert_row);
0086 
0087     void connect_subobject(model::Object* object, Subtree* this_node, bool insert_row);
0088 
0089     void disconnect_recursive(Subtree* node);
0090 
0091     Subtree* object_tree(model::Object* obj);
0092 
0093     void on_delete_object(model::Object* obj);
0094 
0095     Subtree* visual_node_parent(Subtree* tree);
0096 
0097     QModelIndex node_index(model::DocumentNode* node);
0098 
0099     QModelIndex subtree_index(id_type id);
0100 
0101     QModelIndex subtree_index(Subtree* tree);
0102 
0103     bool set_prop_data(Subtree* tree, const QVariant& value, int role);
0104     bool set_prop_data(model::BaseProperty* prop, const QVariant& value, int role);
0105 
0106     void property_changed(const model::BaseProperty* prop, const QVariant& value);
0107     void on_property_changed(id_type prop_node_id, const model::BaseProperty* prop, const QVariant& value);
0108     void clean_object_references(const QModelIndex& index, Private::Subtree* prop_node);
0109 
0110     void begin_insert_row(Subtree* row_tree, int index);
0111     void end_insert_row();
0112     Subtree* add_property(model::BaseProperty* prop, id_type parent, bool insert_row, ReferencedPropertiesMap* referenced);
0113 
0114     void clean_subtree(Subtree* node);
0115 
0116     model::AnimatableBase* animatable(Subtree* node);
0117 
0118     model::Document* document = nullptr;
0119     std::vector<Subtree*> roots;
0120     id_type next_id = 1;
0121     std::unordered_map<id_type, Subtree> nodes;
0122     std::unordered_map<model::Object*, id_type> objects;
0123     std::unordered_map<model::BaseProperty*, id_type> properties;
0124     std::unordered_map<model::Object*, ReferencedPropertiesMap> referenced_properties;
0125     bool animation_only;
0126     PropertyModelBase* model = nullptr;
0127 };