Preserve current state before big refactor

This commit is contained in:
2025-02-05 20:45:49 -08:00
parent 4910ff7770
commit badc6d2375
65 changed files with 2356 additions and 113 deletions

View File

@@ -0,0 +1,38 @@
using System.IO;
using System.Threading.Tasks;
using Godot;
namespace Laura.DeployToSteamOS;
public partial class DeployWindow
{
private async Task DeployBuild(Callable logCallable)
{
CurrentStep = DeployStep.Building;
CurrentProgress = StepProgress.Running;
UpdateUI();
// Adding a 2 second delay so the UI can update
await ToSignal(GetTree().CreateTimer(1), "timeout");
var buildTask = new TaskCompletionSource<bool>();
if (SettingsManager.Instance.Settings.UploadMethod == SettingsFile.UploadMethods.CleanReplace)
{
AddToConsole(DeployStep.Building, "Removing previous build as upload method is set to CleanReplace");
await SteamOSDevkitManager.RunSSHCommand(_device, "python3 ~/devkit-utils/steamos-delete --delete-title " + _gameId, logCallable);
}
GodotExportManager.ExportProject(
ProjectSettings.GlobalizePath("res://"),
Path.Join(_localPath, "game.x86_64"),
false,
logCallable,
() => { buildTask.SetResult(true); }
);
await buildTask.Task;
CurrentProgress = StepProgress.Succeeded;
UpdateUI();
}
}

View File

@@ -0,0 +1 @@
uid://bye7k4dvdra1b

View File

@@ -0,0 +1,36 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Godot;
namespace Laura.DeployToSteamOS;
public partial class DeployWindow
{
private async Task DeployCreateShortcut(Callable logCallable)
{
CurrentStep = DeployStep.CreateShortcut;
CurrentProgress = StepProgress.Running;
UpdateUI();
var createShortcutParameters = new SteamOSDevkitManager.CreateShortcutParameters
{
gameid = _gameId,
directory = _prepareUploadResult.Directory,
argv = new[] { "game.x86_64", SettingsManager.Instance.Settings.StartParameters },
settings = new Dictionary<string, string>
{
{ "steam_play", "0" }
},
};
// TODO: Fix Result, success/error are not filled in response but exist/dont
_createShortcutResult = await SteamOSDevkitManager.CreateShortcut(
_device,
createShortcutParameters,
logCallable
);
CurrentProgress = StepProgress.Succeeded;
UpdateUI();
}
}

View File

@@ -0,0 +1 @@
uid://cveynna4dxqj

View File

@@ -0,0 +1,41 @@
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Godot;
namespace Laura.DeployToSteamOS;
public partial class DeployWindow
{
private async Task DeployInit()
{
CurrentStep = DeployStep.Init;
CurrentProgress = StepProgress.Running;
UpdateUI();
await Task.Delay(0);
_gameId = ProjectSettings.GetSetting("application/config/name", "game").AsString();
_gameId = Regex.Replace(_gameId, @"[^a-zA-Z0-9]", string.Empty);
// Add current timestamp to gameid for incremental builds
if (SettingsManager.Instance.Settings.UploadMethod == SettingsFile.UploadMethods.Incremental)
{
_gameId += "_" + DateTimeOffset.Now.ToUnixTimeSeconds();
}
GD.Print($"[DeployToSteamOS] Deploying '{_gameId}' to '{_device.DisplayName} ({_device.Login}@{_device.IPAdress})'");
_localPath = SettingsManager.Instance.Settings.BuildPath;
if (DirAccess.Open(_localPath) == null)
{
GD.PrintErr($"[DeployToSteamOS] Build path '{_localPath}' does not exist.");
UpdateUIToFail();
return;
}
CurrentProgress = StepProgress.Succeeded;
UpdateUI();
}
}

View File

@@ -0,0 +1 @@
uid://bhkwfem6monsw

View File

