From 46dfbd451578d9aa3ecea2fc8fbdc95b4b3ada60 Mon Sep 17 00:00:00 2001 From: William Edwards Date: Thu, 27 Jul 2023 22:18:06 -0700 Subject: [PATCH] Start work on file manager --- core/systems/file/file_object.gd | 4 ++ core/systems/file/filesystem_object.gd | 23 ++++++++ core/ui/components/file_manager.gd | 25 +++++++++ core/ui/components/file_manager.tscn | 73 ++++++++++++++++++++++++++ 4 files changed, 125 insertions(+) create mode 100644 core/systems/file/file_object.gd create mode 100644 core/systems/file/filesystem_object.gd create mode 100644 core/ui/components/file_manager.gd create mode 100644 core/ui/components/file_manager.tscn diff --git a/core/systems/file/file_object.gd b/core/systems/file/file_object.gd new file mode 100644 index 000000000..179f4cf3b --- /dev/null +++ b/core/systems/file/file_object.gd @@ -0,0 +1,4 @@ +extends FilesystemObject +class_name FileObject + + diff --git a/core/systems/file/filesystem_object.gd b/core/systems/file/filesystem_object.gd new file mode 100644 index 000000000..ab937d2ef --- /dev/null +++ b/core/systems/file/filesystem_object.gd @@ -0,0 +1,23 @@ +extends RefCounted +class_name FilesystemObject + +var path: String + + +func _init(path_to: String) -> void: + path = path_to + + +## Returns the mime type of the given filesystem object +func get_mime_type() -> String: + var cmd := Command.new("xdg-mime", ["query", "filetype", path]) + var code := await cmd.execute() + if code != OK: + return "" + + return cmd.stdout + + +## Return the icon texture for this node +func get_icon() -> Texture2D: + return null diff --git a/core/ui/components/file_manager.gd b/core/ui/components/file_manager.gd new file mode 100644 index 000000000..c26baafde --- /dev/null +++ b/core/ui/components/file_manager.gd @@ -0,0 +1,25 @@ +extends Control + +var HOME := OS.get_environment("HOME") + +@onready var line_edit := $%LineEdit as LineEdit +@onready var tree1 := $%Tree1 as Tree + +# https://unix.stackexchange.com/questions/419895/if-i-have-a-mime-type-how-do-i-get-its-associated-icon-from-the-current-appearan + +# Get mime type: +# $ xdg-mime query filetype entrypoint.gd +# application/x-gdscript + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + line_edit.text = HOME + + var root := tree1.create_item() + for dir in DirAccess.get_directories_at(HOME): + var item := root.create_child() + item.set_text(0, dir) + + for file in DirAccess.get_files_at(HOME): + var item := root.create_child() + item.set_text(0, file) diff --git a/core/ui/components/file_manager.tscn b/core/ui/components/file_manager.tscn new file mode 100644 index 000000000..585f4328f --- /dev/null +++ b/core/ui/components/file_manager.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=4 format=3 uid="uid://um4833sfah6a"] + +[ext_resource type="Script" path="res://core/ui/components/file_manager.gd" id="1_ox374"] +[ext_resource type="PackedScene" uid="uid://cr83fmlociwko" path="res://core/ui/components/card_icon_button.tscn" id="2_bbd5j"] +[ext_resource type="Texture2D" uid="uid://8pmccsyfv3u7" path="res://assets/ui/icons/search.svg" id="3_onyah"] + +[node name="FileManager" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_ox374") + +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 60 +theme_override_constants/margin_right = 60 + +[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer/MarginContainer"] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "/home" + +[node name="SearchButton" parent="PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer2" instance=ExtResource("2_bbd5j")] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("3_onyah") + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Tree1" type="Tree" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +hide_root = true + +[node name="Tree2" type="Tree" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +hide_root = true + +[node name="Tree3" type="Tree" parent="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +hide_root = true