TheFlipSide/addons/_Godot-IDE_/plugins/quick_folds/plugin.gd
2026-01-27 13:00:27 -05:00

115 lines
3.1 KiB
GDScript

@tool
extends EditorPlugin
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Quick Folds
# https://github.com/CodeNameTwister/Quick-Folds
#
# Script Spliter addon for godot 4
# author: "Twister"
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
const KEYS : PackedInt32Array = [
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_0
]
var _inputs : Array[InputEvent] = []
var _inverted_inputs : Array[InputEvent] = []
func _init() -> void:
var editor : EditorSettings = EditorInterface.get_editor_settings()
if editor:
var key1 : String = "plugin/quick_folds/input/fold_type_"
var key2 : String = "plugin/quick_folds/input/inverted_fold_type_"
for z : Array in [[key1, _inputs, false], [key2, _inverted_inputs, true]]:
for x : int in range(0, KEYS.size(), 1):
var key_token : String = str(z[0], x + 1)
var _input : InputEvent = null
if editor.has_setting(key_token):
var variant : Variant = editor.get_setting(key_token)
if variant is InputEvent:
_input = variant
z[1].append(_input)
continue
_input = InputEventKey.new()
_input.pressed = true
_input.alt_pressed = true
_input.shift_pressed = z[2]
_input.keycode = KEYS[x]
editor.set_setting(key_token, _input)
z[1].append(_input)
set_process_unhandled_input(_inputs.size() > 0 or _inverted_inputs.size() > 0)
func _unhandled_input(event: InputEvent) -> void:
if event.is_pressed():
for x : InputEvent in _inputs:
if event.is_match(x):
var index : int = _inputs.find(x)
if index > -1:
folding(index, false)
return
for x : InputEvent in _inverted_inputs:
if event.is_match(x):
var index : int = _inverted_inputs.find(x)
if index > -1:
folding(index, true)
return
func _show_error(msg : String = 'Error, on try fold editor!') -> void:
push_warning(msg)
func folding(level: int, from_back : bool) -> void:
var script_editor : ScriptEditor = null
var editor : ScriptEditorBase = null
script_editor = EditorInterface.get_script_editor()
if !is_instance_valid(script_editor):
_show_error()
return
editor = script_editor.get_current_editor()
if !is_instance_valid(editor):
_show_error()
return
var control : Control = script_editor.get_current_editor().get_base_editor()
if control is CodeEdit:
control.unfold_all_lines()
if from_back:
var max_indent : int = 0
for line_idx : int in range(control.get_line_count()):
max_indent = maxi(max_indent, control.get_indent_level(line_idx))
level = maxi(max_indent - maxi(level * control.indent_size, 0), -1)
for line : int in range(control.get_line_count()):
var indent: int = control.get_indent_level(line)
if control.can_fold_line(line):
if level < indent:
control.fold_line(line)
else:
control.unfold_line(line)
else:
level = maxi((level - 1) * control.indent_size, -1)
for line : int in range(control.get_line_count()):
var indent: int = control.get_indent_level(line)
if control.can_fold_line(line):
if level < indent:
control.fold_line(line)
else:
control.unfold_line(line)