Changed Label to RichtTextLabel for scrolling compatabillity
This commit is contained in:
parent
20158802dd
commit
22108bb58d
@ -1,7 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using YourProject.Commands;
|
using TextRPG.Commands;
|
||||||
|
|
||||||
namespace YourProject.Commands
|
namespace TextRPG.Commands
|
||||||
{
|
{
|
||||||
public class ClearCommand : Command
|
public class ClearCommand : Command
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace YourProject.Commands // Add namespace
|
namespace TextRPG.Commands
|
||||||
{
|
{
|
||||||
public abstract class Command
|
public abstract class Command
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using YourProject.Commands;
|
using TextRPG.Commands;
|
||||||
|
|
||||||
namespace YourProject.Commands
|
namespace TextRPG.Commands
|
||||||
{
|
{
|
||||||
public static class ConsoleManager
|
public static class ConsoleManager
|
||||||
{
|
{
|
||||||
@ -14,6 +14,8 @@ namespace YourProject.Commands
|
|||||||
// Register all commands
|
// Register all commands
|
||||||
RegisterCommand(new HelpCommand());
|
RegisterCommand(new HelpCommand());
|
||||||
RegisterCommand(new ClearCommand());
|
RegisterCommand(new ClearCommand());
|
||||||
|
RegisterCommand(new TimeCommand());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RegisterCommand(Command command)
|
public static void RegisterCommand(Command command)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using YourProject.Commands; // Reference the namespace
|
using TextRPG.Commands;
|
||||||
|
|
||||||
namespace YourProject.Commands
|
namespace TextRPG.Commands
|
||||||
{
|
{
|
||||||
public class HelpCommand : Command
|
public class HelpCommand : Command
|
||||||
{
|
{
|
||||||
|
|||||||
@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using TextRPG.Commands;
|
||||||
|
|
||||||
|
namespace TextRPG.Commands
|
||||||
|
{
|
||||||
|
public class TimeCommand : Command
|
||||||
|
{
|
||||||
|
public override string Name => "time";
|
||||||
|
public override string Description => "Outputs the current time";
|
||||||
|
public override string Usage => "time";
|
||||||
|
|
||||||
|
public override void Execute(string[] args, Action<string> outputCallback)
|
||||||
|
{
|
||||||
|
// Send a special marker that the console UI will recognize
|
||||||
|
outputCallback("12:23");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,20 +1,113 @@
|
|||||||
using Godot;
|
using Godot;
|
||||||
using System;
|
using System;
|
||||||
using YourProject.Commands; // Add this using statement
|
using System.Collections.Generic;
|
||||||
|
using TextRPG.Commands; // Add this to access ConsoleManager
|
||||||
|
|
||||||
public partial class ConsoleUI : CanvasLayer
|
public partial class ConsoleUI : CanvasLayer
|
||||||
{
|
{
|
||||||
private Label consoleOutput;
|
// UI Elements
|
||||||
|
private RichTextLabel consoleOutput;
|
||||||
private LineEdit consoleInput;
|
private LineEdit consoleInput;
|
||||||
|
|
||||||
|
// Command History
|
||||||
|
private List<string> commandHistory = new List<string>();
|
||||||
|
private int historyIndex = -1;
|
||||||
|
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
{
|
{
|
||||||
consoleOutput = GetNode<Label>("ConsoleOutput");
|
// Get UI references
|
||||||
consoleInput = GetNode<LineEdit>("ConsoleInput");
|
consoleOutput = FindChild("ConsoleOutput", true, false) as RichTextLabel;
|
||||||
|
consoleInput = FindChild("ConsoleInput", true, false) as LineEdit;
|
||||||
|
|
||||||
|
if (consoleOutput == null || consoleInput == null)
|
||||||
|
{
|
||||||
|
GD.PrintErr("Failed to find console nodes!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DON'T use SetAnchorsAndOffsetsPreset with containers
|
||||||
|
// Instead, let the containers work naturally
|
||||||
|
|
||||||
|
// Configure the VBoxContainer to expand and fill
|
||||||
|
var vbox = consoleOutput.GetParent() as VBoxContainer;
|
||||||
|
if (vbox != null)
|
||||||
|
{
|
||||||
|
vbox.SizeFlagsVertical = Control.SizeFlags.ExpandFill;
|
||||||
|
vbox.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
|
||||||
|
vbox.AnchorRight = 1;
|
||||||
|
vbox.AnchorBottom = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make the console output expand to fill available space
|
||||||
|
consoleOutput.SizeFlagsVertical = Control.SizeFlags.ExpandFill;
|
||||||
|
consoleOutput.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
|
||||||
|
|
||||||
|
// Set the LineEdit to not expand vertically (fixed height)
|
||||||
|
consoleInput.SizeFlagsVertical = Control.SizeFlags.ShrinkCenter;
|
||||||
|
consoleInput.CustomMinimumSize = new Vector2(0, 35);
|
||||||
|
|
||||||
|
// Configure the console
|
||||||
|
SetupConsole();
|
||||||
|
|
||||||
|
// Connect signals
|
||||||
consoleInput.TextSubmitted += OnTextSubmitted;
|
consoleInput.TextSubmitted += OnTextSubmitted;
|
||||||
|
consoleInput.GuiInput += OnGuiInput;
|
||||||
|
|
||||||
|
// Set initial focus
|
||||||
Callable.From(() => consoleInput.GrabFocus()).CallDeferred();
|
Callable.From(() => consoleInput.GrabFocus()).CallDeferred();
|
||||||
|
|
||||||
|
// Display welcome message
|
||||||
|
DisplayWelcomeMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetupConsole()
|
||||||
|
{
|
||||||
|
// Enable BBCode
|
||||||
|
consoleOutput.BbcodeEnabled = true;
|
||||||
|
|
||||||
|
// CRITICAL FOR NEWLINES AND WRAPPING:
|
||||||
|
consoleOutput.AutowrapMode = TextServer.AutowrapMode.Word;
|
||||||
|
consoleOutput.SizeFlagsVertical = Control.SizeFlags.ExpandFill;
|
||||||
|
|
||||||
|
// Make sure newlines are preserved
|
||||||
|
consoleOutput.ScrollFollowing = true;
|
||||||
|
consoleOutput.ScrollActive = true;
|
||||||
|
consoleOutput.SelectionEnabled = true;
|
||||||
|
consoleOutput.FitContent = false; // Keep false - this is important!
|
||||||
|
|
||||||
|
// Styling
|
||||||
|
var styleBox = new StyleBoxFlat();
|
||||||
|
styleBox.BgColor = new Color(0.08f, 0.08f, 0.12f);
|
||||||
|
styleBox.SetCornerRadiusAll(5);
|
||||||
|
consoleOutput.AddThemeStyleboxOverride("normal", styleBox);
|
||||||
|
consoleOutput.AddThemeColorOverride("default_color", new Color(0.8f, 0.8f, 0.9f));
|
||||||
|
|
||||||
|
var lineEditStyle = new StyleBoxFlat();
|
||||||
|
lineEditStyle.BgColor = new Color(0.05f, 0.05f, 0.08f);
|
||||||
|
lineEditStyle.SetCornerRadiusAll(5);
|
||||||
|
consoleInput.AddThemeStyleboxOverride("normal", lineEditStyle);
|
||||||
|
consoleInput.AddThemeColorOverride("font_color", new Color(0.9f, 0.9f, 1.0f));
|
||||||
|
consoleInput.AddThemeColorOverride("caret_color", new Color(0.9f, 0.9f, 1.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PrintFullTree(Node node, int depth)
|
||||||
|
{
|
||||||
|
string indent = new string(' ', depth * 2);
|
||||||
|
GD.Print($"{indent}{node.Name} ({node.GetType().Name}) - Path: {node.GetPath()}");
|
||||||
|
|
||||||
|
foreach (Node child in node.GetChildren())
|
||||||
|
{
|
||||||
|
PrintFullTree(child, depth + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void DisplayWelcomeMessage()
|
||||||
|
{
|
||||||
|
AddToConsole("Welcome!");
|
||||||
|
AddToConsole("Test");
|
||||||
|
}
|
||||||
|
|
||||||
private void OnTextSubmitted(string submittedText)
|
private void OnTextSubmitted(string submittedText)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(submittedText))
|
if (string.IsNullOrWhiteSpace(submittedText))
|
||||||
@ -23,13 +116,19 @@ public partial class ConsoleUI : CanvasLayer
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddToConsole($"> {submittedText}");
|
// Add to command history
|
||||||
|
commandHistory.Add(submittedText);
|
||||||
|
historyIndex = commandHistory.Count;
|
||||||
|
|
||||||
|
// Echo the command
|
||||||
|
AddToConsole($"[color=yellow]>>[/color] {submittedText}");
|
||||||
|
|
||||||
|
// Execute the command using ConsoleManager
|
||||||
bool commandExecuted = ConsoleManager.Execute(submittedText, (output) =>
|
bool commandExecuted = ConsoleManager.Execute(submittedText, (output) =>
|
||||||
{
|
{
|
||||||
if (output == "CLEAR_CONSOLE")
|
if (output == "CLEAR_CONSOLE")
|
||||||
{
|
{
|
||||||
consoleOutput.Text = "";
|
consoleOutput.Clear();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -39,22 +138,67 @@ public partial class ConsoleUI : CanvasLayer
|
|||||||
|
|
||||||
if (!commandExecuted)
|
if (!commandExecuted)
|
||||||
{
|
{
|
||||||
AddToConsole($"Unknown command. Type 'help' for available commands.");
|
AddToConsole($"[color=red]Unknown command.[/color] Type 'help' for available commands.");
|
||||||
}
|
}
|
||||||
|
|
||||||
consoleInput.Clear();
|
consoleInput.Clear();
|
||||||
Callable.From(() => consoleInput.GrabFocus()).CallDeferred();
|
Callable.From(() => consoleInput.GrabFocus()).CallDeferred();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddToConsole(string text)
|
private void OnGuiInput(InputEvent @event)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(consoleOutput.Text))
|
if (@event is InputEventKey key && key.Pressed)
|
||||||
{
|
{
|
||||||
consoleOutput.Text = text;
|
if (key.Keycode == Key.Up)
|
||||||
}
|
{
|
||||||
else
|
if (commandHistory.Count > 0 && historyIndex > 0)
|
||||||
{
|
{
|
||||||
consoleOutput.Text += "\n" + text;
|
historyIndex--;
|
||||||
|
consoleInput.Text = commandHistory[historyIndex];
|
||||||
|
consoleInput.CaretColumn = consoleInput.Text.Length;
|
||||||
|
}
|
||||||
|
GetViewport().SetInputAsHandled();
|
||||||
|
}
|
||||||
|
else if (key.Keycode == Key.Down)
|
||||||
|
{
|
||||||
|
if (historyIndex < commandHistory.Count - 1)
|
||||||
|
{
|
||||||
|
historyIndex++;
|
||||||
|
consoleInput.Text = commandHistory[historyIndex];
|
||||||
|
consoleInput.CaretColumn = consoleInput.Text.Length;
|
||||||
|
}
|
||||||
|
else if (historyIndex == commandHistory.Count - 1)
|
||||||
|
{
|
||||||
|
historyIndex = commandHistory.Count;
|
||||||
|
consoleInput.Text = "";
|
||||||
|
}
|
||||||
|
GetViewport().SetInputAsHandled();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AddToConsole(string text)
|
||||||
|
{
|
||||||
|
// Force a newline before adding if console already has text
|
||||||
|
if (!string.IsNullOrEmpty(consoleOutput.Text))
|
||||||
|
{
|
||||||
|
consoleOutput.AppendText("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the text
|
||||||
|
consoleOutput.AppendText(text + "\n");
|
||||||
|
|
||||||
|
// Force scroll to bottom
|
||||||
|
consoleOutput.ScrollToLine(consoleOutput.GetLineCount() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogMessage(string message, string color = "white")
|
||||||
|
{
|
||||||
|
AddToConsole($"[color={color}]{message}[/color]");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearConsole()
|
||||||
|
{
|
||||||
|
consoleOutput.Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
30
scenes/TestConsole.cs
Normal file
30
scenes/TestConsole.cs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
public partial class TestConsole : CanvasLayer
|
||||||
|
{
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
var output = GetNode<RichTextLabel>("/root/Playground/Console/Panel/MarginContainer/VBoxContainer/ConsoleOutput");
|
||||||
|
var panel = GetNode<Panel>("/root/Playground/Console/Panel");
|
||||||
|
panel.Visible = true;
|
||||||
|
if (output != null)
|
||||||
|
{
|
||||||
|
GD.Print($"Visible: {output.Visible}");
|
||||||
|
GD.Print($"Modulate: {output.Modulate}");
|
||||||
|
GD.Print($"SelfModulate: {output.SelfModulate}");
|
||||||
|
GD.Print($"Size: {output.Size}");
|
||||||
|
GD.Print($"Position: {output.Position}");
|
||||||
|
|
||||||
|
// Force a minimum size
|
||||||
|
output.SizeFlagsVertical = Control.SizeFlags.ExpandFill;
|
||||||
|
|
||||||
|
output.Text = "TEST WORKING!";
|
||||||
|
|
||||||
|
// Also try changing background to bright red to see if it exists
|
||||||
|
var styleBox = new StyleBoxFlat();
|
||||||
|
styleBox.BgColor = Colors.Red;
|
||||||
|
output.AddThemeStyleboxOverride("normal", styleBox);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
scenes/TestConsole.cs.uid
Normal file
1
scenes/TestConsole.cs.uid
Normal file
@ -0,0 +1 @@
|
|||||||
|
uid://df71y6hixvxlo
|
||||||
@ -4,29 +4,37 @@
|
|||||||
[ext_resource type="FontFile" uid="uid://df205wg7tq2a1" path="res://assets/fonts/Orange Kid.otf" id="2_xil4p"]
|
[ext_resource type="FontFile" uid="uid://df205wg7tq2a1" path="res://assets/fonts/Orange Kid.otf" id="2_xil4p"]
|
||||||
|
|
||||||
[node name="Console" type="CanvasLayer" unique_id=29250469]
|
[node name="Console" type="CanvasLayer" unique_id=29250469]
|
||||||
|
layer = 10
|
||||||
script = ExtResource("1_gf67r")
|
script = ExtResource("1_gf67r")
|
||||||
|
|
||||||
[node name="ConsoleBG" type="ColorRect" parent="." unique_id=325200379]
|
[node name="Panel" type="Panel" parent="." unique_id=1612205637]
|
||||||
offset_right = 872.0
|
anchors_preset = 15
|
||||||
offset_bottom = 575.0
|
|
||||||
color = Color(0.446777, 0.44677705, 0.44677705, 1)
|
|
||||||
|
|
||||||
[node name="ConsoleOutput" type="Label" parent="." unique_id=340259312]
|
|
||||||
offset_left = 18.0
|
|
||||||
offset_top = 14.0
|
|
||||||
offset_right = 857.0
|
|
||||||
offset_bottom = 560.0
|
|
||||||
theme_override_fonts/font = ExtResource("2_xil4p")
|
|
||||||
theme_override_font_sizes/font_size = 35
|
|
||||||
|
|
||||||
[node name="ConsoleInput" type="LineEdit" parent="." unique_id=1233554082]
|
|
||||||
anchors_preset = 12
|
|
||||||
anchor_top = 1.0
|
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
offset_top = -70.0
|
|
||||||
grow_horizontal = 2
|
grow_horizontal = 2
|
||||||
grow_vertical = 0
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="MarginContainer" type="MarginContainer" parent="Panel" unique_id=800285170]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
theme_override_constants/margin_right = 300
|
||||||
|
|
||||||
|
[node name="VBoxContainer" type="VBoxContainer" parent="Panel/MarginContainer" unique_id=1714535234]
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_constants/separation = 5
|
||||||
|
|
||||||
|
[node name="ConsoleOutput" type="RichTextLabel" parent="Panel/MarginContainer/VBoxContainer" unique_id=1029492678]
|
||||||
|
layout_mode = 2
|
||||||
|
bbcode_enabled = true
|
||||||
|
scroll_following = true
|
||||||
|
|
||||||
|
[node name="ConsoleInput" type="LineEdit" parent="Panel/MarginContainer/VBoxContainer" unique_id=1233554082]
|
||||||
|
layout_mode = 2
|
||||||
|
size_flags_vertical = 10
|
||||||
theme_override_fonts/font = ExtResource("2_xil4p")
|
theme_override_fonts/font = ExtResource("2_xil4p")
|
||||||
theme_override_font_sizes/font_size = 30
|
theme_override_font_sizes/font_size = 30
|
||||||
keep_editing_on_text_submit = true
|
keep_editing_on_text_submit = true
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user