From 11a42070d431b8ccc06d4f0b65fa45506d5ef197 Mon Sep 17 00:00:00 2001 From: jwetzell Date: Sat, 22 Jun 2019 15:03:30 -0500 Subject: [PATCH] Work on multiple workspaces/password protected workspaces --- iOS/Info.plist | 2 +- .../Classes/Cell/QInstanceCell.cs | 1 - .../Classes/Cell/QSelectedCueOptionsCell.cs | 77 ++++++--------- .../Classes/Communication/QClient.cs | 11 ++- .../Classes/Communication/QController.cs | 15 +-- .../Classes/Communication/QUpdater.cs | 10 +- qController.Standard/{ => Pages}/App.xaml | 0 qController.Standard/{ => Pages}/App.xaml.cs | 0 .../Pages/ControlPage.xaml.cs | 99 ++++++++++++++----- qController.Standard/Pages/MenuPage.xaml.cs | 13 ++- qController.Standard/qController.csproj | 3 - 11 files changed, 135 insertions(+), 96 deletions(-) rename qController.Standard/{ => Pages}/App.xaml (100%) rename qController.Standard/{ => Pages}/App.xaml.cs (100%) diff --git a/iOS/Info.plist b/iOS/Info.plist index 3038f38..0174961 100644 --- a/iOS/Info.plist +++ b/iOS/Info.plist @@ -36,7 +36,7 @@ XSAppIconAssets Assets.xcassets/AppIcon.appiconset CFBundleShortVersionString - 2.0.5 + 2.0.6 CFBundleVersion 1.0 ITSAppUsesNonExemptEncryption diff --git a/qController.Standard/Classes/Cell/QInstanceCell.cs b/qController.Standard/Classes/Cell/QInstanceCell.cs index 2104a7c..8033ac0 100644 --- a/qController.Standard/Classes/Cell/QInstanceCell.cs +++ b/qController.Standard/Classes/Cell/QInstanceCell.cs @@ -105,7 +105,6 @@ namespace qController void Connect(object sender, EventArgs e) { - App.rootPage.MenuPage.ChangeToControl(); App.NavigationPage.Navigation.PushAsync(new ControlPage(nameLabel.Text,addressLabel.Text)); Console.WriteLine("Connect To " + nameLabel.Text + " Pressed"); diff --git a/qController.Standard/Classes/Cell/QSelectedCueOptionsCell.cs b/qController.Standard/Classes/Cell/QSelectedCueOptionsCell.cs index 6916a85..2fa3ec5 100644 --- a/qController.Standard/Classes/Cell/QSelectedCueOptionsCell.cs +++ b/qController.Standard/Classes/Cell/QSelectedCueOptionsCell.cs @@ -7,37 +7,17 @@ namespace qController { public class QSelectedCueOptionsCell : Frame { - void OnCueInfoUpdated(object source, CueEventArgs args) - { - Device.BeginInvokeOnMainThread(() => { - activeCue = args.Cue.uniqueID; - if(args.Cue.levels != null) - { - levels = args.Cue.levels[0]; - if (mainSlider != null) - { - mainSlider.Value = levels[0]; - } - if (leftSlider != null) - { - leftSlider.Value = levels[1]; - } - if (rightSlider != null) - { - rightSlider.Value = levels[2]; - } - } - }); - } - List levels; - string activeCue; - Slider mainSlider; - Slider leftSlider; - Slider rightSlider; - public QSelectedCueOptionsCell(QController qController) + public List levels; + public string activeCue; + public Slider mainSlider; + public Slider leftSlider; + public Slider rightSlider; + public Label mainLabel; + public Label rightLabel; + public Label leftLabel; + public QSelectedCueOptionsCell() { - qController.qClient.qParser.CueInfoUpdated += OnCueInfoUpdated; Padding = new Thickness(5); CornerRadius = 20; BackgroundColor = Color.FromHex("D8D8D8"); @@ -63,30 +43,21 @@ namespace qController Minimum = -60, Maximum = 12 }; - mainSlider.ValueChanged += (sender, args) => - { - qController.qClient.sendArgs("/cue_id/" + activeCue + "/sliderLevel/0", (float)args.NewValue); - }; + leftSlider = new Slider { Minimum = -60, Maximum = 12 }; - leftSlider.ValueChanged += (sender, args) => - { - qController.qClient.sendArgs("/cue_id/" + activeCue + "/sliderLevel/1", (float)args.NewValue); - }; + rightSlider = new Slider { Minimum = -60, Maximum = 12 }; - rightSlider.ValueChanged += (sender, args) => - { - qController.qClient.sendArgs("/cue_id/" + activeCue + "/sliderLevel/2", (float)args.NewValue); - }; + mainG.Children.Add(mainSlider, 1, 0); mainG.Children.Add(leftSlider, 1, 1); mainG.Children.Add(rightSlider, 1, 2); @@ -94,21 +65,20 @@ namespace qController Grid.SetColumnSpan(mainSlider, 4); Grid.SetColumnSpan(leftSlider, 4); Grid.SetColumnSpan(rightSlider, 4); - - Label mainLabel = new Label { + mainLabel = new Label { Text = "MAIN:", VerticalTextAlignment = TextAlignment.Center, HorizontalTextAlignment = TextAlignment.Center }; - Label leftLabel = new Label + leftLabel = new Label { Text = "LEFT:", VerticalTextAlignment = TextAlignment.Center, HorizontalTextAlignment = TextAlignment.Center }; - Label rightLabel = new Label + rightLabel = new Label { Text = "RIGHT:", VerticalTextAlignment = TextAlignment.Center, @@ -122,5 +92,22 @@ namespace qController Content = mainG; Margin = new Thickness(10); } + + public void UpdateLevels(List lin_levels) + { + levels = lin_levels; + if (mainSlider != null) + { + mainSlider.Value = levels[0]; + } + if (leftSlider != null) + { + leftSlider.Value = levels[1]; + } + if (rightSlider != null) + { + rightSlider.Value = levels[2]; + } + } } } diff --git a/qController.Standard/Classes/Communication/QClient.cs b/qController.Standard/Classes/Communication/QClient.cs index b38085f..f9b3edb 100644 --- a/qController.Standard/Classes/Communication/QClient.cs +++ b/qController.Standard/Classes/Communication/QClient.cs @@ -125,17 +125,18 @@ namespace qController } } - public void UpdateSpecificCue(string cue_id) + public void UpdateSpecificCue(string workspace_id,string cue_id) { string valuesForKeys = "[\"number\",\"uniqueID\",\"flagged\",\"listName\",\"type\",\"colorName\",\"name\",\"armed\",\"displayName\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"notes\",\"levels\"]"; - string address = "/cue_id/" + cue_id + "/valuesForKeys"; + string address = "/workspace/" + workspace_id + "/cue_id/" + cue_id + "/valuesForKeys"; sendAndReceiveStringArgs(address, valuesForKeys); } - public void UpdateSelectedCue() + public void UpdateSelectedCue(string workspace_id) { - string valuesForKeys = "[\"number\",\"uniqueID\",\"flagged\",\"listName\",\"type\",\"colorName\",\"name\",\"armed\",\"displayName\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"notes\",\"levels\"]"; - sendAndReceiveStringArgs("/cue/selected/valuesForKeys", valuesForKeys); + string valuesForKeys = "[\"number\",\"uniqueID\",\"flagged\",\"listName\",\"type\",\"colorName\",\"name\",\"armed\",\"displayName\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"notes\",\"levels\"]"; + string address = "/workspace/" + workspace_id + "/cue/selected/valuesForKeys"; + sendAndReceiveStringArgs(address, valuesForKeys); } public void UpdateWorkspace(string ws_id) diff --git a/qController.Standard/Classes/Communication/QController.cs b/qController.Standard/Classes/Communication/QController.cs index 4cc3d40..94eeda6 100644 --- a/qController.Standard/Classes/Communication/QController.cs +++ b/qController.Standard/Classes/Communication/QController.cs @@ -20,18 +20,19 @@ namespace qController qUpdater = new QUpdater(this); qUpdater.Start(); //Connect(); - - Connect(); - KickOff(); + //Connect(); + //KickOff(); } - public void Connect() + public void Connect(string workspace_id) { - Console.WriteLine("QCONTROLLER CONNECT CALLED"); + Console.WriteLine("QCONTROLLER CONNECT CALLED: " + workspace_id); + qWorkspace = new QWorkSpace(); + qWorkspace.workspace_id = workspace_id; //qClient.sendStringUDP("/connect"); - qClient.sendArgsUDP("/updates", 1); - qClient.sendAndReceiveString("/cueLists"); + qClient.sendArgsUDP("/workspace/"+workspace_id+"/updates", 1); + qClient.sendAndReceiveString("/workspace/"+workspace_id+"/cueLists"); } public void KickOff() diff --git a/qController.Standard/Classes/Communication/QUpdater.cs b/qController.Standard/Classes/Communication/QUpdater.cs index 77c355a..cf115ae 100644 --- a/qController.Standard/Classes/Communication/QUpdater.cs +++ b/qController.Standard/Classes/Communication/QUpdater.cs @@ -58,7 +58,7 @@ namespace qController } else { - qController.qClient.UpdateSelectedCue(); + qController.qClient.UpdateSelectedCue(qController.qWorkspace.workspace_id); } } @@ -71,7 +71,7 @@ namespace qController { Console.WriteLine("Workspace group cues are already populated"); App.showToast("Workspace cues have been loaded...."); - qController.qClient.UpdateSelectedCue(); + qController.qClient.UpdateSelectedCue(qController.qWorkspace.workspace_id); return; } //RefreshGroupCues(); @@ -82,7 +82,7 @@ namespace qController public void OnPlaybackPositionUpdated(object source, PlaybackPositionArgs args) { qController.playbackPosition = args.PlaybackPosition; - qController.qClient.UpdateSpecificCue(args.PlaybackPosition); + qController.qClient.UpdateSpecificCue(qController.qWorkspace.workspace_id,args.PlaybackPosition); } public void RefreshGroupCues() @@ -95,7 +95,7 @@ namespace qController if (cue.type == "Group") { Console.WriteLine("First Group Cue Found"); - qController.qClient.sendStringUDP("/cue_id/" + cue.uniqueID + "/children"); + qController.qClient.sendStringUDP("/workspace/" + qController.qWorkspace.workspace_id + "/cue_id/" + cue.uniqueID + "/children"); break; } } @@ -104,7 +104,7 @@ namespace qController public void SendThump() { - qController.qClient.sendStringUDP("/thump"); + qController.qClient.sendStringUDP("/workspace/" + qController.qWorkspace.workspace_id + "/thump"); } public void Kill(){ diff --git a/qController.Standard/App.xaml b/qController.Standard/Pages/App.xaml similarity index 100% rename from qController.Standard/App.xaml rename to qController.Standard/Pages/App.xaml diff --git a/qController.Standard/App.xaml.cs b/qController.Standard/Pages/App.xaml.cs similarity index 100% rename from qController.Standard/App.xaml.cs rename to qController.Standard/Pages/App.xaml.cs diff --git a/qController.Standard/Pages/ControlPage.xaml.cs b/qController.Standard/Pages/ControlPage.xaml.cs index 81995a9..41af074 100644 --- a/qController.Standard/Pages/ControlPage.xaml.cs +++ b/qController.Standard/Pages/ControlPage.xaml.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using Xamarin.Forms; using System.Collections; - +using Acr.UserDialogs; namespace qController { public partial class ControlPage : ContentPage @@ -29,7 +29,7 @@ namespace qController InitGUI(); - + qController.KickOff(); } private void WorkspaceInfoReceived(object source, WorkspaceInfoArgs args) @@ -37,17 +37,41 @@ namespace qController if(args.WorkspaceInfo.Count > 1) { Console.WriteLine("MULTIPLE WORKSPACES ON SELECTED COMPUTER"); + PromptForWorkspace(args.WorkspaceInfo); } else { Console.WriteLine("ONLY ONE WORKSPACE ON SELECTED COMPUTER"); - //qController.Connect(); + qController.Connect(args.WorkspaceInfo[0].uniqueID); + + Device.BeginInvokeOnMainThread(() => { + FinishUI(); + }); } } + private void PromptForWorkspace(List workspaces) + { + ActionSheetConfig config = new ActionSheetConfig(); + config.SetTitle("Select Workspace"); + for (int i = 0; i < workspaces.Count; i++) + { + QInfo workspace = workspaces[i]; + config.Add(workspace.displayName, new Action(() => { + Console.WriteLine("Workspace Selected: " + workspace.displayName); + qController.Connect(workspace.uniqueID); + Device.BeginInvokeOnMainThread(() => + { + FinishUI(); + }); + })); + } + UserDialogs.Instance.ActionSheet(config); + } + private void InitGUI() { - + App.rootPage.MenuPage.ChangeToControl(); NavigationPage.SetHasNavigationBar(this, false); instanceName.HorizontalTextAlignment = TextAlignment.Center; instanceName.HorizontalOptions = LayoutOptions.CenterAndExpand; @@ -65,16 +89,6 @@ namespace qController break; } - - List buttons = new List(); - - buttons.Add(new QButton("Previous", "/select/previous")); - buttons.Add(new QButton("Panic", "/panic")); - buttons.Add(new QButton("Next", "/select/next")); - buttons.Add(new QButton("Preview", "/preview")); - buttons.Add(new QButton("Pause", "/pause")); - buttons.Add(new QButton("Resume", "/resume")); - var menuButtonGesture = new TapGestureRecognizer(); menuButtonGesture.Tapped += ShowMenu; @@ -82,9 +96,37 @@ namespace qController qCell = new QSelectedCueCell(); - qSelectedCueOptions = new QSelectedCueOptionsCell(qController); - sLayout.Children.Add(qCell); + } + + void FinishUI() + { + string workspace_prefix = "/workspace/" + qController.qWorkspace.workspace_id; + List buttons = new List(); + + buttons.Add(new QButton("Previous", workspace_prefix + "/select/previous")); + buttons.Add(new QButton("Panic", workspace_prefix + "/panic")); + buttons.Add(new QButton("Next", workspace_prefix + "/select/next")); + buttons.Add(new QButton("Preview", "/preview")); + buttons.Add(new QButton("Pause", "/pause")); + buttons.Add(new QButton("Resume", "/resume")); + + + qSelectedCueOptions = new QSelectedCueOptionsCell(); + + qSelectedCueOptions.mainSlider.ValueChanged += (sender, args) => + { + qController.qClient.sendArgs(workspace_prefix + "/cue_id/" + qSelectedCueOptions.activeCue + "/sliderLevel/0", (float)args.NewValue); + }; + qSelectedCueOptions.leftSlider.ValueChanged += (sender, args) => + { + qController.qClient.sendArgs(workspace_prefix + "/cue_id/" + qSelectedCueOptions.activeCue + "/sliderLevel/1", (float)args.NewValue); + }; + qSelectedCueOptions.rightSlider.ValueChanged += (sender, args) => + { + qController.qClient.sendArgs(workspace_prefix + "/cue_id/" + qSelectedCueOptions.activeCue + "/sliderLevel/2", (float)args.NewValue); + }; + mainG = new Grid @@ -110,7 +152,7 @@ namespace qController foreach (var b in buttons) { b.Clicked += sendOSC; - if(b.Text=="Panic") + if (b.Text == "Panic") { b.BackgroundColor = Color.IndianRed; } @@ -119,23 +161,23 @@ namespace qController b.BackgroundColor = Color.FromHex("D8D8D8"); } b.TextColor = Color.Black; - mainG.Children.Add(b,column,row); + mainG.Children.Add(b, column, row); row++; - if(row == 3){ + if (row == 3) + { row = 0; column = 2; } } - QButton goButton = new QButton("GO","/go"); + QButton goButton = new QButton("GO", workspace_prefix+"/go"); goButton.Clicked += sendOSC; goButton.BackgroundColor = Color.SeaGreen; goButton.TextColor = Color.Black; - mainG.Children.Add(goButton,1,0); - Grid.SetRowSpan(goButton,3); + mainG.Children.Add(goButton, 1, 0); + Grid.SetRowSpan(goButton, 3); sLayout.Children.Add(mainG); - } void sendOSC(object sender, EventArgs e) @@ -176,6 +218,7 @@ namespace qController noSelect.number = "!"; qCell.UpdateSelectedCue(noSelect); }); + qController.qClient.UpdateSelectedCue(qController.qWorkspace.workspace_id); } Console.WriteLine("Workspace updated in ControlPage: " + qController.qWorkspace.workspace_id); } @@ -214,6 +257,14 @@ namespace qController qCell.UpdateSelectedCue(args.Cue); if (!mainG.IsVisible) mainG.IsVisible = true; + if(qSelectedCueOptions != null) + { + qSelectedCueOptions.activeCue = args.Cue.uniqueID; + if (args.Cue.levels != null) + { + qSelectedCueOptions.UpdateLevels(args.Cue.levels[0]); + } + } }); } } @@ -236,7 +287,7 @@ namespace qController } }); - qController.qClient.UpdateSelectedCue(); + qController.qClient.UpdateSelectedCue(qController.qWorkspace.workspace_id); App.showToast("Workspace cues loaded..."); } } diff --git a/qController.Standard/Pages/MenuPage.xaml.cs b/qController.Standard/Pages/MenuPage.xaml.cs index 839251f..4403da4 100644 --- a/qController.Standard/Pages/MenuPage.xaml.cs +++ b/qController.Standard/Pages/MenuPage.xaml.cs @@ -82,19 +82,21 @@ namespace qController } public void ChangeToWorkspace(QWorkSpace workspace) { - ChangeToControl(); - foreach (var cueList in workspace.data) + for(int i = 0; i < workspace.data.Count; i++) { + var cueList = workspace.data[i]; items.Add(new MenuPageItem { Title = cueList.listName, Icon = "", Command = "" }); - foreach (var cue in cueList.cues) + for (int j = 0; j < cueList.cues.Count; j++) { + var cue = cueList.cues[j]; AddSubCues(cue, 0); } + } } @@ -125,9 +127,10 @@ namespace qController }); //uncomment to load nested group cues - foreach (var sub_cue in cue.cues) + for (int i = 0; i < cue.cues.Count; i++) { - AddSubCues(sub_cue,level + 1); + var sub_cue = cue.cues[i]; + AddSubCues(sub_cue, level + 1); } } else diff --git a/qController.Standard/qController.csproj b/qController.Standard/qController.csproj index a347457..f95fe44 100644 --- a/qController.Standard/qController.csproj +++ b/qController.Standard/qController.csproj @@ -45,9 +45,6 @@ - - *.xaml - *.xaml