1 /*************************************************************************/
2 /*  item_list_editor_plugin.h                                            */
3 /*************************************************************************/
4 /*                       This file is part of:                           */
5 /*                           GODOT ENGINE                                */
6 /*                      https://godotengine.org                          */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.                 */
9 /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)    */
10 /*                                                                       */
11 /* Permission is hereby granted, free of charge, to any person obtaining */
12 /* a copy of this software and associated documentation files (the       */
13 /* "Software"), to deal in the Software without restriction, including   */
14 /* without limitation the rights to use, copy, modify, merge, publish,   */
15 /* distribute, sublicense, and/or sell copies of the Software, and to    */
16 /* permit persons to whom the Software is furnished to do so, subject to */
17 /* the following conditions:                                             */
18 /*                                                                       */
19 /* The above copyright notice and this permission notice shall be        */
20 /* included in all copies or substantial portions of the Software.       */
21 /*                                                                       */
22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
29 /*************************************************************************/
30 #ifndef ITEM_LIST_EDITOR_PLUGIN_H
31 #define ITEM_LIST_EDITOR_PLUGIN_H
32 
33 #include "canvas_item_editor_plugin.h"
34 #include "editor/editor_node.h"
35 #include "editor/editor_plugin.h"
36 
37 #include "scene/gui/menu_button.h"
38 #include "scene/gui/option_button.h"
39 #include "scene/gui/popup_menu.h"
40 
41 /**
42 	@author Juan Linietsky <reduzio@gmail.com>
43 */
44 
45 class ItemListPlugin : public Object {
46 
47 	OBJ_TYPE(ItemListPlugin, Object);
48 
49 protected:
50 	bool _set(const StringName &p_name, const Variant &p_value);
51 	bool _get(const StringName &p_name, Variant &r_ret) const;
52 	void _get_property_list(List<PropertyInfo> *p_list) const;
53 
54 public:
55 	enum Flags {
56 
57 		FLAG_ICON = 1,
58 		FLAG_CHECKABLE = 2,
59 		FLAG_ID = 4,
60 		FLAG_ENABLE = 8,
61 		FLAG_SEPARATOR = 16
62 	};
63 
64 	virtual void set_object(Object *p_object) = 0;
65 	virtual bool handles(Object *p_object) const = 0;
66 
67 	virtual int get_flags() const = 0;
68 
set_item_text(int p_idx,const String & p_text)69 	virtual void set_item_text(int p_idx, const String &p_text) {}
get_item_text(int p_idx)70 	virtual String get_item_text(int p_idx) const { return ""; };
71 
set_item_icon(int p_idx,const Ref<Texture> & p_tex)72 	virtual void set_item_icon(int p_idx, const Ref<Texture> &p_tex) {}
get_item_icon(int p_idx)73 	virtual Ref<Texture> get_item_icon(int p_idx) const { return Ref<Texture>(); };
74 
set_item_checkable(int p_idx,bool p_check)75 	virtual void set_item_checkable(int p_idx, bool p_check) {}
is_item_checkable(int p_idx)76 	virtual bool is_item_checkable(int p_idx) const { return false; };
77 
set_item_checked(int p_idx,bool p_checked)78 	virtual void set_item_checked(int p_idx, bool p_checked) {}
is_item_checked(int p_idx)79 	virtual bool is_item_checked(int p_idx) const { return false; };
80 
set_item_enabled(int p_idx,int p_enabled)81 	virtual void set_item_enabled(int p_idx, int p_enabled) {}
is_item_enabled(int p_idx)82 	virtual bool is_item_enabled(int p_idx) const { return false; };
83 
set_item_id(int p_idx,int p_id)84 	virtual void set_item_id(int p_idx, int p_id) {}
get_item_id(int p_idx)85 	virtual int get_item_id(int p_idx) const { return -1; };
86 
set_item_separator(int p_idx,bool p_separator)87 	virtual void set_item_separator(int p_idx, bool p_separator) {}
is_item_separator(int p_idx)88 	virtual bool is_item_separator(int p_idx) const { return false; };
89 
90 	virtual void add_item() = 0;
91 	virtual int get_item_count() const = 0;
92 	virtual void erase(int p_idx) = 0;
93 
ItemListPlugin()94 	ItemListPlugin() {}
95 };
96 
97 ///////////////////////////////////////////////////////////////
98 
99 class ItemListOptionButtonPlugin : public ItemListPlugin {
100 
101 	OBJ_TYPE(ItemListOptionButtonPlugin, ItemListPlugin);
102 
103 	OptionButton *ob;
104 
105 public:
106 	virtual void set_object(Object *p_object);
107 	virtual bool handles(Object *p_object) const;
108 	virtual int get_flags() const;
109 
set_item_text(int p_idx,const String & p_text)110 	virtual void set_item_text(int p_idx, const String &p_text) { ob->set_item_text(p_idx, p_text); }
get_item_text(int p_idx)111 	virtual String get_item_text(int p_idx) const { return ob->get_item_text(p_idx); }
112 
set_item_icon(int p_idx,const Ref<Texture> & p_tex)113 	virtual void set_item_icon(int p_idx, const Ref<Texture> &p_tex) { ob->set_item_icon(p_idx, p_tex); }
get_item_icon(int p_idx)114 	virtual Ref<Texture> get_item_icon(int p_idx) const { return ob->get_item_icon(p_idx); }
115 
set_item_enabled(int p_idx,int p_enabled)116 	virtual void set_item_enabled(int p_idx, int p_enabled) { ob->set_item_disabled(p_idx, !p_enabled); }
is_item_enabled(int p_idx)117 	virtual bool is_item_enabled(int p_idx) const { return !ob->is_item_disabled(p_idx); }
118 
set_item_id(int p_idx,int p_id)119 	virtual void set_item_id(int p_idx, int p_id) { ob->set_item_ID(p_idx, p_id); }
get_item_id(int p_idx)120 	virtual int get_item_id(int p_idx) const { return ob->get_item_ID(p_idx); }
121 
122 	virtual void add_item();
123 	virtual int get_item_count() const;
124 	virtual void erase(int p_idx);
125 
126 	ItemListOptionButtonPlugin();
127 };
128 
129 class ItemListPopupMenuPlugin : public ItemListPlugin {
130 
131 	OBJ_TYPE(ItemListPopupMenuPlugin, ItemListPlugin);
132 
133 	PopupMenu *pp;
134 
135 public:
136 	virtual void set_object(Object *p_object);
137 	virtual bool handles(Object *p_object) const;
138 	virtual int get_flags() const;
139 
set_item_text(int p_idx,const String & p_text)140 	virtual void set_item_text(int p_idx, const String &p_text) { pp->set_item_text(p_idx, p_text); }
get_item_text(int p_idx)141 	virtual String get_item_text(int p_idx) const { return pp->get_item_text(p_idx); }
142 
set_item_icon(int p_idx,const Ref<Texture> & p_tex)143 	virtual void set_item_icon(int p_idx, const Ref<Texture> &p_tex) { pp->set_item_icon(p_idx, p_tex); }
get_item_icon(int p_idx)144 	virtual Ref<Texture> get_item_icon(int p_idx) const { return pp->get_item_icon(p_idx); }
145 
set_item_checkable(int p_idx,bool p_check)146 	virtual void set_item_checkable(int p_idx, bool p_check) { pp->set_item_as_checkable(p_idx, p_check); }
is_item_checkable(int p_idx)147 	virtual bool is_item_checkable(int p_idx) const { return pp->is_item_checkable(p_idx); }
148 
set_item_checked(int p_idx,bool p_checked)149 	virtual void set_item_checked(int p_idx, bool p_checked) { pp->set_item_checked(p_idx, p_checked); }
is_item_checked(int p_idx)150 	virtual bool is_item_checked(int p_idx) const { return pp->is_item_checked(p_idx); }
151 
set_item_enabled(int p_idx,int p_enabled)152 	virtual void set_item_enabled(int p_idx, int p_enabled) { pp->set_item_disabled(p_idx, !p_enabled); }
is_item_enabled(int p_idx)153 	virtual bool is_item_enabled(int p_idx) const { return !pp->is_item_disabled(p_idx); }
154 
set_item_id(int p_idx,int p_id)155 	virtual void set_item_id(int p_idx, int p_id) { pp->set_item_ID(p_idx, p_idx); }
get_item_id(int p_idx)156 	virtual int get_item_id(int p_idx) const { return pp->get_item_ID(p_idx); }
157 
set_item_separator(int p_idx,bool p_separator)158 	virtual void set_item_separator(int p_idx, bool p_separator) { pp->set_item_as_separator(p_idx, p_separator); }
is_item_separator(int p_idx)159 	virtual bool is_item_separator(int p_idx) const { return pp->is_item_separator(p_idx); }
160 
161 	virtual void add_item();
162 	virtual int get_item_count() const;
163 	virtual void erase(int p_idx);
164 
165 	ItemListPopupMenuPlugin();
166 };
167 
168 ///////////////////////////////////////////////////////////////
169 
170 class ItemListEditor : public HBoxContainer {
171 
172 	OBJ_TYPE(ItemListEditor, HBoxContainer);
173 
174 	Node *item_list;
175 
176 	ToolButton *toolbar_button;
177 
178 	AcceptDialog *dialog;
179 	PropertyEditor *property_editor;
180 	Tree *tree;
181 	Button *add_button;
182 	Button *del_button;
183 
184 	int selected_idx;
185 
186 	Vector<ItemListPlugin *> item_plugins;
187 
188 	void _edit_items();
189 
190 	void _add_pressed();
191 	void _delete_pressed();
192 
193 	void _node_removed(Node *p_node);
194 
195 protected:
196 	void _notification(int p_notification);
197 	static void _bind_methods();
198 
199 public:
200 	void edit(Node *p_item_list);
201 	bool handles(Object *p_object) const;
add_plugin(ItemListPlugin * p_plugin)202 	void add_plugin(ItemListPlugin *p_plugin) { item_plugins.push_back(p_plugin); }
203 	ItemListEditor();
204 	~ItemListEditor();
205 };
206 
207 class ItemListEditorPlugin : public EditorPlugin {
208 
209 	OBJ_TYPE(ItemListEditorPlugin, EditorPlugin);
210 
211 	ItemListEditor *item_list_editor;
212 	EditorNode *editor;
213 
214 public:
get_name()215 	virtual String get_name() const { return "ItemList"; }
has_main_screen()216 	bool has_main_screen() const { return false; }
217 	virtual void edit(Object *p_node);
218 	virtual bool handles(Object *p_node) const;
219 	virtual void make_visible(bool p_visible);
220 
221 	ItemListEditorPlugin(EditorNode *p_node);
222 	~ItemListEditorPlugin();
223 };
224 
225 #endif // ITEM_LIST_EDITOR_PLUGIN_H
226