diff --git a/CollabVMClient.sln b/CollabVMClient.sln index 0f1f6e7..4687635 100644 --- a/CollabVMClient.sln +++ b/CollabVMClient.sln @@ -7,8 +7,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CollabVMClient", "CollabVMC EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CollabVMClient.Desktop", "CollabVMClient.Desktop\CollabVMClient.Desktop.csproj", "{8A36CCA1-A1F9-47B4-BA88-4768B6BDC5B9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibVLCSharp.Avalonia", "LibVLCSharp.Avalonia\LibVLCSharp.Avalonia.csproj", "{E85E9F2A-5F72-40D1-88BC-21511717BD3E}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -23,10 +21,6 @@ Global {8A36CCA1-A1F9-47B4-BA88-4768B6BDC5B9}.Debug|Any CPU.Build.0 = Debug|Any CPU {8A36CCA1-A1F9-47B4-BA88-4768B6BDC5B9}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A36CCA1-A1F9-47B4-BA88-4768B6BDC5B9}.Release|Any CPU.Build.0 = Release|Any CPU - {E85E9F2A-5F72-40D1-88BC-21511717BD3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E85E9F2A-5F72-40D1-88BC-21511717BD3E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E85E9F2A-5F72-40D1-88BC-21511717BD3E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E85E9F2A-5F72-40D1-88BC-21511717BD3E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/CollabVMClient/App.axaml b/CollabVMClient/App.axaml index 484805f..4a7ca25 100644 --- a/CollabVMClient/App.axaml +++ b/CollabVMClient/App.axaml @@ -1,7 +1,7 @@ + RequestedThemeVariant="Light"> diff --git a/CollabVMClient/CollabVMClient.csproj b/CollabVMClient/CollabVMClient.csproj index 0d3c111..b1f2ecf 100644 --- a/CollabVMClient/CollabVMClient.csproj +++ b/CollabVMClient/CollabVMClient.csproj @@ -20,21 +20,12 @@ - - - - - - - - - True diff --git a/CollabVMClient/CollabVMViewer.cs b/CollabVMClient/CollabVMViewer.cs index 64176c4..ff04fb2 100644 --- a/CollabVMClient/CollabVMViewer.cs +++ b/CollabVMClient/CollabVMViewer.cs @@ -2,7 +2,6 @@ using CollabVMClient.ViewModels; using CollabVMClient.Views; using CollabVMSharp; -using LibVLCSharp.Shared; using MsBox.Avalonia; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Advanced; @@ -42,7 +41,7 @@ namespace CollabVMClient cvm.UserLeft += Cvm_UserLeft; cvm.UserRenamed += Cvm_UserRenamed; cvm.TurnUpdate += Cvm_TurnUpdate; - screen_vm = new CollabVMScreenViewModel(node); + screen_vm = new CollabVMScreenViewModel(cvm, node); screen = new CollabVMScreenView(); screen.DataContext = screen_vm; chat = new CollabVMChatView(); diff --git a/CollabVMClient/ViewModels/CollabVMChatViewModel.cs b/CollabVMClient/ViewModels/CollabVMChatViewModel.cs index 26d8816..8080a56 100644 --- a/CollabVMClient/ViewModels/CollabVMChatViewModel.cs +++ b/CollabVMClient/ViewModels/CollabVMChatViewModel.cs @@ -1,5 +1,4 @@ using CommunityToolkit.Mvvm.ComponentModel; -using LibVLCSharp.Shared; using System; using System.Collections.Generic; using System.Collections.ObjectModel; diff --git a/CollabVMClient/ViewModels/CollabVMScreenViewModel.cs b/CollabVMClient/ViewModels/CollabVMScreenViewModel.cs index 731d712..11b8025 100644 --- a/CollabVMClient/ViewModels/CollabVMScreenViewModel.cs +++ b/CollabVMClient/ViewModels/CollabVMScreenViewModel.cs @@ -13,18 +13,29 @@ using SixLabors.ImageSharp.Processing; using Avalonia.Media; using Avalonia.Controls; using CommunityToolkit.Mvvm.ComponentModel; +using CollabVMSharp; namespace CollabVMClient.ViewModels { internal partial class CollabVMScreenViewModel : ViewModelBase { + private CollabVMSharp.CollabVMClient cvm; public WriteableBitmap Framebuffer { get; set; } [ObservableProperty] private string id; [ObservableProperty] private int width; [ObservableProperty] private int height; + [ObservableProperty] private int windowHeight; + [ObservableProperty] private string toggleTurnBtnText = "Take Turn"; + public string Title => $"CollabVM - Screen ({id})"; - public CollabVMScreenViewModel(string id) + public CollabVMScreenViewModel(CollabVMSharp.CollabVMClient cvm, string id) { + this.cvm = cvm; + cvm.TurnUpdate += (_, _) => + { + if (cvm.TurnStatus == TurnStatus.None) ToggleTurnBtnText = "Take Turn"; + else ToggleTurnBtnText = "End Turn"; + }; this.Id = id; Framebuffer = new WriteableBitmap(new Avalonia.PixelSize(1, 1), new Avalonia.Vector(1, 1)); } @@ -32,6 +43,7 @@ namespace CollabVMClient.ViewModels { this.Width = width; this.Height = height; + this.WindowHeight = height + 34; Framebuffer = new WriteableBitmap(new Avalonia.PixelSize(width, height), new Avalonia.Vector(96.0f, 96.0f), PixelFormat.Rgba8888); } public void LoadRect(byte[] rect, int width, int height, int x, int y) @@ -47,5 +59,16 @@ namespace CollabVMClient.ViewModels l.Dispose(); } + + public void ToggleTurn() + { + cvm.Turn(cvm.TurnStatus == TurnStatus.None); + } + + public void MoveMouse(int x, int y) => cvm.MoveMouse(x, y); + + public void MouseBtn(MouseButton btn, bool down) => cvm.MouseBtn(btn, down); + + public bool CanToggleTurn() => true; } } diff --git a/CollabVMClient/Views/CollabVMChatView.axaml b/CollabVMClient/Views/CollabVMChatView.axaml index 962fde3..d2dc4b5 100644 --- a/CollabVMClient/Views/CollabVMChatView.axaml +++ b/CollabVMClient/Views/CollabVMChatView.axaml @@ -4,7 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:av="clr-namespace:TheArtOfDev.HtmlRenderer.Avalonia;assembly=Avalonia.HtmlRenderer" xmlns:i="https://github.com/projektanker/icons.avalonia" - xmlns:vlc="clr-namespace:LibVLCSharp.Avalonia;assembly=LibVLCSharp.Avalonia" + mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="800" x:Class="CollabVMClient.Views.CollabVMChatView" Title="{Binding Title}" @@ -26,7 +26,6 @@ - diff --git a/CollabVMClient/Views/CollabVMScreenView.axaml b/CollabVMClient/Views/CollabVMScreenView.axaml index d613c2c..20f8a07 100644 --- a/CollabVMClient/Views/CollabVMScreenView.axaml +++ b/CollabVMClient/Views/CollabVMScreenView.axaml @@ -5,6 +5,16 @@ mc:Ignorable="d" d:DesignWidth="1024" d:DesignHeight="768" x:Class="CollabVMClient.Views.CollabVMScreenView" Title="{Binding Title}" - Width="{Binding Width}" Height="{Binding Height}" CanResize="False"> - + Width="{Binding Width}" Height="{Binding WindowHeight}" CanResize="False"> + + + + + + + + + + + diff --git a/CollabVMClient/Views/CollabVMScreenView.axaml.cs b/CollabVMClient/Views/CollabVMScreenView.axaml.cs index 3db7acb..88cea67 100644 --- a/CollabVMClient/Views/CollabVMScreenView.axaml.cs +++ b/CollabVMClient/Views/CollabVMScreenView.axaml.cs @@ -1,5 +1,6 @@ using Avalonia.Controls; using CollabVMClient.ViewModels; +using CollabVMSharp; namespace CollabVMClient.Views { @@ -8,6 +9,46 @@ namespace CollabVMClient.Views public CollabVMScreenView() { InitializeComponent(); + this.exit.Click += Exit_Click; + screen.PointerMoved += Screen_PointerMoved; + screen.PointerPressed += Screen_PointerPressed; + screen.PointerReleased += Screen_PointerReleased; + } + + private void Screen_PointerReleased(object? sender, Avalonia.Input.PointerReleasedEventArgs e) + { + MouseButton btn = e.InitialPressMouseButton switch + { + Avalonia.Input.MouseButton.Left => MouseButton.Left, + Avalonia.Input.MouseButton.Right => MouseButton.Right, + Avalonia.Input.MouseButton.Middle => MouseButton.Middle, + _ => (MouseButton)(-1) + }; + if (btn == (MouseButton)(-1)) return; + var dc = DataContext as CollabVMScreenViewModel; + dc.MouseBtn(btn, false); + } + + private void Screen_PointerPressed(object? sender, Avalonia.Input.PointerPressedEventArgs e) + { + var dc = DataContext as CollabVMScreenViewModel; + // We can't see specifically which button was pressed, so just send every currently pressed button + var point = e.GetCurrentPoint(screen); + if (point.Properties.IsLeftButtonPressed) dc.MouseBtn(MouseButton.Left, true); + if (point.Properties.IsMiddleButtonPressed) dc.MouseBtn(MouseButton.Middle, true); + if (point.Properties.IsRightButtonPressed) dc.MouseBtn(MouseButton.Right, true); + } + + private void Screen_PointerMoved(object? sender, Avalonia.Input.PointerEventArgs e) + { + var dc = DataContext as CollabVMScreenViewModel; + var point = e.GetCurrentPoint(screen); + dc.MoveMouse((int)point.Position.X, (int)point.Position.Y); + } + + private void Exit_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) + { + Close(); } public void RefreshScreen() diff --git a/CollabVMClient/Views/MainWindow.axaml b/CollabVMClient/Views/MainWindow.axaml index b5bb866..cacd8dc 100644 --- a/CollabVMClient/Views/MainWindow.axaml +++ b/CollabVMClient/Views/MainWindow.axaml @@ -3,14 +3,16 @@ xmlns:vm="using:CollabVMClient.ViewModels" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:av="clr-namespace:TheArtOfDev.HtmlRenderer.Avalonia;assembly=Avalonia.HtmlRenderer" xmlns:views="clr-namespace:CollabVMClient.Views" mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="800" x:Class="CollabVMClient.Views.MainWindow" Icon="/Assets/avalonia-logo.ico" Title="CollabVM - Server List" - Width="400" Height="800" CanResize="False"> + Width="400" Height="800" CanResize="False" + Foreground="Black" Background="White"> - +