1
2 //
3 // This source file is part of appleseed.
4 // Visit https://appleseedhq.net/ for additional information and resources.
5 //
6 // This software is released under the MIT license.
7 //
8 // Copyright (c) 2010-2013 Francois Beaune, Jupiter Jazz Limited
9 // Copyright (c) 2014-2018 Francois Beaune, The appleseedhq Organization
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining a copy
12 // of this software and associated documentation files (the "Software"), to deal
13 // in the Software without restriction, including without limitation the rights
14 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 // copies of the Software, and to permit persons to whom the Software is
16 // furnished to do so, subject to the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be included in
19 // all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 // THE SOFTWARE.
28 //
29
30 #pragma once
31
32 // appleseed.studio headers.
33 #include "utility/miscellaneous.h"
34
35 // appleseed.foundation headers.
36 #include "foundation/utility/uid.h"
37
38 // Qt headers.
39 #include <QAction>
40 #include <QList>
41 #include <QMetaType>
42 #include <QObject>
43 #include <QTreeWidgetItem>
44 #include <QVariant>
45
46 // Forward declarations.
47 namespace appleseed { namespace studio { class AttributeEditor; } }
48 namespace appleseed { namespace studio { class EntityEditorContext; } }
49 class QMenu;
50 class QString;
51
52 namespace appleseed {
53 namespace studio {
54
55 class ItemBase
56 : public QObject
57 , public QTreeWidgetItem
58 {
59 Q_OBJECT
60
61 public:
62 ItemBase(
63 EntityEditorContext& editor_context,
64 const foundation::UniqueID class_uid);
65 ItemBase(
66 EntityEditorContext& editor_context,
67 const foundation::UniqueID class_uid,
68 const QString& title);
69
~ItemBase()70 ~ItemBase() override {}
71
72 foundation::UniqueID get_class_uid() const;
73
74 void set_allow_edition(const bool allow);
75 bool allows_edition() const;
76
77 void set_allow_deletion(const bool allow);
78 bool allows_deletion() const;
79
80 void set_title(const QString& title);
81
82 virtual QMenu* get_single_item_context_menu() const;
83 virtual QMenu* get_multiple_items_context_menu(const QList<ItemBase*>& items) const;
84
85 virtual void delete_multiple(const QList<ItemBase*>& items);
86
87 public slots:
88 virtual void slot_edit(AttributeEditor* attribute_editor = nullptr);
89 virtual void slot_instantiate();
90 void slot_delete_multiple();
91
92 protected:
93 EntityEditorContext& m_editor_context;
94
95 template <typename Item>
96 QList<Item*> get_action_items();
97
98 private:
99 const foundation::UniqueID m_class_uid;
100 bool m_allow_edition;
101 bool m_allow_deletion;
102 };
103
104
105 //
106 // ItemBase class implementation.
107 //
108
109 template <typename Item>
get_action_items()110 QList<Item*> ItemBase::get_action_items()
111 {
112 QAction* action = qobject_cast<QAction*>(sender());
113
114 if (action && !action->data().isNull())
115 {
116 const QList<Item*> items = qlist_static_cast<Item*>(action->data().value<QList<ItemBase*>>());
117
118 if (!items.empty())
119 return items;
120 }
121
122 return make_qlist(static_cast<Item*>(this));
123 }
124
125 } // namespace studio
126 } // namespace appleseed
127
128 Q_DECLARE_METATYPE(QList<appleseed::studio::ItemBase*>);
129 Q_DECLARE_METATYPE(QList<const appleseed::studio::ItemBase*>);
130