Start work on Group Cue children loading

This commit is contained in:
2019-04-19 13:51:07 -05:00
parent 3a0a2531bb
commit bceaf80be3
11 changed files with 198 additions and 55 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="17" android:versionName="1.0.1" package="com.jwetzell.qlabcontroller"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="20" android:versionName="1.0.3" package="com.jwetzell.qlabcontroller">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="24" /> <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application android:label="qController" android:icon="@drawable/icon"></application> <application android:label="qController" android:icon="@drawable/icon"></application>
</manifest> </manifest>
+1 -1
View File
@@ -3,7 +3,7 @@
<Application.Resources> <Application.Resources>
<!-- Application resource dictionary --> <!-- Application resource dictionary -->
<OnPlatform x:Key="qfont" x:TypeArguments="x:String"> <OnPlatform x:Key="qfont" x:TypeArguments="x:String">
<On Platform="Android" Value="qfont.otf#qfont" /> <On Platform="Android" Value="qfont.ttf#qfont" />
<On Platform="iOS" Value="qfont" /> <On Platform="iOS" Value="qfont" />
</OnPlatform> </OnPlatform>
</Application.Resources> </Application.Resources>
@@ -115,7 +115,7 @@ namespace qController
public void UpdateSelectedCue(QCue cue) public void UpdateSelectedCue(QCue cue)
{ {
name.Text = cue.name; name.Text = cue.listName;
number.Text = cue.number; number.Text = cue.number;
type.Text = cue.getIconString(); type.Text = cue.getIconString();
notes.Text = cue.notes; notes.Text = cue.notes;
@@ -93,8 +93,6 @@ namespace qController
{ {
UpdateWorkspace("not yet implemented"); UpdateWorkspace("not yet implemented");
} }
} }
public void UpdateSpecificCue(string cue_id) public void UpdateSpecificCue(string cue_id)
@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Diagnostics;
using Xamarin.Forms; using Xamarin.Forms;
namespace qController namespace qController
@@ -13,6 +14,7 @@ namespace qController
public QClient qClient; public QClient qClient;
public QWorkSpace qWorkspace; public QWorkSpace qWorkspace;
public string playbackPosition; public string playbackPosition;
public Stopwatch sw;
public QController(string address, int port) public QController(string address, int port)
{ {
qClient = new QClient(address, port); qClient = new QClient(address, port);
@@ -23,18 +25,40 @@ namespace qController
qClient.qParser.PlaybackPositionUpdated += this.OnPlaybackPositionUpdated; qClient.qParser.PlaybackPositionUpdated += this.OnPlaybackPositionUpdated;
qClient.qParser.CueInfoUpdated += this.OnCueUpdateReceived; qClient.qParser.CueInfoUpdated += this.OnCueUpdateReceived;
qClient.qParser.AudioLevelsUpdated += this.OnAudioLevelsUpdated; qClient.qParser.AudioLevelsUpdated += this.OnAudioLevelsUpdated;
qClient.qParser.ChildrenUpdated += this.OnChildrenUpdated;
qClient.sendArgsUDP("/updates", 1); qClient.sendArgsUDP("/updates", 1);
qClient.sendArgsUDP("/updates", 1); qClient.sendArgsUDP("/updates", 1);
qClient.sendAndReceiveString("/cueLists"); 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) private void OnAudioLevelsUpdated(object source, AudioLevelArgs args)
{ {
if(qWorkspace != null) if(qWorkspace != null)
qWorkspace.UpdateLevels(args.cue_id, args.levels); qWorkspace.UpdateLevels(args.cue_id, args.levels);
} }
public void Connect() public void Connect()
{ {
qClient.sendStringUDP("/connect"); qClient.sendStringUDP("/connect");
@@ -50,14 +74,28 @@ namespace qController
qClient.sendArgsUDP("/connect", pass); qClient.sendArgsUDP("/connect", pass);
} }
public void sendCommand(string cmd){
qClient.sendString(cmd);
}
public void updateCueValue(QCue cue, string property, object newValue){ public void updateCueValue(QCue cue, string property, object newValue){
//qClient.sendArgs("/cue_id/"+cue.uniqueID+"/"+property, 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) public void OnSelectedCueUpdated(object source, CueEventArgs args)
{ {
selectedCue = args.Cue; selectedCue = args.Cue;
@@ -52,6 +52,19 @@ namespace qController
set; set;
} }
} }
public class ChildrenEventArgs : EventArgs
{
public string cue_id
{
get;
set;
}
public List<QCue> children
{
get;
set;
}
}
public class QParser public class QParser
{ {
public QParser() public QParser()
@@ -65,6 +78,8 @@ namespace qController
public delegate void CueInfoUpdatedHandler(object source, CueEventArgs args); public delegate void CueInfoUpdatedHandler(object source, CueEventArgs args);
public delegate void PlaybackPositionUpdatedHandler(object source, PlaybackPositionArgs args); public delegate void PlaybackPositionUpdatedHandler(object source, PlaybackPositionArgs args);
public delegate void ConnectionStatusHandler(object source, ConnectEventArgs args); public delegate void ConnectionStatusHandler(object source, ConnectEventArgs args);
public delegate void ChildrenUpdateHandler(object source, ChildrenEventArgs args);
public event ChildrenUpdateHandler ChildrenUpdated;
public event ConnectionStatusHandler ConnectionStatusChanged; public event ConnectionStatusHandler ConnectionStatusChanged;
public event SelectedCueUpdatedHandler SelectedCueUpdated; public event SelectedCueUpdatedHandler SelectedCueUpdated;
public event AudioLevelsUpdatedHandler AudioLevelsUpdated; public event AudioLevelsUpdatedHandler AudioLevelsUpdated;
@@ -94,6 +109,8 @@ namespace qController
Console.WriteLine("Heartbeat Received"); Console.WriteLine("Heartbeat Received");
else if (msg.Address.Contains("connect")) else if (msg.Address.Contains("connect"))
ParseConnectInfo(msg); ParseConnectInfo(msg);
else if (msg.Address.Contains("children"))
ParseChildrenInfo(msg);
else else
{ {
Console.WriteLine("Unknown message type"); Console.WriteLine("Unknown message type");
@@ -103,10 +120,9 @@ namespace qController
Console.WriteLine(item); Console.WriteLine(item);
} }
} }
} }
} }
public void ParseConnectInfo(OscMessage msg) public void ParseConnectInfo(OscMessage msg)
{ {
JToken connectStatus = OSC2JSON(msg); JToken connectStatus = OSC2JSON(msg);
@@ -130,7 +146,6 @@ namespace qController
public void ParseSelectedCueInfo(OscMessage msg){ public void ParseSelectedCueInfo(OscMessage msg){
JToken selectedCue = OSC2JSON(msg); JToken selectedCue = OSC2JSON(msg);
Console.WriteLine("Selected Cue Updated");
QCue cue = JsonConvert.DeserializeObject<QCue>(selectedCue.ToString()); QCue cue = JsonConvert.DeserializeObject<QCue>(selectedCue.ToString());
OnSelectedCueUpdated(cue); OnSelectedCueUpdated(cue);
} }
@@ -154,6 +169,17 @@ namespace qController
} }
} }
public void ParseChildrenInfo(OscMessage msg)
{
if (msg.Arguments.Count > 0)
{
string cue_id = msg.Address.Split('/')[3];
JToken children_obj = OSC2JSON(msg);
List<QCue> children = JsonConvert.DeserializeObject<List<QCue>>(children_obj.ToString());
OnChildrenUpdated(cue_id, children);
}
}
public JToken OSC2JSON(OscMessage Msg){ public JToken OSC2JSON(OscMessage Msg){
JObject json = JObject.Parse(Msg.Arguments.ToArray()[0].ToString()); JObject json = JObject.Parse(Msg.Arguments.ToArray()[0].ToString());
return json.GetValue("data"); return json.GetValue("data");
@@ -191,5 +217,11 @@ namespace qController
if (ConnectionStatusChanged != null) if (ConnectionStatusChanged != null)
ConnectionStatusChanged(this, new ConnectEventArgs() { Status = status }); ConnectionStatusChanged(this, new ConnectEventArgs() { Status = status });
} }
protected virtual void OnChildrenUpdated(string id, List<QCue> cues)
{
if (ChildrenUpdated != null)
ChildrenUpdated(this, new ChildrenEventArgs() { cue_id = id, children = cues });
}
} }
} }
+9 -8
View File
@@ -13,21 +13,22 @@ namespace qController
public string colorName { get; set; } public string colorName { get; set; }
public string name { get; set; } public string name { get; set; }
public bool armed { get; set; } public bool armed { get; set; }
public int translationX { get; set; } public decimal translationX { get; set; }
public bool isRunning { get; set; } public bool isRunning { get; set; }
public int scaleX { get; set; } public decimal scaleX { get; set; }
public bool isPaused { get; set; } public bool isPaused { get; set; }
public int translationY { get; set; } public decimal translationY { get; set; }
public int preWait { get; set; } public decimal preWait { get; set; }
public int opacity { get; set; } public decimal opacity { get; set; }
public int scaleY { get; set; } public decimal scaleY { get; set; }
public int duration { get; set; } public decimal duration { get; set; }
public int postWait { get; set; } public decimal postWait { get; set; }
public bool isBroken { get; set; } public bool isBroken { get; set; }
public string displayName { get; set; } public string displayName { get; set; }
public bool isLoaded { get; set; } public bool isLoaded { get; set; }
public string notes { get; set; } public string notes { get; set; }
public List<double> levels { get; set; } public List<double> levels { get; set; }
public List<QCue> cues { get; set; }
public string getIconString() public string getIconString()
{ {
switch (type) switch (type)
@@ -9,7 +9,6 @@ namespace qController
public List<QCueList> data { get; set; } public List<QCueList> data { get; set; }
public string workspace_id { get; set; } public string workspace_id { get; set; }
public string address { get; set; } public string address { get; set; }
public QCue GetCue(string cue_id) public QCue GetCue(string cue_id)
{ {
QCue returnCue = null; QCue returnCue = null;
@@ -40,6 +39,23 @@ namespace qController
} }
} }
public void UpdateChildren(string cue_id, List<QCue> children)
{
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].cues.Count; j++)
{
if (data[i].cues[j].uniqueID == cue_id)
{
if(data[i].cues[j].type == "Group")
{
data[i].cues[j].cues = children;
}
}
}
}
}
public void UpdateLevels(string cue_id, List<double> levels) public void UpdateLevels(string cue_id, List<double> levels)
{ {
for (int i = 0; i < data.Count; i++) for (int i = 0; i < data.Count; i++)
@@ -55,6 +71,21 @@ namespace qController
} }
} }
public bool ChildrenPopulated()
{
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].cues.Count; j++)
{
if (data[i].cues[j].type == "Group" && data[i].cues[j].cues == null)
{
return false;
}
}
}
return true;
}
public void PrintStats() public void PrintStats()
{ {
foreach (var cueList in data) foreach (var cueList in data)
+26 -13
View File
@@ -23,6 +23,7 @@ namespace qController
qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated; qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated;
qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived; qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived;
qController.qClient.qParser.ConnectionStatusChanged += OnConnectionStatusChanged; qController.qClient.qParser.ConnectionStatusChanged += OnConnectionStatusChanged;
qController.qClient.qParser.ChildrenUpdated += OnChildrenUpdated;
instanceName.Text = name; instanceName.Text = name;
App.rootPage.MenuItemSelected += OnMenuItemSelected; App.rootPage.MenuItemSelected += OnMenuItemSelected;
qController.Connect(); qController.Connect();
@@ -30,6 +31,30 @@ 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) private void OnConnectionStatusChanged(object source, ConnectEventArgs args)
{ {
if (args.Status == "ok") if (args.Status == "ok")
@@ -149,7 +174,6 @@ namespace qController
sLayout.Children.Add(mainG); sLayout.Children.Add(mainG);
} }
void sendOSC(object sender, EventArgs e) void sendOSC(object sender, EventArgs e)
@@ -193,6 +217,7 @@ namespace qController
App.rootPage.MenuPage.ChangeToWorkspace(e.UpdatedWorkspace); App.rootPage.MenuPage.ChangeToWorkspace(e.UpdatedWorkspace);
qController.qWorkspace = e.UpdatedWorkspace; qController.qWorkspace = e.UpdatedWorkspace;
//qController.RefreshGroupCues();
Console.WriteLine("Workspace updated in ControlPage: " + qController.qWorkspace.workspace_id); Console.WriteLine("Workspace updated in ControlPage: " + qController.qWorkspace.workspace_id);
} }
} }
@@ -206,15 +231,9 @@ namespace qController
{ {
Device.BeginInvokeOnMainThread(() => { Device.BeginInvokeOnMainThread(() => {
if (cue.type.Equals("Audio")) if (cue.type.Equals("Audio"))
{
//Console.WriteLine("CUE IS AN AUDIO CUE");
sLayout.Children.Add(qSelectedCueOptions); sLayout.Children.Add(qSelectedCueOptions);
}
else else
{
//Console.WriteLine("CUE IS NOT AN AUDIO CUE");
sLayout.Children.Remove(qSelectedCueOptions); sLayout.Children.Remove(qSelectedCueOptions);
}
qCell.UpdateSelectedCue(cue); qCell.UpdateSelectedCue(cue);
}); });
} }
@@ -230,15 +249,9 @@ namespace qController
Device.BeginInvokeOnMainThread(() => Device.BeginInvokeOnMainThread(() =>
{ {
if (args.Cue.type.Equals("Audio")) if (args.Cue.type.Equals("Audio"))
{
//Console.WriteLine("CUE IS AN AUDIO CUE");
sLayout.Children.Add(qSelectedCueOptions); sLayout.Children.Add(qSelectedCueOptions);
}
else else
{
//Console.WriteLine("CUE IS NOT AN AUDIO CUE");
sLayout.Children.Remove(qSelectedCueOptions); sLayout.Children.Remove(qSelectedCueOptions);
}
qCell.UpdateSelectedCue(args.Cue); qCell.UpdateSelectedCue(args.Cue);
}); });
} }
+45 -18
View File
@@ -10,6 +10,7 @@ namespace qController
public ListView listView; public ListView listView;
public ObservableCollection<MenuPageItem> items; public ObservableCollection<MenuPageItem> items;
int subLevel = 0;
public MenuPage() public MenuPage()
{ {
Title = "Menu"; Title = "Menu";
@@ -88,29 +89,55 @@ namespace qController
}); });
foreach (var cue in cueList.cues) foreach (var cue in cueList.cues)
{ {
var cueIcon = cue.getIconString(); AddSubCues(cue, 0);
var cueTitle = "";
if(cue.number != "")
{
cueTitle = "\t" + cue.number + " - " + cue.listName;
}
else
{
cueTitle = "\t" + cue.listName;
}
items.Add(new MenuPageItem
{
Title = cueTitle,
Icon = cueIcon,
Command = "/select_id/" + cue.uniqueID
});
} }
} }
} }
public void AddSubCues(QCue cue, int level)
{
var cueIcon = cue.getIconString();
var cueTitle = "";
for (int i = 0; i < level; i++)
{
cueTitle += " ";
}
if (cue.number != "")
{
cueTitle += cue.number + " - " + cue.listName;
}
else
{
cueTitle += cue.listName;
}
if (cue.cues != null )
{
items.Add(new MenuPageItem
{
Title = cueTitle,
Icon = cueIcon,
Command = "/select_id/" + cue.uniqueID
});
//uncomment to load nested group cues
/*foreach (var sub_cue in cue.cues)
{
AddSubCues(sub_cue,level + 1);
}*/
}
else
{
items.Add(new MenuPageItem
{
Title = cueTitle,
Icon = cueIcon,
Command = "/select_id/" + cue.uniqueID
});
}
}
public void ChangeToHome() public void ChangeToHome()
{ {
items.Clear(); items.Clear();
@@ -55,7 +55,10 @@ namespace qController
case Device.iOS: case Device.iOS:
menuButton.Margin = new Thickness(20, 35, 20, 10); menuButton.Margin = new Thickness(20, 35, 20, 10);
break; break;
case Device.Android:
topBar.HeightRequest = 50;
menuButton.Margin = new Thickness(20, 10, 20, 10);
break;
} }
menuButton.Text = "\uF0C9"; menuButton.Text = "\uF0C9";