oh-my-git/terminal.gd

85 lines
2.3 KiB
GDScript3
Raw Normal View History

2020-09-01 21:25:24 +02:00
extends Control
2020-06-10 18:25:41 +02:00
var thread
2020-09-01 19:59:07 +02:00
var history = []
var history_position = 0
2020-09-14 19:36:58 +02:00
onready var input = $Control/InputLine/Input
2020-09-01 21:25:24 +02:00
onready var output = $Control/Output
onready var repo = $"../Repositories/ActiveRepository"
2020-09-14 19:36:58 +02:00
onready var command_dropdown = $Control/InputLine/CommandDropdown
onready var main = get_parent()
2020-09-01 21:25:24 +02:00
2020-09-14 19:25:57 +02:00
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")
2020-09-14 19:25:57 +02:00
for command in premade_commands:
command_dropdown.get_popup().add_item(command)
command_dropdown.get_popup().connect("id_pressed", self, "load_command")
2020-09-14 19:36:58 +02:00
command_dropdown.theme = Theme.new()
command_dropdown.theme.default_font = load("res://fonts/default.tres")
2020-09-14 19:25:57 +02:00
2020-09-01 19:59:07 +02:00
func _input(event):
2020-09-14 16:03:01 +02:00
if event is InputEventKey:
input.grab_focus()
2020-09-01 19:59:07 +02:00
if history.size() > 0:
if event.is_action_pressed("ui_up"):
2020-09-05 10:47:38 +02:00
if history_position > 0:
history_position -= 1
input.text = history[history_position]
input.caret_position = input.text.length()
2020-09-03 18:10:09 +02:00
# This prevents the Input taking the arrow as a "skip to beginning" command.
get_tree().set_input_as_handled()
2020-09-01 19:59:07 +02:00
if event.is_action_pressed("ui_down"):
2020-09-05 10:47:38 +02:00
if history_position < history.size()-1:
history_position += 1
input.text = history[history_position]
input.caret_position = input.text.length()
2020-09-03 18:10:09 +02:00
get_tree().set_input_as_handled()
2020-09-01 19:59:07 +02:00
2020-09-14 19:25:57 +02:00
func load_command(id):
input.text = premade_commands[id]
input.caret_position = input.text.length()
func send_command(command):
2020-09-01 19:59:07 +02:00
history.push_back(command)
2020-09-05 10:47:38 +02:00
history_position = history.size()
2020-09-01 19:59:07 +02:00
2020-09-11 10:33:44 +02:00
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):
2020-09-15 09:30:19 +02:00
output.text += "$ "+command+"\n"
input.text = ""
2020-09-15 09:30:19 +02:00
repo.shell.run_async(command)
func run_command_in_a_thread(command):
var o = repo.shell.run(command)
2020-09-10 12:03:46 +02:00
check_win_condition()
2020-09-01 21:25:24 +02:00
input.text = ""
input.editable = true
2020-09-01 21:25:24 +02:00
output.text = output.text + "$ " + command + "\n" + o
2020-09-10 12:03:46 +02:00
repo.update_everything()
func receive_output(text):
output.text += text
func clear():
output.text = ""
2020-09-10 12:03:46 +02:00
func check_win_condition():
if repo.shell.run("bash /tmp/win 2>&1 >/dev/null && echo yes || echo no") == "yes\n":
main.show_win_status()