From 654aa726c6c7e220060b7ea1b7868508f7e1049a Mon Sep 17 00:00:00 2001 From: Paul-Winpenny <92634321+Paul-Winpenny@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:44:31 +0100 Subject: [PATCH] Can now go back on the bluetooth page. Getting the bluetooth and wifi connection is being done first then Styles. --- .vs/slnx.sqlite | Bin 1175552 -> 1175552 bytes .../ViewModels/ConnectionPageViewModel.cs | 9 +- .../ViewModels/MainPageViewModel.cs | 85 ++++++++++++++---- App/RobobinApp/Views/ConnectionPage.xaml | 7 ++ 4 files changed, 80 insertions(+), 21 deletions(-) diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index f1e2a1d8e4e8c7291713d7e5765ea83bd5c35858..ddce4cda1e8734ebd50cba8503c15bb5c329d3f6 100644 GIT binary patch delta 2876 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 delta 2821 zcmds3Yiv|S6rQ>7=iHsP+ZJdo3${>&*1AyMNGS+i>|5JXMY?Tox4X1m9tA{$<;D=A zNK~%L)tC_Q0f{^mHnEBRp^~MRwnmHwN#zj?QXo=;5g#PRxpzwo!Y24rclJAT_MS6m z=FZN1=WIE@WXt&_uaAS;8)=15J6u<l%Y$E28QM!(o)nlE`6@T^BI94VvDn;pXad`~ z_u|i=L=GLQ!NN@d08H0zn&@awjqH}Xq<V=G_lh%x?}c@Ohd;yb;@9xgc*I@c4sg$N zJ`S^gvS-<S>{hmj1xzPXLSLtM(zB^E)P8CcRY^^vcsKwL!tHQ5oC+?32mt1rN2f)8 z>vmIgt&wYP>8fF~5}q=0tld4hlFgj5!kB9P-h-cJ-O0<1DQ51mY8FXN#=}-gFK$dx z5+64nk^mgH3fdoPWlJ~^(AQdPdhuj!_y^DWq}<1iY^%BtFJc94mND7d-G^teoSb1y zGRH(cFw2}1&CkmuffC0-(GFCwdNujx5QvCVl8gs!TcUWI4Kc~4a^js1uQ8t3(ig|Z z75js2W&VI(5v~u{2ixozw;qisViE7kHZtr{-dMz2F83H!#EzY4JV1Os9w^u=8})It z1ZNVph?Zv?GI7gZ0?oXx#GSp!Jb7XPH7{gMjp8|sH)UbaYK`IrOkP4+vvnkjOPEP% zfq=yx$2yadR@-ESkK-D~J-$V^(z<boL9W_HYkN0&ri^*E!5Zww&oFZSih657KYp4K zJr#aycRwy;_=H(?_I~EmrK}t&>pj3A0MkN}v>7awd@k8zqOZnwNUzC?GEe$LK8vtC zT{@$6tNrSJ^<}k6P1c@MenENCVdb>it`@5^wY}O;+G*t}<)Y+M-d4}a`;?Ehko2Ci zNiLWB)Xi$MS|A7H9r6*WUIj{n{Fih>9YR;o3G^X)1wElmQZQ;kOsr|s$tjK`xn38& zWJxK7;kKq=VEtOXQeV3v*r2ZiKP1z+)UAJ@DyVNP4mav8U{D@Q&!EgV2Hdm3CFNVd zlkFDhMEhib>)`W5`eC@RWxd`W4!1Wi((O<|mCk^rZDfWvy`jB1m7WeQd>kjG1`_CO zSgE&=r+Q<|w`m+b2U=_TaY})1TZab~hFe?xZH<jd^wfVwU)NwyxpLhdVd_W1K)+c& zP$dhr8<zN6^-$h&bH~6KSZDSP9IVTr3#ihz690x^z~8Pv86KW37<SGoxO(p$xbh&q zjEXmCc%|Sn$^=a0^!H^@c*41RAR5U#dlGUcSc=kVQ#h}CFQ5VR4eHkh(OX(O+JUyA zAZkD>P&Fz?%g|!<7@CC)^a5Is!naxkyZmYzGC`UTd_+385A>4``9L4(cpvCB)32rF zvowUIAx8!s+3d)GBbywlJF?M{4UVig!`D)=qxv0Lhk5{8V!m~4b_%${(U9_i%du`S z)?JERzQ#ZbTzzS1Xxq>bB%lar0)~Jk;0SmEfj}gX2xJ0<KqWu~TIbM^E8(b04rC_3 z3us?!rdDl}YgK%5jnQgc`iu|?joVD@nn-b1BR_U$Q49b~muYlWb6E)hP^YXtJ-C9) zoI>;t>yI8>%ej+@o?$+6tcpVtA^u}lX)kUd6if8ldsD3Ic8Vo#*sAHng`A*~H~hld zLr8(+WTL-nj*UJ*Rscfg+^E+}6mLALCAO4!R7-5v|2@@`Q5E+~wZu0I!2bl*c9wmH z4>KM7YA}(X50F>AA+41bN}_m5{6OpwD@Cu!3#WxnVXLrQaP#N1PqlU}2MwaVs80G+ zJ*ZAozEhg{`AWY0C;tV1fL||vC*82y{bh8rRpb*%ajp3OW^S^%s{za{wrdMW5!Spj zb&RHByHLov%Pz7g$wOjHA;+)Wt`D*eeKhMQjwGGYIHv3Pqpb8kV1YR^8j4)#j#6W! z8zA}aQ$NcHI91GC*1ljD?sgarI#PIyC}NS|BG+|pj1N-Dy>GSoV40a5onXEjZOd*o zR>=Ss7&!Lk@pFe$X-$Z47g?W+6mB8AaLbmZ4Mvc}U1khdS@DvKwW}Mao33LCS@ArE a(~s;ENd?&Kly)+&-KzxZtosu0_WTX%l{QBJ diff --git a/App/RobobinApp/ViewModels/ConnectionPageViewModel.cs b/App/RobobinApp/ViewModels/ConnectionPageViewModel.cs index 3c91b664..9802d25e 100644 --- a/App/RobobinApp/ViewModels/ConnectionPageViewModel.cs +++ b/App/RobobinApp/ViewModels/ConnectionPageViewModel.cs @@ -1,13 +1,14 @@ using System.Collections.ObjectModel; using System.Windows.Input; using Microsoft.Maui.Controls; +using RobobinApp.Views; namespace RobobinApp.ViewModels { public class ConnectionPageViewModel : BaseViewModel { private BluetoothDevice _selectedDevice; - + public ICommand GoHomeCommand { get; } public ObservableCollection<BluetoothDevice> BluetoothDevices { get; } public ICommand ConnectCommand { get; } @@ -16,8 +17,12 @@ namespace RobobinApp.ViewModels BluetoothDevices = new ObservableCollection<BluetoothDevice>(); ConnectCommand = new Command(OnConnect); LoadBluetoothDevices(); // Load available devices + GoHomeCommand = new Command(async () => await OnGoHome()); + } + public async Task OnGoHome() + { + await Application.Current.MainPage.Navigation.PushAsync(new MainPage()); } - public BluetoothDevice SelectedDevice { get => _selectedDevice; diff --git a/App/RobobinApp/ViewModels/MainPageViewModel.cs b/App/RobobinApp/ViewModels/MainPageViewModel.cs index ddc5ff7b..d2387784 100644 --- a/App/RobobinApp/ViewModels/MainPageViewModel.cs +++ b/App/RobobinApp/ViewModels/MainPageViewModel.cs @@ -1,26 +1,73 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; using System.Windows.Input; using Microsoft.Maui.Controls; using RobobinApp.Views; namespace RobobinApp.ViewModels + { - public class MainPageViewModel : BaseViewModel - { - public ICommand NavigateToConnectionPageCommand { get; } - - public MainPageViewModel() - { - NavigateToConnectionPageCommand = new Command(OnNavigateToConnectionPage); - } - - private async void OnNavigateToConnectionPage() - { - // Navigate to the ConnectionPage - var connectionPage = new ConnectionPage - { - BindingContext = new ConnectionPageViewModel() - }; - await Application.Current.MainPage.Navigation.PushAsync(connectionPage); - } - } + public class MainPageViewModel : INotifyPropertyChanged + { + private bool _isBusy; + private string _statusMessage; + + public ICommand ConnectToRobobinCommand { get; } + + public MainPageViewModel() + { + ConnectToRobobinCommand = new Command(async () => await OnConnectToRobobin()); + } + + public bool IsBusy + { + get => _isBusy; + set + { + _isBusy = value; + OnPropertyChanged(); + } + } + + public string StatusMessage + { + get => _statusMessage; + set + { + _statusMessage = value; + OnPropertyChanged(); + } + } + + private async Task OnConnectToRobobin() + { + try + { + IsBusy = true; + + + var connectionPage = new ConnectionPage + { + BindingContext = new ConnectionPageViewModel() + }; + await Application.Current.MainPage.Navigation.PushAsync(connectionPage); + } + catch (Exception ex) + { + StatusMessage = $"Failed to connect: {ex.Message}"; + await Application.Current.MainPage.DisplayAlert("Error", StatusMessage, "OK"); + } + finally + { + IsBusy = false; + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } } diff --git a/App/RobobinApp/Views/ConnectionPage.xaml b/App/RobobinApp/Views/ConnectionPage.xaml index 28b40f62..ab9493fd 100644 --- a/App/RobobinApp/Views/ConnectionPage.xaml +++ b/App/RobobinApp/Views/ConnectionPage.xaml @@ -3,6 +3,13 @@ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="RobobinApp.Views.ConnectionPage" Title="Connect to Robobin"> + + <ContentPage.MenuBarItems> + <MenuBarItem Text="Menu"> + <MenuFlyoutItem Text="Back" Command="{Binding GoHomeCommand}" /> + </MenuBarItem> + </ContentPage.MenuBarItems> + <StackLayout Padding="20"> <Label Text="Select a Bluetooth Device" FontSize="Medium" -- GitLab