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