add a few things:

* test case with folders/subfolders
* renaming items by double-clicking them
* naive drag test
This commit is contained in:
Lera Elvoé 2022-10-24 22:20:01 +03:00
parent cdc4e3f14e
commit 08bbf61416
Signed by: yagich
SSH Key Fingerprint: SHA256:6xjGb6uA7lAVcULa7byPEN//rQ0wPoG+UzYVMfZnbvc
11 changed files with 129 additions and 8 deletions

View File

@ -27,3 +27,12 @@ func add_item(text: String, parent_item: ControlTreeItem = null) -> ControlTreeI
new_item.set_button_group(item_select_btn_group)
return new_item
func get_items_by_name(s: String) -> Array:
var res = []
for i in items:
if i.get_text() == s:
res.append(i)
return res

View File

@ -28,13 +28,20 @@ onready var item_text_button: Button = $"%ItemTextButton"
onready var subitem_container: VBoxContainer = $"%Subitems"
signal rename_allowed
func _ready() -> void:
# warning-ignore:return_value_discarded
# warning-ignore:return_value_discarded
# warning-ignore:return_value_discarded
# warning-ignore:return_value_discarded
check_box.connect("pressed", self, "set_enabled", [true])
collapse_button.connect("pressed", self, "toggle_collapsed")
item_text_button.connect("rename_request", self, "rename_request")
connect("rename_allowed", item_text_button, "create_lineedit")
func set_checked(v: bool, from_checkbox: bool = false) -> void:
checked = v
@ -92,3 +99,15 @@ func toggle_collapsed() -> void:
for i in subitems:
i.visible = !collapsed
func can_drop_data(_position: Vector2, data) -> bool:
if data is Control && data.has_method("i_am_item"):
return true
return false
func rename_request() -> void:
if editable:
emit_signal("rename_allowed")

View File

@ -1,6 +1,8 @@
[gd_scene load_steps=2 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://ControlTreeItem.gd" type="Script" id=1]
[ext_resource path="res://DragHandle.gd" type="Script" id=2]
[ext_resource path="res://RenamableButton.gd" type="Script" id=3]
[node name="ControlTreeItem" type="VBoxContainer"]
anchor_right = 0.479
@ -39,6 +41,7 @@ unique_name_in_owner = true
margin_right = 32.0
margin_bottom = 32.0
rect_min_size = Vector2( 32, 0 )
script = ExtResource( 2 )
[node name="CheckBox" type="CheckBox" parent="ItemAtom"]
unique_name_in_owner = true
@ -56,6 +59,7 @@ toggle_mode = true
text = "Item text"
flat = true
align = 0
script = ExtResource( 3 )
[node name="Subitems" type="VBoxContainer" parent="."]
unique_name_in_owner = true

5
DragHandle.gd Normal file
View File

@ -0,0 +1,5 @@
extends Panel
func get_drag_data(position: Vector2):
return get_parent().get_parent()

42
RenamableButton.gd Normal file
View File

@ -0,0 +1,42 @@
extends Button
var le: LineEdit = null
signal rename_request
func _gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton && event.is_doubleclick() && !le:
emit_signal("rename_request")
func remove_lineedit() -> void:
le.queue_free()
le = null
func create_lineedit() -> void:
le = LineEdit.new()
get_tree().get_root().add_child(le)
le.rect_size = get_global_rect().size
# le.rect_size.x += 64 # some padding to make it more readable
le.rect_position = get_global_rect().position
le.expand_to_text_length = true
le.text = text
le.select_all()
le.grab_focus()
le.connect("text_entered", self, "lineeedit_text_entered")
func lineeedit_text_entered(new_text: String) -> void:
le.queue_free()
le = null
text = new_text
func _input(event: InputEvent) -> void:
if le && event is InputEventMouseButton && !(le.get_global_rect().has_point(event.position)):
remove_lineedit()
if event is InputEventKey && event.scancode == KEY_ESCAPE && le:
remove_lineedit()

View File

@ -5,23 +5,60 @@
[sub_resource type="GDScript" id=1]
script/source = "extends Control
onready var control_tree: ControlTree = $ControlTree
var i
var j
var files: Array = [] # Array[FileDef]
func _ready() -> void:
pass
files = get_dir_contents(ProjectSettings.globalize_path(\"res://test_dir\"))
construct_tree(files)
func _on_Button_pressed() -> void:
i = $ControlTree.add_item('test')
func get_dir_contents(path: String) -> Array:
var res = []
var dir = Directory.new()
if dir.open(path) == OK:
dir.list_dir_begin(true)
var fname = dir.get_next()
while fname != \"\":
var f = FileDef.new()
f.path = fname
# print(f.path)
if dir.current_is_dir():
var a = get_dir_contents(path.plus_file(fname))
f.contains.append_array(a)
res.append(f)
fname = dir.get_next()
dir.list_dir_end()
return res
func _on_Button2_pressed() -> void:
j = $ControlTree.add_item('test2', i)
func construct_tree(from: Array, parent: ControlTreeItem = null):
for f in from:
var item = control_tree.add_item(f.path, parent)
if f.contains:
item.editable = false
construct_tree(f.contains, item)
func _on_Button3_pressed() -> void:
$ControlTree.add_item('test3', j)
#func _on_Button_pressed() -> void:
# i = $ControlTree.add_item('test')
#
#
#func _on_Button2_pressed() -> void:
# j = $ControlTree.add_item('test2', i)
#
#
#func _on_Button3_pressed() -> void:
# $ControlTree.add_item('test3', j)
class FileDef:
var path: String
var contains: Array # Array[FileDef]
"
[node name="TestArea" type="Control"]

View File

@ -27,6 +27,7 @@ _global_script_class_icons={
[application]
config/name="customtree"
run/main_scene="res://TestArea.tscn"
config/icon="res://icon.png"
[gui]

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@