From 4d2fef9fc984a884da510dcf1099ee27e9c98f6d Mon Sep 17 00:00:00 2001 From: Allison Ghost Date: Fri, 12 Jan 2024 21:53:49 -0800 Subject: [PATCH] ExportHelper v1.0 - Categories and Buttons --- LICENSE | 21 ++++++ README.md | 37 ++++++++++ .../valla-ExportHelper/FuncButton_Button.gd | 64 ++++++++++++++++++ .../valla-ExportHelper/FuncButton_Category.gd | 17 +++++ .../FuncButton_InspectorPlugin.gd | 26 +++++++ .../valla-ExportHelper/FuncButton_Plugin.gd | 17 +++++ addons/valla-ExportHelper/plugin.cfg | 7 ++ img/Preview.png | Bin 0 -> 19366 bytes img/buttons.png | Bin 0 -> 3692 bytes img/category.png | Bin 0 -> 1804 bytes 10 files changed, 189 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 addons/valla-ExportHelper/FuncButton_Button.gd create mode 100644 addons/valla-ExportHelper/FuncButton_Category.gd create mode 100644 addons/valla-ExportHelper/FuncButton_InspectorPlugin.gd create mode 100644 addons/valla-ExportHelper/FuncButton_Plugin.gd create mode 100644 addons/valla-ExportHelper/plugin.cfg create mode 100644 img/Preview.png create mode 100644 img/buttons.png create mode 100644 img/category.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1cd36d7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Allison Ghost + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d259664 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ + +# ToolButtonPlugin for Godot 3.5 - by Allison Ghost + +Export categories, and clickable buttons that run script functions. +Serves as a replacement to mathewcst's [godot-export-categories](https://github.com/mathewcst/godot-export-categories) + +![cover](./img/Preview.png "Preview") + +## Usage + +- Install and enable the plugin. +- Use the `_c_` prefix on a variable to export a category: + +Example: ```export var _c_category_name:int``` + +![cover](./img/category.png "Preview") + +- Use the `_btn_` prefix on a variable to export a button +- Create a function that the button will call, with a name matches the variable name but without the leading `_` + +NOTE: +- Exporting an `int` or a `bool` type variable will export a standalone button. +- Exporting a `String` or other data type will export the button with an argument field that is passed to the function when clicked. + +Examples: +``` +export (String) var _btn_button_arg = "test" +export (bool) var _btn_button + +func btn_button_arg(entry): + pass + +func btn_button(): + pass + +``` +![cover](./img/buttons.png "Preview") diff --git a/addons/valla-ExportHelper/FuncButton_Button.gd b/addons/valla-ExportHelper/FuncButton_Button.gd new file mode 100644 index 0000000..f3b96ea --- /dev/null +++ b/addons/valla-ExportHelper/FuncButton_Button.gd @@ -0,0 +1,64 @@ +class_name InspectorFunctionButton +extends HBoxContainer + +var args = LineEdit.new() +var spacer = Control.new() +var spacer2 = Control.new() +var button = Button.new() +var object:Object +var info:Dictionary +var method:String +var type + +func _init(obj:Object, i): + object = obj + info = i + method = info["method"] + + alignment = BoxContainer.ALIGN_CENTER + size_flags_horizontal = SIZE_EXPAND_FILL + + add_child(spacer) + spacer.size_flags_horizontal = SIZE_EXPAND_FILL + spacer.size_flags_stretch_ratio = 0.33 + + add_child(button) + button.size_flags_horizontal = SIZE_EXPAND_FILL + button.align = Button.ALIGN_CENTER + button.modulate = info.get("tint", Color(1.5, 1.3, 0.8)) + button.size_flags_stretch_ratio = 0.5 + # Label and Tooltip + button.text = method.capitalize().trim_prefix("Btn").trim_prefix(" ") + button.hint_tooltip = "Click to call "+method + # + button.connect("pressed", self, "_on_button_pressed") + button.disabled = false + + if info.get("use_arg", false): + add_child(args) + args.size_flags_stretch_ratio = 0.33 + args.size_flags_horizontal = SIZE_EXPAND_FILL + args.modulate = info.get("tint", Color(1.1,1.1,1.1)) + args.placeholder_text = "[ Argument ]" + args.placeholder_alpha = 0.3 + args.align = 1 + else: + add_child(spacer2) + spacer2.size_flags_horizontal = SIZE_EXPAND_FILL + spacer2.size_flags_stretch_ratio = 0.33 + +func infer_string_datatype(value): + if value == "true": return true + elif value == "false": return false + elif float(value) > 0 || float(value) < 0 || value == "0" || value == "0.0" || value == "0.00": + value = float(value) + if float(value) == int(value): + value = int(value) + return value + +func _on_button_pressed(): + if info.get("use_arg", false): + object.call(method,infer_string_datatype(args.text)) + args.text = "" + else: + object.call(method) diff --git a/addons/valla-ExportHelper/FuncButton_Category.gd b/addons/valla-ExportHelper/FuncButton_Category.gd new file mode 100644 index 0000000..7116901 --- /dev/null +++ b/addons/valla-ExportHelper/FuncButton_Category.gd @@ -0,0 +1,17 @@ +class_name InspectorCategory +extends Button + +var txt = RichTextLabel.new() + +func _init(info:Dictionary): + align = 0 + size_flags_horizontal = SIZE_EXPAND_FILL + text = get_label(info.get("name", "Category")) + hint_tooltip = "" + focus_mode = 0 + disabled = true + modulate = info.get("tint", Color(1.5, 1.5, 1.5, 0.5)) + add_color_override("font_color_disabled", Color(1.7, 1.7, 1.7)) + +func get_label(name): + return " ■ "+name.capitalize()+" " diff --git a/addons/valla-ExportHelper/FuncButton_InspectorPlugin.gd b/addons/valla-ExportHelper/FuncButton_InspectorPlugin.gd new file mode 100644 index 0000000..e7e8c24 --- /dev/null +++ b/addons/valla-ExportHelper/FuncButton_InspectorPlugin.gd @@ -0,0 +1,26 @@ +extends EditorInspectorPlugin + +var plugin + +func can_handle(object): + return true + +func parse_property(object: Object, type: int, path: String, hint: int, hint_text: String, usage: int) -> bool: + if "_btn_" in path: + # Hide argument field if exporting as bool or int. + # Show field if exporting as String or other. + # String is type 4, bool is type 1, int is type 2 + var usearg = false if type == 1 || type == 2 else true + add_custom_control(InspectorFunctionButton.new(object, { + method=path.trim_prefix("_"), + use_arg=usearg, + type=type, + update_filesystem=true + })) + return true + elif "_c_" in path: + add_custom_control(InspectorCategory.new({ + name=path.trim_prefix("_c_"), + })) + return true + return false diff --git a/addons/valla-ExportHelper/FuncButton_Plugin.gd b/addons/valla-ExportHelper/FuncButton_Plugin.gd new file mode 100644 index 0000000..6188f17 --- /dev/null +++ b/addons/valla-ExportHelper/FuncButton_Plugin.gd @@ -0,0 +1,17 @@ +tool +extends EditorPlugin + +var plugin + +func _enter_tree(): + plugin = preload("./FuncButton_InspectorPlugin.gd").new() + add_inspector_plugin(plugin) + +func _exit_tree(): + remove_inspector_plugin(plugin) + +func rescan_filesystem(): + var filesys = get_editor_interface().get_resource_filesystem() + filesys.update_script_classes() + filesys.scan_sources() + filesys.scan() diff --git a/addons/valla-ExportHelper/plugin.cfg b/addons/valla-ExportHelper/plugin.cfg new file mode 100644 index 0000000..b75a482 --- /dev/null +++ b/addons/valla-ExportHelper/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Export Helper" +description="Export clickable buttons that run script functions." +author="Allison Ghost" +version="1.0" +script="FuncButton_Plugin.gd" diff --git a/img/Preview.png b/img/Preview.png new file mode 100644 index 0000000000000000000000000000000000000000..edfdca14705625fc8caee43a3df28fce00c69d93 GIT binary patch literal 19366 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 literal 0 HcmV?d00001 diff --git a/img/category.png b/img/category.png new file mode 100644 index 0000000000000000000000000000000000000000..8a28643296b6c9a9f2234305e1b7c77f83e75a3c GIT binary patch literal 1804 zcmV+n2lM!eP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2BAqrK~#8N?b}&X zT1gxQ@cA0^Ft0N&sd<@7G{Yz=xCTcQ5!}$=iVKRO5fxD(QDj$k*SN-SIS1Qxn5$$= zig;_NQ}wIVrMqwU?Uz3J-`xE4hocEY(Ky6~vI!wbpm z1(p*n0#=+^*gnXd_YS*6iz131-34GR+t~8S&fns>|5xE%=&}Q@c<7-bEb(Q)eP(6jAi(E&yvGUD`TFF&+!$j&Bf( z+UEZ1I`hg#7#k@}RbqEUL={P$D8k8`Ke_F&I27#?&f>z0IIRiUBj!O%aTL97=t&=5 z8%*P37$O7{YIIhVS=pl-Q{Rjjh8C1ZB8qSey1G7h;Vz^C$|hXn0+Wk&(6;m=AzF+h zxV~HHs`J5XH$)NA1yAJ*?9VU1M++uYyr6ry3&2`pJk&Jy;<1rfVsQ6>GoJd0>r%TD zcM%a)7cEE{@BY1T)g1RIWKSBYq;V*=QB8pHhU=g=8 zboVg2H?~yn@=ezm){;?FY8Ozv79t0a)YdgBej2S)sr(f#O6^VzBOO@ghof&`Y zm;Z!Qtgdw+oxieAdaCQpIM7jfJQ_tJatiO$S_dRd+hQ!V*EWBNqMdL~EYxZoc@RZG zBnqw(55*6Iu0H!>Byo(}F~GI*L3T+piZIyj@a%-Mh^y$qsfeOdyMW@gL==hg3uF|P z+MO6iL{wqQ7eyzx|91az!J}|Gulge4#4*ldT+2rMX&!K94zG~`g%+)8Wg{%3$h#e% zc5RBmxG{5dZ5^6d+^*4CbH_KG)+y0gU2jH7A&&k(8!YL=D^vfh=)&Z?(fs(V7uSj? z0*%gsENSf=#qAwEkGx2fQ3O@m?!aF9?W6|(@!QQ4L*vUREO0I(#=84wYnu87M%)-9qiAj^@FA2%eSpda zKc^SAV#zZc`VDVv2Gh7W-_eecK#hXJqM>aNw`7lQWY_HCHqxTKd!nJuhEz-DE)k;W zdKg7_^Mp{?#Zzamw92=0P#i^o<@Ph@7%ZZw)GpvDQB-PoL_`&-JW=$0kVfykq5bqZ z>KGIs8-WC(2&XVA6&&k0l+kM*bb3D@;`MEVfnXZd2HNqny3Rc9+QR9Nu!$v4adwMg zHI2Oj2a$18Oc_N)L`2VwQA9*UDq|E8 u5s}ImMMOlTGJdu|L`2U=#?2QmH2(k<>a8^YC literal 0 HcmV?d00001