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">
-
-
+
+
+
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ ItemsSource="{Binding ServersGrouped}"
+ Margin="0">
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
\ 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));
+ }
}
}