Refactored a lot of stuff.
Added property lists. Renamed FileAdapter to FileSystemAdapter. And more smaller stuff.
This commit is contained in:
parent
146e48b3b8
commit
a988db1f7f
149
images/folder_up.svg
Normal file
149
images/folder_up.svg
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
viewBox="0 0 4.2333333 4.2333335"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)"
|
||||||
|
sodipodi:docname="folder_up.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<marker
|
||||||
|
style="overflow:visible;"
|
||||||
|
id="Arrow2Send"
|
||||||
|
refX="0.0"
|
||||||
|
refY="0.0"
|
||||||
|
orient="auto"
|
||||||
|
inkscape:stockid="Arrow2Send"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
transform="scale(0.3) rotate(180) translate(-2.3,0)"
|
||||||
|
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||||
|
style="fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;"
|
||||||
|
id="path1350" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
style="overflow:visible;"
|
||||||
|
id="marker1919"
|
||||||
|
refX="0.0"
|
||||||
|
refY="0.0"
|
||||||
|
orient="auto"
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
transform="scale(1.1) rotate(180) translate(1,0)"
|
||||||
|
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||||
|
style="fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;"
|
||||||
|
id="path1917" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
style="overflow:visible;"
|
||||||
|
id="Arrow2Lend"
|
||||||
|
refX="0.0"
|
||||||
|
refY="0.0"
|
||||||
|
orient="auto"
|
||||||
|
inkscape:stockid="Arrow2Lend"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
transform="scale(1.1) rotate(180) translate(1,0)"
|
||||||
|
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||||
|
style="fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;"
|
||||||
|
id="path1338" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
style="overflow:visible;"
|
||||||
|
id="Arrow2Mend"
|
||||||
|
refX="0.0"
|
||||||
|
refY="0.0"
|
||||||
|
orient="auto"
|
||||||
|
inkscape:stockid="Arrow2Mend"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
transform="scale(0.6) rotate(180) translate(0,0)"
|
||||||
|
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||||
|
style="fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;"
|
||||||
|
id="path1344" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
style="overflow:visible;"
|
||||||
|
id="Arrow1Send"
|
||||||
|
refX="0.0"
|
||||||
|
refY="0.0"
|
||||||
|
orient="auto"
|
||||||
|
inkscape:stockid="Arrow1Send"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
transform="scale(0.2) rotate(180) translate(6,0)"
|
||||||
|
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
|
||||||
|
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||||
|
id="path1332" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
style="overflow:visible;"
|
||||||
|
id="Arrow1Lend"
|
||||||
|
refX="0.0"
|
||||||
|
refY="0.0"
|
||||||
|
orient="auto"
|
||||||
|
inkscape:stockid="Arrow1Lend"
|
||||||
|
inkscape:isstock="true">
|
||||||
|
<path
|
||||||
|
transform="scale(0.8) rotate(180) translate(12.5,0)"
|
||||||
|
style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;"
|
||||||
|
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
|
||||||
|
id="path1320" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="45.254834"
|
||||||
|
inkscape:cx="7.1484076"
|
||||||
|
inkscape:cy="7.8776115"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1052"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:snap-object-midpoints="false" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-292.76665)">
|
||||||
|
<path
|
||||||
|
style="fill:#f5fffc;fill-opacity:1;stroke:none;stroke-width:0.996038px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 0.38328226,296.66149 1.73338454,-3.55635 1.7333843,3.55635 z"
|
||||||
|
id="path3031"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.1 KiB |
34
images/folder_up.svg.import
Normal file
34
images/folder_up.svg.import
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/folder_up.svg-097930bffb5edf2a0b4b16cb480291b4.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://addons/de.mewin.gduibasics/images/folder_up.svg"
|
||||||
|
dest_files=[ "res://.import/folder_up.svg-097930bffb5edf2a0b4b16cb480291b4.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=true
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
process/invert_color=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=true
|
||||||
|
svg/scale=1.0
|
44
scenes/property_list/header.tscn
Normal file
44
scenes/property_list/header.tscn
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://addons/de.mewin.gduibasics/scripts/types/misc/constraints/dynamic_grid_constraints.gd" type="Script" id=2]
|
||||||
|
[ext_resource path="res://addons/de.mewin.gduibasics/scenes/property_list/scripts/header.gd" type="Script" id=3]
|
||||||
|
|
||||||
|
[sub_resource type="StyleBoxFlat" id=1]
|
||||||
|
bg_color = Color( 0, 0, 0, 0.627451 )
|
||||||
|
corner_radius_top_left = 2
|
||||||
|
corner_radius_top_right = 2
|
||||||
|
corner_radius_bottom_right = 2
|
||||||
|
corner_radius_bottom_left = 2
|
||||||
|
|
||||||
|
[node name="header" type="PanelContainer"]
|
||||||
|
margin_right = 198.0
|
||||||
|
margin_bottom = 22.0
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
custom_styles/panel = SubResource( 1 )
|
||||||
|
script = ExtResource( 3 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="header_info" type="HBoxContainer" parent="."]
|
||||||
|
margin_right = 198.0
|
||||||
|
margin_bottom = 22.0
|
||||||
|
alignment = 1
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="texture" type="TextureRect" parent="header_info"]
|
||||||
|
margin_left = 70.0
|
||||||
|
margin_right = 70.0
|
||||||
|
margin_bottom = 22.0
|
||||||
|
|
||||||
|
[node name="label" type="Label" parent="header_info"]
|
||||||
|
margin_left = 74.0
|
||||||
|
margin_right = 128.0
|
||||||
|
margin_bottom = 22.0
|
||||||
|
text = "Header"
|
||||||
|
|
||||||
|
[node name="constraints" type="Node" parent="."]
|
||||||
|
script = ExtResource( 2 )
|
||||||
|
colspan = 2
|
21
scenes/property_list/property_label.tscn
Normal file
21
scenes/property_list/property_label.tscn
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://addons/de.mewin.gduibasics/scenes/property_list/scripts/property_label.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[node name="property_label" type="HBoxContainer"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
size_flags_horizontal = 3
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="texture" type="TextureRect" parent="."]
|
||||||
|
margin_bottom = 600.0
|
||||||
|
|
||||||
|
[node name="label" type="Label" parent="."]
|
||||||
|
margin_left = 4.0
|
||||||
|
margin_top = 289.0
|
||||||
|
margin_right = 12.0
|
||||||
|
margin_bottom = 311.0
|
19
scenes/property_list/scripts/header.gd
Normal file
19
scenes/property_list/scripts/header.gd
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
extends Control
|
||||||
|
|
||||||
|
var label := "" setget _set_label, _get_label
|
||||||
|
var texture : Texture = null setget _set_texture, _get_texture
|
||||||
|
|
||||||
|
#####################
|
||||||
|
# setters & getters #
|
||||||
|
#####################
|
||||||
|
func _set_label(label_ : String) -> void:
|
||||||
|
$header_info/label.text = label_
|
||||||
|
|
||||||
|
func _get_label() -> String:
|
||||||
|
return $header_info/label.text
|
||||||
|
|
||||||
|
func _set_texture(texture_ : Texture) -> void:
|
||||||
|
$header_info/texture.texture = texture_
|
||||||
|
|
||||||
|
func _get_texture() -> Texture:
|
||||||
|
return $header_info/texture.texture
|
19
scenes/property_list/scripts/property_label.gd
Normal file
19
scenes/property_list/scripts/property_label.gd
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
extends Control
|
||||||
|
|
||||||
|
var label := "" setget _set_label, _get_label
|
||||||
|
var texture : Texture = null setget _set_texture, _get_texture
|
||||||
|
|
||||||
|
#####################
|
||||||
|
# setters & getters #
|
||||||
|
#####################
|
||||||
|
func _set_label(label_ : String) -> void:
|
||||||
|
$label.text = label_
|
||||||
|
|
||||||
|
func _get_label() -> String:
|
||||||
|
return $label.text
|
||||||
|
|
||||||
|
func _set_texture(texture_ : Texture) -> void:
|
||||||
|
$texture.texture = texture_
|
||||||
|
|
||||||
|
func _get_texture() -> Texture:
|
||||||
|
return $texture.texture
|
@ -39,6 +39,18 @@ static func new_item_sorted(tree : Tree, parent : TreeItem, key : String, meta_c
|
|||||||
new_itm.set_metadata(meta_column, key)
|
new_itm.set_metadata(meta_column, key)
|
||||||
return new_itm
|
return new_itm
|
||||||
|
|
||||||
|
static func find_tree_item_with_meta(root : TreeItem, value, column := 0) -> TreeItem:
|
||||||
|
if root == null:
|
||||||
|
return null
|
||||||
|
elif root.get_metadata(column) == value:
|
||||||
|
return root
|
||||||
|
else:
|
||||||
|
var itm := find_tree_item_with_meta(root.get_next(), value, column)
|
||||||
|
if itm != null:
|
||||||
|
return itm
|
||||||
|
itm = find_tree_item_with_meta(root.get_children(), value, column)
|
||||||
|
return itm
|
||||||
|
|
||||||
static func copy_size(target : Control, source : Control) -> void:
|
static func copy_size(target : Control, source : Control) -> void:
|
||||||
target.rect_min_size = source.rect_min_size
|
target.rect_min_size = source.rect_min_size
|
||||||
target.rect_size = source.rect_size
|
target.rect_size = source.rect_size
|
||||||
|
@ -16,7 +16,7 @@ static func get_recent_places() -> Array:
|
|||||||
return GDBSettings.get_value(GDBConstants.SETTING_RECENT_PLACES, [])
|
return GDBSettings.get_value(GDBConstants.SETTING_RECENT_PLACES, [])
|
||||||
|
|
||||||
static func add_recent_place(place) -> void:
|
static func add_recent_place(place) -> void:
|
||||||
if place is UIB_FileAdapter.FileEntry:
|
if place is UIB_FilesystemAdapter.FileEntry:
|
||||||
add_recent_place(place._get_path())
|
add_recent_place(place._get_path())
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -32,14 +32,14 @@ static func get_favourite_places() -> Array:
|
|||||||
return GDBSettings.get_value(GDBConstants.SETTING_FAVOURITE_PLACES, [])
|
return GDBSettings.get_value(GDBConstants.SETTING_FAVOURITE_PLACES, [])
|
||||||
|
|
||||||
static func is_favourite_place(place) -> bool:
|
static func is_favourite_place(place) -> bool:
|
||||||
if place is UIB_FileAdapter.FileEntry:
|
if place is UIB_FilesystemAdapter.FileEntry:
|
||||||
return is_favourite_place(place._get_path())
|
return is_favourite_place(place._get_path())
|
||||||
|
|
||||||
assert(place is String)
|
assert(place is String)
|
||||||
return GDBSettings.array_has_value(GDBConstants.SETTING_FAVOURITE_PLACES, place)
|
return GDBSettings.array_has_value(GDBConstants.SETTING_FAVOURITE_PLACES, place)
|
||||||
|
|
||||||
static func add_favourite_place(place) -> void:
|
static func add_favourite_place(place) -> void:
|
||||||
if place is UIB_FileAdapter.FileEntry:
|
if place is UIB_FilesystemAdapter.FileEntry:
|
||||||
add_favourite_place(place._get_path())
|
add_favourite_place(place._get_path())
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ static func add_favourite_place(place) -> void:
|
|||||||
__get_state().emit_signal("favourite_places_changed")
|
__get_state().emit_signal("favourite_places_changed")
|
||||||
|
|
||||||
static func remove_favourite_place(place) -> void:
|
static func remove_favourite_place(place) -> void:
|
||||||
if place is UIB_FileAdapter.FileEntry:
|
if place is UIB_FilesystemAdapter.FileEntry:
|
||||||
remove_favourite_place(place._get_path())
|
remove_favourite_place(place._get_path())
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -4,19 +4,51 @@ extends Container
|
|||||||
class_name UIB_DynamicGridContainer
|
class_name UIB_DynamicGridContainer
|
||||||
|
|
||||||
var __DEFAULT_CONSTRAINTS = UIB_DynamicGridConstraints.new()
|
var __DEFAULT_CONSTRAINTS = UIB_DynamicGridConstraints.new()
|
||||||
|
const __META_CONSTRAINTS = "__uib_dynamic_grind_constraints__"
|
||||||
|
|
||||||
export(int, 1, 100) var columns := 1 setget _set_columns
|
export(int, 1, 100) var columns := 1 setget _set_columns
|
||||||
|
|
||||||
|
#############
|
||||||
|
# overrides #
|
||||||
|
#############
|
||||||
func _notification(what):
|
func _notification(what):
|
||||||
if what == NOTIFICATION_SORT_CHILDREN:
|
if what == NOTIFICATION_SORT_CHILDREN:
|
||||||
__sort_children()
|
__sort_children()
|
||||||
|
|
||||||
func __get_constraints(node : Node) -> UIB_DynamicGridConstraints:
|
################
|
||||||
|
# overridables #
|
||||||
|
################
|
||||||
|
func _get_constraints(node : Node) -> UIB_DynamicGridConstraints:
|
||||||
|
var constraints := get_existing_constraints(node)
|
||||||
|
return constraints if constraints else __DEFAULT_CONSTRAINTS
|
||||||
|
|
||||||
|
################
|
||||||
|
# public stuff #
|
||||||
|
################
|
||||||
|
static func get_existing_constraints(node : Node) -> UIB_DynamicGridConstraints:
|
||||||
|
if node.has_meta(__META_CONSTRAINTS):
|
||||||
|
return node.get_meta(__META_CONSTRAINTS).object
|
||||||
|
|
||||||
for child in node.get_children():
|
for child in node.get_children():
|
||||||
if child is UIB_DynamicGridConstraints:
|
if child is UIB_DynamicGridConstraints:
|
||||||
return child
|
return child
|
||||||
return __DEFAULT_CONSTRAINTS
|
return null
|
||||||
|
|
||||||
|
static func get_constraints(node : Node) -> UIB_DynamicGridConstraints:
|
||||||
|
var constraints := get_existing_constraints(node)
|
||||||
|
if constraints != null:
|
||||||
|
return constraints
|
||||||
|
|
||||||
|
if !node.has_meta(__META_CONSTRAINTS):
|
||||||
|
var wrapper := GDB_ReferenceWrapper.new()
|
||||||
|
wrapper.object = UIB_DynamicGridConstraints.new()
|
||||||
|
node.set_meta(__META_CONSTRAINTS, wrapper)
|
||||||
|
|
||||||
|
return node.get_meta(__META_CONSTRAINTS).object
|
||||||
|
|
||||||
|
#################
|
||||||
|
# private stuff #
|
||||||
|
#################
|
||||||
func __sort_children():
|
func __sort_children():
|
||||||
var column_widths := []
|
var column_widths := []
|
||||||
var column_expand := []
|
var column_expand := []
|
||||||
@ -32,7 +64,7 @@ func __sort_children():
|
|||||||
for child in get_children():
|
for child in get_children():
|
||||||
if !child is Control || !child.visible:
|
if !child is Control || !child.visible:
|
||||||
continue
|
continue
|
||||||
var constraints := __get_constraints(child)
|
var constraints := _get_constraints(child)
|
||||||
|
|
||||||
if col + constraints.colspan > columns:
|
if col + constraints.colspan > columns:
|
||||||
col = 0
|
col = 0
|
||||||
@ -67,7 +99,7 @@ func __sort_children():
|
|||||||
var row_height := 0.0
|
var row_height := 0.0
|
||||||
col = 0
|
col = 0
|
||||||
for child in row:
|
for child in row:
|
||||||
var constraints := __get_constraints(child)
|
var constraints := _get_constraints(child)
|
||||||
child.rect_position = pos
|
child.rect_position = pos
|
||||||
|
|
||||||
var width := 0.0
|
var width := 0.0
|
||||||
@ -89,6 +121,9 @@ func __sort_children():
|
|||||||
pos.x = 0.0
|
pos.x = 0.0
|
||||||
rect_min_size.y = pos.y
|
rect_min_size.y = pos.y
|
||||||
|
|
||||||
|
###########
|
||||||
|
# setters #
|
||||||
|
###########
|
||||||
func _set_columns(value : int):
|
func _set_columns(value : int):
|
||||||
if value != columns:
|
if value != columns:
|
||||||
columns = value
|
columns = value
|
||||||
|
116
scripts/types/controls/entity_tree.gd
Normal file
116
scripts/types/controls/entity_tree.gd
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
extends Tree
|
||||||
|
|
||||||
|
class_name UIB_EntityTree
|
||||||
|
|
||||||
|
export(Array, String) var column_ids := [].duplicate()
|
||||||
|
export(Array, String) var column_titles := [].duplicate()
|
||||||
|
export(NodePath) var selected_entity_adapter := ""
|
||||||
|
|
||||||
|
onready var __selected_entity_adapter := get_node_or_null(selected_entity_adapter) as GDB_DataAdapter
|
||||||
|
|
||||||
|
#############
|
||||||
|
# overrides #
|
||||||
|
#############
|
||||||
|
func _ready():
|
||||||
|
create_item() # invisible root
|
||||||
|
hide_root = true
|
||||||
|
columns = column_ids.size()
|
||||||
|
select_mode = SELECT_ROW
|
||||||
|
set_column_titles_visible(true)
|
||||||
|
|
||||||
|
for col in range(min(columns, column_titles.size())):
|
||||||
|
set_column_title(col, column_titles[col])
|
||||||
|
|
||||||
|
connect("item_selected", self, "_on_item_selected")
|
||||||
|
if __selected_entity_adapter != null:
|
||||||
|
__selected_entity_adapter.connect("data_changed", self, "_on_selected_entity_adapter_data_changed")
|
||||||
|
|
||||||
|
################
|
||||||
|
# public stuff #
|
||||||
|
################
|
||||||
|
func add_entity(entity : Object) -> void:
|
||||||
|
if !GDB_Entity.is_valid_entity(entity):
|
||||||
|
printerr("UIB_EntityTree: attempted to add invalid entity")
|
||||||
|
return
|
||||||
|
|
||||||
|
var itm := create_item()
|
||||||
|
itm.set_metadata(0, entity)
|
||||||
|
var col := 0
|
||||||
|
for id in column_ids:
|
||||||
|
var prop : Object = entity.get_property_by_id(id)
|
||||||
|
|
||||||
|
if prop == null:
|
||||||
|
col += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
itm.set_text(col, GDB_Property.get_prop_value_as_string(prop))
|
||||||
|
col += 1
|
||||||
|
|
||||||
|
GDBUtility.try_connect(prop, "value_changed", self, "_on_property_value_changed", [entity, id])
|
||||||
|
|
||||||
|
func select_entity(entity : Object) -> void:
|
||||||
|
if entity == null:
|
||||||
|
return # TODO: unselect?
|
||||||
|
var itm := __item_from_entity(entity)
|
||||||
|
if itm == null:
|
||||||
|
return # TODO: unselect?
|
||||||
|
itm.select(0)
|
||||||
|
|
||||||
|
func get_selected_entity() -> Object:
|
||||||
|
var entities := get_selected_entities()
|
||||||
|
if !entities.empty():
|
||||||
|
return entities[0]
|
||||||
|
return null
|
||||||
|
|
||||||
|
func get_selected_entities() -> Array: # n/a yet
|
||||||
|
var entities := []
|
||||||
|
var itm := get_selected()
|
||||||
|
|
||||||
|
while itm != null:
|
||||||
|
var entity_ := __entity_from_item(itm)
|
||||||
|
if entity_ != null:
|
||||||
|
entities.append(entity_)
|
||||||
|
itm = get_next_selected(itm)
|
||||||
|
return entities
|
||||||
|
|
||||||
|
#################
|
||||||
|
# private stuff #
|
||||||
|
#################
|
||||||
|
func __entity_from_item(itm : TreeItem) -> Object:
|
||||||
|
return itm.get_metadata(0) as Object
|
||||||
|
|
||||||
|
func __item_from_entity(entity : Object) -> TreeItem:
|
||||||
|
return GDBUIUtility.find_tree_item_with_meta(get_root(), entity)
|
||||||
|
|
||||||
|
func __update_row(entity : Object, column := ""):
|
||||||
|
if column == "":
|
||||||
|
for col in column_ids:
|
||||||
|
if col != "":
|
||||||
|
__update_row(entity, col)
|
||||||
|
return
|
||||||
|
|
||||||
|
var itm := __item_from_entity(entity)
|
||||||
|
var col_idx := column_ids.find(column)
|
||||||
|
|
||||||
|
if itm == null || col_idx < 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
var prop := entity.get_property_by_id(column) as Object
|
||||||
|
if prop == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
itm.set_text(col_idx, GDB_Property.get_prop_value_as_string(prop))
|
||||||
|
|
||||||
|
############
|
||||||
|
# handlers #
|
||||||
|
############
|
||||||
|
func _on_item_selected() -> void:
|
||||||
|
if __selected_entity_adapter != null:
|
||||||
|
__selected_entity_adapter.data = get_selected_entity()
|
||||||
|
|
||||||
|
func _on_selected_entity_adapter_data_changed() -> void:
|
||||||
|
if __selected_entity_adapter.data != get_selected_entity():
|
||||||
|
select_entity(__selected_entity_adapter.data)
|
||||||
|
|
||||||
|
func _on_property_value_changed(entity : Object, property_id : String) -> void:
|
||||||
|
__update_row(entity, property_id)
|
@ -46,7 +46,9 @@ class DetailsColumnType:
|
|||||||
func _get_name() -> String:
|
func _get_name() -> String:
|
||||||
return tr("Type")
|
return tr("Type")
|
||||||
func _get_value(entry) -> String:
|
func _get_value(entry) -> String:
|
||||||
if entry._is_folder():
|
if entry._is_link():
|
||||||
|
return tr("Link")
|
||||||
|
elif entry._is_folder():
|
||||||
return tr("Folder")
|
return tr("Folder")
|
||||||
else:
|
else:
|
||||||
return tr("File")
|
return tr("File")
|
||||||
@ -82,7 +84,7 @@ class DetailsColumnModifiedTime:
|
|||||||
return entry0._get_modified_time() < entry1._get_modified_time()
|
return entry0._get_modified_time() < entry1._get_modified_time()
|
||||||
|
|
||||||
class __ParentFolderEntry:
|
class __ParentFolderEntry:
|
||||||
extends UIB_FileAdapter.FileEntry
|
extends UIB_FilesystemAdapter.FileEntry
|
||||||
|
|
||||||
var real_entry
|
var real_entry
|
||||||
|
|
||||||
@ -99,11 +101,12 @@ const CHECKBOX_COLUMN_WIDTH = 25
|
|||||||
|
|
||||||
export(ViewMode) var view_mode = ViewMode.DETAILS setget _set_view_mode
|
export(ViewMode) var view_mode = ViewMode.DETAILS setget _set_view_mode
|
||||||
export(Checkable) var checkable = Checkable.NONE setget _set_checkable
|
export(Checkable) var checkable = Checkable.NONE setget _set_checkable
|
||||||
|
export(NodePath) var folder_adapter := ""
|
||||||
export var allow_navigation := true
|
export var allow_navigation := true
|
||||||
export var show_up_entry := true
|
export var show_up_entry := true
|
||||||
var adapter : UIB_FileAdapter setget _set_adapter
|
var adapter : UIB_FilesystemAdapter setget _set_adapter
|
||||||
var filter : UIB_FileFilter setget _set_filter
|
var filter : UIB_FileFilter setget _set_filter
|
||||||
var current_folder : UIB_FileAdapter.FileEntry setget _set_current_folder
|
var current_folder : UIB_FilesystemAdapter.FileEntry setget _set_current_folder
|
||||||
var details_columns := [
|
var details_columns := [
|
||||||
DetailsColumnName.new(),
|
DetailsColumnName.new(),
|
||||||
DetailsColumnType.new(),
|
DetailsColumnType.new(),
|
||||||
@ -113,13 +116,14 @@ var details_columns := [
|
|||||||
var __special_columns := []
|
var __special_columns := []
|
||||||
var __sort_column := 0
|
var __sort_column := 0
|
||||||
var __sort_reverse := false
|
var __sort_reverse := false
|
||||||
|
onready var __folder_adapter := get_node_or_null(folder_adapter) as GDB_DataAdapter
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
hide_root = true
|
hide_root = true
|
||||||
select_mode = Tree.SELECT_ROW
|
select_mode = Tree.SELECT_ROW
|
||||||
|
|
||||||
if adapter == null:
|
if adapter == null:
|
||||||
adapter = UIB_LocalFileAdapter.new()
|
adapter = UIB_LocalFilesystemAdapter.new()
|
||||||
|
|
||||||
if current_folder == null:
|
if current_folder == null:
|
||||||
current_folder = adapter._get_root()
|
current_folder = adapter._get_root()
|
||||||
@ -130,6 +134,13 @@ func _ready():
|
|||||||
connect("item_selected", self, "_on_item_selected")
|
connect("item_selected", self, "_on_item_selected")
|
||||||
connect("column_title_pressed", self, "_on_column_title_pressed")
|
connect("column_title_pressed", self, "_on_column_title_pressed")
|
||||||
|
|
||||||
|
if __folder_adapter != null:
|
||||||
|
__folder_adapter.connect("data_changed", self, "_on_folder_adapter_data_changed")
|
||||||
|
if __folder_adapter.data:
|
||||||
|
_set_current_folder(__folder_adapter.data)
|
||||||
|
else:
|
||||||
|
__folder_adapter.data = current_folder
|
||||||
|
|
||||||
#################
|
#################
|
||||||
# private stuff #
|
# private stuff #
|
||||||
#################
|
#################
|
||||||
@ -213,7 +224,7 @@ func _set_view_mode(value):
|
|||||||
view_mode = value
|
view_mode = value
|
||||||
__update_entries()
|
__update_entries()
|
||||||
|
|
||||||
func _set_adapter(value : UIB_FileAdapter):
|
func _set_adapter(value : UIB_FilesystemAdapter):
|
||||||
if value != adapter:
|
if value != adapter:
|
||||||
adapter = value
|
adapter = value
|
||||||
__update_entries()
|
__update_entries()
|
||||||
@ -223,11 +234,13 @@ func _set_filter(value : UIB_FileFilter):
|
|||||||
filter = value
|
filter = value
|
||||||
__update_entries()
|
__update_entries()
|
||||||
|
|
||||||
func _set_current_folder(value : UIB_FileAdapter.FileEntry):
|
func _set_current_folder(value : UIB_FilesystemAdapter.FileEntry):
|
||||||
if value != current_folder:
|
if value != current_folder:
|
||||||
current_folder = value
|
current_folder = value
|
||||||
emit_signal("current_folder_changed")
|
emit_signal("current_folder_changed")
|
||||||
__update_entries()
|
__update_entries()
|
||||||
|
if __folder_adapter != null:
|
||||||
|
__folder_adapter.data = current_folder
|
||||||
|
|
||||||
func _set_checkable(value):
|
func _set_checkable(value):
|
||||||
if value != checkable:
|
if value != checkable:
|
||||||
@ -272,6 +285,9 @@ func _on_column_title_pressed(idx : int):
|
|||||||
__sort_reverse = false
|
__sort_reverse = false
|
||||||
__update_entries()
|
__update_entries()
|
||||||
|
|
||||||
|
func _on_folder_adapter_data_changed() -> void:
|
||||||
|
_set_current_folder(__folder_adapter.data)
|
||||||
|
|
||||||
###########
|
###########
|
||||||
# signals #
|
# signals #
|
||||||
###########
|
###########
|
||||||
|
81
scripts/types/controls/folder_default_button.gd
Normal file
81
scripts/types/controls/folder_default_button.gd
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
extends ToolButton
|
||||||
|
|
||||||
|
class_name UIB_FolderDefaultButton
|
||||||
|
|
||||||
|
enum Type {
|
||||||
|
FOLDER_UP,
|
||||||
|
FAVOURITE
|
||||||
|
}
|
||||||
|
|
||||||
|
export(Type) var type := Type.FAVOURITE
|
||||||
|
export(NodePath) var folder_adapter := ""
|
||||||
|
export(Texture) var icon_active : Texture = null
|
||||||
|
|
||||||
|
var current_folder : UIB_FilesystemAdapter.FileEntry = null
|
||||||
|
|
||||||
|
onready var __folder_adapter := get_node_or_null(folder_adapter) as GDB_DataAdapter
|
||||||
|
onready var __icon_inactive = icon
|
||||||
|
|
||||||
|
#############
|
||||||
|
# overrides #
|
||||||
|
#############
|
||||||
|
func _ready() -> void:
|
||||||
|
if __folder_adapter == null:
|
||||||
|
printerr("This UIB_FolderDefaultButton is missing a folder_adapter, it will do nothing.")
|
||||||
|
disabled = true
|
||||||
|
return
|
||||||
|
|
||||||
|
if __folder_adapter.data:
|
||||||
|
__set_current_folder(__folder_adapter.data)
|
||||||
|
|
||||||
|
__update_disabled()
|
||||||
|
|
||||||
|
__folder_adapter.connect("data_changed", self, "_on_folder_adapter_data_changed")
|
||||||
|
GDBUX.connect_static("favourite_places_changed", self, "_on_favourite_places_changed")
|
||||||
|
|
||||||
|
func _pressed() -> void:
|
||||||
|
match type:
|
||||||
|
Type.FOLDER_UP:
|
||||||
|
__set_current_folder(current_folder._get_parent())
|
||||||
|
Type.FAVOURITE:
|
||||||
|
if GDBUX.is_favourite_place(current_folder):
|
||||||
|
GDBUX.remove_favourite_place(current_folder)
|
||||||
|
else:
|
||||||
|
GDBUX.add_favourite_place(current_folder)
|
||||||
|
|
||||||
|
#################
|
||||||
|
# private stuff #
|
||||||
|
#################
|
||||||
|
func __set_current_folder(value : UIB_FilesystemAdapter.FileEntry) -> void:
|
||||||
|
if value != current_folder:
|
||||||
|
current_folder = value
|
||||||
|
__folder_adapter.data = current_folder
|
||||||
|
__update_disabled()
|
||||||
|
__update_icon()
|
||||||
|
|
||||||
|
func __update_disabled() -> void:
|
||||||
|
if current_folder == null:
|
||||||
|
disabled = true
|
||||||
|
return
|
||||||
|
|
||||||
|
match type:
|
||||||
|
Type.FOLDER_UP:
|
||||||
|
disabled = (current_folder._get_parent() == null)
|
||||||
|
Type.FAVOURITE:
|
||||||
|
disabled = false
|
||||||
|
|
||||||
|
func __update_icon():
|
||||||
|
if type == Type.FAVOURITE:
|
||||||
|
if GDBUX.is_favourite_place(current_folder):
|
||||||
|
icon = icon_active
|
||||||
|
else:
|
||||||
|
icon = __icon_inactive
|
||||||
|
|
||||||
|
############
|
||||||
|
# handlers #
|
||||||
|
############
|
||||||
|
func _on_folder_adapter_data_changed() -> void:
|
||||||
|
__set_current_folder(__folder_adapter.data)
|
||||||
|
|
||||||
|
func _on_favourite_places_changed() -> void:
|
||||||
|
__update_icon()
|
@ -2,9 +2,13 @@ extends LineEdit
|
|||||||
|
|
||||||
class_name UIB_FolderEdit
|
class_name UIB_FolderEdit
|
||||||
|
|
||||||
|
export(NodePath) var folder_adapter := ""
|
||||||
|
|
||||||
var suggestion_popup := UIB_SuggestionPopup.new()
|
var suggestion_popup := UIB_SuggestionPopup.new()
|
||||||
var adapter : UIB_FileAdapter
|
var adapter : UIB_FilesystemAdapter
|
||||||
var current_folder : UIB_FileAdapter.FileEntry setget _set_current_folder
|
var current_folder : UIB_FilesystemAdapter.FileEntry setget _set_current_folder
|
||||||
|
|
||||||
|
onready var __folder_adapter := get_node_or_null(folder_adapter) as GDB_DataAdapter
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# overrides #
|
# overrides #
|
||||||
@ -14,6 +18,16 @@ func _ready():
|
|||||||
connect("text_changed", self, "_on_text_changed")
|
connect("text_changed", self, "_on_text_changed")
|
||||||
connect("text_entered", self, "_on_text_entered")
|
connect("text_entered", self, "_on_text_entered")
|
||||||
|
|
||||||
|
if adapter == null:
|
||||||
|
adapter = UIB_LocalFilesystemAdapter.new()
|
||||||
|
|
||||||
|
if __folder_adapter:
|
||||||
|
__folder_adapter.connect("data_changed", self, "_on_folder_adapter_data_changed")
|
||||||
|
if __folder_adapter.data:
|
||||||
|
_set_current_folder(__folder_adapter.data)
|
||||||
|
else:
|
||||||
|
__folder_adapter.data = current_folder
|
||||||
|
|
||||||
#################
|
#################
|
||||||
# private stuff #
|
# private stuff #
|
||||||
#################
|
#################
|
||||||
@ -59,6 +73,8 @@ func _set_current_folder(value):
|
|||||||
current_folder = value
|
current_folder = value
|
||||||
text = current_folder._get_path()
|
text = current_folder._get_path()
|
||||||
emit_signal("current_folder_changed")
|
emit_signal("current_folder_changed")
|
||||||
|
if __folder_adapter != null:
|
||||||
|
__folder_adapter.data = current_folder
|
||||||
|
|
||||||
############
|
############
|
||||||
# handlers #
|
# handlers #
|
||||||
@ -73,6 +89,9 @@ func _on_suggestion_accepted(suggestion):
|
|||||||
__update_current_folder()
|
__update_current_folder()
|
||||||
__update_suggestions()
|
__update_suggestions()
|
||||||
|
|
||||||
|
func _on_folder_adapter_data_changed() -> void:
|
||||||
|
_set_current_folder(__folder_adapter.data)
|
||||||
|
|
||||||
###########
|
###########
|
||||||
# signals #
|
# signals #
|
||||||
###########
|
###########
|
||||||
|
@ -13,9 +13,9 @@ export(DefaultFolder) var default_folder = DefaultFolder.HOME
|
|||||||
export(NodePath) var folder_up_action
|
export(NodePath) var folder_up_action
|
||||||
export(NodePath) var folder_favourite_action
|
export(NodePath) var folder_favourite_action
|
||||||
export var custom_default_folder := ""
|
export var custom_default_folder := ""
|
||||||
var adapter : UIB_FileAdapter = UIB_LocalFileAdapter.new()
|
var adapter : UIB_FilesystemAdapter = UIB_LocalFilesystemAdapter.new()
|
||||||
|
|
||||||
var current_folder : UIB_FileAdapter.FileEntry setget set_current_folder
|
var current_folder : UIB_FilesystemAdapter.FileEntry setget set_current_folder
|
||||||
var __folder_up_action : UIB_SimpleAction
|
var __folder_up_action : UIB_SimpleAction
|
||||||
var __folder_favourite_action : UIB_SimpleAction
|
var __folder_favourite_action : UIB_SimpleAction
|
||||||
var __nodes := []
|
var __nodes := []
|
||||||
|
@ -18,17 +18,16 @@ class __DefaultItem:
|
|||||||
icon = icon_
|
icon = icon_
|
||||||
label = label_
|
label = label_
|
||||||
|
|
||||||
var __DEFAULT_ITEMS := [
|
|
||||||
__DefaultItem.new(GDBFsUtil.get_home_folder(), preload("res://addons/de.mewin.gduibasics/images/home32.svg"), tr("Home"))
|
|
||||||
]
|
|
||||||
|
|
||||||
export(Mode) var mode = Mode.DEFAULT setget _set_mode
|
export(Mode) var mode = Mode.DEFAULT setget _set_mode
|
||||||
export(Array, String) var places := [] setget _set_places
|
export(Array, String) var places := [] setget _set_places
|
||||||
export(Array, Texture) var icons := []
|
export(Array, Texture) var icons := []
|
||||||
export(Array, String) var names := []
|
export(Array, String) var names := []
|
||||||
|
export(NodePath) var folder_adapter := ""
|
||||||
|
|
||||||
var adapter : UIB_FileAdapter
|
var adapter : UIB_FilesystemAdapter
|
||||||
var current_folder : UIB_FileAdapter.FileEntry setget _set_current_folder
|
var current_folder : UIB_FilesystemAdapter.FileEntry setget _set_current_folder
|
||||||
|
|
||||||
|
onready var __folder_adapter := get_node_or_null(folder_adapter) as GDB_DataAdapter
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# overrides #
|
# overrides #
|
||||||
@ -36,6 +35,16 @@ var current_folder : UIB_FileAdapter.FileEntry setget _set_current_folder
|
|||||||
func _ready():
|
func _ready():
|
||||||
call_deferred("__update_items")
|
call_deferred("__update_items")
|
||||||
|
|
||||||
|
if adapter == null:
|
||||||
|
adapter = UIB_LocalFilesystemAdapter.new()
|
||||||
|
|
||||||
|
if __folder_adapter:
|
||||||
|
__folder_adapter.connect("data_changed", self, "_on_folder_adapter_data_changed")
|
||||||
|
if __folder_adapter.data:
|
||||||
|
_set_current_folder(__folder_adapter.data)
|
||||||
|
else:
|
||||||
|
__folder_adapter.data = current_folder
|
||||||
|
|
||||||
connect("item_activated", self, "_on_item_activated")
|
connect("item_activated", self, "_on_item_activated")
|
||||||
GDBUX.connect_static("favourite_places_changed", self, "_on_favourite_places_changed")
|
GDBUX.connect_static("favourite_places_changed", self, "_on_favourite_places_changed")
|
||||||
|
|
||||||
@ -44,8 +53,6 @@ func _ready():
|
|||||||
#################
|
#################
|
||||||
func __update_items():
|
func __update_items():
|
||||||
clear()
|
clear()
|
||||||
if !adapter:
|
|
||||||
return
|
|
||||||
|
|
||||||
match mode:
|
match mode:
|
||||||
Mode.DEFAULT:
|
Mode.DEFAULT:
|
||||||
@ -54,7 +61,7 @@ func __update_items():
|
|||||||
__add_custom_places()
|
__add_custom_places()
|
||||||
|
|
||||||
func __add_default_places():
|
func __add_default_places():
|
||||||
for default_place in __DEFAULT_ITEMS:
|
for default_place in __get_default_places():
|
||||||
var folder := adapter._get_file(default_place.place)
|
var folder := adapter._get_file(default_place.place)
|
||||||
if !folder || !folder._is_folder():
|
if !folder || !folder._is_folder():
|
||||||
continue
|
continue
|
||||||
@ -75,7 +82,7 @@ func __add_custom_places():
|
|||||||
var icon : Texture = icons[i] if i < icons.size() else null
|
var icon : Texture = icons[i] if i < icons.size() else null
|
||||||
__add_place(folder, icon, label)
|
__add_place(folder, icon, label)
|
||||||
|
|
||||||
func __add_place(folder : UIB_FileAdapter.FileEntry, icon : Texture, label := ""):
|
func __add_place(folder : UIB_FilesystemAdapter.FileEntry, icon : Texture, label := ""):
|
||||||
if !icon:
|
if !icon:
|
||||||
icon = preload("res://addons/de.mewin.gduibasics/images/folder32.svg")
|
icon = preload("res://addons/de.mewin.gduibasics/images/folder32.svg")
|
||||||
if !label:
|
if !label:
|
||||||
@ -89,6 +96,14 @@ func __select_current_folder():
|
|||||||
if get_item_metadata(i)._get_path() == current_folder._get_path():
|
if get_item_metadata(i)._get_path() == current_folder._get_path():
|
||||||
select(i)
|
select(i)
|
||||||
|
|
||||||
|
func __get_default_places() -> Array:
|
||||||
|
var places := [
|
||||||
|
__DefaultItem.new(GDBFsUtil.get_home_folder(), preload("res://addons/de.mewin.gduibasics/images/home32.svg"), tr("Home"))
|
||||||
|
]
|
||||||
|
for special_folder in GDBFsUtil.get_special_folders():
|
||||||
|
places.append(__DefaultItem.new(special_folder.path, preload("res://addons/de.mewin.gduibasics/images/folder32.svg"), special_folder.name))
|
||||||
|
return places
|
||||||
|
|
||||||
###########
|
###########
|
||||||
# setters #
|
# setters #
|
||||||
###########
|
###########
|
||||||
@ -106,6 +121,8 @@ func _set_current_folder(value):
|
|||||||
if value != current_folder:
|
if value != current_folder:
|
||||||
current_folder = value
|
current_folder = value
|
||||||
emit_signal("current_folder_changed")
|
emit_signal("current_folder_changed")
|
||||||
|
if __folder_adapter:
|
||||||
|
__folder_adapter.data = current_folder
|
||||||
|
|
||||||
############
|
############
|
||||||
# handlers #
|
# handlers #
|
||||||
@ -116,6 +133,10 @@ func _on_item_activated(idx):
|
|||||||
func _on_favourite_places_changed():
|
func _on_favourite_places_changed():
|
||||||
if mode == Mode.DEFAULT:
|
if mode == Mode.DEFAULT:
|
||||||
__update_items()
|
__update_items()
|
||||||
|
|
||||||
|
func _on_folder_adapter_data_changed() -> void:
|
||||||
|
_set_current_folder(__folder_adapter.data)
|
||||||
|
|
||||||
###########
|
###########
|
||||||
# signals #
|
# signals #
|
||||||
###########
|
###########
|
||||||
|
51
scripts/types/controls/property_check_box.gd
Normal file
51
scripts/types/controls/property_check_box.gd
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
extends CheckBox
|
||||||
|
|
||||||
|
class_name UIB_PropertyCheckBox
|
||||||
|
|
||||||
|
var property : Object = null setget _set_property
|
||||||
|
|
||||||
|
#############
|
||||||
|
# overrides #
|
||||||
|
#############
|
||||||
|
func _pressed() -> void:
|
||||||
|
if property == null:
|
||||||
|
return
|
||||||
|
property.set_value(pressed)
|
||||||
|
|
||||||
|
#################
|
||||||
|
# private stuff #
|
||||||
|
#################
|
||||||
|
func __init_property() -> void:
|
||||||
|
text = __text_from_property()
|
||||||
|
pressed = property.get_value() if property != null else false
|
||||||
|
disabled = (property == null)
|
||||||
|
|
||||||
|
if property != null:
|
||||||
|
GDBUtility.try_connect(property, "value_changed", self, "_on_property_value_changed")
|
||||||
|
|
||||||
|
func __text_from_property() -> String:
|
||||||
|
if property == null:
|
||||||
|
return ""
|
||||||
|
return property.get_name()
|
||||||
|
|
||||||
|
###########
|
||||||
|
# setters #
|
||||||
|
###########
|
||||||
|
func _set_property(property_ : Object) -> void:
|
||||||
|
if property_ != null && (!GDB_Property.is_valid_property(property_) || property_.get_type() != TYPE_BOOL):
|
||||||
|
printerr("Attempting to set invalid property in UIB_PropertyCheckBox.")
|
||||||
|
return
|
||||||
|
|
||||||
|
if property_ != property:
|
||||||
|
if property:
|
||||||
|
GDBUtility.disconnect_all(property, self)
|
||||||
|
property = property_
|
||||||
|
__init_property()
|
||||||
|
|
||||||
|
############
|
||||||
|
# handlers #
|
||||||
|
############
|
||||||
|
func _on_property_value_changed() -> void:
|
||||||
|
var value = property.get_value()
|
||||||
|
if value != pressed:
|
||||||
|
pressed = value
|
169
scripts/types/controls/property_list.gd
Normal file
169
scripts/types/controls/property_list.gd
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
extends UIB_DynamicGridContainer
|
||||||
|
|
||||||
|
class_name UIB_PropertyList
|
||||||
|
|
||||||
|
export(NodePath) var entity_adapter := ""
|
||||||
|
|
||||||
|
var entity : Object = null setget _set_entity
|
||||||
|
var _properties := [].duplicate()
|
||||||
|
var __controls_per_property := [].duplicate()
|
||||||
|
onready var __entity_adapter := get_node_or_null(entity_adapter) as GDB_DataAdapter
|
||||||
|
|
||||||
|
#############
|
||||||
|
# overrides #
|
||||||
|
#############
|
||||||
|
func _ready() -> void:
|
||||||
|
self.columns = 2
|
||||||
|
|
||||||
|
if __entity_adapter != null:
|
||||||
|
__entity_adapter.connect("data_changed", self, "_on_entity_adapter_data_changed")
|
||||||
|
|
||||||
|
################
|
||||||
|
# overridables #
|
||||||
|
################
|
||||||
|
func _make_controls(property : Object) -> Array:
|
||||||
|
match property.get_type():
|
||||||
|
GDB_Property.TYPE_HEADER:
|
||||||
|
return _make_header(property)
|
||||||
|
TYPE_INT, TYPE_REAL, TYPE_STRING:
|
||||||
|
return _make_controls_simple(property)
|
||||||
|
TYPE_BOOL:
|
||||||
|
return _make_controls_bool(property)
|
||||||
|
_:
|
||||||
|
return []
|
||||||
|
|
||||||
|
func _make_header(property : Object) -> Array:
|
||||||
|
assert(property.get_type() == GDB_Property.TYPE_HEADER)
|
||||||
|
var header := preload("res://addons/de.mewin.gduibasics/scenes/property_list/header.tscn").instance()
|
||||||
|
header.label = property.get_name()
|
||||||
|
header.texture = GDB_Property.get_prop_icon(property)
|
||||||
|
get_constraints(header).colspan = self.columns
|
||||||
|
return [header]
|
||||||
|
|
||||||
|
func _make_controls_simple(property : Object) -> Array:
|
||||||
|
var label := preload("res://addons/de.mewin.gduibasics/scenes/property_list/property_label.tscn").instance()
|
||||||
|
label.label = property.get_name()
|
||||||
|
label.texture = GDB_Property.get_prop_icon(property)
|
||||||
|
|
||||||
|
var edit := UIB_SimplePropertyEdit.new()
|
||||||
|
edit.property = property
|
||||||
|
edit.size_flags_horizontal |= SIZE_EXPAND
|
||||||
|
|
||||||
|
return [
|
||||||
|
label, edit
|
||||||
|
]
|
||||||
|
|
||||||
|
func _make_controls_bool(property : Object) -> Array:
|
||||||
|
var checkbox := UIB_PropertyCheckBox.new()
|
||||||
|
checkbox.property = property
|
||||||
|
checkbox.size_flags_horizontal |= SIZE_EXPAND
|
||||||
|
get_constraints(checkbox).colspan = self.columns
|
||||||
|
return [
|
||||||
|
checkbox
|
||||||
|
]
|
||||||
|
|
||||||
|
################
|
||||||
|
# public stuff #
|
||||||
|
################
|
||||||
|
func add_property(property : Object, insert_before := -1) -> void: # no type to allow ducktyping
|
||||||
|
if find_property(property) >= 0:
|
||||||
|
return
|
||||||
|
if !GDB_Property.is_valid_property(property):
|
||||||
|
printerr("Attempting to add invalid property object to property list: ", property)
|
||||||
|
return
|
||||||
|
|
||||||
|
var control_insert_index := -1
|
||||||
|
var insert_index : int
|
||||||
|
|
||||||
|
if insert_before < 0:
|
||||||
|
insert_index = _properties.size()
|
||||||
|
else:
|
||||||
|
insert_index = min(insert_index, _properties.size())
|
||||||
|
control_insert_index = __find_control_index_before(insert_index)
|
||||||
|
_properties.insert(insert_index, property)
|
||||||
|
|
||||||
|
# create controls
|
||||||
|
var controls := _make_controls(property)
|
||||||
|
__controls_per_property.insert(insert_index, controls)
|
||||||
|
|
||||||
|
for control in controls:
|
||||||
|
add_child(control)
|
||||||
|
|
||||||
|
if control_insert_index >= 0:
|
||||||
|
for control in controls:
|
||||||
|
move_child(control, control_insert_index)
|
||||||
|
control_insert_index += 1
|
||||||
|
|
||||||
|
emit_signal("property_added", insert_index)
|
||||||
|
|
||||||
|
func remove_property(property : Object) -> bool:
|
||||||
|
var index := find_property(property)
|
||||||
|
if index < 0:
|
||||||
|
return false
|
||||||
|
|
||||||
|
# remove actual property
|
||||||
|
GDBUtility.disconnect_all(property, self)
|
||||||
|
_properties.remove(index)
|
||||||
|
|
||||||
|
# remove controls
|
||||||
|
for control in __controls_per_property[index]:
|
||||||
|
control.queue_free()
|
||||||
|
__controls_per_property.remove(index)
|
||||||
|
|
||||||
|
emit_signal("property_removed", property)
|
||||||
|
return true
|
||||||
|
|
||||||
|
func find_property(property : Object) -> int:
|
||||||
|
return _properties.find(property)
|
||||||
|
|
||||||
|
func clear_properties() -> void:
|
||||||
|
_properties.clear()
|
||||||
|
__controls_per_property.clear()
|
||||||
|
|
||||||
|
for child in get_children():
|
||||||
|
child.queue_free()
|
||||||
|
|
||||||
|
#################
|
||||||
|
# private stuff #
|
||||||
|
#################
|
||||||
|
func __find_control_index_before(index : int) -> int:
|
||||||
|
if index >= __controls_per_property.size():
|
||||||
|
return -1
|
||||||
|
var controls : Array = __controls_per_property[index]
|
||||||
|
if controls.empty():
|
||||||
|
return __find_control_index_before(index + 1)
|
||||||
|
return controls[0].get_position_in_parent()
|
||||||
|
|
||||||
|
func __init_entity() -> void:
|
||||||
|
clear_properties()
|
||||||
|
if entity == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
for property in entity.get_properties():
|
||||||
|
add_property(property)
|
||||||
|
|
||||||
|
###########
|
||||||
|
# setters #
|
||||||
|
###########
|
||||||
|
func _set_entity(entity_ : Object) -> void:
|
||||||
|
if entity_ != null && !GDB_Entity.is_valid_entity(entity_):
|
||||||
|
printerr("Attempting to set invalid entity in UIB_PropertyList.")
|
||||||
|
return
|
||||||
|
|
||||||
|
if entity_ != entity:
|
||||||
|
entity = entity_
|
||||||
|
if __entity_adapter != null:
|
||||||
|
__entity_adapter.data = entity
|
||||||
|
__init_entity()
|
||||||
|
|
||||||
|
############
|
||||||
|
# handlers #
|
||||||
|
############
|
||||||
|
func _on_entity_adapter_data_changed() -> void:
|
||||||
|
_set_entity(__entity_adapter.data)
|
||||||
|
|
||||||
|
###########
|
||||||
|
# signals #
|
||||||
|
###########
|
||||||
|
signal property_added(index)
|
||||||
|
signal property_removed(index)
|
@ -6,6 +6,7 @@ class_name UIB_RecentPlacesList
|
|||||||
# overrides #
|
# overrides #
|
||||||
#############
|
#############
|
||||||
func _ready():
|
func _ready():
|
||||||
|
mode = Mode.CUSTOM
|
||||||
places = GDBSettings.get_value(GDBConstants.SETTING_RECENT_PLACES, [])
|
places = GDBSettings.get_value(GDBConstants.SETTING_RECENT_PLACES, [])
|
||||||
|
|
||||||
GDBSettings.connect_static("setting_changed", self, "_on_setting_changed")
|
GDBSettings.connect_static("setting_changed", self, "_on_setting_changed")
|
||||||
|
102
scripts/types/controls/simple_property_edit.gd
Normal file
102
scripts/types/controls/simple_property_edit.gd
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
extends LineEdit
|
||||||
|
|
||||||
|
class_name UIB_SimplePropertyEdit
|
||||||
|
|
||||||
|
var property : Object = null setget _set_property
|
||||||
|
|
||||||
|
var __caret_pos := 0
|
||||||
|
var __last_valid_text := ""
|
||||||
|
|
||||||
|
#############
|
||||||
|
# overrides #
|
||||||
|
#############
|
||||||
|
func _ready() -> void:
|
||||||
|
connect("text_changed", self, "_on_text_changed")
|
||||||
|
|
||||||
|
func _gui_input(event : InputEvent) -> void:
|
||||||
|
__caret_pos = caret_position
|
||||||
|
|
||||||
|
#################
|
||||||
|
# private stuff #
|
||||||
|
#################
|
||||||
|
func __init_property() -> void:
|
||||||
|
text = __text_from_property()
|
||||||
|
editable = (property != null)
|
||||||
|
__validate_text()
|
||||||
|
|
||||||
|
if property != null:
|
||||||
|
GDBUtility.try_connect(property, "value_changed", self, "_on_property_value_changed")
|
||||||
|
|
||||||
|
func __text_from_property() -> String:
|
||||||
|
if property == null:
|
||||||
|
return ""
|
||||||
|
match property.get_type():
|
||||||
|
TYPE_INT, TYPE_REAL:
|
||||||
|
return str(property.get_value())
|
||||||
|
TYPE_STRING:
|
||||||
|
return property.get_value()
|
||||||
|
_:
|
||||||
|
printerr("UIB_SimplePropertyEdit: unsupported property type: %s" % GDBUtility.type_name(property.get_type()))
|
||||||
|
return ""
|
||||||
|
|
||||||
|
func __text_to_property() -> bool:
|
||||||
|
if property == null:
|
||||||
|
return false
|
||||||
|
var value
|
||||||
|
match property.get_type():
|
||||||
|
TYPE_INT:
|
||||||
|
value = int(text)
|
||||||
|
TYPE_REAL:
|
||||||
|
value = float(text)
|
||||||
|
TYPE_STRING:
|
||||||
|
value = text
|
||||||
|
_:
|
||||||
|
printerr("UIB_SimplePropertyEdit: unsupported property type: %s" % GDBUtility.type_name(property.get_type()))
|
||||||
|
return false
|
||||||
|
if !GDB_Property.is_prop_value_valid(property, value):
|
||||||
|
return false
|
||||||
|
property.set_value(value)
|
||||||
|
return true
|
||||||
|
|
||||||
|
func __is_text_valid() -> bool:
|
||||||
|
if property == null:
|
||||||
|
return false
|
||||||
|
match property.get_type():
|
||||||
|
TYPE_INT:
|
||||||
|
return text == "" || text.is_valid_integer()
|
||||||
|
TYPE_REAL:
|
||||||
|
return text == "" || text.is_valid_float()
|
||||||
|
return true
|
||||||
|
|
||||||
|
func __validate_text() -> void:
|
||||||
|
if !__is_text_valid() || !__text_to_property():
|
||||||
|
# var old_caret := caret_position
|
||||||
|
text = __last_valid_text
|
||||||
|
caret_position = __caret_pos
|
||||||
|
else:
|
||||||
|
__last_valid_text = text
|
||||||
|
|
||||||
|
###########
|
||||||
|
# setters #
|
||||||
|
###########
|
||||||
|
func _set_property(property_ : Object) -> void:
|
||||||
|
if property_ != null && !GDB_Property.is_valid_property(property_):
|
||||||
|
printerr("Attempting to set invalid property in UIB_SimplePropertyEdit.")
|
||||||
|
return
|
||||||
|
|
||||||
|
if property_ != property:
|
||||||
|
if property:
|
||||||
|
GDBUtility.disconnect_all(property, self)
|
||||||
|
property = property_
|
||||||
|
__init_property()
|
||||||
|
|
||||||
|
############
|
||||||
|
# handlers #
|
||||||
|
############
|
||||||
|
func _on_text_changed(new_text : String) -> void:
|
||||||
|
__validate_text()
|
||||||
|
|
||||||
|
func _on_property_value_changed() -> void:
|
||||||
|
var new_text := __text_from_property()
|
||||||
|
if new_text != text:
|
||||||
|
text = new_text
|
@ -1,6 +1,6 @@
|
|||||||
extends Reference
|
extends Reference
|
||||||
|
|
||||||
class_name UIB_FileAdapter
|
class_name UIB_FilesystemAdapter
|
||||||
|
|
||||||
class FileEntry:
|
class FileEntry:
|
||||||
func _is_folder() -> bool:
|
func _is_folder() -> bool:
|
@ -1,11 +1,11 @@
|
|||||||
extends UIB_FileAdapter
|
extends UIB_FilesystemAdapter
|
||||||
|
|
||||||
class_name UIB_LocalFileAdapter
|
class_name UIB_LocalFilesystemAdapter
|
||||||
|
|
||||||
var __dir = Directory.new()
|
var __dir = Directory.new()
|
||||||
|
|
||||||
class LocalFileEntry:
|
class LocalFileEntry:
|
||||||
extends UIB_FileAdapter.FileEntry
|
extends UIB_FilesystemAdapter.FileEntry
|
||||||
|
|
||||||
var path : String
|
var path : String
|
||||||
var is_link : bool
|
var is_link : bool
|
||||||
@ -30,6 +30,7 @@ class LocalFileEntry:
|
|||||||
if !is_folder:
|
if !is_folder:
|
||||||
return []
|
return []
|
||||||
var dir := Directory.new()
|
var dir := Directory.new()
|
||||||
|
var file := File.new()
|
||||||
if dir.open(path + "/") != OK:
|
if dir.open(path + "/") != OK:
|
||||||
return []
|
return []
|
||||||
if dir.list_dir_begin(true) != OK:
|
if dir.list_dir_begin(true) != OK:
|
||||||
@ -59,7 +60,7 @@ class LocalFileEntry:
|
|||||||
modified_time = __calc_modified_time()
|
modified_time = __calc_modified_time()
|
||||||
return modified_time
|
return modified_time
|
||||||
|
|
||||||
func _get_parent() -> UIB_FileAdapter.FileEntry:
|
func _get_parent() -> UIB_FilesystemAdapter.FileEntry:
|
||||||
var parent_path := path.get_base_dir()
|
var parent_path := path.get_base_dir()
|
||||||
if parent_path && parent_path != path:
|
if parent_path && parent_path != path:
|
||||||
return LocalFileEntry.new(parent_path, false, true)
|
return LocalFileEntry.new(parent_path, false, true)
|
||||||
@ -97,7 +98,7 @@ func _get_file(path : String) -> FileEntry:
|
|||||||
else:
|
else:
|
||||||
return null
|
return null
|
||||||
|
|
||||||
func _get_root() -> UIB_FileAdapter.FileEntry:
|
func _get_root() -> UIB_FilesystemAdapter.FileEntry:
|
||||||
return _get_file("/")
|
return _get_file("/")
|
||||||
|
|
||||||
func _get_drives() -> Array:
|
func _get_drives() -> Array:
|
8
styles/property_list_header.tres
Normal file
8
styles/property_list_header.tres
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[gd_resource type="StyleBoxFlat" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
bg_color = Color( 0, 0, 0, 0.627451 )
|
||||||
|
corner_radius_top_left = 2
|
||||||
|
corner_radius_top_right = 2
|
||||||
|
corner_radius_bottom_right = 2
|
||||||
|
corner_radius_bottom_left = 2
|
Loading…
x
Reference in New Issue
Block a user