diff --git a/project.godot b/project.godot index f2de314..724a72a 100644 --- a/project.godot +++ b/project.godot @@ -14,6 +14,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://scenes/chapter.gd" }, { +"base": "Control", +"class": "FileBrowserItem", +"language": "GDScript", +"path": "res://scenes/file_browser_item.gd" +}, { "base": "Node", "class": "Level", "language": "GDScript", @@ -36,6 +41,7 @@ _global_script_classes=[ { } ] _global_script_class_icons={ "Chapter": "", +"FileBrowserItem": "", "Level": "", "LevelRepo": "", "Shell": "", diff --git a/scenes/file_browser.gd b/scenes/file_browser.gd index 2251ed5..8577a38 100644 --- a/scenes/file_browser.gd +++ b/scenes/file_browser.gd @@ -55,6 +55,9 @@ func update(): var item = preload("res://scenes/file_browser_item.tscn").instance() item.label = file_path item.connect("clicked", self, "item_clicked") + + item.status = get_file_status(file_path, shell, 1) + grid.add_child(item) FileBrowserMode.COMMIT: if commit: @@ -67,25 +70,48 @@ func update(): item.connect("clicked", self, "item_clicked") grid.add_child(item) FileBrowserMode.INDEX: - if repository: - var files = Array(repository.shell.run("git ls-files -s | cut -f2").split("\n")) + if repository and repository.there_is_a_git(): + var files = Array(repository.shell.run("git ls-files -s | cut -f2 | uniq").split("\n")) # The last entry is an empty string, remove it. files.pop_back() for file_path in files: var item = preload("res://scenes/file_browser_item.tscn").instance() item.label = file_path item.connect("clicked", self, "item_clicked") + item.status = get_file_status(file_path, repository.shell, 0) grid.add_child(item) + +func get_file_status(file_path, shell, idx): + var file_status = shell.run("git status -s '%s'" % file_path) + if file_status.length()>0: + match file_status[idx]: + "D": + return FileBrowserItem.IconStatus.REMOVED + "M": + return FileBrowserItem.IconStatus.EDIT + "U": + return FileBrowserItem.IconStatus.CONFLICT + " ": + return FileBrowserItem.IconStatus.NONE + "A": + return FileBrowserItem.IconStatus.NEW + "?": + return FileBrowserItem.IconStatus.UNTRACKED + else: + return FileBrowserItem.IconStatus.NONE func item_clicked(item): - open_file = item.label match mode: FileBrowserMode.WORKING_DIRECTORY: text_edit.text = helpers.read_file(shell._cwd + item.label) FileBrowserMode.COMMIT: text_edit.text = commit.repository.shell.run("git show %s:\"%s\"" % [commit.id, item.label]) FileBrowserMode.INDEX: + if item.status == item.IconStatus.CONFLICT: + return text_edit.text = repository.shell.run("git show :\"%s\"" % [item.label]) + + open_file = item.label text_edit.show() text_edit.grab_focus() diff --git a/scenes/file_browser_item.gd b/scenes/file_browser_item.gd index 9330e68..aeb2fc8 100644 --- a/scenes/file_browser_item.gd +++ b/scenes/file_browser_item.gd @@ -1,13 +1,18 @@ +class_name FileBrowserItem extends Control signal clicked(what) +enum IconStatus {NONE, NEW, REMOVED, CONFLICT, EDIT, UNTRACKED} +export(IconStatus) var status setget _set_status export var label: String setget _set_label onready var label_node = $VBoxContainer/Label +onready var status_icon = $VBoxContainer/Control/TextureRect/StatusIcon func _ready(): _set_label(label) + _set_status(status) func _set_label(new_label): label = new_label @@ -17,3 +22,27 @@ func _set_label(new_label): func _gui_input(event): if event is InputEventMouseButton and event.is_pressed() and event.button_index == BUTTON_LEFT: emit_signal("clicked", self) + +func _set_status(new_status): + if status_icon: + match new_status: + IconStatus.NEW: + status_icon.texture = preload("res://images/new.svg") + status_icon.modulate = Color("33BB33") + IconStatus.REMOVED: + status_icon.texture = preload("res://images/removed.svg") + status_icon.modulate = Color("D10F0F") + IconStatus.CONFLICT: + status_icon.texture = preload("res://images/conflict.svg") + status_icon.modulate = Color("DE5E09") + IconStatus.EDIT: + status_icon.texture = preload("res://images/modified.svg") + status_icon.modulate = Color("344DED") + IconStatus.UNTRACKED: + status_icon.texture = preload("res://images/untracked.svg") + status_icon.modulate = Color("9209B8") + IconStatus.NONE: + status_icon.texture = null + + status = new_status + diff --git a/scenes/file_browser_item.tscn b/scenes/file_browser_item.tscn index bd6f09d..4a61ba1 100644 --- a/scenes/file_browser_item.tscn +++ b/scenes/file_browser_item.tscn @@ -53,6 +53,21 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="StatusIcon" type="TextureRect" parent="VBoxContainer/Control/TextureRect"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -11.2842 +margin_top = 0.810516 +margin_right = 13.7158 +margin_bottom = 25.8105 +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + [node name="Label" type="Label" parent="VBoxContainer"] margin_top = 98.0 margin_right = 200.0 diff --git a/scenes/main.gd b/scenes/main.gd index 15c8b7b..dfb653c 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -18,6 +18,7 @@ onready var level_description = $Rows/Columns/RightSide/LevelInfo/LevelPanel/Tex onready var level_congrats = $Rows/Columns/RightSide/LevelInfo/LevelPanel/Text/LevelCongrats onready var cards = $Rows/Controls/Cards onready var file_browser = $Rows/Columns/RightSide/FileBrowser +onready var index = $Rows/Columns/RightSide/Index func _ready(): var args = helpers.parse_args() @@ -83,6 +84,8 @@ func load_level(level_id): if new_repo.label == "yours": file_browser.shell = new_repo.shell file_browser.update() + index.repository = new_repo + index.update() repositories_node.add_child(new_repo) repositories[r] = new_repo @@ -137,6 +140,7 @@ func update_repos(): var repo = repositories[r] repo.update_everything() file_browser.update() + index.update() if levels.chapters[current_chapter].levels[current_level].check_win(): show_win_status() diff --git a/scenes/main.tscn b/scenes/main.tscn index 12f80c6..e4f36bd 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -80,7 +80,7 @@ custom_constants/separation = 8 [node name="LevelInfo" type="VBoxContainer" parent="Rows/Columns/RightSide"] margin_right = 633.0 -margin_bottom = 442.0 +margin_bottom = 383.0 size_flags_horizontal = 3 size_flags_vertical = 3 @@ -143,7 +143,7 @@ __meta__ = { [node name="LevelPanel" type="VBoxContainer" parent="Rows/Columns/RightSide/LevelInfo"] margin_top = 40.0 margin_right = 633.0 -margin_bottom = 442.0 +margin_bottom = 383.0 size_flags_vertical = 3 [node name="LevelName" type="RichTextLabel" parent="Rows/Columns/RightSide/LevelInfo/LevelPanel"] @@ -159,7 +159,7 @@ __meta__ = { [node name="Text" type="Control" parent="Rows/Columns/RightSide/LevelInfo/LevelPanel"] margin_top = 65.0 margin_right = 633.0 -margin_bottom = 402.0 +margin_bottom = 343.0 size_flags_vertical = 3 [node name="LevelDescription" type="RichTextLabel" parent="Rows/Columns/RightSide/LevelInfo/LevelPanel/Text"] @@ -185,14 +185,25 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="Index" parent="Rows/Columns/RightSide" instance=ExtResource( 5 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 391.0 +margin_right = 633.0 +margin_bottom = 582.0 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.5 +title = "Next Commit:" +mode = 2 + [node name="FileBrowser" parent="Rows/Columns/RightSide" instance=ExtResource( 5 )] anchor_right = 0.0 anchor_bottom = 0.0 -margin_top = 450.0 +margin_top = 590.0 margin_right = 633.0 margin_bottom = 782.0 size_flags_vertical = 3 -size_flags_stretch_ratio = 0.75 +size_flags_stretch_ratio = 0.5 title = "Current environment" [node name="Controls" type="HBoxContainer" parent="Rows"]