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