diff --git a/qController.Standard/Pages/QBrowserPage.xaml b/qController.Standard/Pages/QBrowserPage.xaml index a65c679..cf76204 100644 --- a/qController.Standard/Pages/QBrowserPage.xaml +++ b/qController.Standard/Pages/QBrowserPage.xaml @@ -3,73 +3,120 @@ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core" mc:Ignorable="d" x:Class="qController.Pages.QBrowserPage"> - - + + + - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - - \ No newline at end of file diff --git a/qController.Standard/Pages/QBrowserPage.xaml.cs b/qController.Standard/Pages/QBrowserPage.xaml.cs index fd010c7..451b45f 100644 --- a/qController.Standard/Pages/QBrowserPage.xaml.cs +++ b/qController.Standard/Pages/QBrowserPage.xaml.cs @@ -18,12 +18,8 @@ namespace qController.Pages App.rootPage.MenuItemSelected += OnMenuItemSelected; serverListView.BindingContext = new QBrowserViewModel(new QBrowser()); - - serverListView.ItemSelected += QWorkspaceSelected; - - storageListView.ItemsSource = QStorage.qInstances; storageListView.ItemTemplate = new DataTemplate(typeof(QInstanceCell)); storageListView.ItemTapped += (object sender, ItemTappedEventArgs e) => @@ -53,10 +49,15 @@ namespace qController.Pages Title = "Workspace Requires Passcode", OkText = "Connect", IsCancellable = true, + OnTextChanged = args => + { + args.IsValid = args.Value != null && !args.Value.Equals("") && args.Value.Length == 4; + }, OnAction = async (resp) => { if (resp.Ok) { + Console.WriteLine($"Passcode is null: {resp.Value == null}"); await Navigation.PushAsync(new WorkspacePage(selectedWorkspace, resp.Value)); } } diff --git a/qController.Standard/Pages/WorkspacePage.xaml b/qController.Standard/Pages/WorkspacePage.xaml index cec8aa5..8c69d73 100644 --- a/qController.Standard/Pages/WorkspacePage.xaml +++ b/qController.Standard/Pages/WorkspacePage.xaml @@ -7,20 +7,13 @@ x:Class="qController.WorkspacePage"> - + - - - + - - + + + + + + + + \ No newline at end of file diff --git a/qController.Standard/Pages/WorkspacePage.xaml.cs b/qController.Standard/Pages/WorkspacePage.xaml.cs index f815440..6fce328 100644 --- a/qController.Standard/Pages/WorkspacePage.xaml.cs +++ b/qController.Standard/Pages/WorkspacePage.xaml.cs @@ -6,6 +6,7 @@ using Serilog; using Xamarin.Essentials; using Xamarin.Forms; using Acr.UserDialogs; +using System.Windows.Input; namespace qController { @@ -13,29 +14,44 @@ namespace qController { private QWorkspace connectedWorkspace; private Dictionary cueGridDict = new Dictionary(); - - public WorkspacePage(QWorkspace workspace) + public WorkspacePage(QWorkspace workspace, string passcode = null) { InitializeComponent(); connectedWorkspace = workspace; connectedWorkspace.WorkspaceUpdated += Workspace_WorkspaceUpdated; - + connectedWorkspace.WorkspaceConnectionError += ConnectedWorkspace_WorkspaceConnectionError; connectedWorkspace.defaultSendUpdatesOSC = true; connectedWorkspace.CueListChangedPlaybackPosition += ConnectedWorkspace_CueListChangedPlaybackPosition; + + connectedWorkspace.connect(passcode); } - public WorkspacePage(QWorkspace workspace, string passcode) + private void ConnectedWorkspace_WorkspaceConnectionError(object source, QWorkspaceConnectionErrorArgs connectionErrorArgs) { - InitializeComponent(); - - connectedWorkspace = workspace; - connectedWorkspace.WorkspaceUpdated += Workspace_WorkspaceUpdated; - connectedWorkspace.connectWithPasscode(passcode); - - - connectedWorkspace.defaultSendUpdatesOSC = true; - connectedWorkspace.CueListChangedPlaybackPosition += ConnectedWorkspace_CueListChangedPlaybackPosition; + System.Console.WriteLine("WorkspaceConnectionError Called"); + if (connectionErrorArgs.status.Equals("badpass")) + { + UserDialogs.Instance.Prompt(new PromptConfig + { + InputType = InputType.Number, + MaxLength = 4, + Title = "Incorrect Passcode!", + OkText = "Connect", + IsCancellable = true, + OnTextChanged = args => + { + args.IsValid = args.Value != null && !args.Value.Equals("") && args.Value.Length == 4; + }, + OnAction = (resp) => + { + if (resp.Ok) + { + connectedWorkspace.connect(resp.Value); + } + } + }); + } } void ConnectedWorkspace_CueListChangedPlaybackPosition(object source, QCueListChangedPlaybackPositionArgs args) @@ -84,6 +100,7 @@ namespace qController //unsubscribe from events connectedWorkspace.WorkspaceUpdated -= Workspace_WorkspaceUpdated; connectedWorkspace.CueListChangedPlaybackPosition -= ConnectedWorkspace_CueListChangedPlaybackPosition; + connectedWorkspace.WorkspaceConnectionError -= ConnectedWorkspace_WorkspaceConnectionError; //disconnect connectedWorkspace.disconnect(); @@ -95,6 +112,20 @@ namespace qController QCueViewModel qCueViewModel = new QCueViewModel(cue, true); cueGrid.RowDefinitions = new RowDefinitionCollection(); cueGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(40) }); + + + //Group List "Frame" added early so other children or "on top" + if (cue.cues.Count > 0) + { + var cueFrame = new Frame + { + BackgroundColor = Color.Transparent, + BorderColor = Color.Black + }; + cueGrid.Children.Add(cueFrame); + Grid.SetRowSpan(cueFrame, cue.cues.Count + 1); + } + var cueLabel = new Label { BindingContext = qCueViewModel, @@ -102,6 +133,17 @@ namespace qController VerticalTextAlignment = TextAlignment.Center, }; cueLabel.SetBinding(Label.TextProperty, "name", BindingMode.OneWay); + + //System.Console.WriteLine($"Cue has continue mode: {cue.}" ); + //Section for selecting a cue by tapping the name Label + var selectCueGesture = new TapGestureRecognizer(); + selectCueGesture.Tapped += (sender, e) => + { + connectedWorkspace.firstCueList.playbackPositionID = cue.uid; + }; + cueLabel.GestureRecognizers.Add(selectCueGesture); + + var cueBackground = new Frame { BindingContext = qCueViewModel, @@ -110,6 +152,7 @@ namespace qController CornerRadius = 0, BorderColor = Color.Black }; + cueBackground.SetBinding(BackgroundColorProperty, "color", BindingMode.OneWay); var cueSelectedIndicator = new Frame @@ -118,13 +161,13 @@ namespace qController BackgroundColor = Color.Blue, HasShadow = false }; + cueSelectedIndicator.SetBinding(IsVisibleProperty, "IsSelected"); cueGrid.Children.Add(cueSelectedIndicator, 0, 0); cueGrid.Children.Add(cueBackground, 0, 0); cueGrid.Children.Add(cueLabel, 0, 0); - int rows = 1; if (cue.cues.Count > 0) { foreach (var aCue in cue.cues) @@ -134,17 +177,9 @@ namespace qController cueGridDict.Add(aCue.uid, aCueGrid); aCueGrid.Margin = new Thickness(10, 0, 0, 0); cueGrid.Children.Add(aCueGrid, 0, aCue.sortIndex + 1); - rows++; } - var cueFrame = new Frame - { - BackgroundColor = Color.Transparent, - BorderColor = Color.Black - }; - - cueGrid.Children.Add(cueFrame); - Grid.SetRowSpan(cueFrame, rows); + } return cueGrid; diff --git a/qController.Standard/ViewModels/QBrowserViewModel.cs b/qController.Standard/ViewModels/QBrowserViewModel.cs index 35611ba..5962a7e 100644 --- a/qController.Standard/ViewModels/QBrowserViewModel.cs +++ b/qController.Standard/ViewModels/QBrowserViewModel.cs @@ -2,6 +2,7 @@ using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; +using Xamarin.Forms; namespace qController.ViewModels { @@ -22,8 +23,11 @@ namespace qController.ViewModels private void OnServerFound(object source, QServerFoundArgs args) { - ServersGrouped.Add(new QServerViewModel(args.server)); - + Device.BeginInvokeOnMainThread(() => + { + System.Console.WriteLine($"[QBrowserViewModel] adding server: {args.server.description}"); + ServersGrouped.Add(new QServerViewModel(args.server)); + }); } void OnPropertyChanged([CallerMemberName] string name = "") diff --git a/qController.Standard/ViewModels/QServerViewModel.cs b/qController.Standard/ViewModels/QServerViewModel.cs index 0711ef6..a46caec 100644 --- a/qController.Standard/ViewModels/QServerViewModel.cs +++ b/qController.Standard/ViewModels/QServerViewModel.cs @@ -1,11 +1,15 @@ using QControlKit; using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using Xamarin.Forms; namespace qController.ViewModels { - public class QServerViewModel : ObservableCollection + public class QServerViewModel : ObservableCollection, INotifyPropertyChanged { QServer server; + public new event PropertyChangedEventHandler PropertyChanged; public string name { get @@ -26,6 +30,22 @@ namespace qController.ViewModels } } + public string version + { + get + { + if (server.version == null) + { + return ""; + } + else + { + return $"v{server.version}"; + + } + } + } + public string GroupName { get @@ -40,19 +60,35 @@ namespace qController.ViewModels name = this.server.name; foreach (var workspace in this.server.workspaces) { - this.Add(new QWorkspaceViewModel(workspace)); + Device.BeginInvokeOnMainThread(() => + { + this.Add(new QWorkspaceViewModel(workspace)); + }); } this.server.ServerUpdated += OnServerUpdated; } private void OnServerUpdated(object source, QServerUpdatedArgs args) { + OnPropertyChanged("GroupName"); + OnPropertyChanged("version"); + foreach (var workspace in this.server.workspaces) { QWorkspaceViewModel workspaceViewModel = new QWorkspaceViewModel(workspace); if (!Contains(workspaceViewModel)) - Add(workspaceViewModel); + { + Device.BeginInvokeOnMainThread(() => + { + Add(workspaceViewModel); + }); + } } } + + void OnPropertyChanged([CallerMemberName] string name = "") + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); + } } }