mirror of
https://github.com/git-learning-game/oh-my-git.git
synced 2024-11-24 16:20:08 +01:00
Added File Browser for Repository Scene
This commit is contained in:
parent
9f657b012f
commit
1a264e2beb
8 changed files with 169 additions and 35 deletions
30
file_browser.gd
Normal file
30
file_browser.gd
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
extends Control
|
||||||
|
|
||||||
|
var shell
|
||||||
|
var thread
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
pass
|
||||||
|
|
||||||
|
func update():
|
||||||
|
$FileTree.clear()
|
||||||
|
var root_item = $FileTree.create_item()
|
||||||
|
root_item.set_text(0, "FILES")
|
||||||
|
|
||||||
|
var file_string = shell.run("find -type f")
|
||||||
|
var files = file_string.split("\n")
|
||||||
|
files = Array(files)
|
||||||
|
files.sort()
|
||||||
|
for file_path in files:
|
||||||
|
file_path = file_path.substr(2)
|
||||||
|
var child = $FileTree.create_item(root_item)
|
||||||
|
child.set_text(0, file_path)
|
||||||
|
#child.set_editable(0, true)
|
||||||
|
|
||||||
|
|
||||||
|
func _on_item_selected():
|
||||||
|
var item = $FileTree.get_selected()
|
||||||
|
var file_path = item.get_text(0)
|
||||||
|
|
||||||
|
shell.run("/tmp/fake-editor-noblock "+file_path)
|
||||||
|
|
21
file_browser.tscn
Normal file
21
file_browser.tscn
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://file_browser.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[node name="FileBrowser" type="Control"]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="FileTree" type="Tree" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
allow_reselect = true
|
||||||
|
hide_root = true
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
[connection signal="item_selected" from="FileTree" to="." method="_on_item_selected"]
|
17
game.gd
17
game.gd
|
@ -7,15 +7,20 @@ var fake_editor
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
global_shell = Shell.new()
|
global_shell = Shell.new()
|
||||||
|
fake_editor = copy_file_to_game_env("fake-editor")
|
||||||
|
copy_file_to_game_env("fake-editor-noblock")
|
||||||
|
|
||||||
|
func copy_file_to_game_env(filename):
|
||||||
|
|
||||||
# Copy fake-editor to tmp directory (because the original might be in a .pck file).
|
# Copy fake-editor to tmp directory (because the original might be in a .pck file).
|
||||||
var fake_editor_outside = tmp_prefix + "fake-editor"
|
var file_outside = tmp_prefix + filename
|
||||||
fake_editor = "/tmp/fake-editor"
|
var file_inside = "/tmp/"+filename
|
||||||
var content = game.read_file("res://scripts/fake-editor", "")
|
var content = game.read_file("res://scripts/"+filename, "")
|
||||||
if content.empty():
|
if content.empty():
|
||||||
push_error("fake-editor could not be read.")
|
push_error(filename + " could not be read.")
|
||||||
write_file(fake_editor_outside, content)
|
write_file(file_outside, content)
|
||||||
global_shell.run("chmod u+x " + fake_editor)
|
global_shell.run("chmod u+x " + file_inside)
|
||||||
|
return file_inside
|
||||||
|
|
||||||
func read_file(path, fallback_string):
|
func read_file(path, fallback_string):
|
||||||
if debug_file_io:
|
if debug_file_io:
|
||||||
|
|
|
@ -78,6 +78,7 @@ margin_bottom = 1070.0
|
||||||
size_flags_horizontal = 3
|
size_flags_horizontal = 3
|
||||||
size_flags_vertical = 3
|
size_flags_vertical = 3
|
||||||
label = "Goal"
|
label = "Goal"
|
||||||
|
file_browser_active = false
|
||||||
|
|
||||||
[node name="ActiveRepository" parent="HBoxContainer/Repositories" instance=ExtResource( 3 )]
|
[node name="ActiveRepository" parent="HBoxContainer/Repositories" instance=ExtResource( 3 )]
|
||||||
anchor_right = 0.0
|
anchor_right = 0.0
|
||||||
|
|
|
@ -1,7 +1,20 @@
|
||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
|
export(NodePath) var index_path
|
||||||
|
onready var index = get_node(index_path)
|
||||||
|
|
||||||
|
export(NodePath) var nodes_path
|
||||||
|
onready var nodes = get_node(nodes_path)
|
||||||
|
|
||||||
|
export(NodePath) var file_browser_path
|
||||||
|
onready var file_browser = get_node(file_browser_path)
|
||||||
|
|
||||||
|
export(NodePath) var label_node_path
|
||||||
|
onready var label_node = get_node(label_node_path)
|
||||||
|
|
||||||
export var label: String setget set_label
|
export var label: String setget set_label
|
||||||
export var path: String setget set_path, get_path
|
export var path: String setget set_path, get_path
|
||||||
|
export var file_browser_active = true setget set_file_browser_active
|
||||||
|
|
||||||
var node = preload("res://node.tscn")
|
var node = preload("res://node.tscn")
|
||||||
|
|
||||||
|
@ -12,7 +25,12 @@ var mouse_inside = false
|
||||||
var _simplified_view = false
|
var _simplified_view = false
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
$Nodes.rect_pivot_offset = $Nodes.rect_size / 2
|
nodes.rect_pivot_offset = nodes.rect_size / 2
|
||||||
|
file_browser.shell = shell
|
||||||
|
|
||||||
|
# Trigger these again because nodes were not ready before.
|
||||||
|
set_label(label)
|
||||||
|
set_file_browser_active(file_browser_active)
|
||||||
|
|
||||||
func _process(_delta):
|
func _process(_delta):
|
||||||
if path:
|
if path:
|
||||||
|
@ -20,15 +38,16 @@ func _process(_delta):
|
||||||
|
|
||||||
func _input(event):
|
func _input(event):
|
||||||
if mouse_inside:
|
if mouse_inside:
|
||||||
if event.is_action_pressed("zoom_out") and $Nodes.rect_scale.x > 0.3:
|
if event.is_action_pressed("zoom_out") and nodes.rect_scale.x > 0.3:
|
||||||
$Nodes.rect_scale -= Vector2(0.05, 0.05)
|
nodes.rect_scale -= Vector2(0.05, 0.05)
|
||||||
if event.is_action_pressed("zoom_in") and $Nodes.rect_scale.x < 2:
|
if event.is_action_pressed("zoom_in") and nodes.rect_scale.x < 2:
|
||||||
$Nodes.rect_scale += Vector2(0.05, 0.05)
|
nodes.rect_scale += Vector2(0.05, 0.05)
|
||||||
|
|
||||||
func there_is_a_git():
|
func there_is_a_git():
|
||||||
return shell.run("test -d .git && echo yes || echo no") == "yes\n"
|
return shell.run("test -d .git && echo yes || echo no") == "yes\n"
|
||||||
|
|
||||||
func update_everything():
|
func update_everything():
|
||||||
|
file_browser.update()
|
||||||
if there_is_a_git():
|
if there_is_a_git():
|
||||||
update_head()
|
update_head()
|
||||||
update_refs()
|
update_refs()
|
||||||
|
@ -36,7 +55,8 @@ func update_everything():
|
||||||
update_objects()
|
update_objects()
|
||||||
remove_gone_stuff()
|
remove_gone_stuff()
|
||||||
else:
|
else:
|
||||||
$Index.text = ""
|
index.text = ""
|
||||||
|
|
||||||
|
|
||||||
func set_path(new_path):
|
func set_path(new_path):
|
||||||
path = new_path
|
path = new_path
|
||||||
|
@ -51,10 +71,11 @@ func get_path():
|
||||||
|
|
||||||
func set_label(new_label):
|
func set_label(new_label):
|
||||||
label = new_label
|
label = new_label
|
||||||
$Label.text = new_label
|
if label_node:
|
||||||
|
label_node.text = new_label
|
||||||
|
|
||||||
func update_index():
|
func update_index():
|
||||||
$Index.text = git("ls-files -s --abbrev=8").replace("\t", " ")
|
index.text = git("ls-files -s --abbrev=8").replace("\t", " ")
|
||||||
|
|
||||||
func random_position():
|
func random_position():
|
||||||
return Vector2(rand_range(0, rect_size.x), rand_range(0, rect_size.y))
|
return Vector2(rand_range(0, rect_size.x), rand_range(0, rect_size.y))
|
||||||
|
@ -94,7 +115,7 @@ func update_objects():
|
||||||
n.children = tag_target(o)
|
n.children = tag_target(o)
|
||||||
|
|
||||||
n.position = find_position(n)
|
n.position = find_position(n)
|
||||||
$Nodes.add_child(n)
|
nodes.add_child(n)
|
||||||
objects[o] = n
|
objects[o] = n
|
||||||
|
|
||||||
func update_refs():
|
func update_refs():
|
||||||
|
@ -108,7 +129,7 @@ func update_refs():
|
||||||
objects[r] = n
|
objects[r] = n
|
||||||
n.children = {ref_target(r): ""}
|
n.children = {ref_target(r): ""}
|
||||||
n.position = find_position(n)
|
n.position = find_position(n)
|
||||||
$Nodes.add_child(n)
|
nodes.add_child(n)
|
||||||
var n = objects[r]
|
var n = objects[r]
|
||||||
n.children = {ref_target(r): ""}
|
n.children = {ref_target(r): ""}
|
||||||
|
|
||||||
|
@ -166,7 +187,7 @@ func update_head():
|
||||||
n.position = find_position(n)
|
n.position = find_position(n)
|
||||||
|
|
||||||
objects["HEAD"] = n
|
objects["HEAD"] = n
|
||||||
$Nodes.add_child(n)
|
nodes.add_child(n)
|
||||||
var n = objects["HEAD"]
|
var n = objects["HEAD"]
|
||||||
n.children = {ref_target("HEAD"): ""}
|
n.children = {ref_target("HEAD"): ""}
|
||||||
|
|
||||||
|
@ -266,3 +287,10 @@ func _on_mouse_entered():
|
||||||
|
|
||||||
func _on_mouse_exited():
|
func _on_mouse_exited():
|
||||||
mouse_inside = false
|
mouse_inside = false
|
||||||
|
|
||||||
|
func set_file_browser_active(active):
|
||||||
|
file_browser_active = active
|
||||||
|
if file_browser:
|
||||||
|
file_browser.visible = active
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=5 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://repository.gd" type="Script" id=1]
|
[ext_resource path="res://repository.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://styles/theme.tres" type="Theme" id=2]
|
[ext_resource path="res://styles/theme.tres" type="Theme" id=2]
|
||||||
[ext_resource path="res://fonts/big.tres" type="DynamicFont" id=3]
|
[ext_resource path="res://fonts/big.tres" type="DynamicFont" id=3]
|
||||||
|
[ext_resource path="res://file_browser.tscn" type="PackedScene" id=4]
|
||||||
|
|
||||||
[node name="Repository" type="Control"]
|
[node name="Repository" type="Control"]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
|
@ -10,8 +11,28 @@ anchor_bottom = 1.0
|
||||||
mouse_filter = 1
|
mouse_filter = 1
|
||||||
theme = ExtResource( 2 )
|
theme = ExtResource( 2 )
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
index_path = NodePath("VSplitContainer/RepoVis/Index")
|
||||||
|
nodes_path = NodePath("VSplitContainer/RepoVis/Nodes")
|
||||||
|
file_browser_path = NodePath("VSplitContainer/FileBrowser")
|
||||||
|
label_node_path = NodePath("VSplitContainer/RepoVis/Label")
|
||||||
|
|
||||||
[node name="Label" type="Label" parent="."]
|
[node name="VSplitContainer" type="VSplitContainer" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
|
||||||
|
[node name="RepoVis" type="Control" parent="VSplitContainer"]
|
||||||
|
margin_right = 1920.0
|
||||||
|
margin_bottom = 894.0
|
||||||
|
rect_clip_content = true
|
||||||
|
size_flags_vertical = 3
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="VSplitContainer/RepoVis"]
|
||||||
margin_left = 5.60091
|
margin_left = 5.60091
|
||||||
margin_top = -0.518692
|
margin_top = -0.518692
|
||||||
margin_right = 204.601
|
margin_right = 204.601
|
||||||
|
@ -22,7 +43,7 @@ __meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="Index" type="Label" parent="."]
|
[node name="Index" type="Label" parent="VSplitContainer/RepoVis"]
|
||||||
margin_left = 8.64569
|
margin_left = 8.64569
|
||||||
margin_top = 63.8375
|
margin_top = 63.8375
|
||||||
margin_right = 359.725
|
margin_right = 359.725
|
||||||
|
@ -33,7 +54,7 @@ __meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="IndexLabel" type="Label" parent="."]
|
[node name="IndexLabel" type="Label" parent="VSplitContainer/RepoVis"]
|
||||||
visible = false
|
visible = false
|
||||||
margin_left = 21.0
|
margin_left = 21.0
|
||||||
margin_top = 65.0
|
margin_top = 65.0
|
||||||
|
@ -44,33 +65,48 @@ __meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="Button" type="Button" parent="."]
|
[node name="Button" type="Button" parent="VSplitContainer/RepoVis"]
|
||||||
visible = false
|
visible = false
|
||||||
margin_left = 36.5602
|
margin_left = 36.5602
|
||||||
margin_top = 67.9891
|
margin_top = 67.9891
|
||||||
margin_right = 94.5602
|
margin_right = 119.56
|
||||||
margin_bottom = 109.989
|
margin_bottom = 109.989
|
||||||
text = "Update"
|
text = "Update"
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="SimplifyCheckbox" type="CheckBox" parent="."]
|
[node name="SimplifyCheckbox" type="CheckBox" parent="VSplitContainer/RepoVis"]
|
||||||
anchor_top = 1.0
|
anchor_left = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_right = 1.0
|
||||||
margin_left = 2.87984
|
margin_left = -208.715
|
||||||
margin_top = -23.2002
|
margin_top = 17.9594
|
||||||
margin_right = 195.88
|
margin_right = -15.7146
|
||||||
margin_bottom = 1.7998
|
margin_bottom = 42.9594
|
||||||
focus_mode = 0
|
focus_mode = 0
|
||||||
enabled_focus_mode = 0
|
enabled_focus_mode = 0
|
||||||
text = "Hide trees and blobs"
|
text = "Hide trees and blobs"
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
[node name="Nodes" type="Control" parent="."]
|
[node name="Nodes" type="Control" parent="VSplitContainer/RepoVis"]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
mouse_filter = 2
|
mouse_filter = 2
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="FileBrowser" parent="VSplitContainer" instance=ExtResource( 4 )]
|
||||||
|
anchor_right = 0.0
|
||||||
|
anchor_bottom = 0.0
|
||||||
|
margin_top = 906.0
|
||||||
|
margin_right = 1920.0
|
||||||
|
margin_bottom = 1080.0
|
||||||
|
size_flags_vertical = 3
|
||||||
|
size_flags_stretch_ratio = 0.2
|
||||||
[connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"]
|
[connection signal="mouse_entered" from="." to="." method="_on_mouse_entered"]
|
||||||
[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"]
|
[connection signal="mouse_exited" from="." to="." method="_on_mouse_exited"]
|
||||||
[connection signal="pressed" from="Button" to="." method="update_everything"]
|
[connection signal="pressed" from="VSplitContainer/RepoVis/Button" to="." method="update_everything"]
|
||||||
[connection signal="toggled" from="SimplifyCheckbox" to="." method="simplify_view"]
|
[connection signal="toggled" from="VSplitContainer/RepoVis/SimplifyCheckbox" to="." method="simplify_view"]
|
||||||
|
|
14
scripts/fake-editor-noblock
Executable file
14
scripts/fake-editor-noblock
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use IO::Socket;
|
||||||
|
|
||||||
|
$socket = IO::Socket::INET->new(PeerAddr => "127.0.0.1",
|
||||||
|
PeerPort => 1234,
|
||||||
|
Proto => "tcp",
|
||||||
|
Type => SOCK_STREAM);
|
||||||
|
|
||||||
|
# Send the length of the first argument as a byte.
|
||||||
|
$socket->send(chr(length($ARGV[0])));
|
||||||
|
# Send the first argument as a string.
|
||||||
|
$socket->send($ARGV[0]);
|
||||||
|
|
|
@ -16,8 +16,7 @@ func _process(_delta):
|
||||||
var length = _client_connection.get_u8()
|
var length = _client_connection.get_u8()
|
||||||
var filename = _client_connection.get_string(length)
|
var filename = _client_connection.get_string(length)
|
||||||
var regex = RegEx.new()
|
var regex = RegEx.new()
|
||||||
regex.compile("(\\.git\\/.*)")
|
filename = filename.replace("/tmp/active/", "")
|
||||||
filename = regex.search(filename).get_string()
|
|
||||||
open(filename)
|
open(filename)
|
||||||
|
|
||||||
func open(filename):
|
func open(filename):
|
||||||
|
|
Loading…
Reference in a new issue