From ddc9286029516683c111a344ffc0544bf47899c6 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Mon, 19 Jan 2026 18:55:47 +1000 Subject: [PATCH] refactor terminal usage to scene --- .../Features/Build/BuildPanel.cs | 7 ++-- .../Features/Build/BuildPanel.tscn | 11 ++----- .../Features/Debug_/Tab/DebugPanelTab.cs | 10 +++--- .../Features/Debug_/Tab/DebugPanelTab.tscn | 11 ++----- .../Features/Run/RunPanelTab.cs | 13 +++----- .../Features/Run/RunPanelTab.tscn | 6 ++-- .../Features/TerminalBase/SharpIdeTerminal.cs | 33 +++++++++++++++++++ .../TerminalBase/SharpIdeTerminal.cs.uid | 1 + .../TerminalBase/SharpIdeTerminal.tscn | 25 ++++++++++++++ 9 files changed, 79 insertions(+), 38 deletions(-) create mode 100644 src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.cs create mode 100644 src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.cs.uid create mode 100644 src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.tscn diff --git a/src/SharpIDE.Godot/Features/Build/BuildPanel.cs b/src/SharpIDE.Godot/Features/Build/BuildPanel.cs index 5650400..11ea2e3 100644 --- a/src/SharpIDE.Godot/Features/Build/BuildPanel.cs +++ b/src/SharpIDE.Godot/Features/Build/BuildPanel.cs @@ -2,18 +2,19 @@ using System.Threading.Channels; using GDExtensionBindgen; using Godot; using SharpIDE.Application.Features.Build; +using SharpIDE.Godot.Features.TerminalBase; namespace SharpIDE.Godot.Features.Build; public partial class BuildPanel : Control { - private Terminal _terminal = null!; + private SharpIdeTerminal _terminal = null!; private ChannelReader? _buildOutputChannelReader; [Inject] private readonly BuildService _buildService = null!; public override void _Ready() { - _terminal = new Terminal(GetNode("%Terminal")); + _terminal = GetNode("%SharpIdeTerminal"); _buildService.BuildStarted.Subscribe(OnBuildStarted); } @@ -29,7 +30,7 @@ public partial class BuildPanel : Control private async Task OnBuildStarted(BuildStartedFlags _) { - await this.InvokeAsync(() => _terminal.Clear()); + await this.InvokeAsync(() => _terminal.ClearTerminal()); _buildOutputChannelReader ??= _buildService.BuildTextWriter.ConsoleChannel.Reader; } } \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/Build/BuildPanel.tscn b/src/SharpIDE.Godot/Features/Build/BuildPanel.tscn index 989fd07..dfcbbc3 100644 --- a/src/SharpIDE.Godot/Features/Build/BuildPanel.tscn +++ b/src/SharpIDE.Godot/Features/Build/BuildPanel.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://co6dkhdolriej"] [ext_resource type="Script" uid="uid://dt46krpl6ds28" path="res://Features/Build/BuildPanel.cs" id="1_tx1bg"] -[ext_resource type="Theme" uid="uid://bswaamju2blyt" path="res://Features/TerminalBase/TerminalTheme.tres" id="2_5bb6p"] +[ext_resource type="PackedScene" uid="uid://beo6fg8r0ogxc" path="res://Features/TerminalBase/SharpIdeTerminal.tscn" id="2_5bb6p"] [node name="BuildPanel" type="Control"] layout_mode = 3 @@ -36,13 +36,6 @@ text = "Build" layout_mode = 2 size_flags_vertical = 3 -[node name="Terminal" type="Terminal" parent="VBoxContainer/TerminalContainer"] +[node name="SharpIdeTerminal" parent="VBoxContainer/TerminalContainer" instance=ExtResource("2_5bb6p")] unique_name_in_owner = true layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_vertical = 3 -theme = ExtResource("2_5bb6p") diff --git a/src/SharpIDE.Godot/Features/Debug_/Tab/DebugPanelTab.cs b/src/SharpIDE.Godot/Features/Debug_/Tab/DebugPanelTab.cs index eaf7624..06f6241 100644 --- a/src/SharpIDE.Godot/Features/Debug_/Tab/DebugPanelTab.cs +++ b/src/SharpIDE.Godot/Features/Debug_/Tab/DebugPanelTab.cs @@ -2,12 +2,13 @@ using GDExtensionBindgen; using Godot; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; using SharpIDE.Godot.Features.Debug_.Tab.SubTabs; +using SharpIDE.Godot.Features.TerminalBase; namespace SharpIDE.Godot.Features.Debug_.Tab; public partial class DebugPanelTab : Control { - private Terminal _terminal = null!; + private SharpIdeTerminal _terminal = null!; private ThreadsVariablesSubTab _threadsVariablesSubTab = null!; private Task _writeTask = Task.CompletedTask; @@ -22,8 +23,7 @@ public partial class DebugPanelTab : Control public override void _Ready() { - var terminalControl = GetNode("%Terminal"); - _terminal = new Terminal(terminalControl); + _terminal = GetNode("%SharpIdeTerminal"); } public void StartWritingFromProjectOutput() @@ -37,13 +37,13 @@ public partial class DebugPanelTab : Control { await foreach (var array in Project.RunningOutputChannel!.Reader.ReadAllAsync().ConfigureAwait(false)) { - await this.InvokeAsync(() => _terminal.Write(array)); + await _terminal.WriteAsync(array); } }); } public void ClearTerminal() { - _terminal.Clear(); + _terminal.ClearTerminal(); } } \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/Debug_/Tab/DebugPanelTab.tscn b/src/SharpIDE.Godot/Features/Debug_/Tab/DebugPanelTab.tscn index e6f9919..bfa36ec 100644 --- a/src/SharpIDE.Godot/Features/Debug_/Tab/DebugPanelTab.tscn +++ b/src/SharpIDE.Godot/Features/Debug_/Tab/DebugPanelTab.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" uid="uid://b6gq81odfn8ok" path="res://Features/Debug_/Tab/DebugPanelTab.cs" id="1_ppo25"] [ext_resource type="PackedScene" uid="uid://bdu08nd7si641" path="res://Features/Debug_/Tab/SubTabs/ThreadsVariablesSubTab.tscn" id="2_e6ax5"] -[ext_resource type="Theme" uid="uid://bswaamju2blyt" path="res://Features/TerminalBase/TerminalTheme.tres" id="3_e6ax5"] +[ext_resource type="PackedScene" uid="uid://beo6fg8r0ogxc" path="res://Features/TerminalBase/SharpIdeTerminal.tscn" id="4_utxf4"] [node name="DebugPanelTab" type="Control"] layout_mode = 3 @@ -35,13 +35,6 @@ visible = false layout_mode = 2 metadata/_tab_index = 1 -[node name="Terminal" type="Terminal" parent="TabContainer/Console"] -copy_on_selection = true +[node name="SharpIdeTerminal" parent="TabContainer/Console" instance=ExtResource("4_utxf4")] unique_name_in_owner = true layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme = ExtResource("3_e6ax5") diff --git a/src/SharpIDE.Godot/Features/Run/RunPanelTab.cs b/src/SharpIDE.Godot/Features/Run/RunPanelTab.cs index 19313a9..88d1c6f 100644 --- a/src/SharpIDE.Godot/Features/Run/RunPanelTab.cs +++ b/src/SharpIDE.Godot/Features/Run/RunPanelTab.cs @@ -1,12 +1,12 @@ -using GDExtensionBindgen; using Godot; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; +using SharpIDE.Godot.Features.TerminalBase; namespace SharpIDE.Godot.Features.Run; public partial class RunPanelTab : Control { - private Terminal _terminal = null!; + private SharpIdeTerminal _terminal = null!; private Task _writeTask = Task.CompletedTask; public SharpIdeProjectModel Project { get; set; } = null!; @@ -14,8 +14,7 @@ public partial class RunPanelTab : Control public override void _Ready() { - var terminalControl = GetNode("Terminal"); - _terminal = new Terminal(terminalControl); + _terminal = GetNode("SharpIdeTerminal"); } public void StartWritingFromProjectOutput() @@ -29,15 +28,13 @@ public partial class RunPanelTab : Control { await foreach (var array in Project.RunningOutputChannel!.Reader.ReadAllAsync().ConfigureAwait(false)) { - await this.InvokeAsync(() => _terminal.Write(array)); + await _terminal.WriteAsync(array); } }); } public void ClearTerminal() { - // .Clear removes all text except for the bottom row, so lets make sure we have a blank line, and cursor at start - _terminal.Write("\r\n"); - _terminal.Clear(); + _terminal.ClearTerminal(); } } \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/Run/RunPanelTab.tscn b/src/SharpIDE.Godot/Features/Run/RunPanelTab.tscn index 5548060..14a21ea 100644 --- a/src/SharpIDE.Godot/Features/Run/RunPanelTab.tscn +++ b/src/SharpIDE.Godot/Features/Run/RunPanelTab.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://cjopkm4osnp27"] [ext_resource type="Script" uid="uid://ouskvcd0yaub" path="res://Features/Run/RunPanelTab.cs" id="1_dx3i6"] -[ext_resource type="Theme" uid="uid://bswaamju2blyt" path="res://Features/TerminalBase/TerminalTheme.tres" id="2_6d1fj"] +[ext_resource type="PackedScene" uid="uid://beo6fg8r0ogxc" path="res://Features/TerminalBase/SharpIdeTerminal.tscn" id="2_6d1fj"] [node name="RunPanelTab" type="MarginContainer"] anchors_preset = 15 @@ -11,7 +11,5 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_dx3i6") -[node name="Terminal" type="Terminal" parent="."] -copy_on_selection = true +[node name="SharpIdeTerminal" parent="." instance=ExtResource("2_6d1fj")] layout_mode = 2 -theme = ExtResource("2_6d1fj") diff --git a/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.cs b/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.cs new file mode 100644 index 0000000..495073e --- /dev/null +++ b/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.cs @@ -0,0 +1,33 @@ +using GDExtensionBindgen; +using Godot; + +namespace SharpIDE.Godot.Features.TerminalBase; + +public partial class SharpIdeTerminal : Control +{ + private Terminal _terminal = null!; + public override void _Ready() + { + var terminalControl = GetNode("Terminal"); + _terminal = new Terminal(terminalControl); + } + + [RequiresGodotUiThread] + public void Write(string text) + { + _terminal.Write(text); + } + + public async Task WriteAsync(byte[] text) + { + await this.InvokeAsync(() => _terminal.Write(text)); + } + + [RequiresGodotUiThread] + public void ClearTerminal() + { + // .Clear removes all text except for the bottom row, so lets make sure we have a blank line, and cursor at start + _terminal.Write("\r\n"); + _terminal.Clear(); + } +} \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.cs.uid b/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.cs.uid new file mode 100644 index 0000000..1b25e60 --- /dev/null +++ b/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.cs.uid @@ -0,0 +1 @@ +uid://7j2hyf2tvcdi diff --git a/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.tscn b/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.tscn new file mode 100644 index 0000000..5419f8d --- /dev/null +++ b/src/SharpIDE.Godot/Features/TerminalBase/SharpIdeTerminal.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=3 format=3 uid="uid://beo6fg8r0ogxc"] + +[ext_resource type="Script" uid="uid://7j2hyf2tvcdi" path="res://Features/TerminalBase/SharpIdeTerminal.cs" id="1_kpqy5"] +[ext_resource type="Theme" uid="uid://bswaamju2blyt" path="res://Features/TerminalBase/TerminalTheme.tres" id="2_76y22"] + +[node name="SharpIdeTerminal" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource("1_kpqy5") + +[node name="Terminal" type="Terminal" parent="."] +copy_on_selection = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_76y22")