diff --git a/.gitignore b/.gitignore index 1084d09..acf0eb1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .godot/ .idea/ +*.DotSettings.user diff --git a/Library/UI/LabelLineEdit.cs b/Library/UI/LabelLineEdit.cs index 54d354f..c14e574 100644 --- a/Library/UI/LabelLineEdit.cs +++ b/Library/UI/LabelLineEdit.cs @@ -1,23 +1,45 @@ using Godot; using System; -[GlobalClass] +[GlobalClass, Tool] public partial class LabelLineEdit : HBoxContainer { - #region Exports - #endregion - - #region Nodes + [Export, Notify] public partial string Label { get; set; } + [Export, Notify] public partial string Text { get; set; } + [Export, Notify] public partial int Spacing { get; set; } + [Export, Notify] public partial bool Password { get; set; } + private Label _labelNode; private LineEdit _lineEdit; - #endregion public LabelLineEdit() { - _labelNode = new Label(); - _lineEdit = new LineEdit(); + Spacing = 4; + } + + [GodotOverride] + private void OnReady() + { + _labelNode ??= new Label(); + _lineEdit ??= new LineEdit(); _lineEdit.SizeFlagsHorizontal = SizeFlags.ExpandFill; AddChild(_labelNode); AddChild(_lineEdit); + _labelNode.Text = Label; + _lineEdit.Text = Text; + _lineEdit.Secret = Password; + LabelChanged += () => _labelNode.Text = Label; + TextChanged += () => _lineEdit.Text = Text; + PasswordChanged += () => _lineEdit.Secret = Password; + SpacingChanged += () => AddThemeConstantOverride("separation", Spacing); + _lineEdit.TextChanged += async value => + { + var pos = _lineEdit.GetCaretColumn(); + Text = value; + await ToSignal(GetTree(), SceneTree.SignalName.ProcessFrame); + _lineEdit.SetCaretColumn(pos); + }; } + + public override partial void _Ready(); } diff --git a/MediaPortal.csproj b/MediaPortal.csproj index 06efe92..eee961c 100644 --- a/MediaPortal.csproj +++ b/MediaPortal.csproj @@ -3,11 +3,12 @@ net8.0 net9.0 true + 13 - + - \ No newline at end of file + diff --git a/TestingInterface.cs b/TestingInterface.cs index a9336c9..4dc3aae 100644 --- a/TestingInterface.cs +++ b/TestingInterface.cs @@ -1,5 +1,13 @@ using Godot; +[SceneTree(root: "Nodes")] public partial class TestingInterface : Control { + [GodotOverride] + void OnReady() + { + GD.Print("TestingInterface::OnReady"); + } + + public override partial void _Ready(); } diff --git a/TestingInterface.tscn b/TestingInterface.tscn new file mode 100644 index 0000000..f1c0e77 --- /dev/null +++ b/TestingInterface.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=3 format=3 uid="uid://b6v8kn5pjdd1b"] + +[ext_resource type="Script" uid="uid://demxhjphd8gkg" path="res://TestingInterface.cs" id="1_1mh2b"] +[ext_resource type="Script" uid="uid://c3juujxln4m38" path="res://Library/UI/LabelLineEdit.cs" id="2_a7i77"] + +[node name="TestingInterface" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_1mh2b") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ServerUrl" type="HBoxContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_constants/separation = 10 +script = ExtResource("2_a7i77") +Label = "Server URL:" +Spacing = 10 +metadata/_custom_type_script = "uid://c3juujxln4m38" + +[node name="Username" type="HBoxContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_constants/separation = 14 +script = ExtResource("2_a7i77") +Label = "Username:" +Spacing = 14 +metadata/_custom_type_script = "uid://c3juujxln4m38" + +[node name="Password" type="HBoxContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_constants/separation = 20 +script = ExtResource("2_a7i77") +Label = "Password:" +Spacing = 20 +Password = true +metadata/_custom_type_script = "uid://c3juujxln4m38" diff --git a/project.godot b/project.godot index a77dfee..c51218f 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,8 @@ config_version=5 config/name="MediaPortal" config/description="Enter an interesting project description here!" -config/features=PackedStringArray("4.5") +run/main_scene="uid://b6v8kn5pjdd1b" +config/features=PackedStringArray("4.5", "C#") config/icon="res://icon.png" [dotnet]