@@ -0,0 +1,26 @@
using System.Threading.Tasks;
using Godot;
namespace Laura.DeployToSteamOS;
public partial class DeployWindow
{
private async Task DeployPrepareUpload(Callable logCallable)
{
CurrentStep = DeployStep.PrepareUpload;
CurrentProgress = StepProgress.Running;
UpdateUI();
_prepareUploadResult = await SteamOSDevkitManager.PrepareUpload(
_device,
_gameId,
logCallable
);
AddToConsole(DeployStep.PrepareUpload, $"User: {_prepareUploadResult.User}");
AddToConsole(DeployStep.PrepareUpload, $"Directory: {_prepareUploadResult.Directory}");
CurrentProgress = StepProgress.Succeeded;
UpdateUI();
}
}

View File

@@ -0,0 +1 @@
uid://do8iwi7jpset4

View File

@@ -0,0 +1,33 @@
using System;
using System.Threading.Tasks;
using Godot;
namespace Laura.DeployToSteamOS;
public partial class DeployWindow
{
private async Task DeployUpload(Callable logCallable)
{
CurrentStep = DeployStep.Uploading;
CurrentProgress = StepProgress.Running;
UpdateUI();
try
{
await SteamOSDevkitManager.CopyFiles(
_device,
_localPath,
_prepareUploadResult.Directory,
logCallable
);
}
catch (Exception e)
{
AddToConsole(DeployStep.Uploading, e.Message);
UpdateUIToFail();
}
CurrentProgress = StepProgress.Succeeded;
UpdateUI();
}
}

View File

@@ -0,0 +1 @@
uid://csn5do4f3tqya

View File

