mirror of
https://github.com/git-learning-game/oh-my-git.git
synced 2024-11-03 19:04:40 +01:00
85 lines
2.3 KiB
GDScript
85 lines
2.3 KiB
GDScript
extends Control
|
|
|
|
var thread
|
|
|
|
var history = []
|
|
var history_position = 0
|
|
|
|
onready var input = $Control/InputLine/Input
|
|
onready var output = $Control/Output
|
|
onready var repo = $"../Repositories/ActiveRepository"
|
|
onready var command_dropdown = $Control/InputLine/CommandDropdown
|
|
onready var main = get_parent()
|
|
onready var text_editor = $"../TextEditor"
|
|
|
|
var premade_commands = [
|
|
'git commit --allow-empty -m "empty"',
|
|
'echo $RANDOM | git hash-object -w --stdin',
|
|
'git switch -c $RANDOM',
|
|
]
|
|
|
|
func _ready():
|
|
#repo.shell.connect("output", self, "receive_output")
|
|
|
|
for command in premade_commands:
|
|
command_dropdown.get_popup().add_item(command)
|
|
command_dropdown.get_popup().connect("id_pressed", self, "load_command")
|
|
command_dropdown.theme = Theme.new()
|
|
command_dropdown.theme.default_font = load("res://fonts/default.tres")
|
|
|
|
func _input(event):
|
|
if event is InputEventKey and not text_editor.visible:
|
|
input.grab_focus()
|
|
if history.size() > 0:
|
|
if event.is_action_pressed("ui_up"):
|
|
if history_position > 0:
|
|
history_position -= 1
|
|
input.text = history[history_position]
|
|
input.caret_position = input.text.length()
|
|
# This prevents the Input taking the arrow as a "skip to beginning" command.
|
|
get_tree().set_input_as_handled()
|
|
if event.is_action_pressed("ui_down"):
|
|
if history_position < history.size()-1:
|
|
history_position += 1
|
|
input.text = history[history_position]
|
|
input.caret_position = input.text.length()
|
|
get_tree().set_input_as_handled()
|
|
|
|
func load_command(id):
|
|
input.text = premade_commands[id]
|
|
input.caret_position = input.text.length()
|
|
|
|
func send_command(command):
|
|
history.push_back(command)
|
|
history_position = history.size()
|
|
|
|
input.editable = false
|
|
|
|
if thread != null:
|
|
thread.wait_to_finish()
|
|
thread = Thread.new()
|
|
thread.start(self, "run_command_in_a_thread", command)
|
|
|
|
func send_command_async(command):
|
|
output.text += "$ "+command+"\n"
|
|
input.text = ""
|
|
repo.shell.run_async(command)
|
|
|
|
func run_command_in_a_thread(command):
|
|
var o = repo.shell.run(command)
|
|
check_win_condition()
|
|
|
|
input.text = ""
|
|
input.editable = true
|
|
output.text = output.text + "$ " + command + "\n" + o
|
|
repo.update_everything()
|
|
|
|
func receive_output(text):
|
|
output.text += text
|
|
|
|
func clear():
|
|
output.text = ""
|
|
|
|
func check_win_condition():
|
|
if repo.shell.run("bash /tmp/win 2>/dev/null >/dev/null && echo yes || echo no") == "yes\n":
|
|
main.show_win_status()
|