diff options
author | Rory& <root@rory.gay> | 2024-08-08 02:57:34 +0200 |
---|---|---|
committer | Rory& <root@rory.gay> | 2024-08-08 03:02:10 +0200 |
commit | df5fe7c86e41235f99a9b0d69519a18581eddd5e (patch) | |
tree | d7ae3b2c9b98ffcf4fbe4613091dfc7db7e2c62b /ModerationClient/Views | |
parent | List rooms (diff) | |
download | ModerationClient-df5fe7c86e41235f99a9b0d69519a18581eddd5e.tar.xz |
Further work
Diffstat (limited to 'ModerationClient/Views')
-rw-r--r-- | ModerationClient/Views/MainWindow/ClientView.axaml (renamed from ModerationClient/Views/ClientView.axaml) | 10 | ||||
-rw-r--r-- | ModerationClient/Views/MainWindow/ClientView.axaml.cs (renamed from ModerationClient/Views/ClientView.axaml.cs) | 0 | ||||
-rw-r--r-- | ModerationClient/Views/MainWindow/LoginView.axaml (renamed from ModerationClient/Views/LoginView.axaml) | 2 | ||||
-rw-r--r-- | ModerationClient/Views/MainWindow/LoginView.axaml.cs (renamed from ModerationClient/Views/LoginView.axaml.cs) | 0 | ||||
-rw-r--r-- | ModerationClient/Views/MainWindow/MainWindow.axaml (renamed from ModerationClient/Views/MainWindow.axaml) | 25 | ||||
-rw-r--r-- | ModerationClient/Views/MainWindow/MainWindow.axaml.cs (renamed from ModerationClient/Views/MainWindow.axaml.cs) | 54 | ||||
-rw-r--r-- | ModerationClient/Views/UserManagementWindow.axaml | 59 | ||||
-rw-r--r-- | ModerationClient/Views/UserManagementWindow.axaml.cs | 136 |
8 files changed, 253 insertions, 33 deletions
diff --git a/ModerationClient/Views/ClientView.axaml b/ModerationClient/Views/MainWindow/ClientView.axaml index 0ed8021..ba030e4 100644 --- a/ModerationClient/Views/ClientView.axaml +++ b/ModerationClient/Views/MainWindow/ClientView.axaml @@ -7,7 +7,7 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="ModerationClient.Views.ClientView" x:DataType="viewModels:ClientViewModel"> - <Grid Width="{Binding $parent.Width}" Height="{Binding $parent.Height}" RowDefinitions="*,20"> + <Grid Width="{Binding $parent.Width}" Height="{Binding $parent.Height}" RowDefinitions="*, Auto"> <Grid Grid.Row="0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="128" MinWidth="16" /> @@ -19,7 +19,7 @@ <TreeView Grid.Column="0" Background="Red" ItemsSource="{CompiledBinding DisplayedSpaces}" SelectedItem="{CompiledBinding CurrentSpace}"> <TreeView.ItemTemplate> <TreeDataTemplate ItemsSource="{Binding ChildSpaces}"> - <TextBlock Text="{Binding Name}" /> + <TextBlock Text="{Binding Name}" Height="20" /> </TreeDataTemplate> </TreeView.ItemTemplate> </TreeView> @@ -28,15 +28,15 @@ <ListBox Grid.Column="2" Background="Green" ItemsSource="{CompiledBinding CurrentSpace.ChildRooms}"> <ListBox.ItemTemplate> <DataTemplate DataType="viewModels:RoomNode"> - <Label Content="{CompiledBinding Name}" /> + <TextBlock Text="{CompiledBinding Name}" Height="20" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <GridSplitter Grid.Column="3" Background="Black" ResizeDirection="Columns" /> <Rectangle Grid.Column="4" Fill="Blue" /> </Grid> - <Grid Grid.Row="1" ColumnDefinitions="Auto, *, Auto"> - <Label Grid.Column="2">Text here</Label> + <Grid Grid.Row="1" ColumnDefinitions="Auto, *, Auto" Background="Black"> + <Label Grid.Column="2" Content="{CompiledBinding Status}" /> </Grid> </Grid> </UserControl> \ No newline at end of file diff --git a/ModerationClient/Views/ClientView.axaml.cs b/ModerationClient/Views/MainWindow/ClientView.axaml.cs index 894e807..894e807 100644 --- a/ModerationClient/Views/ClientView.axaml.cs +++ b/ModerationClient/Views/MainWindow/ClientView.axaml.cs diff --git a/ModerationClient/Views/LoginView.axaml b/ModerationClient/Views/MainWindow/LoginView.axaml index 10e97c6..5dc6533 100644 --- a/ModerationClient/Views/LoginView.axaml +++ b/ModerationClient/Views/MainWindow/LoginView.axaml @@ -7,8 +7,6 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="ModerationClient.Views.LoginView" x:DataType="viewModels:LoginViewModel"> - <!-- DataContext="{Binding $self}"> --> - <!-- DataContext="{Binding $self}"> --> <StackPanel> <Label>Log in</Label> <StackPanel Orientation="Horizontal"> diff --git a/ModerationClient/Views/LoginView.axaml.cs b/ModerationClient/Views/MainWindow/LoginView.axaml.cs index 5e84ace..5e84ace 100644 --- a/ModerationClient/Views/LoginView.axaml.cs +++ b/ModerationClient/Views/MainWindow/LoginView.axaml.cs diff --git a/ModerationClient/Views/MainWindow.axaml b/ModerationClient/Views/MainWindow/MainWindow.axaml index 1c2b396..ef13553 100644 --- a/ModerationClient/Views/MainWindow.axaml +++ b/ModerationClient/Views/MainWindow/MainWindow.axaml @@ -5,20 +5,19 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:views="clr-namespace:ModerationClient.Views" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="ModerationClient.Views.MainWindow" + x:Class="ModerationClient.Views.MainWindow.MainWindow" x:DataType="vm:MainWindowViewModel" Icon="/Assets/avalonia-logo.ico" Title="ModerationClient" - Width="640" Height="480"> - - <Design.DataContext> - <!-- This only sets the DataContext for the previewer in an IDE, + Width="1280" Height="720"> + <!-- <Design.DataContext> --> + <!-- This only sets the DataContext for the previewer in an IDE, to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) --> - <vm:MainWindowViewModel /> - </Design.DataContext> + <!-- <vm:MainWindowViewModel /> --> + <!-- </Design.DataContext> --> - <StackPanel> - <Grid ColumnDefinitions="Auto, *, Auto"> + <Grid RowDefinitions="Auto, *"> + <Grid Grid.Row="0" ColumnDefinitions="Auto, *, Auto" x:Name="TopPanel"> <StackPanel Orientation="Horizontal" Grid.Column="0"> <Label Content="{CompiledBinding Scale}" /> <Label>x</Label> @@ -29,14 +28,12 @@ </StackPanel> <Label Grid.Column="2">Press '?' for keybinds</Label> </Grid> - <Viewbox> + <Viewbox Grid.Row="1"> <ContentControl Width="{CompiledBinding ChildTargetWidth}" - Height="{CompiledBinding ChildTargetHeight}" Background="#222222" + Height="{CompiledBinding ChildTargetHeight}" Content="{CompiledBinding CurrentViewModel}" /> </Viewbox> - - </StackPanel> - + </Grid> </Window> \ No newline at end of file diff --git a/ModerationClient/Views/MainWindow.axaml.cs b/ModerationClient/Views/MainWindow/MainWindow.axaml.cs index 884e90c..01027c1 100644 --- a/ModerationClient/Views/MainWindow.axaml.cs +++ b/ModerationClient/Views/MainWindow/MainWindow.axaml.cs @@ -8,13 +8,17 @@ using Microsoft.Extensions.Hosting; using ModerationClient.Services; using ModerationClient.ViewModels; -namespace ModerationClient.Views; +namespace ModerationClient.Views.MainWindow; public partial class MainWindow : Window { public MainWindow(CommandLineConfiguration cfg, MainWindowViewModel dataContext, IHostApplicationLifetime appLifetime) { InitializeComponent(); DataContext = dataContext; - _ = dataContext.AuthService.LoadProfileAsync(); + _ = dataContext.AuthService.LoadProfileAsync().ContinueWith(x => { + if (x.IsFaulted) { + Console.WriteLine("Failed to load profile: " + x.Exception); + } + }); Console.WriteLine("mainwnd"); #if DEBUG this.AttachDevTools(new DevToolsOptions() { @@ -25,31 +29,43 @@ public partial class MainWindow : Window { PropertyChanged += (sender, args) => { // Console.WriteLine($"MainWindow PropertyChanged: {args.Property.Name} ({args.OldValue} -> {args.NewValue})"); switch (args.Property.Name) { - case nameof(Height): - case nameof(Width): { + case nameof(ClientSize): { if (DataContext is not MainWindowViewModel viewModel) { - Console.WriteLine("WARN: MainWindowViewModel is null, ignoring height/width change!"); + Console.WriteLine("WARN: MainWindowViewModel is null, ignoring ClientSize change!"); return; } - // Console.WriteLine("height/width changed"); - viewModel.Scale = viewModel.Scale; + viewModel.PhysicalSize = new Size(ClientSize.Width, ClientSize.Height - TopPanel.Bounds.Height); break; } } }; + + TopPanel.PropertyChanged += (_, args) => { + if (args.Property.Name == nameof(Visual.Bounds)) { + if (DataContext is not MainWindowViewModel viewModel) { + Console.WriteLine("WARN: MainWindowViewModel is null, ignoring TopPanel.Bounds change!"); + return; + } + + viewModel.PhysicalSize = new Size(ClientSize.Width, ClientSize.Height - TopPanel.Bounds.Height); + } + }; + dataContext.AuthService.PropertyChanged += (sender, args) => { if (args.PropertyName == nameof(MatrixAuthenticationService.IsLoggedIn)) { if (dataContext.AuthService.IsLoggedIn) { // dataContext.CurrentViewModel = new ClientViewModel(dataContext.AuthService); dataContext.CurrentViewModel = App.Current.Host.Services.GetRequiredService<ClientViewModel>(); + var window = App.Current.Host.Services.GetRequiredService<UserManagementWindow>(); + window.Show(); } else { dataContext.CurrentViewModel = new LoginViewModel(dataContext.AuthService); } } }; - dataContext.MainWindow = this; + dataContext.Scale = cfg.Scale; Width *= cfg.Scale; Height *= cfg.Scale; @@ -84,11 +100,25 @@ public partial class MainWindow : Window { viewModel.Scale = 5.0f; } } - else if (e.Key == Key.K && e.KeyModifiers == KeyModifiers.Control) { - if(viewModel.CurrentViewModel is ClientViewModel clientViewModel) { - Console.WriteLine("QuickSwitcher invoked"); + else if (e.KeyModifiers == KeyModifiers.Control) { + if (e.Key == Key.K) { + if (viewModel.CurrentViewModel is ClientViewModel clientViewModel) { + Console.WriteLine("QuickSwitcher invoked"); + } + else Console.WriteLine("WARN: CurrentViewModel is not ClientViewModel, ignoring Quick Switcher"); + } + else if (e.Key == Key.U ) { + Console.WriteLine("UserManagementWindow invoked"); + var window = App.Current.Host.Services.GetRequiredService<UserManagementWindow>(); + window.Show(); + } + else if (e.Key == Key.F5) { + Console.WriteLine("Launching new process"); + System.Diagnostics.Process.Start(System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName, Environment.GetCommandLineArgs()); + } + else if (e.Key == Key.F9) { + } - else Console.WriteLine("WARN: CurrentViewModel is not ClientViewModel, ignoring Quick Switcher"); } } } \ No newline at end of file diff --git a/ModerationClient/Views/UserManagementWindow.axaml b/ModerationClient/Views/UserManagementWindow.axaml new file mode 100644 index 0000000..ef93517 --- /dev/null +++ b/ModerationClient/Views/UserManagementWindow.axaml @@ -0,0 +1,59 @@ +<Window xmlns="https://github.com/avaloniaui" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:vm="using:ModerationClient.ViewModels" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:views="clr-namespace:ModerationClient.Views" + xmlns:responses="clr-namespace:LibMatrix.Homeservers.ImplementationDetails.Synapse.Models.Responses;assembly=LibMatrix" + mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" + x:Class="ModerationClient.Views.UserManagementWindow" + x:DataType="vm:MainWindowViewModel" + Icon="/Assets/avalonia-logo.ico" + Title="ModerationClient" + Width="640" Height="480"> + <!-- <Design.DataContext> --> + <!-- This only sets the DataContext for the previewer in an IDE, + to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) --> + <!-- <vm:MainWindowViewModel /> --> + <!-- </Design.DataContext> --> + + <Grid RowDefinitions="Auto, *"> + <Grid Grid.Row="0" ColumnDefinitions="Auto, *, Auto" x:Name="TopPanel"> + <StackPanel Orientation="Horizontal" Grid.Column="0"> + <Label Content="{CompiledBinding Scale}" /> + <Label>x</Label> + <Rectangle Width="32" /> + <Label Content="{CompiledBinding ChildTargetWidth}" /> + <Label>x</Label> + <Label Content="{CompiledBinding ChildTargetHeight}" /> + </StackPanel> + <Label Grid.Column="2">Press '?' for keybinds</Label> + </Grid> + <Viewbox Grid.Row="1"> + <ScrollViewer + Width="{CompiledBinding ChildTargetWidth}" + Background="#222222" + Height="{CompiledBinding ChildTargetHeight}"> + <ContentControl DataContext="{CompiledBinding Path=CurrentViewModel}"> + <ItemsControl ItemsSource="{ReflectionBinding Users}"> + <ItemsControl.ItemTemplate> + <DataTemplate DataType="vm:User"> + <StackPanel Orientation="Vertical"> + <StackPanel Orientation="Horizontal"> + <TextBlock Text="{CompiledBinding Name}" /> + <TextBlock Text="{CompiledBinding DisplayName}" /> + </StackPanel> + <StackPanel Orientation="Horizontal"> + <Button Tag="{CompiledBinding .}" Click="PuppetButtonClicked">Puppet</Button> + <!-- <Button>Terminate</Button> --> + </StackPanel> + </StackPanel> + </DataTemplate> + </ItemsControl.ItemTemplate> + </ItemsControl> + </ContentControl> + </ScrollViewer> + </Viewbox> + </Grid> + +</Window> \ No newline at end of file diff --git a/ModerationClient/Views/UserManagementWindow.axaml.cs b/ModerationClient/Views/UserManagementWindow.axaml.cs new file mode 100644 index 0000000..2d2dfb4 --- /dev/null +++ b/ModerationClient/Views/UserManagementWindow.axaml.cs @@ -0,0 +1,136 @@ +using System; +using ArcaneLibs.Extensions; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Diagnostics; +using Avalonia.Input; +using Avalonia.Interactivity; +using LibMatrix.Homeservers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using ModerationClient.Services; +using ModerationClient.ViewModels; + +namespace ModerationClient.Views; + +public partial class UserManagementWindow : Window { + private readonly CommandLineConfiguration _cfg; + private readonly MatrixAuthenticationService _auth; + + public UserManagementWindow(CommandLineConfiguration cfg, MainWindowViewModel dataContext, IHostApplicationLifetime appLifetime, + UserManagementViewModel userManagementViewModel, MatrixAuthenticationService auth) { + _cfg = cfg; + _auth = auth; + InitializeComponent(); + DataContext = dataContext; + dataContext.CurrentViewModel = userManagementViewModel; + Console.WriteLine("mainwnd"); +#if DEBUG + this.AttachDevTools(new DevToolsOptions() { + ShowAsChildWindow = true, + LaunchView = DevToolsViewKind.LogicalTree, + }); +#endif + PropertyChanged += (sender, args) => { + // Console.WriteLine($"MainWindow PropertyChanged: {args.Property.Name} ({args.OldValue} -> {args.NewValue})"); + switch (args.Property.Name) { + case nameof(ClientSize): { + if (DataContext is not MainWindowViewModel viewModel) { + Console.WriteLine("WARN: MainWindowViewModel is null, ignoring ClientSize change!"); + return; + } + + viewModel.PhysicalSize = new Size(ClientSize.Width, ClientSize.Height - TopPanel.Bounds.Height); + break; + } + } + }; + + TopPanel.PropertyChanged += (_, args) => { + if (args.Property.Name == nameof(TopPanel.Bounds)) { + if (DataContext is not MainWindowViewModel viewModel) { + Console.WriteLine("WARN: MainWindowViewModel is null, ignoring TopPanel.Bounds change!"); + return; + } + + viewModel.PhysicalSize = new Size(ClientSize.Width, ClientSize.Height - TopPanel.Bounds.Height); + } + }; + + dataContext.AuthService.PropertyChanged += (sender, args) => { + if (args.PropertyName == nameof(MatrixAuthenticationService.IsLoggedIn)) { + if (dataContext.AuthService.IsLoggedIn) { + // dataContext.CurrentViewModel = new ClientViewModel(dataContext.AuthService); + dataContext.CurrentViewModel = App.Current.Host.Services.GetRequiredService<ClientViewModel>(); + } + else { + dataContext.CurrentViewModel = new LoginViewModel(dataContext.AuthService); + } + } + }; + + dataContext.Scale = cfg.Scale; + Width *= cfg.Scale; + Height *= cfg.Scale; + + appLifetime.ApplicationStopping.Register(() => { + Console.WriteLine("ApplicationStopping triggered"); + Close(); + }); + } + + protected override void OnKeyDown(KeyEventArgs e) => OnKeyDown(this, e); + + private void OnKeyDown(object? _, KeyEventArgs e) { + if (DataContext is not MainWindowViewModel viewModel) { + Console.WriteLine($"WARN: DataContext is {DataContext?.GetType().Name ?? "null"}, ignoring key press!"); + return; + } + + // Console.WriteLine("MainWindow KeyDown: " + e.Key); + if (e.Key == Key.Escape) { + viewModel.Scale = 1.0f; + } + else if (e.Key == Key.F1) { + viewModel.Scale -= 0.1f; + if (viewModel.Scale < 0.1f) { + viewModel.Scale = 0.1f; + } + } + else if (e.Key == Key.F2) { + viewModel.Scale += 0.1f; + if (viewModel.Scale > 5.0f) { + viewModel.Scale = 5.0f; + } + } + else if (e.Key == Key.K && e.KeyModifiers == KeyModifiers.Control) { + if (viewModel.CurrentViewModel is ClientViewModel clientViewModel) { + Console.WriteLine("QuickSwitcher invoked"); + } + else Console.WriteLine("WARN: CurrentViewModel is not ClientViewModel, ignoring Quick Switcher"); + } + } + + // ReSharper disable once AsyncVoidMethod + private async void PuppetButtonClicked(object? sender, RoutedEventArgs e) { + if (e.Source is not Button button) { + Console.WriteLine("WARN: Source is not Button, ignoring PuppetButtonClicked!"); + return; + } + + if (button.Tag is not User user) { + Console.WriteLine("WARN: Tag is not User, ignoring PuppetButtonClicked!"); + return; + } + + if (_auth.Homeserver is not AuthenticatedHomeserverSynapse synapse) { + Console.WriteLine("WARN: Homeserver is not Synapse, ignoring PuppetButtonClicked!"); + return; + } + + var puppet = await synapse.Admin.LoginUserAsync(user.Name, TimeSpan.FromMinutes(5)); + + System.Diagnostics.Process.Start(System.Diagnostics.Process.GetCurrentProcess().MainModule!.FileName, + (_cfg with { IsTemporary = true, LoginData = puppet.ToJson() }).Serialise()); + } +} \ No newline at end of file |