@@ -0,0 +1,304 @@
using System.Collections.Generic;
using Godot;
namespace Laura.DeployToSteamOS;
[Tool]
public partial class DeployWindow : Window
{
public enum DeployStep
{
Init,
Building,
PrepareUpload,
Uploading,
CreateShortcut,
Done
}
public DeployStep CurrentStep = DeployStep.Init;
public enum StepProgress
{
Queued,
Running,
Succeeded,
Failed
}
public StepProgress CurrentProgress = StepProgress.Queued;
private string _localPath;
private string _gameId;
private SteamOSDevkitManager.Device _device;
private SteamOSDevkitManager.PrepareUploadResult _prepareUploadResult;
private SteamOSDevkitManager.CreateShortcutResult _createShortcutResult;
private Dictionary<StepProgress, Color> _colorsBright = new()
{
{ StepProgress.Queued, new Color("#6a6a6a") },
{ StepProgress.Running, new Color("#ffffff") },
{ StepProgress.Succeeded, new Color("#00f294") },
{ StepProgress.Failed, new Color("#ff4245") },
};
private Dictionary<StepProgress, Color> _colorsDim = new()
{
{ StepProgress.Queued, new Color("#1d1d1d") },
{ StepProgress.Running, new Color("#222222") },
{ StepProgress.Succeeded, new Color("#13241d") },
{ StepProgress.Failed, new Color("#241313") },
};
[ExportGroup("References")]
[Export] private VBoxContainer _buildingContainer;
[Export] private VBoxContainer _prepareUploadContainer;
[Export] private VBoxContainer _uploadingContainer;
[Export] private VBoxContainer _createShortcutContainer;
public override void _Process(double delta)
{
if (CurrentStep != DeployStep.Done)
{
var container = CurrentStep switch
{
DeployStep.Building => _buildingContainer,
DeployStep.PrepareUpload => _prepareUploadContainer,
DeployStep.Uploading => _uploadingContainer,
DeployStep.CreateShortcut => _createShortcutContainer,
_ => null
};
if (container != null)
{
var progressBar = container.GetNode<ProgressBar>("Progressbar");
if (progressBar.Value < 95f)
{
var shouldDoubleSpeed = CurrentStep is DeployStep.PrepareUpload or DeployStep.CreateShortcut;
progressBar.Value += (float)delta * (shouldDoubleSpeed ? 2f : 1f);
}
}
}
}
public async void Deploy(SteamOSDevkitManager.Device device)
{
if (device == null)
{
GD.PrintErr("[DeployToSteamOS] Device is not available.");
return;
}
_device = device;
_prepareUploadResult = null;
_createShortcutResult = null;
ResetUI();
Title = $"Deploying to {_device.DisplayName} ({_device.Login}@{_device.IPAdress})";
Show();
await DeployInit();
await DeployBuild(Callable.From((Variant log) => AddToConsole(DeployStep.Building, log.AsString())));
await DeployPrepareUpload(Callable.From((Variant log) => AddToConsole(DeployStep.PrepareUpload, log.AsString())));
await DeployUpload(Callable.From((Variant log) => AddToConsole(DeployStep.Uploading, log.AsString())));
await DeployCreateShortcut(Callable.From((Variant log) => AddToConsole(DeployStep.CreateShortcut, log.AsString())));
CurrentStep = DeployStep.Done;
CurrentProgress = StepProgress.Succeeded;
UpdateUI();
}
public void Close()
{
if (CurrentStep != DeployStep.Init && CurrentStep != DeployStep.Done) return;
Hide();
}
private void UpdateUI()
{
UpdateContainer(CurrentStep, CurrentProgress);
if (CurrentStep == DeployStep.Done)
{
SetConsoleVisibility(DeployStep.Building, false, false);
SetConsoleVisibility(DeployStep.PrepareUpload, false, false);
SetConsoleVisibility(DeployStep.Uploading, false, false);
SetConsoleVisibility(DeployStep.CreateShortcut, false, false);
}
}
private void ResetUI()
{
// Clear Consoles
List<Node> consoleNodes = new();
consoleNodes.AddRange(_buildingContainer.GetNode<VBoxContainer>("ConsoleContainer/ScrollContainer/VBoxContainer").GetChildren());
consoleNodes.AddRange(_prepareUploadContainer.GetNode<VBoxContainer>("ConsoleContainer/ScrollContainer/VBoxContainer").GetChildren());
consoleNodes.AddRange(_uploadingContainer.GetNode<VBoxContainer>("ConsoleContainer/ScrollContainer/VBoxContainer").GetChildren());
consoleNodes.AddRange(_createShortcutContainer.GetNode<VBoxContainer>("ConsoleContainer/ScrollContainer/VBoxContainer").GetChildren());
foreach (var consoleNode in consoleNodes)
{
consoleNode.QueueFree();
}
// Clear States
UpdateContainer(DeployStep.Building, StepProgress.Queued);
UpdateContainer(DeployStep.PrepareUpload, StepProgress.Queued);
UpdateContainer(DeployStep.Uploading, StepProgress.Queued);
UpdateContainer(DeployStep.CreateShortcut, StepProgress.Queued);
CurrentStep = DeployStep.Init;
CurrentProgress = StepProgress.Queued;
}
private void UpdateContainer(DeployStep step, StepProgress progress)
{
var container = step switch
{
DeployStep.Building => _buildingContainer,
DeployStep.PrepareUpload => _prepareUploadContainer,
DeployStep.Uploading => _uploadingContainer,
DeployStep.CreateShortcut => _createShortcutContainer,
_ => null
};
if (container == null) return;
var headerContainer = container.GetNode<PanelContainer>("HeaderContainer");
var label = headerContainer.GetNode<Label>("HBoxContainer/Label");
var toggleConsoleButton = headerContainer.GetNode<Button>("HBoxContainer/ToggleConsoleButton");
var progressBar = container.GetNode<ProgressBar>("Progressbar");
label.AddThemeColorOverride("font_color", _colorsBright[progress]);
headerContainer.AddThemeStyleboxOverride("panel", new StyleBoxFlat
{
BgColor = _colorsDim[progress],
ContentMarginTop = 10,
ContentMarginBottom = 10,
ContentMarginLeft = 10,
ContentMarginRight = 10,
});
progressBar.AddThemeStyleboxOverride("fill", new StyleBoxFlat
{
BgColor = _colorsBright[progress],
});
progressBar.Value = progress switch
{
StepProgress.Queued => 0,
StepProgress.Running => 0,
StepProgress.Succeeded => 100,
StepProgress.Failed => 100,
_ => progressBar.Value
};
SetConsoleVisibility(step, progress == StepProgress.Running, false);
toggleConsoleButton.Visible = progress is StepProgress.Succeeded or StepProgress.Failed;
toggleConsoleButton.Disabled = progress is not StepProgress.Succeeded and not StepProgress.Failed;
}
private void AddToConsole(DeployStep step, string text)
{
var consoleContainer = step switch
{
DeployStep.Building => _buildingContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.PrepareUpload => _prepareUploadContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.Uploading => _uploadingContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.CreateShortcut => _createShortcutContainer.GetNode<PanelContainer>("ConsoleContainer"),
_ => null
};
if (consoleContainer == null) return;
var consoleScrollContainer = consoleContainer.GetNode<ScrollContainer>("ScrollContainer");
var consoleVBoxContainer = consoleScrollContainer.GetNode<VBoxContainer>("VBoxContainer");
// Create new Label
var newLabel = new Label { Text = text };
newLabel.AddThemeFontSizeOverride("font_size", 12);
newLabel.AutowrapMode = TextServer.AutowrapMode.Word;
newLabel.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
consoleVBoxContainer.AddChild(newLabel);
consoleScrollContainer.ScrollVertical = (int)consoleScrollContainer.GetVScrollBar().MaxValue;
}
private void SetConsoleVisibility(DeployStep step, bool shouldOpen, bool closeOthers)
{
var consoleContainer = step switch
{
DeployStep.Building => _buildingContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.PrepareUpload => _prepareUploadContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.Uploading => _uploadingContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.CreateShortcut => _createShortcutContainer.GetNode<PanelContainer>("ConsoleContainer"),
_ => null
};
if (consoleContainer == null) return;
// Open Container
if (shouldOpen)
{
// Close all other open containers if not running anymore
if (closeOthers)
{
var consoleContainers = new List<PanelContainer>
{
_buildingContainer.GetNode<PanelContainer>("ConsoleContainer"),
_prepareUploadContainer.GetNode<PanelContainer>("ConsoleContainer"),
_uploadingContainer.GetNode<PanelContainer>("ConsoleContainer"),
_createShortcutContainer.GetNode<PanelContainer>("ConsoleContainer")
};
foreach (var container in consoleContainers)
{
container.Visible = false;
container.GetParent<VBoxContainer>().SizeFlagsVertical = Control.SizeFlags.ShrinkBegin;
}
}
// Open container
consoleContainer.Visible = true;
consoleContainer.GetParent<VBoxContainer>().SizeFlagsVertical = Control.SizeFlags.ExpandFill;
}
else
{
consoleContainer.Visible = false;
consoleContainer.GetParent<VBoxContainer>().SizeFlagsVertical = Control.SizeFlags.ShrinkBegin;
}
}
private void ToggleConsoleVisiblity(DeployStep step)
{
var consoleContainer = step switch
{
DeployStep.Building => _buildingContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.PrepareUpload => _prepareUploadContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.Uploading => _uploadingContainer.GetNode<PanelContainer>("ConsoleContainer"),
DeployStep.CreateShortcut => _createShortcutContainer.GetNode<PanelContainer>("ConsoleContainer"),
_ => null
};
if (consoleContainer == null) return;
SetConsoleVisibility(step, !consoleContainer.Visible, CurrentStep == DeployStep.Done);
}
private void UpdateUIToFail()
{
CurrentProgress = StepProgress.Failed;
UpdateUI();
CurrentStep = DeployStep.Done;
CurrentProgress = StepProgress.Queued;
UpdateUI();
}
public void OnBuildingConsolePressed()
{
ToggleConsoleVisiblity(DeployStep.Building);
}
public void OnPrepareUploadConsolePressed()
{
ToggleConsoleVisiblity(DeployStep.PrepareUpload);
}
public void OnUploadingConsolePressed()
{
ToggleConsoleVisiblity(DeployStep.Uploading);
}
public void OnCreatingShortcutConsolePressed()
{
ToggleConsoleVisiblity(DeployStep.CreateShortcut);
}
}

