diff --git a/Droid/Assets/qfont.ttf b/Droid/Assets/qfont.ttf index b3ee7ff..b0fa4cd 100644 Binary files a/Droid/Assets/qfont.ttf and b/Droid/Assets/qfont.ttf differ diff --git a/iOS/Info.plist b/iOS/Info.plist index d1ec055..3038f38 100644 --- a/iOS/Info.plist +++ b/iOS/Info.plist @@ -36,7 +36,7 @@ XSAppIconAssets Assets.xcassets/AppIcon.appiconset CFBundleShortVersionString - 2.0.4 + 2.0.5 CFBundleVersion 1.0 ITSAppUsesNonExemptEncryption diff --git a/iOS/Resources/qfont.ttf b/iOS/Resources/qfont.ttf index b3ee7ff..b0fa4cd 100644 Binary files a/iOS/Resources/qfont.ttf and b/iOS/Resources/qfont.ttf differ diff --git a/qController.Standard/Classes/Cell/QInstanceCell.cs b/qController.Standard/Classes/Cell/QInstanceCell.cs index dc65b63..2104a7c 100644 --- a/qController.Standard/Classes/Cell/QInstanceCell.cs +++ b/qController.Standard/Classes/Cell/QInstanceCell.cs @@ -80,13 +80,13 @@ namespace qController connectLabel.HorizontalOptions = LayoutOptions.CenterAndExpand; connectLabel.VerticalOptions = LayoutOptions.CenterAndExpand; - connectLabel.Text = "\uF1EB"; + connectLabel.Text = QIcon.WIFI; connectLabel.FontSize = 40; connectLabel.TextColor = Color.LimeGreen; deleteLabel.HorizontalOptions = LayoutOptions.CenterAndExpand; deleteLabel.VerticalOptions = LayoutOptions.CenterAndExpand; - deleteLabel.Text = "\uE802"; + deleteLabel.Text = QIcon.TRASH_EMPTY; deleteLabel.FontSize = 40; deleteLabel.TextColor = Color.Red; @@ -105,6 +105,7 @@ 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/QSelectedCueCell.cs b/qController.Standard/Classes/Cell/QSelectedCueCell.cs index 0cb95aa..206e16a 100644 --- a/qController.Standard/Classes/Cell/QSelectedCueCell.cs +++ b/qController.Standard/Classes/Cell/QSelectedCueCell.cs @@ -66,14 +66,14 @@ namespace qController }; number = new Label { - Text = "N/A", + Text = "", FontAttributes = FontAttributes.Bold, FontSize = 30, Margin = new Thickness(5) }; name = new Label { - Text = "N/A", + Text = "Loading Workspace....", FontAttributes = FontAttributes.Bold, HorizontalTextAlignment = TextAlignment.Center, FontSize = 20, @@ -81,7 +81,7 @@ namespace qController }; type = new Label { - Text = "", + Text = QIcon.SPIN3, FontFamily = App.QFont, VerticalTextAlignment = TextAlignment.Center, HorizontalTextAlignment = TextAlignment.End, @@ -89,14 +89,14 @@ namespace qController FontSize = 27 }; - notes = new Label { Text = "Viewing Notes Currently Unavailable" }; + notes = new Label { Text = "Loading Cue Lists and Playhead Position" }; notes.HorizontalTextAlignment = TextAlignment.Center; notes.Margin = new Thickness(0, 0, 0, 10); topGrid.Children.Add(number, 0, 0); topGrid.Children.Add(type, 4, 0); - Grid.SetColumnSpan(number, 2); - Grid.SetColumnSpan(type, 3); + Grid.SetColumnSpan(number, 3); + Grid.SetColumnSpan(type, 1); bottomGrid.Children.Add(name, 0, 0); bottomGrid.Children.Add(notes, 0, 1); diff --git a/qController.Standard/Classes/Cell/QSelectedCueOptionsCell.cs b/qController.Standard/Classes/Cell/QSelectedCueOptionsCell.cs index 75221c0..6916a85 100644 --- a/qController.Standard/Classes/Cell/QSelectedCueOptionsCell.cs +++ b/qController.Standard/Classes/Cell/QSelectedCueOptionsCell.cs @@ -7,22 +7,25 @@ namespace qController { public class QSelectedCueOptionsCell : Frame { - void AudioLevelsUpdated(object source, AudioLevelArgs args) + void OnCueInfoUpdated(object source, CueEventArgs args) { Device.BeginInvokeOnMainThread(() => { - activeCue = args.cue_id; - levels = args.levels; - if (mainSlider != null) + activeCue = args.Cue.uniqueID; + if(args.Cue.levels != null) { - mainSlider.Value = levels[0]; - } - if (leftSlider != null) - { - leftSlider.Value = levels[1]; - } - if (rightSlider != null) - { - rightSlider.Value = levels[2]; + 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]; + } } }); } @@ -34,7 +37,7 @@ namespace qController Slider rightSlider; public QSelectedCueOptionsCell(QController qController) { - qController.qClient.qParser.AudioLevelsUpdated += AudioLevelsUpdated; + qController.qClient.qParser.CueInfoUpdated += OnCueInfoUpdated; Padding = new Thickness(5); CornerRadius = 20; BackgroundColor = Color.FromHex("D8D8D8"); diff --git a/qController.Standard/Classes/Communication/QClient.cs b/qController.Standard/Classes/Communication/QClient.cs index 8f7ed5f..9a2c64c 100644 --- a/qController.Standard/Classes/Communication/QClient.cs +++ b/qController.Standard/Classes/Communication/QClient.cs @@ -14,6 +14,11 @@ namespace qController string Address; int Port; + + + public delegate void WorkspaceDisconnectHandler(object source, EventArgs args); + public event WorkspaceDisconnectHandler WorkspaceDisconnect; + public QClient(string address, int port) { Address = address; @@ -26,7 +31,6 @@ namespace qController tcpSender.MessageReceived += OnMessageReceived; qReceiver.UpdateMessageReceived += OnMessageReceived; - } private void OnMessageReceived(object source, MessageEventArgs args) @@ -73,7 +77,7 @@ namespace qController { if (msg.Address.Contains("disconnect")) { - Console.WriteLine("Workspace is disonnecting"); + OnWorkspaceDisconnect(); } else if (msg.Address.Contains("cue_id")) { @@ -87,26 +91,25 @@ namespace qController qParser.ParseMessage(msg); UpdateSelectedCue(); } - } else if (msg.Address.Contains("workspace")) - { + { UpdateWorkspace("not yet implemented"); } } public void UpdateSpecificCue(string cue_id) { - Console.WriteLine("Updating specific cue: " + cue_id); - string valuesForKeys = "[\"displayName\",\"number\",\"type\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"uniqueID\",\"flagged\",\"listName\",\"colorName\",\"name\",\"armed\",\"notes\"]"; + + 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"; sendAndReceiveStringArgs(address, valuesForKeys); } public void UpdateSelectedCue() { - Console.WriteLine("Updating selected cue"); - string valuesForKeys = "[\"displayName\",\"number\",\"type\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"uniqueID\",\"flagged\",\"listName\",\"colorName\",\"name\",\"armed\",\"notes\"]"; + 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); } @@ -115,6 +118,12 @@ namespace qController Console.WriteLine("Workspace needs to be updated: " + ws_id); } + protected virtual void OnWorkspaceDisconnect() + { + if (WorkspaceDisconnect != null) + WorkspaceDisconnect(this, new EventArgs()); + } + public void Close() { udpSender.Close(); diff --git a/qController.Standard/Classes/Communication/QController.cs b/qController.Standard/Classes/Communication/QController.cs index c9a61ee..86ba16a 100644 --- a/qController.Standard/Classes/Communication/QController.cs +++ b/qController.Standard/Classes/Communication/QController.cs @@ -10,7 +10,6 @@ namespace qController { QUpdater qUpdater; - QCue selectedCue; public QClient qClient; public QWorkSpace qWorkspace; public string playbackPosition; @@ -20,45 +19,11 @@ namespace qController qClient = new QClient(address, port); qUpdater = new QUpdater(this); qUpdater.Start(); - qClient.qParser.SelectedCueUpdated += this.OnSelectedCueUpdated; - qClient.qParser.WorkspaceUpdated += this.OnWorkspaceUpdated; - qClient.qParser.PlaybackPositionUpdated += this.OnPlaybackPositionUpdated; - qClient.qParser.CueInfoUpdated += this.OnCueUpdateReceived; - qClient.qParser.AudioLevelsUpdated += this.OnAudioLevelsUpdated; - qClient.qParser.ChildrenUpdated += this.OnChildrenUpdated; - qClient.sendArgsUDP("/updates", 1); + qClient.sendArgsUDP("/updates", 1); qClient.sendAndReceiveString("/cueLists"); - } - private void OnChildrenUpdated(object source, ChildrenEventArgs args) - { - Console.WriteLine("Children Updated in QController: " + args.cue_id); - qWorkspace.UpdateChildren(args.cue_id, args.children); - - foreach (var cueList in qWorkspace.data) - { - foreach (var cue in cueList.cues) - { - if (cue.type == "Group") - { - if (cue.cues == null) - { - Console.WriteLine("Next Group Cue Found"); - qClient.sendStringUDP("/cue_id/" + cue.uniqueID + "/children"); - break; - } - } - } - } - } - - private void OnAudioLevelsUpdated(object source, AudioLevelArgs args) - { - if(qWorkspace != null) - qWorkspace.UpdateLevels(args.cue_id, args.levels); - } public void Connect() { qClient.sendStringUDP("/connect"); @@ -74,64 +39,6 @@ namespace qController qClient.sendArgsUDP("/connect", pass); } - public void updateCueValue(QCue cue, string property, object newValue){ - //qClient.sendArgs("/cue_id/"+cue.uniqueID+"/"+property, newValue); - } - - public void RefreshGroupCues() - { - if (qWorkspace.ChildrenPopulated()) - return; - foreach (var cueList in qWorkspace.data) - { - foreach (var cue in cueList.cues) - { - if (cue.type == "Group") - { - Console.WriteLine("First Group Cue Found"); - qClient.sendStringUDP("/cue_id/" + cue.uniqueID + "/children"); - break; - } - } - } - } - - public void OnSelectedCueUpdated(object source, CueEventArgs args) - { - selectedCue = args.Cue; - Console.WriteLine("Selected cue updated: " + selectedCue.uniqueID); - } - - public void OnWorkspaceUpdated(object source, WorkspaceEventArgs args) - { - qWorkspace = args.UpdatedWorkspace; - Console.WriteLine("Workspace updated in QController: " + qWorkspace.workspace_id); - qWorkspace.PrintStats(); - playbackPosition = null; - qClient.UpdateSelectedCue(); - } - - public void OnPlaybackPositionUpdated(object source, PlaybackPositionArgs args) - { - playbackPosition = args.PlaybackPosition; - Console.WriteLine("Playback Position updated in QController: " + playbackPosition); - } - - public void OnCueUpdateReceived(object source, CueEventArgs args) - { - qWorkspace.UpdateCue(args.Cue); - Console.WriteLine("Cue updated in QController: " + args.Cue.uniqueID ); - if (playbackPosition == null) - { - playbackPosition = args.Cue.uniqueID; - } - if(args.Cue.type == "Audio" || args.Cue.type == "Mic" || args.Cue.type == "Video") - { - Console.WriteLine("Cue has audio levels...sending request"); - qClient.sendStringUDP("/cue_id/" + args.Cue.uniqueID + "/levels"); - } - } - public void Kill(){ qUpdater.Kill(); qClient.Close(); diff --git a/qController.Standard/Classes/Communication/QParser.cs b/qController.Standard/Classes/Communication/QParser.cs index 3866cec..3097072 100644 --- a/qController.Standard/Classes/Communication/QParser.cs +++ b/qController.Standard/Classes/Communication/QParser.cs @@ -15,19 +15,8 @@ namespace qController } } - public class AudioLevelArgs : EventArgs - { - public string cue_id - { - get; - set; - } - public List levels - { - get; - set; - } - } + + public class WorkspaceEventArgs : EventArgs { public QWorkSpace UpdatedWorkspace @@ -36,6 +25,7 @@ namespace qController set; } } + public class PlaybackPositionArgs : EventArgs { public string PlaybackPosition @@ -44,6 +34,7 @@ namespace qController set; } } + public class ConnectEventArgs : EventArgs { public string Status @@ -52,6 +43,7 @@ namespace qController set; } } + public class ChildrenEventArgs : EventArgs { public string cue_id @@ -73,7 +65,6 @@ namespace qController } public delegate void SelectedCueUpdatedHandler(object source, CueEventArgs args); - public delegate void AudioLevelsUpdatedHandler(object source, AudioLevelArgs args); public delegate void WorkspaceUpdatedHandler(object source, WorkspaceEventArgs args); public delegate void CueInfoUpdatedHandler(object source, CueEventArgs args); public delegate void PlaybackPositionUpdatedHandler(object source, PlaybackPositionArgs args); @@ -82,7 +73,6 @@ namespace qController public event ChildrenUpdateHandler ChildrenUpdated; public event ConnectionStatusHandler ConnectionStatusChanged; public event SelectedCueUpdatedHandler SelectedCueUpdated; - public event AudioLevelsUpdatedHandler AudioLevelsUpdated; public event WorkspaceUpdatedHandler WorkspaceUpdated; public event CueInfoUpdatedHandler CueInfoUpdated; public event PlaybackPositionUpdatedHandler PlaybackPositionUpdated; @@ -92,15 +82,10 @@ namespace qController { if (msg.Address.Contains("valuesForKeys")) { - if (msg.Address.Contains("WithArguments")) - ParseLevelInfo(msg); - else - ParseCueUpdateInfo(msg); + ParseCueUpdateInfo(msg); } else if (msg.Address.Contains("notes")) ParseNoteInfo(msg); - else if (msg.Address.Contains("levels")) - ParseLevelInfo(msg); else if (msg.Address.Contains("cueLists")) ParseWorkspaceInfo(msg); else if (msg.Address.Contains("playbackPosition")) @@ -140,6 +125,7 @@ namespace qController public void ParseCueUpdateInfo(OscMessage msg) { JToken cueUpdate = OSC2JSON(msg); + Console.WriteLine(OSC2JSON(msg).ToString()); QCue cue = JsonConvert.DeserializeObject(cueUpdate.ToString()); OnCueInfoUpdated(cue); } @@ -154,12 +140,6 @@ namespace qController //JToken cueInfo = OSC2JSON(msg); } - public void ParseLevelInfo(OscMessage msg){ - var cue_id = msg.Address.Split('/')[3]; - JToken levels = OSC2JSON(msg)[0]; - OnAudioLevelsUpdated(cue_id, levels.ToObject>()); - } - public void ParseWorkspaceInfo(OscMessage msg) { if (msg.Arguments.Count > 0) @@ -196,11 +176,6 @@ namespace qController SelectedCueUpdated(this, new CueEventArgs() { Cue = cue }); } - protected virtual void OnAudioLevelsUpdated(string id, List audioLevels){ - if (AudioLevelsUpdated != null) - AudioLevelsUpdated(this, new AudioLevelArgs { cue_id = id, levels = audioLevels }); - } - protected virtual void OnCueInfoUpdated(QCue cue) { if (CueInfoUpdated != null) diff --git a/qController.Standard/Classes/Communication/QUpdater.cs b/qController.Standard/Classes/Communication/QUpdater.cs index 0cb79cd..79f9a36 100644 --- a/qController.Standard/Classes/Communication/QUpdater.cs +++ b/qController.Standard/Classes/Communication/QUpdater.cs @@ -14,6 +14,12 @@ namespace qController { qController = controller; updateThread = new Thread(new ThreadStart(UpdateLoop)); + + qController.qClient.qParser.ChildrenUpdated += OnChildrenUpdated; + qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived; + qController.qClient.qParser.WorkspaceUpdated += OnWorkspaceUpdated; + qController.qClient.qParser.PlaybackPositionUpdated += OnPlaybackPositionUpdated; + } public void Start(){ @@ -29,6 +35,59 @@ namespace qController }); } + public void OnCueUpdateReceived(object source, CueEventArgs args) + { + qController.qWorkspace.UpdateCue(args.Cue); + if (qController.playbackPosition == null) + { + qController.playbackPosition = args.Cue.uniqueID; + } + } + + private void OnChildrenUpdated(object source, ChildrenEventArgs args) + { + qController.qWorkspace.UpdateChildren(args.cue_id, args.children); + + if (!qController.qWorkspace.IsPopulated) + { + QCue cue = qController.qWorkspace.GetEmptyGroup(); + if(cue != null) + { + qController.qClient.sendStringUDP("/cue_id/" + cue.uniqueID + "/children"); + } + } + } + + public void OnWorkspaceUpdated(object source, WorkspaceEventArgs args) + { + qController.qWorkspace = args.UpdatedWorkspace; + qController.playbackPosition = null; + qController.qClient.UpdateSelectedCue(); + } + + public void OnPlaybackPositionUpdated(object source, PlaybackPositionArgs args) + { + qController.playbackPosition = args.PlaybackPosition; + } + + public void RefreshGroupCues() + { + if (qController.qWorkspace.ChildrenPopulated()) + return; + foreach (var cueList in qController.qWorkspace.data) + { + foreach (var cue in cueList.cues) + { + if (cue.type == "Group") + { + Console.WriteLine("First Group Cue Found"); + qController.qClient.sendStringUDP("/cue_id/" + cue.uniqueID + "/children"); + break; + } + } + } + } + public void SendThump() { qController.qClient.sendStringUDP("/thump"); diff --git a/qController.Standard/Classes/Cues/QCue.cs b/qController.Standard/Classes/Cues/QCue.cs index a227024..1ae0c68 100644 --- a/qController.Standard/Classes/Cues/QCue.cs +++ b/qController.Standard/Classes/Cues/QCue.cs @@ -5,6 +5,7 @@ namespace qController { public class QCue { + //info loaded from "/cueLists" public string number { get; set; } public string uniqueID { get; set; } public bool flagged { get; set; } @@ -13,6 +14,8 @@ namespace qController public string colorName { get; set; } public string name { get; set; } public bool armed { get; set; } + + //info loaded from "/valuesForKeys public decimal translationX { get; set; } public bool isRunning { get; set; } public decimal scaleX { get; set; } @@ -27,65 +30,13 @@ namespace qController public string displayName { get; set; } public bool isLoaded { get; set; } public string notes { get; set; } - public List levels { get; set; } + public List> levels { get; set; } + + //info loaded from /children public List cues { get; set; } public string getIconString() { - switch (type) - { - case "Group": - return "\uF248"; - case "Audio": - return "\uE807"; - case "Mic": - return "\uF130"; - case "Video": - return "\uE805"; - case "Camera": - return "\uE806"; - case "Text": - return "T"; - case "Light": - return "\uF0EB"; - case "Fade": - return "\uF1DE"; - case "Network": - return "\uF192"; - case "MIDI": - return ""; - case "MIDI File": - return "\uE804"; - case "Timecode": - return "\uE808"; - case "Start": - return "\uE809"; - case "Stop": - return "\uE80A"; - case "Pause": - return "\uE80B"; - case "Load": - return "\uE80E"; - case "Reset": - return "\uE80F"; - case "Devamp": - return "\uE80C"; - case "GoTo": - return "\uF178"; - case "Target": - return "\uE80D"; - case "Arm": - return "\uE810"; - case "Disarm": - return ""; - case "Wait": - return "\uF250"; - case "Memo": - return "\uF27B"; - case "Script": - return "\uE811"; - default: - return ""; - } + return QIcon.GetIconFromType(type); } } } diff --git a/qController.Standard/Classes/Cues/QWorkSpace.cs b/qController.Standard/Classes/Cues/QWorkSpace.cs index 9857a7e..3f1906a 100644 --- a/qController.Standard/Classes/Cues/QWorkSpace.cs +++ b/qController.Standard/Classes/Cues/QWorkSpace.cs @@ -9,20 +9,20 @@ namespace qController public List data { get; set; } public string workspace_id { get; set; } public string address { get; set; } + public bool IsPopulated { get; set; } public QCue GetCue(string cue_id) { - QCue returnCue = null; foreach (var cueList in data) { foreach (var cue in cueList.cues) { if(cue.uniqueID == cue_id) { - returnCue = cue; + return cue; } } } - return returnCue; + return null; } public void UpdateCue(QCue cue) @@ -34,6 +34,7 @@ namespace qController if(data[i].cues[j].uniqueID == cue.uniqueID) { data[i].cues[j] = cue; + return; } } } @@ -50,25 +51,28 @@ namespace qController if(data[i].cues[j].type == "Group") { data[i].cues[j].cues = children; + return; } } } } } - public void UpdateLevels(string cue_id, List levels) + public QCue GetEmptyGroup() { - for (int i = 0; i < data.Count; i++) + foreach (var cueList in data) { - for (int j = 0; j < data[i].cues.Count; j++) + foreach (var cue in cueList.cues) { - if (data[i].cues[j].uniqueID == cue_id) + if (cue.type == "Group" && cue.cues == null) { - Console.WriteLine("Cue found and levels updated"); - data[i].cues[j].levels = levels; + Console.WriteLine("Next Group Cue Found"); + return cue; } } } + IsPopulated = true; + return null; } public bool ChildrenPopulated() @@ -79,10 +83,12 @@ namespace qController { if (data[i].cues[j].type == "Group" && data[i].cues[j].cues == null) { + IsPopulated = false; return false; } } } + IsPopulated = true; return true; } @@ -91,7 +97,6 @@ namespace qController foreach (var cueList in data) { Console.WriteLine(cueList.listName + "("+ cueList.cues.Count + " cues)"); - } } } diff --git a/qController.Standard/Classes/Settings/QIcon.cs b/qController.Standard/Classes/Settings/QIcon.cs new file mode 100644 index 0000000..9dddf21 --- /dev/null +++ b/qController.Standard/Classes/Settings/QIcon.cs @@ -0,0 +1,110 @@ +using System; +namespace qController +{ + public static class QIcon + { + public const string SEARCH = "\uE800"; + public const string PLUS = "\uE801"; + public const string TRASH_EMPTY = "\uE802"; + public const string CANCEL = "\uE803"; + public const string MUSIC = "\uE804"; + public const string VIDEO = "\uE805"; + public const string VIDEOCAM = "\uE806"; + public const string VOLUME_UP = "\uE807"; + public const string CLOCK = "\uE808"; + public const string PLAY = "\uE809"; + public const string STOP = "\uE80A"; + public const string PAUSE = "\uE80B"; + public const string CW = "\uE80C"; + public const string TARGET = "\uE80D"; + public const string CHART_PIE = "\uE80E"; + public const string UNDO = "\uE80F"; + + public const string POWER = "\uE810"; + public const string QRCODE = "\uE811"; + + public const string SPIN3 = "\uE832"; + + public const string MENU = "\uF0C9"; + + public const string LIGHTBULB = "\uF0CB"; + + public const string MIC = "\uF130"; + + public const string MINUS_SQUARED = "\uF146"; + + public const string RIGHT = "\uF148"; + + public const string DOT_CIRCLED = "\uF192"; + + public const string SLIDERS = "\uF1DE"; + + public const string WIFI = "\uF1EB"; + + public const string OBJECT_UNGROUP = "\uF248"; + + public const string HOURGLASS_O = "\uF251"; + + public const string COMMENTING_O = "\uF27B"; + + + public static string GetIconFromType(string type) + { + switch (type) + { + case "Group": + return OBJECT_UNGROUP; + case "Audio": + return VOLUME_UP; + case "Mic": + return MIC; + case "Video": + return VIDEO; + case "Camera": + return VIDEOCAM; + case "Text": + return "T"; + case "Light": + return LIGHTBULB; + case "Fade": + return SLIDERS; + case "Network": + return DOT_CIRCLED; + case "MIDI": + return ""; + case "MIDI File": + return MUSIC; + case "Timecode": + return CLOCK; + case "Start": + return PLAY; + case "Stop": + return STOP; + case "Pause": + return PAUSE; + case "Load": + return CHART_PIE; + case "Reset": + return UNDO; + case "Devamp": + return CW; + case "GoTo": + return RIGHT; + case "Target": + return TARGET; + case "Arm": + return POWER; + case "Disarm": + return ""; + case "Wait": + return HOURGLASS_O; + case "Memo": + return COMMENTING_O; + case "Script": + return QRCODE; + default: + return ""; + } + } + } +} diff --git a/qController.Standard/Pages/ControlPage.xaml.cs b/qController.Standard/Pages/ControlPage.xaml.cs index c248a5b..d7eb46d 100644 --- a/qController.Standard/Pages/ControlPage.xaml.cs +++ b/qController.Standard/Pages/ControlPage.xaml.cs @@ -18,11 +18,9 @@ namespace qController InitializeComponent(); qController = new QController(address, 53000); - qController.qClient.qParser.SelectedCueUpdated += SelectedCueUpdated; qController.qClient.qParser.WorkspaceUpdated += WorkspaceUpdated; qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated; qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived; - qController.qClient.qParser.ConnectionStatusChanged += OnConnectionStatusChanged; qController.qClient.qParser.ChildrenUpdated += OnChildrenUpdated; instanceName.Text = name; App.rootPage.MenuItemSelected += OnMenuItemSelected; @@ -31,58 +29,6 @@ namespace qController } - private void OnChildrenUpdated(object source, ChildrenEventArgs args) - { - Console.WriteLine("Children Updated in ControlPage: " + args.cue_id); - qController.qWorkspace.UpdateChildren(args.cue_id, args.children); - if (qController.qWorkspace.ChildrenPopulated()) - { - Device.BeginInvokeOnMainThread(() => - { - if (App.MenuIsPresented) - { - //App.MenuIsPresented = false; - App.rootPage.MenuPage.ChangeToWorkspace(qController.qWorkspace); - //App.MenuIsPresented = true; - } - else - { - App.rootPage.MenuPage.ChangeToWorkspace(qController.qWorkspace); - - } - }); - qController.qClient.UpdateSelectedCue(); - } - } - - private void OnConnectionStatusChanged(object source, ConnectEventArgs args) - { - if (args.Status == "ok") - { - Console.WriteLine("Workspace has successfully connected"); - } - else if (args.Status == "badpass") - { - Console.WriteLine("Password incorrect or no password supplied"); - } - else - { - Console.WriteLine("Workspace not found"); - } - } - - private void OnMenuItemSelected(object source, MenuEventArgs args) - { - if (args.Command.Contains("/")) - { - Console.WriteLine("Cue selected: " + args.Command); - qController.qClient.sendStringUDP(args.Command); - }else if (args.Command == "disconnect") - { - Back(); - } - } - private void InitGUI() { @@ -94,7 +40,7 @@ namespace qController topBar.BackgroundColor = Color.FromHex("71AEFF"); BackgroundColor = Color.FromHex("4A4A4A"); - menuButton.Text = "\uF0C9"; + menuButton.Text = QIcon.MENU; switch (Device.RuntimePlatform) { case Device.iOS: @@ -162,7 +108,6 @@ namespace qController row = 0; column = 2; } - } QButton goButton = new QButton("GO","/go"); @@ -194,22 +139,6 @@ namespace qController App.NavigationPage.Navigation.PopAsync(); } - public void SelectedCueUpdated(object sender, CueEventArgs e){ - Device.BeginInvokeOnMainThread(()=>{ - if (e.Cue.type.Equals("Audio")) - { - //Console.WriteLine("CUE IS AN AUDIO CUE"); - sLayout.Children.Add(qSelectedCueOptions); - } - else - { - //Console.WriteLine("CUE IS NOT AN AUDIO CUE"); - sLayout.Children.Remove(qSelectedCueOptions); - } - qCell.UpdateSelectedCue(e.Cue); - }); - } - public void WorkspaceUpdated(object sender, WorkspaceEventArgs e) { if(e.UpdatedWorkspace.data.Count > 0) @@ -248,7 +177,7 @@ namespace qController Console.WriteLine("Cue that was updated is equal to the playback position."); Device.BeginInvokeOnMainThread(() => { - if (args.Cue.type.Equals("Audio")) + if (args.Cue.levels != null) sLayout.Children.Add(qSelectedCueOptions); else sLayout.Children.Remove(qSelectedCueOptions); @@ -257,6 +186,42 @@ namespace qController } } + private void OnChildrenUpdated(object source, ChildrenEventArgs args) + { + Console.WriteLine("Children Updated in ControlPage: " + args.cue_id); + qController.qWorkspace.UpdateChildren(args.cue_id, args.children); + if (qController.qWorkspace.ChildrenPopulated()) + { + Device.BeginInvokeOnMainThread(() => + { + if (App.MenuIsPresented) + { + //App.MenuIsPresented = false; + App.rootPage.MenuPage.ChangeToWorkspace(qController.qWorkspace); + //App.MenuIsPresented = true; + } + else + { + App.rootPage.MenuPage.ChangeToWorkspace(qController.qWorkspace); + + } + }); + qController.qClient.UpdateSelectedCue(); + } + } + + private void OnMenuItemSelected(object source, MenuEventArgs args) + { + if (args.Command.Contains("/")) + { + qController.qClient.sendStringUDP(args.Command); + } + else if (args.Command == "disconnect") + { + Back(); + } + } + protected override void OnDisappearing() { base.OnDisappearing(); diff --git a/qController.Standard/Pages/MenuPage.xaml.cs b/qController.Standard/Pages/MenuPage.xaml.cs index d4271eb..839251f 100644 --- a/qController.Standard/Pages/MenuPage.xaml.cs +++ b/qController.Standard/Pages/MenuPage.xaml.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Threading; using Xamarin.Forms; namespace qController @@ -69,16 +70,19 @@ namespace qController }; } - - public void ChangeToWorkspace(QWorkSpace workspace) + public void ChangeToControl() { items.Clear(); items.Add(new MenuPageItem { Title = "Disconnect", - Icon = "\uE803", + Icon = QIcon.CANCEL, Command = "disconnect" }); + } + public void ChangeToWorkspace(QWorkSpace workspace) + { + ChangeToControl(); foreach (var cueList in workspace.data) { items.Add(new MenuPageItem @@ -90,7 +94,6 @@ namespace qController foreach (var cue in cueList.cues) { AddSubCues(cue, 0); - } } } @@ -122,10 +125,10 @@ namespace qController }); //uncomment to load nested group cues - /*foreach (var sub_cue in cue.cues) + foreach (var sub_cue in cue.cues) { AddSubCues(sub_cue,level + 1); - }*/ + } } else {