diff --git a/QSharpDemo/Program.cs b/QSharpDemo/Program.cs
deleted file mode 100644
index 7592f8e..0000000
--- a/QSharpDemo/Program.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-using System.Threading;
-using QSharp;
-
-namespace qControlDemo
-{
- class Program
- {
- static void Main(string[] args)
- {
- Console.OutputEncoding = System.Text.Encoding.UTF8;
- Console.WriteLine("qControlDemo Started");
- QBrowser browser = new QBrowser();
- Thread.Sleep(100000000);
- }
- }
-}
diff --git a/QSharpDemo/QSharpDemo.csproj b/QSharpDemo/QSharpDemo.csproj
deleted file mode 100644
index 283fc7c..0000000
--- a/QSharpDemo/QSharpDemo.csproj
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- Exe
- netcoreapp3.1
-
-
-
-
-
-
diff --git a/QSharpDemoApp/Form1.Designer.cs b/QSharpDemoApp/Form1.Designer.cs
new file mode 100644
index 0000000..54d8d04
--- /dev/null
+++ b/QSharpDemoApp/Form1.Designer.cs
@@ -0,0 +1,157 @@
+namespace QSharpDemoApp
+{
+ partial class Form1
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.workspaceListView = new System.Windows.Forms.ListView();
+ this.cueNumberHeader = new System.Windows.Forms.ColumnHeader();
+ this.cueNameHeader = new System.Windows.Forms.ColumnHeader();
+ this.goButton = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.serverListView = new System.Windows.Forms.ListView();
+ this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
+ this.columnHeader4 = new System.Windows.Forms.ColumnHeader();
+ this.connectButton = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // workspaceListView
+ //
+ this.workspaceListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.cueNumberHeader,
+ this.cueNameHeader});
+ this.workspaceListView.FullRowSelect = true;
+ this.workspaceListView.GridLines = true;
+ this.workspaceListView.HideSelection = false;
+ this.workspaceListView.Location = new System.Drawing.Point(208, 122);
+ this.workspaceListView.MultiSelect = false;
+ this.workspaceListView.Name = "workspaceListView";
+ this.workspaceListView.Size = new System.Drawing.Size(580, 316);
+ this.workspaceListView.TabIndex = 0;
+ this.workspaceListView.UseCompatibleStateImageBehavior = false;
+ this.workspaceListView.View = System.Windows.Forms.View.Details;
+ //
+ // cueNumberHeader
+ //
+ this.cueNumberHeader.Name = "cueNumberHeader";
+ this.cueNumberHeader.Text = "Number";
+ //
+ // cueNameHeader
+ //
+ this.cueNameHeader.Name = "cueNameHeader";
+ this.cueNameHeader.Text = "Name";
+ this.cueNameHeader.Width = 300;
+ //
+ // goButton
+ //
+ this.goButton.Location = new System.Drawing.Point(208, 47);
+ this.goButton.Name = "goButton";
+ this.goButton.Size = new System.Drawing.Size(104, 69);
+ this.goButton.TabIndex = 1;
+ this.goButton.Text = "GO";
+ this.goButton.UseVisualStyleBackColor = true;
+ this.goButton.Click += new System.EventHandler(this.goButton_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("Segoe UI", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
+ this.label1.Location = new System.Drawing.Point(13, 23);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(53, 19);
+ this.label1.TabIndex = 3;
+ this.label1.Text = "Servers";
+ //
+ // serverListView
+ //
+ this.serverListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.columnHeader3,
+ this.columnHeader4});
+ this.serverListView.FullRowSelect = true;
+ this.serverListView.GridLines = true;
+ this.serverListView.HideSelection = false;
+ this.serverListView.Location = new System.Drawing.Point(13, 47);
+ this.serverListView.Name = "serverListView";
+ this.serverListView.Size = new System.Drawing.Size(189, 391);
+ this.serverListView.TabIndex = 4;
+ this.serverListView.UseCompatibleStateImageBehavior = false;
+ this.serverListView.View = System.Windows.Forms.View.Details;
+ //
+ // columnHeader3
+ //
+ this.columnHeader3.Text = "Name";
+ this.columnHeader3.Width = 130;
+ //
+ // columnHeader4
+ //
+ this.columnHeader4.Text = "Version";
+ this.columnHeader4.Width = 50;
+ //
+ // connectButton
+ //
+ this.connectButton.Location = new System.Drawing.Point(94, 21);
+ this.connectButton.Name = "connectButton";
+ this.connectButton.Size = new System.Drawing.Size(75, 23);
+ this.connectButton.TabIndex = 5;
+ this.connectButton.Text = "Connect";
+ this.connectButton.UseVisualStyleBackColor = true;
+ this.connectButton.Click += new System.EventHandler(this.connectButton_Click);
+ //
+ // Form1
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(800, 450);
+ this.Controls.Add(this.connectButton);
+ this.Controls.Add(this.serverListView);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.goButton);
+ this.Controls.Add(this.workspaceListView);
+ this.Name = "Form1";
+ this.Text = "Form1";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ListView workspaceListView;
+ private System.Windows.Forms.Button goButton;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.ListView serverListView;
+ private System.Windows.Forms.ColumnHeader cueNumberHeader;
+ private System.Windows.Forms.ColumnHeader columnHeader2;
+ private System.Windows.Forms.ColumnHeader columnHeader3;
+ private System.Windows.Forms.Button connectButton;
+ private System.Windows.Forms.ColumnHeader columnHeader4;
+ private System.Windows.Forms.ColumnHeader cueNameHeader;
+ }
+}
+
diff --git a/QSharpDemoApp/Form1.cs b/QSharpDemoApp/Form1.cs
new file mode 100644
index 0000000..634a39a
--- /dev/null
+++ b/QSharpDemoApp/Form1.cs
@@ -0,0 +1,140 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Windows.Forms.VisualStyles;
+using QSharp;
+using Serilog;
+
+namespace QSharpDemoApp
+{
+ public partial class Form1 : Form
+ {
+ QBrowser browser;
+ QWorkspace connectedWorkspace;
+ public Form1()
+ {
+ InitializeComponent();
+ browser = new QBrowser();
+ browser.ServerFound += Browser_ServerFound;
+ }
+
+ private void Browser_ServerFound(object source, QServerFoundArgs args)
+ {
+ Log.Debug(args.server.name);
+ args.server.ServerUpdated += Server_ServerUpdated;
+ args.server.refreshWorkspaces();
+
+ }
+
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ Log.Logger = new LoggerConfiguration().WriteTo.Console().MinimumLevel.Debug().CreateLogger();
+ }
+
+
+ private void Form1_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ browser.Close();
+ }
+
+ private void connectButton_Click(object sender, EventArgs e)
+ {
+ if(serverListView.SelectedItems.Count == 1)
+ {
+
+ QServer server = browser.serverForAddress(serverListView.SelectedItems[0].SubItems[3].Text);
+ string workspaceID = serverListView.SelectedItems[0].SubItems[2].Text;
+ if (server != null)
+ {
+ connectedWorkspace = server.workspaceWithID(workspaceID);
+ if(connectedWorkspace != null)
+ {
+ connectedWorkspace.WorkspaceUpdated += Workspace_WorkspaceUpdated;
+ connectedWorkspace.connectWithPasscode("");
+ }
+ }
+ }
+ }
+
+ private void Server_ServerUpdated(object source, QServerUpdatedArgs args)
+ {
+ QServer server = args.server;
+
+ if (server.workspaces.Count > 0)
+ {
+ Log.Debug($"[demo] server has more than one workspace so adding as a group");
+
+ if (serverListView.InvokeRequired)
+ {
+ serverListView.Invoke((MethodInvoker)delegate () {
+ ListViewGroup serverGroup = new ListViewGroup(server.name.ToUpper());
+ serverListView.Groups.Add(serverGroup);
+ foreach(var workspace in server.workspaces)
+ {
+ ListViewItem workspaceItem = new ListViewItem(new[] { workspace.nameWithoutPathExtension, workspace.version, workspace.uniqueID, server.host }, serverGroup) ;
+ serverListView.Items.Add(workspaceItem);
+ }
+ });
+ }
+ }
+ }
+
+ private void reloadListView()
+ {
+ if (workspaceListView.InvokeRequired)
+ {
+ workspaceListView.Invoke((MethodInvoker)delegate () {
+
+ workspaceListView.Items.Clear();
+
+ foreach(var cueList in connectedWorkspace.cueLists)
+ {
+ addCueToListView(cueList);
+ }
+
+ workspaceListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
+ workspaceListView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
+
+ });
+ }
+ }
+
+ public void addCueToListView(QCue cue)
+ {
+
+ if (cue.IsGroup)
+ {
+ ListViewGroup cueGroup = new ListViewGroup(cue.displayName);
+ workspaceListView.Groups.Add(cueGroup);
+ foreach(var aCue in cue.cues)
+ {
+ ListViewItem cueItem = new ListViewItem(new[] { aCue.number, aCue.listName, aCue.uid }, cueGroup);
+ cueItem.BackColor = ColorTranslator.FromHtml($"#{aCue.color.lightHex}");
+ workspaceListView.Items.Add(cueItem);
+ }
+ }
+ }
+
+ private void Workspace_WorkspaceUpdated(object source, QWorkspaceUpdatedArgs args)
+ {
+ Log.Debug("[demo] workspace has been updated");
+ if(connectedWorkspace.firstCueList != null)
+ {
+ reloadListView();
+ }
+ }
+
+ private void goButton_Click(object sender, EventArgs e)
+ {
+ if (connectedWorkspace != null)
+ connectedWorkspace.go();
+ }
+ }
+}
diff --git a/QSharpDemoApp/Form1.resx b/QSharpDemoApp/Form1.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/QSharpDemoApp/Form1.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/QSharpDemoApp/Program.cs b/QSharpDemoApp/Program.cs
new file mode 100644
index 0000000..1891093
--- /dev/null
+++ b/QSharpDemoApp/Program.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace QSharpDemoApp
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetHighDpiMode(HighDpiMode.SystemAware);
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Form1());
+ }
+ }
+}
diff --git a/QSharpDemoApp/QSharpDemoApp.csproj b/QSharpDemoApp/QSharpDemoApp.csproj
new file mode 100644
index 0000000..ca56657
--- /dev/null
+++ b/QSharpDemoApp/QSharpDemoApp.csproj
@@ -0,0 +1,18 @@
+
+
+
+ Exe
+ netcoreapp3.1
+ true
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file