refactor terminal usage to scene

This commit is contained in:
Matt Parker
2026-01-19 18:55:47 +10:00
parent 26ce5b981e
commit ddc9286029
9 changed files with 79 additions and 38 deletions

View File

@@ -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<string>? _buildOutputChannelReader;
[Inject] private readonly BuildService _buildService = null!;
public override void _Ready()
{
_terminal = new Terminal(GetNode<Control>("%Terminal"));
_terminal = GetNode<SharpIdeTerminal>("%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;
}
}

View File

@@ -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")

View File

@@ -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<Control>("%Terminal");
_terminal = new Terminal(terminalControl);
_terminal = GetNode<SharpIdeTerminal>("%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();
}
}

View File

@@ -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")

View File

@@ -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<Control>("Terminal");
_terminal = new Terminal(terminalControl);
_terminal = GetNode<SharpIdeTerminal>("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();
}
}

View File

@@ -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")

View File

@@ -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<Control>("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();
}
}

View File

@@ -0,0 +1 @@
uid://7j2hyf2tvcdi

View File

@@ -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")