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