Observe R3 events on threadpool

This commit is contained in:
Matt Parker
2025-12-05 22:12:26 +10:00
parent 8932667acc
commit f5c24ce0af
4 changed files with 13 additions and 13 deletions

View File

@@ -104,7 +104,7 @@ public partial class CodeEditorPanel : MarginContainer
_tabContainer.SetTabTooltip(newTabIndex, file.Path); _tabContainer.SetTabTooltip(newTabIndex, file.Path);
_tabContainer.CurrentTab = newTabIndex; _tabContainer.CurrentTab = newTabIndex;
file.IsDirty.Skip(1).SubscribeOnThreadPool().SubscribeAwait(async (isDirty, ct) => file.IsDirty.Skip(1).SubscribeOnThreadPool().ObserveOnThreadPool().SubscribeAwait(async (isDirty, ct) =>
{ {
//GD.Print($"File dirty state changed: {file.Path} is now {(isDirty ? "dirty" : "clean")}"); //GD.Print($"File dirty state changed: {file.Path} is now {(isDirty ? "dirty" : "clean")}");
await this.InvokeAsync(() => await this.InvokeAsync(() =>

View File

@@ -278,7 +278,7 @@ public partial class SharpIdeCodeEdit : CodeEdit
var project = ((IChildSharpIdeNode)_currentFile).GetNearestProjectNode(); var project = ((IChildSharpIdeNode)_currentFile).GetNearestProjectNode();
if (project is not null) if (project is not null)
{ {
_projectDiagnosticsObserveDisposable = project.Diagnostics.ObserveChanged() _projectDiagnosticsObserveDisposable = project.Diagnostics.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => .SubscribeAwait(async (innerEvent, ct) =>
{ {
var projectDiagnosticsForFile = project.Diagnostics.Where(s => s.FilePath == _currentFile.Path).ToImmutableArray(); var projectDiagnosticsForFile = project.Diagnostics.Where(s => s.FilePath == _currentFile.Path).ToImmutableArray();

View File

@@ -48,7 +48,7 @@ public partial class ProblemsPanel : Control
public void BindToTree(ObservableHashSet<SharpIdeProjectModel> list) public void BindToTree(ObservableHashSet<SharpIdeProjectModel> list)
{ {
var view = list.CreateView(y => new TreeItemContainer()); var view = list.CreateView(y => new TreeItemContainer());
view.ObserveChanged() view.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (e, ct) => await (e.Action switch .SubscribeAwait(async (e, ct) => await (e.Action switch
{ {
NotifyCollectionChangedAction.Add => CreateProjectTreeItem(_tree, _rootItem, e), NotifyCollectionChangedAction.Add => CreateProjectTreeItem(_tree, _rootItem, e),
@@ -70,7 +70,7 @@ public partial class ProblemsPanel : Control
Observable.EveryValueChanged(e.NewItem.Value, s => s.Diagnostics.Count).Subscribe(s => treeItem.Visible = s is not 0).AddTo(this); Observable.EveryValueChanged(e.NewItem.Value, s => s.Diagnostics.Count).Subscribe(s => treeItem.Visible = s is not 0).AddTo(this);
var projectDiagnosticsView = e.NewItem.Value.Diagnostics.CreateView(y => new TreeItemContainer()); var projectDiagnosticsView = e.NewItem.Value.Diagnostics.CreateView(y => new TreeItemContainer());
projectDiagnosticsView.ObserveChanged() projectDiagnosticsView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => CreateDiagnosticTreeItem(_tree, treeItem, innerEvent), NotifyCollectionChangedAction.Add => CreateDiagnosticTreeItem(_tree, treeItem, innerEvent),

View File

@@ -141,7 +141,7 @@ public partial class SolutionExplorerPanel : MarginContainer
var projectsView = solution.Projects.CreateView(y => new TreeItemContainer()); var projectsView = solution.Projects.CreateView(y => new TreeItemContainer());
projectsView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateProjectTreeItem(_tree, rootItem, s.Value)); projectsView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateProjectTreeItem(_tree, rootItem, s.Value));
projectsView.ObserveChanged() projectsView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (e, ct) => await (e.Action switch .SubscribeAwait(async (e, ct) => await (e.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => e.NewItem.View.Value = CreateProjectTreeItem(_tree, _rootItem, e.NewItem.Value)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => e.NewItem.View.Value = CreateProjectTreeItem(_tree, _rootItem, e.NewItem.Value)),
@@ -152,7 +152,7 @@ public partial class SolutionExplorerPanel : MarginContainer
// Observe Solution Folders // Observe Solution Folders
var foldersView = solution.SlnFolders.CreateView(y => new TreeItemContainer()); var foldersView = solution.SlnFolders.CreateView(y => new TreeItemContainer());
foldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateSlnFolderTreeItem(_tree, rootItem, s.Value)); foldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateSlnFolderTreeItem(_tree, rootItem, s.Value));
foldersView.ObserveChanged() foldersView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (e, ct) => await (e.Action switch .SubscribeAwait(async (e, ct) => await (e.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => e.NewItem.View.Value = CreateSlnFolderTreeItem(_tree, _rootItem, e.NewItem.Value)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => e.NewItem.View.Value = CreateSlnFolderTreeItem(_tree, _rootItem, e.NewItem.Value)),
@@ -176,7 +176,7 @@ public partial class SolutionExplorerPanel : MarginContainer
var subFoldersView = slnFolder.Folders.CreateView(y => new TreeItemContainer()); var subFoldersView = slnFolder.Folders.CreateView(y => new TreeItemContainer());
subFoldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateSlnFolderTreeItem(_tree, folderItem, s.Value)); subFoldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateSlnFolderTreeItem(_tree, folderItem, s.Value));
subFoldersView.ObserveChanged() subFoldersView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateSlnFolderTreeItem(_tree, folderItem, innerEvent.NewItem.Value)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateSlnFolderTreeItem(_tree, folderItem, innerEvent.NewItem.Value)),
@@ -186,7 +186,7 @@ public partial class SolutionExplorerPanel : MarginContainer
var projectsView = slnFolder.Projects.CreateView(y => new TreeItemContainer()); var projectsView = slnFolder.Projects.CreateView(y => new TreeItemContainer());
projectsView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateProjectTreeItem(_tree, folderItem, s.Value)); projectsView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateProjectTreeItem(_tree, folderItem, s.Value));
projectsView.ObserveChanged() projectsView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateProjectTreeItem(_tree, folderItem, innerEvent.NewItem.Value)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateProjectTreeItem(_tree, folderItem, innerEvent.NewItem.Value)),
@@ -196,7 +196,7 @@ public partial class SolutionExplorerPanel : MarginContainer
var filesView = slnFolder.Files.CreateView(y => new TreeItemContainer()); var filesView = slnFolder.Files.CreateView(y => new TreeItemContainer());
filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, folderItem, s.Value)); filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, folderItem, s.Value));
filesView.ObserveChanged() filesView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, folderItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, folderItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
@@ -218,7 +218,7 @@ public partial class SolutionExplorerPanel : MarginContainer
var foldersView = projectModel.Folders.CreateView(y => new TreeItemContainer()); var foldersView = projectModel.Folders.CreateView(y => new TreeItemContainer());
foldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFolderTreeItem(_tree, projectItem, s.Value)); foldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFolderTreeItem(_tree, projectItem, s.Value));
foldersView.ObserveChanged() foldersView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, projectItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, projectItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
@@ -230,7 +230,7 @@ public partial class SolutionExplorerPanel : MarginContainer
// Observe project files // Observe project files
var filesView = projectModel.Files.CreateView(y => new TreeItemContainer()); var filesView = projectModel.Files.CreateView(y => new TreeItemContainer());
filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, projectItem, s.Value)); filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, projectItem, s.Value));
filesView.ObserveChanged() filesView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, projectItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, projectItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
@@ -259,7 +259,7 @@ public partial class SolutionExplorerPanel : MarginContainer
var subFoldersView = sharpIdeFolder.Folders.CreateView(y => new TreeItemContainer()); var subFoldersView = sharpIdeFolder.Folders.CreateView(y => new TreeItemContainer());
subFoldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFolderTreeItem(_tree, folderItem, s.Value)); subFoldersView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFolderTreeItem(_tree, folderItem, s.Value));
subFoldersView.ObserveChanged() subFoldersView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, folderItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFolderTreeItem(_tree, folderItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),
@@ -271,7 +271,7 @@ public partial class SolutionExplorerPanel : MarginContainer
// Observe files // Observe files
var filesView = sharpIdeFolder.Files.CreateView(y => new TreeItemContainer()); var filesView = sharpIdeFolder.Files.CreateView(y => new TreeItemContainer());
filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, folderItem, s.Value)); filesView.Unfiltered.ToList().ForEach(s => s.View.Value = CreateFileTreeItem(_tree, folderItem, s.Value));
filesView.ObserveChanged() filesView.ObserveChanged().SubscribeOnThreadPool().ObserveOnThreadPool()
.SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch .SubscribeAwait(async (innerEvent, ct) => await (innerEvent.Action switch
{ {
NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, folderItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)), NotifyCollectionChangedAction.Add => this.InvokeAsync(() => innerEvent.NewItem.View.Value = CreateFileTreeItem(_tree, folderItem, innerEvent.NewItem.Value, innerEvent.NewStartingIndex)),