View File

@@ -0,0 +1 @@
uid://dwen7451fh4y0

View File

@@ -0,0 +1,287 @@
[gd_scene load_steps=17 format=3 uid="uid://ds2umdqybfls8"]
[ext_resource type="Script" path="res://addons/deploy_to_steamos/deploy_window/DeployWindow.cs" id="1_01184"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4voio"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.0666667, 0.0666667, 0.0666667, 1)
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_e8gqy"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lhk4y"]
bg_color = Color(0.866667, 0.866667, 0.866667, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_asgva"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.113725, 0.113725, 0.113725, 1)
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7uvru"]
content_margin_left = 5.0
content_margin_top = 5.0
content_margin_right = 5.0
content_margin_bottom = 5.0
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ojxav"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_e3114"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gqti7"]
bg_color = Color(0.866667, 0.866667, 0.866667, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ok20f"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.113725, 0.113725, 0.113725, 1)
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_aj0up"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_td6y3"]
bg_color = Color(0.866667, 0.866667, 0.866667, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_017mf"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.113725, 0.113725, 0.113725, 1)
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_encuu"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_esvxa"]
bg_color = Color(0.866667, 0.866667, 0.866667, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dgegm"]
content_margin_left = 10.0
content_margin_top = 10.0
content_margin_right = 10.0
content_margin_bottom = 10.0
bg_color = Color(0.113725, 0.113725, 0.113725, 1)
[node name="DeployWindow" type="Window" node_paths=PackedStringArray("_buildingContainer", "_prepareUploadContainer", "_uploadingContainer", "_createShortcutContainer")]
title = "Deploying to steamdeck (deck@127.0.0.1)"
initial_position = 1
size = Vector2i(450, 600)
transient = true
min_size = Vector2i(450, 600)
script = ExtResource("1_01184")
_buildingContainer = NodePath("PanelContainer/VBoxContainer/BuildContainer")
_prepareUploadContainer = NodePath("PanelContainer/VBoxContainer/PrepareUploadContainer")
_uploadingContainer = NodePath("PanelContainer/VBoxContainer/UploadContainer")
_createShortcutContainer = NodePath("PanelContainer/VBoxContainer/CreateShortcutContainer")
[node name="PanelContainer" type="PanelContainer" parent="."]
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
theme_override_styles/panel = SubResource("StyleBoxFlat_4voio")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/separation = 10
[node name="BuildContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 0
theme_override_constants/separation = 0
[node name="Progressbar" type="ProgressBar" parent="PanelContainer/VBoxContainer/BuildContainer"]
custom_minimum_size = Vector2(0, 2)
layout_mode = 2
theme_override_styles/background = SubResource("StyleBoxEmpty_e8gqy")
theme_override_styles/fill = SubResource("StyleBoxFlat_lhk4y")
show_percentage = false
[node name="HeaderContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/BuildContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_asgva")
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/BuildContainer/HeaderContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/BuildContainer/HeaderContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_colors/font_color = Color(0.415686, 0.415686, 0.415686, 1)
text = "Building Project"
[node name="ToggleConsoleButton" type="Button" parent="PanelContainer/VBoxContainer/BuildContainer/HeaderContainer/HBoxContainer"]
layout_mode = 2
disabled = true
text = "Output"
[node name="ConsoleContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/BuildContainer"]
visible = false
layout_mode = 2
size_flags_vertical = 3
theme_override_styles/panel = SubResource("StyleBoxEmpty_7uvru")
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer/BuildContainer/ConsoleContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxEmpty_ojxav")
horizontal_scroll_mode = 0
vertical_scroll_mode = 2
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/BuildContainer/ConsoleContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 0
[node name="PrepareUploadContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 0
theme_override_constants/separation = 0
[node name="Progressbar" type="ProgressBar" parent="PanelContainer/VBoxContainer/PrepareUploadContainer"]
custom_minimum_size = Vector2(0, 2)
layout_mode = 2
theme_override_styles/background = SubResource("StyleBoxEmpty_e3114")
theme_override_styles/fill = SubResource("StyleBoxFlat_gqti7")
show_percentage = false
[node name="HeaderContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/PrepareUploadContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_ok20f")
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/PrepareUploadContainer/HeaderContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/PrepareUploadContainer/HeaderContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_colors/font_color = Color(0.415686, 0.415686, 0.415686, 1)
text = "Preparing Upload"
[node name="ToggleConsoleButton" type="Button" parent="PanelContainer/VBoxContainer/PrepareUploadContainer/HeaderContainer/HBoxContainer"]
layout_mode = 2
disabled = true
text = "Output"
[node name="ConsoleContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/PrepareUploadContainer"]
visible = false
layout_mode = 2
size_flags_vertical = 3
theme_override_styles/panel = SubResource("StyleBoxEmpty_7uvru")
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer/PrepareUploadContainer/ConsoleContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxEmpty_ojxav")
horizontal_scroll_mode = 0
vertical_scroll_mode = 2
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/PrepareUploadContainer/ConsoleContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 0
theme_override_constants/separation = 0
[node name="UploadContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer"]
layout_mode = 2
theme_override_constants/separation = 0
[node name="Progressbar" type="ProgressBar" parent="PanelContainer/VBoxContainer/UploadContainer"]
custom_minimum_size = Vector2(0, 2)
layout_mode = 2
theme_override_styles/background = SubResource("StyleBoxEmpty_aj0up")
theme_override_styles/fill = SubResource("StyleBoxFlat_td6y3")
show_percentage = false
[node name="HeaderContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/UploadContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_017mf")
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/UploadContainer/HeaderContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/UploadContainer/HeaderContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_colors/font_color = Color(0.415686, 0.415686, 0.415686, 1)
text = "Uploading Project"
[node name="ToggleConsoleButton" type="Button" parent="PanelContainer/VBoxContainer/UploadContainer/HeaderContainer/HBoxContainer"]
layout_mode = 2
disabled = true
text = "Output"
[node name="ConsoleContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/UploadContainer"]
visible = false
layout_mode = 2
size_flags_vertical = 3
theme_override_styles/panel = SubResource("StyleBoxEmpty_7uvru")
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer/UploadContainer/ConsoleContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxEmpty_ojxav")
horizontal_scroll_mode = 0
vertical_scroll_mode = 2
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/UploadContainer/ConsoleContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 0
[node name="CreateShortcutContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer"]
layout_mode = 2
theme_override_constants/separation = 0
[node name="Progressbar" type="ProgressBar" parent="PanelContainer/VBoxContainer/CreateShortcutContainer"]
custom_minimum_size = Vector2(0, 2)
layout_mode = 2
theme_override_styles/background = SubResource("StyleBoxEmpty_encuu")
theme_override_styles/fill = SubResource("StyleBoxFlat_esvxa")
show_percentage = false
[node name="HeaderContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/CreateShortcutContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_dgegm")
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/CreateShortcutContainer/HeaderContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/CreateShortcutContainer/HeaderContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_colors/font_color = Color(0.415686, 0.415686, 0.415686, 1)
text = "Creating Shortcut"
[node name="ToggleConsoleButton" type="Button" parent="PanelContainer/VBoxContainer/CreateShortcutContainer/HeaderContainer/HBoxContainer"]
layout_mode = 2
disabled = true
text = "Output"
[node name="ConsoleContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/CreateShortcutContainer"]
visible = false
layout_mode = 2
size_flags_vertical = 3
theme_override_styles/panel = SubResource("StyleBoxEmpty_7uvru")
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer/CreateShortcutContainer/ConsoleContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxEmpty_ojxav")
horizontal_scroll_mode = 0
vertical_scroll_mode = 2
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/CreateShortcutContainer/ConsoleContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 0
[connection signal="close_requested" from="." to="." method="Close"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/BuildContainer/HeaderContainer/HBoxContainer/ToggleConsoleButton" to="." method="OnBuildingConsolePressed"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/PrepareUploadContainer/HeaderContainer/HBoxContainer/ToggleConsoleButton" to="." method="OnPrepareUploadConsolePressed"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/UploadContainer/HeaderContainer/HBoxContainer/ToggleConsoleButton" to="." method="OnUploadingConsolePressed"]
[connection signal="pressed" from="PanelContainer/VBoxContainer/CreateShortcutContainer/HeaderContainer/HBoxContainer/ToggleConsoleButton" to="." method="OnCreatingShortcutConsolePressed"]