collapse bottom panel

This commit is contained in:
Matt Parker
2025-08-27 21:28:45 +10:00
parent e26e9dbd9f
commit e162e6ba5e
5 changed files with 51 additions and 20 deletions

View File

@@ -31,7 +31,11 @@ public partial class BottomPanelManager : Panel
{
if (type == null)
{
// TODO: Ask parent to to collapse slider.
GodotGlobalEvents.InvokeBottomPanelVisibilityChangeRequested(false);
}
else
{
GodotGlobalEvents.InvokeBottomPanelVisibilityChangeRequested(true);
}
foreach (var kvp in _panelTypeMap)
{

View File

@@ -7,6 +7,23 @@ public partial class InvertedVSplitContainer : VSplitContainer
{
[Export]
private int _invertedOffset = 200;
private bool _invertedCollapsed = false;
public void InvertedSetCollapsed(bool collapsed)
{
if (_invertedCollapsed == collapsed) return;
_invertedCollapsed = collapsed;
if (collapsed)
{
SplitOffset = (int)Size.Y + 100;
DraggingEnabled = false;
}
else
{
SplitOffset = (int)Size.Y - _invertedOffset;
DraggingEnabled = true;
}
}
public override void _Ready()
{

View File

@@ -4,6 +4,9 @@ public static class GodotGlobalEvents
{
public static event Func<BottomPanelType?, Task> BottomPanelTabSelected = _ => Task.CompletedTask;
public static void InvokeBottomPanelTabSelected(BottomPanelType? type) => BottomPanelTabSelected.Invoke(type);
public static event Func<bool, Task> BottomPanelVisibilityChangeRequested = _ => Task.CompletedTask;
public static void InvokeBottomPanelVisibilityChangeRequested(bool show) => BottomPanelVisibilityChangeRequested.Invoke(show);
}
public enum BottomPanelType

View File

@@ -4,6 +4,7 @@ using Godot;
using Microsoft.Build.Locator;
using SharpIDE.Application.Features.Analysis;
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
using SharpIDE.Godot.Features.CustomControls;
using SharpIDE.Godot.Features.Run;
using SharpIDE.Godot.Features.SolutionExplorer;
@@ -16,6 +17,7 @@ public partial class IdeRoot : Control
private FileDialog _fileDialog = null!;
private SharpIdeCodeEdit _sharpIdeCodeEdit = null!;
private SolutionExplorerPanel _solutionExplorerPanel = null!;
private InvertedVSplitContainer _invertedVSplitContainer = null!;
private RunPanel _runPanel = null!;
private Button _runMenuButton = null!;
private Popup _runMenuPopup = null!;
@@ -29,25 +31,29 @@ public partial class IdeRoot : Control
_buildSlnButton = GetNode<Button>("%BuildSlnButton");
_runMenuPopup = GetNode<Popup>("%RunMenuPopup");
_runMenuButton = GetNode<Button>("%RunMenuButton");
_runMenuButton.Pressed += () =>
{
var popupMenuPosition = _runMenuButton.GlobalPosition;
const int buttonHeight = 37;
_runMenuPopup.Position = new Vector2I((int)popupMenuPosition.X, (int)popupMenuPosition.Y + buttonHeight);
_runMenuPopup.Popup();
};
_sharpIdeCodeEdit = GetNode<SharpIdeCodeEdit>("%SharpIdeCodeEdit");
_fileDialog = GetNode<FileDialog>("%OpenSolutionDialog");
_solutionExplorerPanel = GetNode<SolutionExplorerPanel>("%SolutionExplorerPanel");
_runPanel = GetNode<RunPanel>("%RunPanel");
_invertedVSplitContainer = GetNode<InvertedVSplitContainer>("%InvertedVSplitContainer");
_runMenuButton.Pressed += OnRunMenuButtonPressed;
_solutionExplorerPanel.FileSelected += OnSolutionExplorerPanelOnFileSelected;
_fileDialog.FileSelected += OnFileSelected;
_runPanel = GetNode<RunPanel>("%RunPanel");
_openSlnButton.Pressed += () => _fileDialog.Visible = true;
_buildSlnButton.Pressed += OnBuildSlnButtonPressed;
GodotGlobalEvents.BottomPanelVisibilityChangeRequested += async show => await this.InvokeAsync(() => _invertedVSplitContainer.InvertedSetCollapsed(!show));
OnFileSelected(@"C:\Users\Matthew\Documents\Git\BlazorCodeBreaker\BlazorCodeBreaker.slnx");
}
private void OnRunMenuButtonPressed()
{
var popupMenuPosition = _runMenuButton.GlobalPosition;
const int buttonHeight = 37;
_runMenuPopup.Position = new Vector2I((int)popupMenuPosition.X, (int)popupMenuPosition.Y + buttonHeight);
_runMenuPopup.Popup();
}
private async void OnBuildSlnButtonPressed()
{
await Singletons.BuildService.MsBuildSolutionAsync(_solutionExplorerPanel.SolutionModel.FilePath);

View File

@@ -99,24 +99,25 @@ size_flags_vertical = 3
[node name="LeftSideBar" parent="VBoxContainer/HBoxContainer" instance=ExtResource("3_f60gr")]
layout_mode = 2
[node name="VSplitContainer" type="VSplitContainer" parent="VBoxContainer/HBoxContainer"]
[node name="InvertedVSplitContainer" type="VSplitContainer" parent="VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
split_offset = 402
script = ExtResource("3_0ybuf")
metadata/_custom_type_script = "uid://kvnhndc3l6ih"
[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer/HBoxContainer/VSplitContainer"]
[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer"]
layout_mode = 2
size_flags_horizontal = 3
split_offset = 400
[node name="SolutionExplorerPanel" type="Panel" parent="VBoxContainer/HBoxContainer/VSplitContainer/HSplitContainer"]
[node name="SolutionExplorerPanel" type="Panel" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer/HSplitContainer"]
unique_name_in_owner = true
layout_mode = 2
script = ExtResource("2_tcy02")
[node name="Tree" type="Tree" parent="VBoxContainer/HBoxContainer/VSplitContainer/HSplitContainer/SolutionExplorerPanel"]
[node name="Tree" type="Tree" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer/HSplitContainer/SolutionExplorerPanel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@@ -124,7 +125,7 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="SharpIdeCodeEdit" type="CodeEdit" parent="VBoxContainer/HBoxContainer/VSplitContainer/HSplitContainer"]
[node name="SharpIdeCodeEdit" type="CodeEdit" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer/HSplitContainer"]
unique_name_in_owner = true
layout_mode = 2
theme_override_colors/current_line_color = Color(0.0588235, 0.0588235, 0.0588235, 1)
@@ -142,26 +143,26 @@ auto_brace_completion_enabled = true
auto_brace_completion_highlight_matching = true
script = ExtResource("2_qjf5e")
[node name="CodeFixesMenu" type="PopupMenu" parent="VBoxContainer/HBoxContainer/VSplitContainer/HSplitContainer/SharpIdeCodeEdit"]
[node name="CodeFixesMenu" type="PopupMenu" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer/HSplitContainer/SharpIdeCodeEdit"]
size = Vector2i(217, 100)
item_count = 1
item_0/text = "Getting Context Actions..."
item_0/id = 0
[node name="BottomPanel" type="Panel" parent="VBoxContainer/HBoxContainer/VSplitContainer"]
[node name="BottomPanel" type="Panel" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer"]
layout_mode = 2
script = ExtResource("7_i62lx")
[node name="RunPanel" parent="VBoxContainer/HBoxContainer/VSplitContainer/BottomPanel" instance=ExtResource("5_y3aoi")]
[node name="RunPanel" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer/BottomPanel" instance=ExtResource("5_y3aoi")]
unique_name_in_owner = true
layout_mode = 1
[node name="BuildPanel" parent="VBoxContainer/HBoxContainer/VSplitContainer/BottomPanel" instance=ExtResource("9_rllbf")]
[node name="BuildPanel" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer/BottomPanel" instance=ExtResource("9_rllbf")]
unique_name_in_owner = true
visible = false
layout_mode = 1
[node name="ProblemsPanel" parent="VBoxContainer/HBoxContainer/VSplitContainer/BottomPanel" instance=ExtResource("11_b7c1a")]
[node name="ProblemsPanel" parent="VBoxContainer/HBoxContainer/InvertedVSplitContainer/BottomPanel" instance=ExtResource("11_b7c1a")]
unique_name_in_owner = true
visible = false
layout_mode = 1