From 6ff80af78cfc36aaed15c0f27e9cbc252f68b93e Mon Sep 17 00:00:00 2001 From: Manuel Gasser Date: Sat, 21 Mar 2026 23:18:22 +0100 Subject: [PATCH 1/5] Subscribe to solution altered when focused --- .../Features/CodeEditor/SharpIdeCodeEdit.cs | 14 ++++++-- .../Features/Common/ActivityTimer.cs | 32 +++++++++++++++++++ .../Features/Common/ActivityTimer.cs.uid | 1 + 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/SharpIDE.Godot/Features/Common/ActivityTimer.cs create mode 100644 src/SharpIDE.Godot/Features/Common/ActivityTimer.cs.uid diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs index bef8c57d..2b55e556 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs @@ -1,4 +1,6 @@ using System.Collections.Immutable; +using System.Diagnostics; + using Godot; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeActions; @@ -19,6 +21,8 @@ using SharpIDE.Application.Features.Run; using SharpIDE.Application.Features.SolutionDiscovery; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; +using SharpIDE.Godot.Features.Common; + using Task = System.Threading.Tasks.Task; namespace SharpIDE.Godot.Features.CodeEditor; @@ -89,11 +93,11 @@ public override void _Ready() CaretChanged += OnCaretChanged; TextChanged += OnTextChanged; FocusEntered += OnFocusEntered; + FocusExited += OnFocusExited; SymbolHovered += OnSymbolHovered; SymbolValidate += OnSymbolValidate; SymbolLookup += OnSymbolLookup; LinesEditedFrom += OnLinesEditedFrom; - GlobalEvents.Instance.SolutionAltered.Subscribe(OnSolutionAltered); GodotGlobalEvents.Instance.TextEditorThemeChanged.Subscribe(UpdateEditorThemeAsync); //AddGitGutter(); var hScrollBar = GetHScrollBar(); @@ -110,6 +114,7 @@ private async Task OnSolutionAltered() using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(SharpIdeCodeEdit)}.{nameof(OnSolutionAltered)}"); if (_currentFile is null) return; if (_fileDeleted) return; + using var __ = ActivityTimer.Start($"[{nameof(OnSolutionAltered)}] for '{_currentFile.Name}'"); GD.Print($"[{_currentFile.Name.Value}] Solution altered, updating project diagnostics for file"); var newCt = _solutionAlteredCancellationTokenSeries.CreateNext(); var hasFocus = this.InvokeAsync(HasFocus); @@ -185,7 +190,6 @@ public override void _ExitTree() _currentFile?.FileContentsChangedExternally.Unsubscribe(OnFileChangedExternally); _currentFile?.FileDeleted.Unsubscribe(OnFileDeleted); _projectDiagnosticsObserveDisposable?.Dispose(); - GlobalEvents.Instance.SolutionAltered.Unsubscribe(OnSolutionAltered); GodotGlobalEvents.Instance.TextEditorThemeChanged.Unsubscribe(UpdateEditorThemeAsync); if (_currentFile is not null) _openTabsFileManager.CloseFile(_currentFile); } @@ -194,6 +198,12 @@ private void OnFocusEntered() { // The selected tab changed, report the caret position _editorCaretPositionService.CaretPosition = GetCaretPosition(startAt1: true); + GlobalEvents.Instance.SolutionAltered.Subscribe(OnSolutionAltered); + } + + private void OnFocusExited() + { + GlobalEvents.Instance.SolutionAltered.Unsubscribe(OnSolutionAltered); } private async void OnBreakpointToggled(long line) diff --git a/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs b/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs new file mode 100644 index 00000000..caa8edef --- /dev/null +++ b/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs @@ -0,0 +1,32 @@ +using System.Diagnostics; +using System.Runtime.CompilerServices; + +using Godot; + +namespace SharpIDE.Godot.Features.Common; + +public sealed class ActivityTimer : IDisposable +{ + private readonly string _activity; + private readonly Stopwatch _sw; + + private ActivityTimer(string activity) + { + _activity = activity; + + GD.Print($"{_activity} starting"); + _sw = Stopwatch.StartNew(); + } + + public static ActivityTimer Start([CallerMemberName] string activity = "") + { + return new ActivityTimer(activity); + } + + /// + public void Dispose() + { + _sw.Stop(); + GD.Print($"{_activity} completed in {_sw.Elapsed.Milliseconds}.{_sw.Elapsed.Microseconds}ms"); + } +} \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs.uid b/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs.uid new file mode 100644 index 00000000..07608cf9 --- /dev/null +++ b/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs.uid @@ -0,0 +1 @@ +uid://dmgq8t6gkf4a3 From b32bfea18e3047743c76d3bfdbaea94f05ac9ad8 Mon Sep 17 00:00:00 2001 From: Manuel Gasser Date: Sun, 22 Mar 2026 16:57:14 +0100 Subject: [PATCH 2/5] Avoid unecessary tab switching --- .../Features/CodeEditor/CodeEditorPanel.cs | 90 ++++++++++++------- src/SharpIDE.Godot/IdeRoot.cs | 5 +- 2 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs b/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs index 4ac81848..a12e7d02 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs @@ -155,52 +155,74 @@ private void RecordNavigationToNextSelectedTab(List a } } + public async Task AddSharpIdeFiles(IReadOnlyList files) + { + await Task.CompletedTask.ConfigureAwait(ConfigureAwaitOptions.ForceYielding); + var newTabs = files.Select(file => + { + var newTab = _sharpIdeCodeEditScene.Instantiate(); + newTab.CodeEdit.Solution = Solution; + + return (Tab: newTab, File: file); + }).ToList(); + + await this.InvokeAsync(() => + { + foreach (var newTab in newTabs) + { + _tabContainer.AddChild(newTab.Tab); + var newTabIndex = _tabContainer.GetTabCount() - 1; + _tabContainer.SetIconsForFileExtension(newTab.File, newTabIndex); + _tabContainer.SetTabTitle(newTabIndex, newTab.File.Name.Value); + _tabContainer.SetTabTooltip(newTabIndex, newTab.File.Path); + + newTab.File.FileDeleted.Subscribe(async () => { await this.InvokeAsync(() => { CloseTabs([newTab.Tab]); }); }); + + var nameChanged = newTab.File.Name.Skip(1).Select(name => (name, newTab.File.IsDirty.Value)); + var dirtyChanged = newTab.File.IsDirty.Skip(1).Select(isDirty => (newTab.File.Name.Value, isDirty)); + + nameChanged.Merge(dirtyChanged) + .SubscribeOnThreadPool() + .ObserveOnThreadPool() + .SubscribeAwait(async (x, ct) => + { + var (name, isDirty) = x; + await UpdateTabFileName(newTab.Tab.GetIndex(), name, isDirty); + }) + .AddTo(newTab.Tab); // needs to be on ui thread + } + }); + + foreach (var newTab in newTabs) + { + await newTab.Tab.CodeEdit.SetSharpIdeFile(newTab.File, fileLinePosition: null); + } + } + public async Task SetSharpIdeFile(SharpIdeFile file, SharpIdeFileLinePosition? fileLinePosition) { await Task.CompletedTask.ConfigureAwait(ConfigureAwaitOptions.ForceYielding); var existingTab = await this.InvokeAsync(() => _tabContainer.GetChildren().OfType().FirstOrDefault(t => t.CodeEdit.SharpIdeFile == file)); if (existingTab is not null) { - var existingTabIndex = existingTab.GetIndex(); - await this.InvokeAsync(() => - { - _tabContainer.CurrentTab = existingTabIndex; - if (fileLinePosition is not null) existingTab.CodeEdit.SetFileLinePosition(fileLinePosition.Value); - }); + await SetCurrentSharpIdeFile(file, fileLinePosition); return; } - var newTab = _sharpIdeCodeEditScene.Instantiate(); - newTab.CodeEdit.Solution = Solution; + + await AddSharpIdeFiles([file]); + await SetCurrentSharpIdeFile(file, fileLinePosition); + } + + private async Task SetCurrentSharpIdeFile(SharpIdeFile file, SharpIdeFileLinePosition? fileLinePosition) + { await this.InvokeAsync(() => { - _tabContainer.AddChild(newTab); - var newTabIndex = _tabContainer.GetTabCount() - 1; - _tabContainer.SetIconsForFileExtension(file, newTabIndex); - _tabContainer.SetTabTitle(newTabIndex, file.Name.Value); - _tabContainer.SetTabTooltip(newTabIndex, file.Path); - _tabContainer.CurrentTab = newTabIndex; - - file.FileDeleted.Subscribe(async () => - { - await this.InvokeAsync(() => - { - CloseTabs([newTab]); - }); - }); + var tab = _tabContainer.GetChildren().OfType().FirstOrDefault(t => t.CodeEdit.SharpIdeFile == file); + if (tab is null) return; - var nameChanged = file.Name.Skip(1).Select(name => (name, file.IsDirty.Value)); - var dirtyChanged = file.IsDirty.Skip(1).Select(isDirty => (file.Name.Value, isDirty)); - - nameChanged.Merge(dirtyChanged).SubscribeOnThreadPool().ObserveOnThreadPool() - .SubscribeAwait(async (x, ct) => - { - var (name, isDirty) = x; - await UpdateTabFileName(newTab.GetIndex(), name, isDirty); - }) - .AddTo(newTab); // needs to be on ui thread + _tabContainer.CurrentTab = tab.GetIndex(); + if (fileLinePosition.HasValue) tab.CodeEdit.SetFileLinePosition(fileLinePosition.Value); }); - - await newTab.CodeEdit.SetSharpIdeFile(file, fileLinePosition); } private async Task UpdateTabFileName(int tabIndex, string name, bool isDirty) diff --git a/src/SharpIDE.Godot/IdeRoot.cs b/src/SharpIDE.Godot/IdeRoot.cs index 44aa9ed5..4b3ef52b 100644 --- a/src/SharpIDE.Godot/IdeRoot.cs +++ b/src/SharpIDE.Godot/IdeRoot.cs @@ -179,10 +179,7 @@ public void SetSlnFilePath(string path) await this.InvokeDeferredAsync(async () => { // Preserves order of tabs - foreach (var (file, linePosition, isSelected) in filesToOpen) - { - await GodotGlobalEvents.Instance.FileExternallySelected.InvokeParallelAsync(file, linePosition); - } + await _codeEditorPanel.AddSharpIdeFiles(filesToOpen.Select(file => file.file).ToList()); _navigationHistoryService.StartRecording(); // Select the selected tab var selectedFile = filesToOpen.SingleOrDefault(f => f.isSelected); From 0514722b15ee8235493738f19390e71b29dc3115 Mon Sep 17 00:00:00 2001 From: Manuel Gasser Date: Sun, 22 Mar 2026 17:59:59 +0100 Subject: [PATCH 3/5] Remove solution altered changes --- .../Features/CodeEditor/SharpIdeCodeEdit.cs | 14 ++------ .../Features/Common/ActivityTimer.cs | 32 ------------------- .../Features/Common/ActivityTimer.cs.uid | 1 - 3 files changed, 2 insertions(+), 45 deletions(-) delete mode 100644 src/SharpIDE.Godot/Features/Common/ActivityTimer.cs delete mode 100644 src/SharpIDE.Godot/Features/Common/ActivityTimer.cs.uid diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs index 2b55e556..bef8c57d 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs @@ -1,6 +1,4 @@ using System.Collections.Immutable; -using System.Diagnostics; - using Godot; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeActions; @@ -21,8 +19,6 @@ using SharpIDE.Application.Features.Run; using SharpIDE.Application.Features.SolutionDiscovery; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; -using SharpIDE.Godot.Features.Common; - using Task = System.Threading.Tasks.Task; namespace SharpIDE.Godot.Features.CodeEditor; @@ -93,11 +89,11 @@ public override void _Ready() CaretChanged += OnCaretChanged; TextChanged += OnTextChanged; FocusEntered += OnFocusEntered; - FocusExited += OnFocusExited; SymbolHovered += OnSymbolHovered; SymbolValidate += OnSymbolValidate; SymbolLookup += OnSymbolLookup; LinesEditedFrom += OnLinesEditedFrom; + GlobalEvents.Instance.SolutionAltered.Subscribe(OnSolutionAltered); GodotGlobalEvents.Instance.TextEditorThemeChanged.Subscribe(UpdateEditorThemeAsync); //AddGitGutter(); var hScrollBar = GetHScrollBar(); @@ -114,7 +110,6 @@ private async Task OnSolutionAltered() using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(SharpIdeCodeEdit)}.{nameof(OnSolutionAltered)}"); if (_currentFile is null) return; if (_fileDeleted) return; - using var __ = ActivityTimer.Start($"[{nameof(OnSolutionAltered)}] for '{_currentFile.Name}'"); GD.Print($"[{_currentFile.Name.Value}] Solution altered, updating project diagnostics for file"); var newCt = _solutionAlteredCancellationTokenSeries.CreateNext(); var hasFocus = this.InvokeAsync(HasFocus); @@ -190,6 +185,7 @@ public override void _ExitTree() _currentFile?.FileContentsChangedExternally.Unsubscribe(OnFileChangedExternally); _currentFile?.FileDeleted.Unsubscribe(OnFileDeleted); _projectDiagnosticsObserveDisposable?.Dispose(); + GlobalEvents.Instance.SolutionAltered.Unsubscribe(OnSolutionAltered); GodotGlobalEvents.Instance.TextEditorThemeChanged.Unsubscribe(UpdateEditorThemeAsync); if (_currentFile is not null) _openTabsFileManager.CloseFile(_currentFile); } @@ -198,12 +194,6 @@ private void OnFocusEntered() { // The selected tab changed, report the caret position _editorCaretPositionService.CaretPosition = GetCaretPosition(startAt1: true); - GlobalEvents.Instance.SolutionAltered.Subscribe(OnSolutionAltered); - } - - private void OnFocusExited() - { - GlobalEvents.Instance.SolutionAltered.Unsubscribe(OnSolutionAltered); } private async void OnBreakpointToggled(long line) diff --git a/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs b/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs deleted file mode 100644 index caa8edef..00000000 --- a/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Diagnostics; -using System.Runtime.CompilerServices; - -using Godot; - -namespace SharpIDE.Godot.Features.Common; - -public sealed class ActivityTimer : IDisposable -{ - private readonly string _activity; - private readonly Stopwatch _sw; - - private ActivityTimer(string activity) - { - _activity = activity; - - GD.Print($"{_activity} starting"); - _sw = Stopwatch.StartNew(); - } - - public static ActivityTimer Start([CallerMemberName] string activity = "") - { - return new ActivityTimer(activity); - } - - /// - public void Dispose() - { - _sw.Stop(); - GD.Print($"{_activity} completed in {_sw.Elapsed.Milliseconds}.{_sw.Elapsed.Microseconds}ms"); - } -} \ No newline at end of file diff --git a/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs.uid b/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs.uid deleted file mode 100644 index 07608cf9..00000000 --- a/src/SharpIDE.Godot/Features/Common/ActivityTimer.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dmgq8t6gkf4a3 From 729d46743ce0317822e18287ff01a0148427b223 Mon Sep 17 00:00:00 2001 From: Manuel Gasser Date: Sun, 22 Mar 2026 18:23:05 +0100 Subject: [PATCH 4/5] File cleanup --- src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs b/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs index a12e7d02..8c1a34a1 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs @@ -164,7 +164,8 @@ public async Task AddSharpIdeFiles(IReadOnlyList files) newTab.CodeEdit.Solution = Solution; return (Tab: newTab, File: file); - }).ToList(); + }) + .ToList(); await this.InvokeAsync(() => { From 8e2230bba1b17018f44abb2a49a63e06f6cb156f Mon Sep 17 00:00:00 2001 From: Manuel Gasser Date: Mon, 23 Mar 2026 22:12:07 +0100 Subject: [PATCH 5/5] Add loading spinner --- .../Features/CodeEditor/CodeEditorPanel.cs | 30 ++++++++++++++++++- .../Features/CodeEditor/CodeEditorPanel.tscn | 14 +++++++++ .../CodeEditor/Resources/LoadingSpinner.svg | 20 +++++++++++++ .../Resources/LoadingSpinner.svg.import | 18 +++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/SharpIDE.Godot/Features/CodeEditor/Resources/LoadingSpinner.svg create mode 100644 src/SharpIDE.Godot/Features/CodeEditor/Resources/LoadingSpinner.svg.import diff --git a/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs b/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs index 8c1a34a1..a15c51b3 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.cs @@ -21,6 +21,8 @@ public partial class CodeEditorPanel : MarginContainer public SharpIdeSolutionModel Solution { get; set; } = null!; private PackedScene _sharpIdeCodeEditScene = GD.Load("res://Features/CodeEditor/SharpIdeCodeEdit.tscn"); private TabContainer _tabContainer = null!; + private TextureProgressBar _loadingSpinner = null!; + private Tween? _loadingSpinnerTween; private ConcurrentDictionary _debuggerExecutionStopInfoByProject = []; [Inject] private readonly RunService _runService = null!; @@ -34,6 +36,7 @@ public override void _Ready() tabBar.TabCloseDisplayPolicy = TabBar.CloseButtonDisplayPolicy.ShowAlways; tabBar.TabClosePressed += OnTabClosePressed; tabBar.TabRmbClicked += OnTabRmbClicked; + _loadingSpinner = GetNode("%LoadingSpinner"); GlobalEvents.Instance.DebuggerExecutionStopped.Subscribe(OnDebuggerExecutionStopped); GlobalEvents.Instance.ProjectStoppedDebugging.Subscribe(OnProjectStoppedDebugging); } @@ -155,9 +158,32 @@ private void RecordNavigationToNextSelectedTab(List a } } + private void ShowLoadingSpinner() + { + if (_loadingSpinner.Visible) return; + + _loadingSpinnerTween = GetTree().CreateTween().SetLoops(); + _loadingSpinnerTween.TweenProperty(_loadingSpinner, "radial_initial_angle", 360.0, 1.0).AsRelative(); + _loadingSpinner.Show(); + } + + private void HideLoadingSpinner() + { + if (!_loadingSpinner.Visible) return; + + _loadingSpinnerTween?.Kill(); + _loadingSpinner.Hide(); + } + public async Task AddSharpIdeFiles(IReadOnlyList files) { + if (files.Count <= 0) return; + await Task.CompletedTask.ConfigureAwait(ConfigureAwaitOptions.ForceYielding); + + if (_tabContainer.GetTabCount() <= 0) + await this.InvokeAsync(ShowLoadingSpinner); + var newTabs = files.Select(file => { var newTab = _sharpIdeCodeEditScene.Instantiate(); @@ -168,7 +194,9 @@ public async Task AddSharpIdeFiles(IReadOnlyList files) .ToList(); await this.InvokeAsync(() => - { + { + HideLoadingSpinner(); + foreach (var newTab in newTabs) { _tabContainer.AddChild(newTab.Tab); diff --git a/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.tscn b/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.tscn index f1b90b61..419d0428 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.tscn +++ b/src/SharpIDE.Godot/Features/CodeEditor/CodeEditorPanel.tscn @@ -3,6 +3,7 @@ [ext_resource type="Script" uid="uid://cy7erscaagrtj" path="res://Features/CodeEditor/CodeEditorPanel.cs" id="1_eraxv"] [ext_resource type="PackedScene" uid="uid://cinaqbdghcvoi" path="res://Features/CodeEditor/SharpIdeCodeEdit.tscn" id="1_y4okr"] [ext_resource type="Texture2D" uid="uid://do0edciarrnp0" path="res://Features/SolutionExplorer/Resources/CsharpFile.svg" id="2_dbtmr"] +[ext_resource type="Texture2D" uid="uid://qqpwpn4f6r4j" path="res://Features/CodeEditor/Resources/LoadingSpinner.svg" id="3_dbtmr"] [node name="CodeEditorPanel" type="MarginContainer" unique_id=154728753] anchors_preset = 15 @@ -25,3 +26,16 @@ drag_to_rearrange_enabled = true [node name="SharpIdeCodeEdit" parent="TabContainer" unique_id=170225652 instance=ExtResource("1_y4okr")] layout_mode = 2 metadata/_tab_index = 0 + +[node name="LoadingSpinner" type="TextureProgressBar" parent="." unique_id=33022366] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(50, 50) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +value = 100.0 +fill_mode = 4 +radial_fill_degrees = 180.0 +nine_patch_stretch = true +texture_progress = ExtResource("3_dbtmr") diff --git a/src/SharpIDE.Godot/Features/CodeEditor/Resources/LoadingSpinner.svg b/src/SharpIDE.Godot/Features/CodeEditor/Resources/LoadingSpinner.svg new file mode 100644 index 00000000..96d41ee0 --- /dev/null +++ b/src/SharpIDE.Godot/Features/CodeEditor/Resources/LoadingSpinner.svg @@ -0,0 +1,20 @@ + + + + diff --git a/src/SharpIDE.Godot/Features/CodeEditor/Resources/LoadingSpinner.svg.import b/src/SharpIDE.Godot/Features/CodeEditor/Resources/LoadingSpinner.svg.import new file mode 100644 index 00000000..3831ecec --- /dev/null +++ b/src/SharpIDE.Godot/Features/CodeEditor/Resources/LoadingSpinner.svg.import @@ -0,0 +1,18 @@ +[remap] + +importer="svg" +type="DPITexture" +uid="uid://qqpwpn4f6r4j" +path="res://.godot/imported/LoadingSpinner.svg-678c8f11ed23b35cd2310c9f8c60f1fa.dpitex" + +[deps] + +source_file="res://Features/CodeEditor/Resources/LoadingSpinner.svg" +dest_files=["res://.godot/imported/LoadingSpinner.svg-678c8f11ed23b35cd2310c9f8c60f1fa.dpitex"] + +[params] + +base_scale=1.0 +saturation=1.0 +color_map={} +compress=true