1 /*************************************************************************/
2 /* style_box_editor_plugin.cpp */
3 /*************************************************************************/
4 /* This file is part of: */
5 /* GODOT ENGINE */
6 /* https://godotengine.org */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
9 /* Copyright (c) 2014-2020 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
31 #include "style_box_editor_plugin.h"
32
33 #include "editor/editor_scale.h"
34
can_handle(Object * p_object)35 bool EditorInspectorPluginStyleBox::can_handle(Object *p_object) {
36
37 return Object::cast_to<StyleBox>(p_object) != NULL;
38 }
39
parse_begin(Object * p_object)40 void EditorInspectorPluginStyleBox::parse_begin(Object *p_object) {
41
42 Ref<StyleBox> sb = Ref<StyleBox>(Object::cast_to<StyleBox>(p_object));
43
44 StyleBoxPreview *preview = memnew(StyleBoxPreview);
45 preview->edit(sb);
46 add_custom_control(preview);
47 }
parse_property(Object * p_object,Variant::Type p_type,const String & p_path,PropertyHint p_hint,const String & p_hint_text,int p_usage)48 bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) {
49 return false; //do not want
50 }
parse_end()51 void EditorInspectorPluginStyleBox::parse_end() {
52 }
53
edit(const Ref<StyleBox> & p_stylebox)54 void StyleBoxPreview::edit(const Ref<StyleBox> &p_stylebox) {
55
56 if (stylebox.is_valid())
57 stylebox->disconnect("changed", this, "_sb_changed");
58 stylebox = p_stylebox;
59 if (p_stylebox.is_valid()) {
60 preview->add_style_override("panel", stylebox);
61 stylebox->connect("changed", this, "_sb_changed");
62 }
63 _sb_changed();
64 }
65
_sb_changed()66 void StyleBoxPreview::_sb_changed() {
67
68 preview->update();
69 }
70
_redraw()71 void StyleBoxPreview::_redraw() {
72 if (stylebox.is_valid()) {
73 Rect2 preview_rect = preview->get_rect();
74
75 // Re-adjust preview panel to fit all drawn content
76 Rect2 draw_rect = stylebox->get_draw_rect(preview_rect);
77 preview_rect.size -= draw_rect.size - preview_rect.size;
78 preview_rect.position -= draw_rect.position - preview_rect.position;
79
80 preview->draw_style_box(stylebox, preview_rect);
81 }
82 }
83
_bind_methods()84 void StyleBoxPreview::_bind_methods() {
85
86 ClassDB::bind_method("_sb_changed", &StyleBoxPreview::_sb_changed);
87 ClassDB::bind_method("_redraw", &StyleBoxPreview::_redraw);
88 }
89
StyleBoxPreview()90 StyleBoxPreview::StyleBoxPreview() {
91 preview = memnew(Control);
92 preview->set_custom_minimum_size(Size2(0, 150 * EDSCALE));
93 preview->set_clip_contents(true);
94 preview->connect("draw", this, "_redraw");
95 add_margin_child(TTR("Preview:"), preview);
96 }
97
StyleBoxEditorPlugin(EditorNode * p_node)98 StyleBoxEditorPlugin::StyleBoxEditorPlugin(EditorNode *p_node) {
99
100 Ref<EditorInspectorPluginStyleBox> inspector_plugin;
101 inspector_plugin.instance();
102 add_inspector_plugin(inspector_plugin);
103 }
104