diff --git a/pgLabII.PgUtils.Tests/ConnectionStrings/DbConnectionStringBuilderTests.cs b/pgLabII.PgUtils.Tests/ConnectionStrings/DbConnectionStringBuilderTests.cs index 303d5da..2e8dbb3 100644 --- a/pgLabII.PgUtils.Tests/ConnectionStrings/DbConnectionStringBuilderTests.cs +++ b/pgLabII.PgUtils.Tests/ConnectionStrings/DbConnectionStringBuilderTests.cs @@ -1,5 +1,4 @@ using System.Data.Common; -using Npgsql; namespace pgLabII.PgUtils.Tests.ConnectionStrings; diff --git a/pgLabII.PgUtils.Tests/ConnectionStrings/NpgsqlCodecTests.cs b/pgLabII.PgUtils.Tests/ConnectionStrings/NpgsqlCodecTests.cs index 11fa216..b5ecdd9 100644 --- a/pgLabII.PgUtils.Tests/ConnectionStrings/NpgsqlCodecTests.cs +++ b/pgLabII.PgUtils.Tests/ConnectionStrings/NpgsqlCodecTests.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Npgsql; +using Npgsql; using pgLabII.PgUtils.ConnectionStrings; namespace pgLabII.PgUtils.Tests.ConnectionStrings; diff --git a/pgLabII.PgUtils.Tests/ConnectionStrings/UrlCodecTests.cs b/pgLabII.PgUtils.Tests/ConnectionStrings/UrlCodecTests.cs index 8d1c39b..07d43a7 100644 --- a/pgLabII.PgUtils.Tests/ConnectionStrings/UrlCodecTests.cs +++ b/pgLabII.PgUtils.Tests/ConnectionStrings/UrlCodecTests.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Npgsql; +using Npgsql; using pgLabII.PgUtils.ConnectionStrings; namespace pgLabII.PgUtils.Tests.ConnectionStrings; diff --git a/pgLabII.PgUtils.Tests/ConnectionStrings/Util/UnitTestTokenizerTests.cs b/pgLabII.PgUtils.Tests/ConnectionStrings/Util/UnitTestTokenizerTests.cs index 8c85e5f..9d0ec34 100644 --- a/pgLabII.PgUtils.Tests/ConnectionStrings/Util/UnitTestTokenizerTests.cs +++ b/pgLabII.PgUtils.Tests/ConnectionStrings/Util/UnitTestTokenizerTests.cs @@ -1,6 +1,4 @@ -using FluentResults; - -namespace pgLabII.PgUtils.Tests.ConnectionStrings.Util; +namespace pgLabII.PgUtils.Tests.ConnectionStrings.Util; public class UnitTestTokenizerTests { diff --git a/pgLabII.PgUtils/ConnectionStrings/CodecCommon.cs b/pgLabII.PgUtils/ConnectionStrings/CodecCommon.cs index bef3c04..dd383b2 100644 --- a/pgLabII.PgUtils/ConnectionStrings/CodecCommon.cs +++ b/pgLabII.PgUtils/ConnectionStrings/CodecCommon.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; +using System.Globalization; using Npgsql; namespace pgLabII.PgUtils.ConnectionStrings; diff --git a/pgLabII.PgUtils/ConnectionStrings/ConnectionStringService.cs b/pgLabII.PgUtils/ConnectionStrings/ConnectionStringService.cs index b715866..9c34546 100644 --- a/pgLabII.PgUtils/ConnectionStrings/ConnectionStringService.cs +++ b/pgLabII.PgUtils/ConnectionStrings/ConnectionStringService.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using FluentResults; +using FluentResults; namespace pgLabII.PgUtils.ConnectionStrings; @@ -26,7 +23,7 @@ public sealed class ConnectionStringService : IConnectionStringService public static ConnectionStringService CreateDefault() => new(new IConnectionStringCodec[] { new LibpqCodec(), new NpgsqlCodec(), new UrlCodec(), new JdbcCodec() }); - public Result DetectFormat(string input) + public Result DetectFormat(string? input) { if (string.IsNullOrWhiteSpace(input)) return Result.Fail("Empty input"); diff --git a/pgLabII.PgUtils/ConnectionStrings/HostEndpoint.cs b/pgLabII.PgUtils/ConnectionStrings/HostEndpoint.cs index b03d3f7..a5ca42c 100644 --- a/pgLabII.PgUtils/ConnectionStrings/HostEndpoint.cs +++ b/pgLabII.PgUtils/ConnectionStrings/HostEndpoint.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace pgLabII.PgUtils.ConnectionStrings; +namespace pgLabII.PgUtils.ConnectionStrings; public sealed class HostEndpoint { diff --git a/pgLabII.PgUtils/ConnectionStrings/IConnectionStringService.cs b/pgLabII.PgUtils/ConnectionStrings/IConnectionStringService.cs index fb6f04d..0a69e60 100644 --- a/pgLabII.PgUtils/ConnectionStrings/IConnectionStringService.cs +++ b/pgLabII.PgUtils/ConnectionStrings/IConnectionStringService.cs @@ -8,11 +8,11 @@ namespace pgLabII.PgUtils.ConnectionStrings; /// public interface IConnectionStringService { - Result DetectFormat(string input); + Result DetectFormat(string? input); Result ParseToDescriptor(string input); Result FormatFromDescriptor(ConnectionDescriptor descriptor, ConnStringFormat targetFormat); Result Convert(string input, ConnStringFormat targetFormat); -} \ No newline at end of file +} diff --git a/pgLabII.PgUtils/ConnectionStrings/JdbcCodec.cs b/pgLabII.PgUtils/ConnectionStrings/JdbcCodec.cs index 1274f9c..5776dda 100644 --- a/pgLabII.PgUtils/ConnectionStrings/JdbcCodec.cs +++ b/pgLabII.PgUtils/ConnectionStrings/JdbcCodec.cs @@ -1,11 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Globalization; -using System.Linq; using System.Text; using FluentResults; -using Npgsql; namespace pgLabII.PgUtils.ConnectionStrings; diff --git a/pgLabII.PgUtils/ConnectionStrings/NpgsqlCodec.cs b/pgLabII.PgUtils/ConnectionStrings/NpgsqlCodec.cs index ba67313..4fa7765 100644 --- a/pgLabII.PgUtils/ConnectionStrings/NpgsqlCodec.cs +++ b/pgLabII.PgUtils/ConnectionStrings/NpgsqlCodec.cs @@ -1,7 +1,5 @@ -using System.Collections; -using System.Data.Common; +using System.Data.Common; using System.Globalization; -using System.Text; using FluentResults; using Npgsql; diff --git a/pgLabII.PgUtils/ConnectionStrings/Pq/PqConnectionStringParser.cs b/pgLabII.PgUtils/ConnectionStrings/Pq/PqConnectionStringParser.cs index 6842a19..c255d81 100644 --- a/pgLabII.PgUtils/ConnectionStrings/Pq/PqConnectionStringParser.cs +++ b/pgLabII.PgUtils/ConnectionStrings/Pq/PqConnectionStringParser.cs @@ -1,5 +1,4 @@ -using System.Collections.ObjectModel; -using FluentResults; +using FluentResults; using Npgsql; namespace pgLabII.PgUtils.ConnectionStrings; diff --git a/pgLabII.PgUtils/ConnectionStrings/Pq/PqConnectionStringTokenizer.cs b/pgLabII.PgUtils/ConnectionStrings/Pq/PqConnectionStringTokenizer.cs index c27a568..06d632b 100644 --- a/pgLabII.PgUtils/ConnectionStrings/Pq/PqConnectionStringTokenizer.cs +++ b/pgLabII.PgUtils/ConnectionStrings/Pq/PqConnectionStringTokenizer.cs @@ -1,6 +1,5 @@ using System.Text; using FluentResults; -using static System.Net.Mime.MediaTypeNames; namespace pgLabII.PgUtils.ConnectionStrings; diff --git a/pgLabII/App.axaml.cs b/pgLabII/App.axaml.cs index 4403271..639b8ae 100644 --- a/pgLabII/App.axaml.cs +++ b/pgLabII/App.axaml.cs @@ -4,7 +4,6 @@ using Avalonia.Markup.Xaml; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using pgLabII.Infra; -using pgLabII.ViewModels; using pgLabII.Views; namespace pgLabII; diff --git a/pgLabII/ConnectionManager/ConnectionRepository.cs b/pgLabII/ConnectionManager/ConnectionRepository.cs index 1259b40..233a6ef 100644 --- a/pgLabII/ConnectionManager/ConnectionRepository.cs +++ b/pgLabII/ConnectionManager/ConnectionRepository.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace pgLabII.ConnectionManager; +namespace pgLabII.ConnectionManager; internal class ConnectionRepository { } diff --git a/pgLabII/Contracts/IEditHistoryManager.cs b/pgLabII/Contracts/IEditHistoryManager.cs index d93ddf8..049d74b 100644 --- a/pgLabII/Contracts/IEditHistoryManager.cs +++ b/pgLabII/Contracts/IEditHistoryManager.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; -using pgLabII.Model; -using pgLabII.Views.Controls; +using pgLabII.Model; namespace pgLabII; diff --git a/pgLabII/EditHistoryManager/EditBuffer.cs b/pgLabII/EditHistoryManager/EditBuffer.cs index 60e8f54..1616b60 100644 --- a/pgLabII/EditHistoryManager/EditBuffer.cs +++ b/pgLabII/EditHistoryManager/EditBuffer.cs @@ -1,5 +1,4 @@ -using System; -using System.Text; +using System.Text; namespace pgLabII; diff --git a/pgLabII/EditHistoryManager/EditHistoryManager.cs b/pgLabII/EditHistoryManager/EditHistoryManager.cs index 45ba53d..9f4a2d6 100644 --- a/pgLabII/EditHistoryManager/EditHistoryManager.cs +++ b/pgLabII/EditHistoryManager/EditHistoryManager.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Timers; +using System.Timers; using pgLabII.Infra; using pgLabII.Model; @@ -13,7 +11,7 @@ public class EditHistoryManager : IEditHistoryManager private readonly List _pendingEdits = new(); private EditBuffer? _currentBuffer; private const int BufferTimeoutMs = 500; - private readonly Timer _idleFlushTimer; + private readonly System.Timers.Timer _idleFlushTimer; private readonly object _sync = new object(); public EditHistoryManager(LocalDb db, Document document) @@ -21,7 +19,7 @@ public class EditHistoryManager : IEditHistoryManager _db = db; _document = document; - _idleFlushTimer = new Timer(BufferTimeoutMs) + _idleFlushTimer = new (BufferTimeoutMs) { AutoReset = false, Enabled = false diff --git a/pgLabII/EditHistoryManager/EditOperation.cs b/pgLabII/EditHistoryManager/EditOperation.cs index b0fb10c..8eef1d9 100644 --- a/pgLabII/EditHistoryManager/EditOperation.cs +++ b/pgLabII/EditHistoryManager/EditOperation.cs @@ -1,6 +1,4 @@ -using System; - -namespace pgLabII; +namespace pgLabII; public class EditOperation { diff --git a/pgLabII/Infra/LocalDb.cs b/pgLabII/Infra/LocalDb.cs index 2d1343b..6baa326 100644 --- a/pgLabII/Infra/LocalDb.cs +++ b/pgLabII/Infra/LocalDb.cs @@ -1,6 +1,4 @@ -using System; -using Avalonia.Controls.Shapes; -using Avalonia.Media; +using Avalonia.Media; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using pgLabII.Model; diff --git a/pgLabII/Migrations/LocalDbModelSnapshot.cs b/pgLabII/Migrations/LocalDbModelSnapshot.cs index c860147..a96a8c7 100644 --- a/pgLabII/Migrations/LocalDbModelSnapshot.cs +++ b/pgLabII/Migrations/LocalDbModelSnapshot.cs @@ -39,7 +39,7 @@ namespace pgLabII.Migrations b.HasKey("Id"); - b.ToTable("Documents"); + b.ToTable("Documents", (string)null); }); modelBuilder.Entity("pgLabII.Model.EditHistoryEntry", b => @@ -69,7 +69,7 @@ namespace pgLabII.Migrations b.HasIndex("DocumentId", "Timestamp"); - b.ToTable("EditHistory"); + b.ToTable("EditHistory", (string)null); }); modelBuilder.Entity("pgLabII.Model.ServerConfigurationEntity", b => @@ -112,7 +112,7 @@ namespace pgLabII.Migrations b.HasKey("Id"); - b.ToTable("ServerConfigurations"); + b.ToTable("ServerConfigurations", (string)null); }); modelBuilder.Entity("pgLabII.Model.EditHistoryEntry", b => diff --git a/pgLabII/Model/Document.cs b/pgLabII/Model/Document.cs index 01e3f62..9c6bd0c 100644 --- a/pgLabII/Model/Document.cs +++ b/pgLabII/Model/Document.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; - -namespace pgLabII.Model; +namespace pgLabII.Model; public class Document { diff --git a/pgLabII/Model/EditHistoryEntry.cs b/pgLabII/Model/EditHistoryEntry.cs index 750d2c9..bdab4b8 100644 --- a/pgLabII/Model/EditHistoryEntry.cs +++ b/pgLabII/Model/EditHistoryEntry.cs @@ -1,6 +1,4 @@ -using System; - -namespace pgLabII.Model; +namespace pgLabII.Model; public class EditHistoryEntry { diff --git a/pgLabII/Model/ServerConfigurationEntity.cs b/pgLabII/Model/ServerConfigurationEntity.cs index 0b28c7b..22e0f02 100644 --- a/pgLabII/Model/ServerConfigurationEntity.cs +++ b/pgLabII/Model/ServerConfigurationEntity.cs @@ -1,5 +1,4 @@ -using System; -using Npgsql; +using Npgsql; namespace pgLabII.Model; @@ -15,6 +14,5 @@ public class ServerConfigurationEntity public bool ColorEnabled { get; set; } = true; public int ColorArgb { get; set; } = unchecked((int)0xFF_33_33_33); // default dark gray public string UserName { get; set; } = ""; - - public string Password { get; set; } = ""; + public string Password { get; set; } = ""; } diff --git a/pgLabII/Services/DocumentSessionFactory.cs b/pgLabII/Services/DocumentSessionFactory.cs index a16640b..5f11ec7 100644 --- a/pgLabII/Services/DocumentSessionFactory.cs +++ b/pgLabII/Services/DocumentSessionFactory.cs @@ -1,5 +1,4 @@ -using System; -using pgLabII.Infra; +using pgLabII.Infra; namespace pgLabII.Services; diff --git a/pgLabII/Services/ServerConfigurationMapping.cs b/pgLabII/Services/ServerConfigurationMapping.cs index a61b0f6..99fece1 100644 --- a/pgLabII/Services/ServerConfigurationMapping.cs +++ b/pgLabII/Services/ServerConfigurationMapping.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Npgsql; -using pgLabII.Model; +using pgLabII.Model; using pgLabII.PgUtils.ConnectionStrings; namespace pgLabII.Services; diff --git a/pgLabII/ViewLocator.cs b/pgLabII/ViewLocator.cs index 8febb4f..691656c 100644 --- a/pgLabII/ViewLocator.cs +++ b/pgLabII/ViewLocator.cs @@ -1,7 +1,5 @@ -using System; using Avalonia.Controls; using Avalonia.Controls.Templates; -using pgLabII.ViewModels; namespace pgLabII; diff --git a/pgLabII/ViewModels/EditServerConfigurationViewModel.cs b/pgLabII/ViewModels/EditServerConfigurationViewModel.cs index 42108fe..5c59a7d 100644 --- a/pgLabII/ViewModels/EditServerConfigurationViewModel.cs +++ b/pgLabII/ViewModels/EditServerConfigurationViewModel.cs @@ -1,35 +1,18 @@ -using System; -using System.Linq; -using System.Reactive; +using System.Reactive; using System.Reactive.Linq; -using Npgsql; using pgLabII.Model; using pgLabII.PgUtils.ConnectionStrings; using pgLabII.Services; using ReactiveUI; +using ReactiveUI.SourceGenerators; namespace pgLabII.ViewModels; -public class EditServerConfigurationViewModel : ViewModelBase +public partial class EditServerConfigurationViewModel : ViewModelBase { - // Prefer new UI VM; keep old model for compatibility by wrapping when needed - public ServerConfigurationViewModel Configuration { get; set; } - - // Connection string IO - private string _inputConnectionString = string.Empty; - public string InputConnectionString - { - get => _inputConnectionString; - set - { - this.RaiseAndSetIfChanged(ref _inputConnectionString, value); - // auto-detect when input changes and we are in Auto mode - if (ForcedFormat == ForcedFormatOption.Auto) - { - DetectFormat(); - } - } - } + private readonly IConnectionStringService _service; + // Store original for reverting changes + private ServerConfigurationViewModel? _originalConfiguration; public enum ForcedFormatOption { @@ -40,50 +23,27 @@ public class EditServerConfigurationViewModel : ViewModelBase Jdbc } - private ForcedFormatOption _forcedFormat = ForcedFormatOption.Auto; - public ForcedFormatOption ForcedFormat - { - get => _forcedFormat; - set - { - this.RaiseAndSetIfChanged(ref _forcedFormat, value); - // When forcing off Auto, clear detected label; when switching to Auto, re-detect - if (value == ForcedFormatOption.Auto) - DetectFormat(); - else - DetectedFormat = null; - } - } + public Interaction CloseInteraction { get; } = new(); + // Prefer new UI VM; keep old model for compatibility by wrapping when needed + public ServerConfigurationViewModel Configuration { get; set; } + + // Connection string IO + [Reactive] public partial string? InputConnectionString { get; set; } - private ConnStringFormat? _detectedFormat; - public ConnStringFormat? DetectedFormat - { - get => _detectedFormat; - private set => this.RaiseAndSetIfChanged(ref _detectedFormat, value); - } + [Reactive] public partial ForcedFormatOption ForcedFormat { get; set; } - private ConnStringFormat _outputFormat = ConnStringFormat.Url; - public ConnStringFormat OutputFormat - { - get => _outputFormat; - set => this.RaiseAndSetIfChanged(ref _outputFormat, value); - } + [ObservableAsProperty] private ConnStringFormat? _detectedFormat; + [Reactive] public partial ConnStringFormat OutputFormat { get; set; } - private string _outputConnectionString = string.Empty; - public string OutputConnectionString - { - get => _outputConnectionString; - set => this.RaiseAndSetIfChanged(ref _outputConnectionString, value); - } + [Reactive] public partial string? OutputConnectionString { get; set; } public ReactiveCommand ParseConnectionStringCommand { get; } public ReactiveCommand GenerateConnectionStringCommand { get; } public ReactiveCommand CopyOutputConnectionStringCommand { get; } - public ReactiveCommand SaveAndCloseCommand { get; } - public ReactiveCommand CloseCommand { get; } + public ReactiveCommand SaveCommand { get; } + public ReactiveCommand RevertCommand { get; } - private readonly IConnectionStringService _service; public EditServerConfigurationViewModel() { @@ -94,25 +54,31 @@ public class EditServerConfigurationViewModel : ViewModelBase GenerateConnectionStringCommand = ReactiveCommand.Create(GenerateConnectionString); CopyOutputConnectionStringCommand = ReactiveCommand.Create(() => { /* no-op placeholder */ }); - SaveAndCloseCommand = ReactiveCommand.Create(() => { }); - CloseCommand = ReactiveCommand.Create(() => { }); + SaveCommand = ReactiveCommand.CreateFromTask(Save); + RevertCommand = ReactiveCommand.CreateFromTask(Revert); + + _detectedFormatHelper = this.WhenAnyValue(x => x.ForcedFormat, x => x.InputConnectionString, + DetectFormat) + .ToProperty(this, x => x.DetectedFormat); } public EditServerConfigurationViewModel(ServerConfigurationViewModel configuration) : this() { Configuration = configuration; + InitializeFromCopy(); } - private void DetectFormat() + private ConnStringFormat? DetectFormat(ForcedFormatOption format, string? input) { - if (string.IsNullOrWhiteSpace(InputConnectionString)) - { - DetectedFormat = null; - return; - } + if (format != ForcedFormatOption.Auto) + return null; + + if (string.IsNullOrWhiteSpace(input)) + return null; + var res = _service.DetectFormat(InputConnectionString); - DetectedFormat = res.IsSuccess ? res.Value : null; + return res.IsSuccess ? res.Value : null; } private void ParseConnectionString() @@ -173,4 +139,73 @@ public class EditServerConfigurationViewModel : ViewModelBase if (r.IsSuccess) OutputConnectionString = r.Value; } + + /// + /// Creates a deep copy of the configuration for editing. + /// This ensures changes are isolated until Save is called. + /// + private void InitializeFromCopy() + { + _originalConfiguration = Configuration; + + // Create a copy of the entity + var copiedEntity = new ServerConfigurationEntity + { + Id = _originalConfiguration.Entity.Id, + Name = _originalConfiguration.Entity.Name, + Host = _originalConfiguration.Entity.Host, + Port = _originalConfiguration.Entity.Port, + InitialDatabase = _originalConfiguration.Entity.InitialDatabase, + SslMode = _originalConfiguration.Entity.SslMode, + ColorEnabled = _originalConfiguration.Entity.ColorEnabled, + ColorArgb = _originalConfiguration.Entity.ColorArgb, + UserName = _originalConfiguration.Entity.UserName, + Password = _originalConfiguration.Entity.Password + }; + + // Create a new ViewModel wrapping the copied entity + Configuration = new ServerConfigurationViewModel(copiedEntity); + } + + /// + /// Copies changes from the edited configuration back to the original. + /// + private async Task Save() + { + if (_originalConfiguration == null) return; + + // Copy all properties from the edited configuration back to the original + _originalConfiguration.Name = Configuration.Name; + _originalConfiguration.Host = Configuration.Host; + _originalConfiguration.Port = Configuration.Port; + _originalConfiguration.InitialDatabase = Configuration.InitialDatabase; + _originalConfiguration.DefaultSslMode = Configuration.DefaultSslMode; + _originalConfiguration.ColorEnabled = Configuration.ColorEnabled; + _originalConfiguration.Color = Configuration.Color; + _originalConfiguration.UserName = Configuration.UserName; + _originalConfiguration.Password = Configuration.Password; + + await CloseInteraction.Handle(true); + } + + /// + /// Reverts to the original configuration, discarding all changes. + /// + private async Task Revert() + { + if (_originalConfiguration == null) return; + + // Copy all properties from the original back to the working configuration + Configuration.Name = _originalConfiguration.Name; + Configuration.Host = _originalConfiguration.Host; + Configuration.Port = _originalConfiguration.Port; + Configuration.InitialDatabase = _originalConfiguration.InitialDatabase; + Configuration.DefaultSslMode = _originalConfiguration.DefaultSslMode; + Configuration.ColorEnabled = _originalConfiguration.ColorEnabled; + Configuration.Color = _originalConfiguration.Color; + Configuration.UserName = _originalConfiguration.UserName; + Configuration.Password = _originalConfiguration.Password; + + await CloseInteraction.Handle(false); + } } diff --git a/pgLabII/ViewModels/MainViewModel.cs b/pgLabII/ViewModels/MainViewModel.cs index bf3e70f..966c217 100644 --- a/pgLabII/ViewModels/MainViewModel.cs +++ b/pgLabII/ViewModels/MainViewModel.cs @@ -1,8 +1,4 @@ - -using System; -using Microsoft.Extensions.DependencyInjection; - -namespace pgLabII.ViewModels; +namespace pgLabII.ViewModels; public class MainViewModel : ViewModelBase { diff --git a/pgLabII/ViewModels/QueryToolViewModel.cs b/pgLabII/ViewModels/QueryToolViewModel.cs index 8968d48..4285c86 100644 --- a/pgLabII/ViewModels/QueryToolViewModel.cs +++ b/pgLabII/ViewModels/QueryToolViewModel.cs @@ -1,8 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; +using System.Collections.ObjectModel; using System.Reactive; -using System.Threading.Tasks; using Npgsql; using ReactiveUI; using ReactiveUI.SourceGenerators; diff --git a/pgLabII/ViewModels/ServerConfigurationViewModel.cs b/pgLabII/ViewModels/ServerConfigurationViewModel.cs index 3718e09..de313f8 100644 --- a/pgLabII/ViewModels/ServerConfigurationViewModel.cs +++ b/pgLabII/ViewModels/ServerConfigurationViewModel.cs @@ -1,14 +1,14 @@ -using System; -using System.Reactive; +using System.Reactive; using Avalonia.Media; using Npgsql; using pgLabII.Model; using ReactiveUI; +using ReactiveUI.SourceGenerators; namespace pgLabII.ViewModels; // UI ViewModel that wraps the persistence entity -public class ServerConfigurationViewModel : ReactiveObject +public partial class ServerConfigurationViewModel : ReactiveObject { private readonly ServerConfigurationEntity _entity; @@ -17,7 +17,7 @@ public class ServerConfigurationViewModel : ReactiveObject _entity = entity ?? throw new ArgumentNullException(nameof(entity)); EditCommand = ReactiveCommand.Create(() => { - var window = new Views.EditServerConfigurationWindow(new(this)) { New = false }; + var window = new Views.EditServerConfigurationWindow(new(this)); window.Show(); }); ExploreCommand = ReactiveCommand.Create(() => @@ -25,6 +25,10 @@ public class ServerConfigurationViewModel : ReactiveObject var window = new Views.SingleDatabaseWindow(entity); window.Show(); }); + + _backgroundBrushHelper = this.WhenAnyValue(x => x.ColorEnabled, x => x.Color, + (enabled, color) => enabled ? new SolidColorBrush(color) : null) + .ToProperty(this, x => x.BackgroundBrush); } public ServerConfigurationEntity Entity => _entity; @@ -68,7 +72,7 @@ public class ServerConfigurationViewModel : ReactiveObject public bool ColorEnabled { get => _entity.ColorEnabled; - set { if (_entity.ColorEnabled != value) { _entity.ColorEnabled = value; this.RaisePropertyChanged(); this.RaisePropertyChanged(nameof(BackgroundBrush)); } } + set { if (_entity.ColorEnabled != value) { _entity.ColorEnabled = value; this.RaisePropertyChanged(); } } } public Color Color @@ -81,12 +85,12 @@ public class ServerConfigurationViewModel : ReactiveObject { _entity.ColorArgb = argb; this.RaisePropertyChanged(); - this.RaisePropertyChanged(nameof(BackgroundBrush)); } } } - public IBrush? BackgroundBrush => ColorEnabled ? new SolidColorBrush(Color) : null; + //public IBrush? BackgroundBrush => ColorEnabled ? new SolidColorBrush(Color) : null; + [ObservableAsProperty] private IBrush? _backgroundBrush; public string UserName { @@ -116,6 +120,7 @@ public class ServerConfigurationViewModel : ReactiveObject } } + public ReactiveCommand EditCommand { get; } public ReactiveCommand ExploreCommand { get; } diff --git a/pgLabII/ViewModels/ServerListViewModel.cs b/pgLabII/ViewModels/ServerListViewModel.cs index 0e7a51b..a8cbf0d 100644 --- a/pgLabII/ViewModels/ServerListViewModel.cs +++ b/pgLabII/ViewModels/ServerListViewModel.cs @@ -3,12 +3,14 @@ using ReactiveUI; using System.Reactive; using Avalonia.Media; using pgLabII.Views; -using pgLabII.Model; +using ReactiveUI.SourceGenerators; namespace pgLabII.ViewModels; -public class ServerListViewModel : ViewModelBase +public partial class ServerListViewModel : ViewModelBase { + [Reactive] public partial ServerConfigurationViewModel? SelectedServerConfiguration { get; set; } + public ObservableCollection ServerConfigurations { get; } = [ new (new() @@ -19,7 +21,7 @@ public class ServerListViewModel : ViewModelBase Port = 5418, InitialDatabase = "postgres", UserName = "postgres", - Password = "admin", + Password = "admin" }) { Color = Colors.Aquamarine, @@ -32,22 +34,48 @@ public class ServerListViewModel : ViewModelBase }), ]; - public ReactiveCommand RemoveServerCommand { get; } - + public ReactiveCommand ExploreServerCommand { get; } + public ReactiveCommand EditServerCommand { get; } + public ReactiveCommand RemoveServerCommand { get; } public ReactiveCommand AddServerCommand { get; } public ServerListViewModel() { - RemoveServerCommand = ReactiveCommand.Create((sc) => + ExploreServerCommand = ReactiveCommand.Create((sc) => { - ServerConfigurations.Remove(sc); + var conf = sc ?? SelectedServerConfiguration; + if (conf is null) + return Unit.Default; + + var window = new Views.SingleDatabaseWindow(conf.Entity); + window.Show(); + return Unit.Default; + }); + + EditServerCommand = ReactiveCommand.Create((sc) => + { + var conf = sc ?? SelectedServerConfiguration; + if (conf is null) + return Unit.Default; + + EditServerConfigurationWindow window = new(new(conf)); + window.Show(); + return Unit.Default; + }); + + RemoveServerCommand = ReactiveCommand.Create((sc) => + { + var conf = sc ?? SelectedServerConfiguration; + if (conf is null) + return Unit.Default; + + ServerConfigurations.Remove(conf); return Unit.Default; }); AddServerCommand = ReactiveCommand.Create(() => { - EditServerConfigurationViewModel vm = new(); - EditServerConfigurationWindow window = new() { DataContext = vm, New = true }; + EditServerConfigurationWindow window = new(new()); window.Show(); }); } diff --git a/pgLabII/Views/Controls/CodeEditorView.axaml.cs b/pgLabII/Views/Controls/CodeEditorView.axaml.cs index c7f8a06..754a536 100644 --- a/pgLabII/Views/Controls/CodeEditorView.axaml.cs +++ b/pgLabII/Views/Controls/CodeEditorView.axaml.cs @@ -1,12 +1,8 @@ -using System.IO; -using Avalonia; +using Avalonia; using Avalonia.Controls; -using Avalonia.Data; using AvaloniaEdit.Document; using AvaloniaEdit.TextMate; using TextMateSharp.Grammars; -using System; -using System.Reactive.Linq; namespace pgLabII.Views.Controls; diff --git a/pgLabII/Views/DatabaseListView.axaml.cs b/pgLabII/Views/DatabaseListView.axaml.cs index 462dea5..56681a8 100644 --- a/pgLabII/Views/DatabaseListView.axaml.cs +++ b/pgLabII/Views/DatabaseListView.axaml.cs @@ -1,6 +1,4 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; +using Avalonia.Controls; namespace pgLabII.Views; diff --git a/pgLabII/Views/EditServerConfigurationWindow.axaml b/pgLabII/Views/EditServerConfigurationWindow.axaml index 400fc06..292e1a5 100644 --- a/pgLabII/Views/EditServerConfigurationWindow.axaml +++ b/pgLabII/Views/EditServerConfigurationWindow.axaml @@ -12,7 +12,7 @@ - + @@ -93,6 +93,10 @@ - + + + - - - - - - - - + \ No newline at end of file diff --git a/pgLabII/Views/ServerListView.axaml.cs b/pgLabII/Views/ServerListView.axaml.cs index eb5c023..c482161 100644 --- a/pgLabII/Views/ServerListView.axaml.cs +++ b/pgLabII/Views/ServerListView.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using pgLabII.ViewModels; namespace pgLabII.Views; diff --git a/pgLabII/Views/ServerWindow.axaml.cs b/pgLabII/Views/ServerWindow.axaml.cs index a754f5b..5929285 100644 --- a/pgLabII/Views/ServerWindow.axaml.cs +++ b/pgLabII/Views/ServerWindow.axaml.cs @@ -1,6 +1,4 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; +using Avalonia.Controls; namespace pgLabII.Views; diff --git a/pgLabII/Views/SingleDatabaseWindow.axaml.cs b/pgLabII/Views/SingleDatabaseWindow.axaml.cs index d8f2ab3..0a6e593 100644 --- a/pgLabII/Views/SingleDatabaseWindow.axaml.cs +++ b/pgLabII/Views/SingleDatabaseWindow.axaml.cs @@ -1,6 +1,4 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; +using Avalonia.Controls; using pgLabII.Model; using pgLabII.ViewModels; diff --git a/pgLabII/pgLabII.csproj b/pgLabII/pgLabII.csproj index b0f4298..5f2fcca 100644 --- a/pgLabII/pgLabII.csproj +++ b/pgLabII/pgLabII.csproj @@ -3,6 +3,7 @@ net9.0 enable latest + enable true AnyCPU;x64