10 Commits

Author SHA1 Message Date
jwetzell bd099a2162 Bump version number 2021-07-28 08:32:03 -05:00
jwetzell effd9d3f92 Add Connection Error call for client not connected 2021-07-28 08:30:50 -05:00
jwetzell e7f60ba782 Add Group Cue class. Closes #19 2021-07-18 11:40:29 -05:00
jwetzell cd6115bfbc Add Network Cue class. Closes #12 2021-07-17 20:33:27 -05:00
jwetzell e455b42b72 Add Network Cue class. Closes #6. 2021-07-17 20:10:28 -05:00
jwetzell 6f683ba6e8 Update dependencies 2021-07-17 08:23:58 -05:00
jwetzell 3656a9f9b7 Add QMicCue class. Closes #10 2021-07-16 14:10:09 +00:00
jwetzell c750297cf5 Start work on adding missing OSC Methods 2021-07-15 22:36:30 -05:00
jwetzell b639dc401f Only publish on release 2021-07-14 09:54:03 -05:00
jwetzell 96adbadbd7 * QCue.cs: Add child cue sorting
* QControlKit.csproj: Update Versions

* QMessage.cs:
* QWorkspace.cs:
* CueListPage.xaml.cs: Cleanup TODO's and Logging
2021-06-20 18:50:39 -05:00
19 changed files with 874 additions and 102 deletions
+3 -3
View File
@@ -1,8 +1,8 @@
name: Publish to NuGet
on:
push:
branches:
- master # Default release branch
release:
types:
- created # When a release is made
jobs:
publish:
name: build, pack & publish
+389 -55
View File
@@ -11,6 +11,7 @@
public const string Cue = "Cue";
public const string CueList = "Cue List";
public const string Cart = "Cart";
public const string CueCart = "Cue Cart";
public const string Group = "Group";
public const string Audio = "";
public const string Mic = "Mic";
@@ -46,73 +47,231 @@
public static class QOSCKey
{
public const string UID = "uniqueID";
public const string Type = "type";
public const string Parent = "parent";
public const string Name = "name";
public const string Number = "number";
public const string Notes = "notes";
public const string FileTarget = "fileTarget";
public const string CueTargetNumber = "cueTargetNumber";
public const string CurrentCueTarget = "currentCueTarget";
public const string ColorName = "colorName";
public const string Flagged = "flagged";
public const string ActionElapsed = "actionElapsed";
public const string AllowsEditingDuration = "allowsEditingDuration";
public const string Armed = "armed";
public const string AutoLoad = "autoLoad"; //implement on QCue
public const string CartPosition = "cartPosition";
public const string ColorName = "colorName";
public const string Cues = "cues";
public const string CueTargetNumber = "cueTargetNumber";
public const string CueTargetId = "cueTargetId"; //implement on QCue
public const string CurrentCueTarget = "currentCueTarget";
public const string CurrentFileTime = "currentFileTime"; //implement on QCue
public const string ContinueMode = "continueMode";
public const string CurrentDuration = "currentDuration";
public const string DefaultName = "defaultName"; //implement on QCue
public const string DisplayName = "displayName"; //implement on QCue
public const string DuckLevel = "duckLevel"; //implement on QCue
public const string DuckOthers = "duckOthers"; //implement on QCue
public const string DuckTime = "duckTime"; //implement on QCue
public const string FileTarget = "fileTarget";
public const string Flagged = "flagged";
public const string FadeAndStopOthers = "fadeAndStopOthers"; //implement on QCue
public const string FadeAndStopOthersTime = "fadeAndStopOthersTime"; //implement on QCue
public const string HasFileTargets = "hasFileTargets";
public const string HasCueTargets = "hasCueTargets";
public const string IsActionRunning = "isActionRunning"; //implement on QCue
public const string IsBroken = "isBroken";
public const string IsLoaded = "isLoaded";
public const string IsOverridden = "isOverridden";
public const string IsPanicking = "isPanicking";
public const string IsPaused = "isPaused";
public const string IsRunning = "isRunning";
public const string IsTailingOut = "isTailingOut";
public const string ListName = "listName";
public const string LoadAt = "loadAt"; //implement on QCue
public const string LoadActionAt = "loadActionAt"; //implement on QCue
public const string MaxTimeInCueSequence = "maxTimeInCueSequence"; //implement on QCue
public const string Name = "name";
public const string Notes = "notes";
public const string Number = "number";
public const string PanicInTime = "panicInTime"; //implement on QCue
public const string PreWait = "preWait";
public const string PostWait = "postWait";
public const string CurrentDuration = "currentDuration";
public const string PercentPreWaitElapsed = "percentPreWaitElapsed";
public const string PercentPostWaitElapsed = "percentPostWaitElapsed";
public const string PercentActionElapsed = "percentActionElapsed";
public const string PreWaitElapsed = "preWaitElapsed";
public const string Parent = "parent";
public const string PostWaitElapsed = "postWaitElapsed";
public const string ActionElapsed = "actionElapsed";
public const string GroupMode = "mode";
public const string CartPosition = "cartPosition";
public const string CartRows = "cartRows";
public const string CartColumns = "cartColumns";
public const string HasFileTargets = "hasFileTargets";
public const string HasCueTargets = "hasCueTargets";
public const string AllowsEditingDuration = "allowsEditingDuration";
public const string IsPanicking = "isPanicking";
public const string IsTailingOut = "isTailingOut";
public const string IsRunning = "isRunning";
public const string IsLoaded = "isLoaded";
public const string IsPaused = "isPaused";
public const string IsBroken = "isBroken";
public const string IsOverridden = "isOverridden";
public const string TranslationX = "translationX";
public const string TranslationY = "translationY";
public const string ScaleX = "scaleX";
public const string ScaleY = "scaleY";
public const string OriginX = "originX";
public const string OriginY = "originY";
public const string Quaternion = "quaternion";
public const string SurfaceSize = "surfaceSize";
public const string CueSize = "cueSize";
public const string PreserveAspectRatio = "preserveAspectRatio";
public const string Layer = "layer";
public const string Patch = "patch";
public const string PatchList = "patchList";
public const string SurfaceList = "surfaceList";
public const string Cues = "cues";
public const string Children = "children";
public const string ListName = "listName";
public const string SurfaceID = "surfaceID";
public const string FullSurface = "fullSurface";
public const string Opacity = "opacity";
public const string RotationZ = "rotationZ";
public const string RotationY = "rotationY";
public const string RotationX = "rotationX";
public const string PlaybackPositionId = "playbackPositionId";
public const string StartNextCueWhenSliceEnds = "startNextCueWhenSliceEnds";
public const string StopTargetWhenSliceEnds = "stopTargetWhenSliceEnds";
public const string SliderLevel = "sliderLevel";
public const string SecondTriggerAction = "secondTriggerAction"; //implement on QCue
public const string SecondTriggerOnRelease = "secondTriggerOnRelease"; //implement on QCue
public const string SoloCueInTime = "soloCueInTime"; //implement on QCue
public const string TempCueTargetNumber = "tempCueTargetNumber"; //implement on QCue
public const string TempCueTargetId = "tempCueTargetId"; //implement on QCue
public const string TempDuration = "tempDuration"; //implement on QCue
public const string Type = "type";
public const string UID = "uniqueID";
public const string UniqueID = "uniqueID";
public const string ValuesForKeys = "valuesForKeys";
public const string ValuesForKeysWithArguments = "valuesForKeysWithArguments";
//Group Cue Keys
public const string CartColumns = "cartColumns";
public const string CartRows = "cartRows";
public const string Children = "children";
public const string Go = "go";
public const string Mode = "mode";
public const string MoveCartCue = "moveCartCue";
public const string PlaybackPositionId = "playbackPositionId";
public const string PlaybackPosition = "playbackPosition"; //Implement on Group Cue
public const string PlayheadId = "playheadId"; //Implement on Group Cue
public const string Playhead = "playhead"; //Implement on Group Cue
//Audio Cue Keys
public const string DoFade = "doFade"; //Implement on Audio Cue and Video Cue
public const string DoPitchShift = "doPitchShift"; //Implement on Audio Cue and Video Cue
public const string EndTime = "endTime"; //Implement on Audio Cue and Video Cue
public const string Gang = "gang"; //Implement on Audio Cue and Video Cue
public const string InfiniteLoop = "infiniteLoop"; //Implement on Audio Cue and Video Cue
public const string Level = "level"; //Implement on Audio Cue and Video Cue
public const string Levels = "levels"; //Implement on Audio Cue and Video Cue
public const string LiveAverageLevel = "liveAverageLevel"; //Implement on Audio Cue and Video Cue
public const string LockFadeToCue = "lockFadeToCue"; //Implement on Audio Cue and Video Cue
public const string NumChannelsIn = "numChannelsIn"; //Implement on Audio Cue and Video Cue
public const string PatchList = "patchList"; //Implement on Audio Cue and Video Cue
public const string PlayCount = "playCount"; //Implement on Audio Cue and Video Cue
public const string LiveRate = "liveRate"; //Implement on Audio Cue and Video Cue
public const string SliceMarkers = "sliceMarkers"; //Implement on Audio Cue and Video Cue
public const string SliceMarker = "sliceMarker"; //Implement on Audio Cue and Video Cue
public const string Time = "time"; //Implement on Audio Cue related to slicemarker and Video Cue
public const string LastSlicePlayCount = "lastSlicePlayCount"; //Implement on Audio Cue and Video Cue
public const string LastSliceInfiniteLoop = "lastSliceInfiniteLoop"; //Implement on Audio Cue and Video Cue
public const string SliderLevel = "sliderLevel"; // Implement on Video Cue
public const string SliderLevels = "sliderLevels"; //Implement on Audio Cue and Video Cue
public const string StartTime = "startTime"; // Implement on Audio Cue and Video Cue
//Mic Cue Keys
public const string ChannelOffset = "channelOffset"; //Implement on Mic Cue
public const string Channels = "channels"; //Implement on Mic Cue
//Video Cue Keys
public const string CueSize = "cueSize"; //Implement on Video Cue
public const string DoEffect = "doEffect"; //Implement on Video Cue
public const string EffectIndex = "effectIndex"; //Implement on Video Cue
public const string EffectSet = "effectSet"; //Implement on Video Cue
public const string liveEffectSet = "liveEffectSet"; //Implement on Video Cue
public const string FullSurface = "fullSurface"; //Implement on Video Cue
public const string HoldLastFrame = "holdLastFrame"; //Implement on Video Cue
public const string Layer = "layer"; //Implement on Video Cue
public const string Opacity = "opacity"; //Implement on Video Cue
public const string OriginX = "originX"; //Implement on Video Cue
public const string OriginY = "originY"; //Implement on Video Cue
public const string Origin = "origin"; //Implement on Video Cue
public const string PreserveAspectRatio = "preserveAspectRatio"; //Implement on Video Cue
public const string Quaternion = "quaternion"; //Implement on Video Cue
public const string RotateZ = "rotateZ"; //Implement on Video Cue
public const string RotateY = "rotateY"; //Implement on Video Cue
public const string RotateX = "rotateX"; //Implement on Video Cue
public const string LiveRotation = "liveRotation"; //Implement on Video Cue
public const string XAxis = "Xaxis"; //Implement on Video Cue
public const string YAxis = "Yaxis"; //Implement on Video Cue
public const string ZAxis = "Zaxis"; //Implement on Video Cue
public const string X = "x"; //Implement on Video Cue
public const string Y = "y"; //Implement on Video Cue
public const string Z = "z"; //Implement on Video Cue
public const string ScaleX = "scaleX"; //Implement on Video Cue
public const string LiveScaleX = "liveScaleX"; //Implement on Video Cue
public const string ScaleY = "scaleY"; //Implement on Video Cue
public const string LiveScaleY = "liveScaleY"; //Implement on Video Cue
public const string Scale = "scale"; //Implement on Video Cue
public const string LiveScale = "liveScale"; //Implement on Video Cue
public const string SurfaceID = "surfaceID"; //Implement on Video Cue
public const string SurfaceList = "surfaceList"; //Implement on Video Cue
public const string SurfaceName = "surfaceName"; //Implement on Video Cue
public const string SurfaceSize = "surfaceSize"; //Implement on Video Cue
public const string TranslationX = "translationX";
public const string LiveTranslationX = "liveTranslationX"; //Implement on Video Cue
public const string TranslationY = "translationY";
public const string LiveTranslationY = "liveTranslationY"; //Implement on Video Cue
public const string Translation = "translation"; //Implement on Video Cue
public const string LiveTranslation = "liveTranslation"; //Implement on Video Cue
//Camera Cue Keys (Extension of Video Cue
public const string CameraPatch = "cameraPatch";
//Text Cue Keys
public const string FixedWidth = "fixedWidth"; //Implement on Text Cue
public const string Text = "text"; //Implement on Text Cue
public const string LiveText = "liveText"; //Implement on Text Cue
public const string Format = "format"; //Implement on Text Cue
public const string Alignment = "alignment"; //Implement on Text Cue
public const string FontFamily = "fontFamily"; //Implement on Text Cue
public const string FontStyle = "fontStyle"; //Implement on Text Cue
public const string FontFamilyAndStyle = "fontFamilyAndStyle"; //Implement on Text Cue
public const string FontName = "fontName"; //Implement on Text Cue
public const string FontSize = "fontSize"; //Implement on Text Cue
public const string LineSpacing = "lineSpacing"; //Implement on Text Cue
public const string Color = "color"; //Implement on Text Cue
public const string BackgroundColor = "backgroundColor"; //Implement on Text Cue
public const string StrikethroughColor = "strikethroughColor"; //Implement on Text Cue
public const string UnderlineColor = "underlineColor"; //Implement on Text Cue
public const string StrikethroughStyle = "strikethroughStyle"; //Implement on Text Cue
public const string UnderlineStyle = "underlineStyle"; //Implement on Text Cue
public const string OutputSize = "outputSize"; //Implement on Text Cue
//Light Cue Keys
public const string AlwaysCollate = "alwaysCollate";
public const string CollateAndStart = "collateAndStart";
public const string LightCommandText = "lightCommandText";
public const string Prune = "prune";
public const string PruneCommands = "pruneCommands";
public const string RemoveLightCommandsMatching = "removeLightCommandsMatching";
public const string ReplaceLightCommand = "replaceLightCommand";
public const string SafeSort = "safeSort";
public const string SafeSortCommands = "safeSortCommands";
public const string SetLight = "setLight";
public const string UpdateLightCommand = "updateLightCommand";
//Fade Cue Keys
//Network Cue Keys
public const string CustomString = "customString";
public const string MessageType = "messageType";
public const string QLabCommand = "qlabCommand";
public const string QLabCueNumber = "qlabCueNumber";
public const string QLabCueParameters = "qlabCueParameters";
public const string RawString = "rawString";
public const string UdpString = "udpString";
//MIDI Cue Keys
//Midi File Cue Keys
public const string Patch = "patch"; //Implement on Audio Cue and Video Cue and Network Cue
public const string Rate = "rate"; //Implement on Audio Cue and Video Cue
//Devamp Cue Keys
public const string startNextCueWhenSliceEnds = "startNextCueWhenSliceEnds";
public const string stopTargetWhenSliceEnds = "stopTargetWhenSliceEnds";
//Script Cue Keys
public const string ScriptSource = "scriptSource";
// v3
public const string Duration = "duration";
public const string FullScreen = "fullScreen";
public const string FullScreen = "fullScreen"; //Implement on Video Cue
}
public static class QIdentifiers
@@ -143,16 +302,191 @@
public const string Default = "default"; //is this even an option?
}
enum QFadeMode
public enum QTriggerAction
{
Nothing = 0,
Panics = 1,
Stops = 2,
Hard_Stops = 3,
Hard_Stops_And_Restarts = 4
}
public enum QFadeMode
{
Absolute = 0,
Relative = 1
}
enum QContinueMode
public enum QContinueMode
{
NoContinue = 0,
AutoContinue = 1,
AutoFollow = 2
}
public enum QMSCCommand
{
GO = 1,
STOP = 2,
RESUME = 3,
TIMED_GO = 4,
LOAD = 5,
SET = 6,
FIRE = 7,
ALL_OFF =8,
RESTORE = 9,
RESET = 10,
GO_OFF = 11,
GO_OR_JAM_CLOCK = 16,
STANDBY_PLUSS = 17,
STANDBY_MINUS = 18,
SEQUENCE_PLUS = 19,
SEQUENCE_MINUS = 20,
START_CLOCK = 21,
STOP_CLOCK = 22,
ZERO_CLOCK = 23,
SET_CLOCK = 24,
MTC_CHASE_ON = 25,
MTC_CHASE_OFF = 26,
OPEN_CUE_LIST = 27,
CLOSE_CUE_LIST = 28,
OPEN_CUE_PATH = 29,
CLOSE_CUE_PATH = 30,
}
public enum QMSCCommandFormat
{
All_Types = 127,
Lighting_General = 1,
Moving_Lights = 2,
Color_Changers = 3,
Strobes = 4,
Lasers = 5,
Chasers = 6,
Sound_General = 16,
Music = 17,
CD_Players = 18,
EPROM_Playback = 19,
Audio_Tape_Machines = 20,
Intercoms = 21,
Amplifiers = 22,
Audio_Effects_Devices = 23,
Equalizers = 24,
Machinery_General = 32,
Rigging = 33,
Flys = 34,
Lifts = 35,
Turntables = 36,
Trusses = 37,
Robots = 38,
Animation = 39,
Floats = 40,
Breakaways = 41,
Barges = 42,
Video_General = 48,
Video_Tape_Machines = 49,
Video_Cassette_Machines = 50,
Video_Disc_Players = 51,
Video_Switchers = 52,
Video_Effects = 53,
Video_Character_Generators = 54,
Video_Still_Stores = 55,
Video_Monitors = 56,
Projection_General = 64,
Film_Projectors = 65,
Slide_Projectors = 66,
Video_Projectors = 67,
Dissolvers = 68,
Shutter_Controls = 69,
Process_Control_General = 80,
Hydraulic_Oil = 81,
H2O = 82,
CO2 = 83,
Compressed_Air = 84,
Natural_Gas = 85,
Fog = 86,
Smoke = 87,
Cracked_Haze = 88,
Pyrotechnics_General = 96,
Fireworks = 97,
Explosions = 98,
Flame = 99,
Smoke_Pots = 100
}
public enum QNetworkMessageType
{
QLAB = 1,
OSC = 2,
UDP = 3
}
public enum QNetworkQLabCommand
{
start = 1,
stop = 2,
hardStop = 3,
pause = 4,
resume = 5,
togglePause = 6,
load = 7,
preview = 8,
reset = 9,
panic = 10,
number = 11,
name = 12,
notes = 13,
cueTargetNumber = 14,
preWait = 15,
duration = 16,
postWait = 17,
continueMode = 18,
flagged = 19,
armed = 20,
colorName = 21
}
public enum QRotationType
{
THREE_D = 0,
X = 1,
Y = 2,
Z = 3
}
public enum QVideoEffect
{
Color_Controls = 1,
Exposure = 2,
Gamma = 3,
Sepia_Monochrome = 4,
Min_Max_Invert = 5,
White_point = 6,
Box_Disc_Gaussian_Blurs = 7,
Motion_Blur = 8,
Sharpen_Luminance = 9,
Unsharp_Mask = 10,
Zoom_Blur = 11,
Pixellation = 12,
Screen = 13,
Bloom_and_Gloom = 14,
CMYK_Halftone = 15,
Color_Posterize = 16,
Crystallize_and_Pointillize = 17,
Edge_Work = 18,
Kaleidoscope = 1,
Median_and_Comic_Effect = 19,
Noise_Reduction = 20,
Circle_Splash_Hole_Distortion = 21,
Pinch_Bump_Distortion = 22,
Torus_Lens_Distortion = 23,
Twirl_Circular_Wrap_Vortex = 24,
Glass_Lozenge = 25,
Op_Tile = 26,
Perspective_Tile = 27,
Quad_Tiles = 28,
Reflected_Tiles = 29,
Rotated_Tiles = 30,
Titles = 31
}
}
+31
View File
@@ -0,0 +1,31 @@
using QControlKit.Constants;
namespace QControlKit.Cue
{
public class QDevampCue : QCue
{
public bool startNextCueWhenSliceEnds
{
get
{
return (bool)propertyForKey(QOSCKey.startNextCueWhenSliceEnds);
}
set
{
setProperty(value, QOSCKey.startNextCueWhenSliceEnds);
}
}
public bool stopTargetWhenSliceEnds
{
get
{
return (bool)propertyForKey(QOSCKey.stopTargetWhenSliceEnds);
}
set
{
setProperty(value, QOSCKey.stopTargetWhenSliceEnds);
}
}
}
}
+117
View File
@@ -0,0 +1,117 @@
using System;
using System.Collections.Generic;
using QControlKit.Constants;
namespace QControlKit.Cue
{
public class QGroupCue : QCue
{
public int cartColumns
{
get
{
return (int)propertyForKey(QOSCKey.CartColumns);
}
set
{
setProperty(value, QOSCKey.CartColumns);
}
}
public int cartRows
{
get
{
return (int)propertyForKey(QOSCKey.CartRows);
}
set
{
setProperty(value, QOSCKey.CartRows);
}
}
public List<QCue> children
{
get
{
return cues;
}
}
public void go()
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.Go}");
}
public int mode
{
get
{
return (int)propertyForKey(QOSCKey.Mode);
}
set
{
if(value > 0 && value < 5)
{
setProperty(value, QOSCKey.Mode);
}
}
}
public void moveCartCue(QCue cart, int row, int column)
{
if(cart.type.Equals(QCueType.CueCart) || cart.type.Equals(QCueType.Cart))
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.MoveCartCue}/{cart.uid}", row, column);
}
}
public string playhead
{
get
{
return propertyForKey(QOSCKey.Playhead).ToString();
}
set
{
setProperty(value, QOSCKey.Playhead);
}
}
public string playheadId
{
get
{
return propertyForKey(QOSCKey.PlayheadId).ToString();
}
set
{
setProperty(value, QOSCKey.PlayheadId);
}
}
public string playbackPosition
{
get
{
return propertyForKey(QOSCKey.PlaybackPosition).ToString();
}
set
{
setProperty(value, QOSCKey.PlaybackPosition);
}
}
public string playbackPositionId
{
get
{
return propertyForKey(QOSCKey.PlaybackPositionId).ToString();
}
set
{
setProperty(value, QOSCKey.PlaybackPositionId);
}
}
}
}
+91
View File
@@ -0,0 +1,91 @@
using QControlKit.Constants;
namespace QControlKit.Cue
{
public class QLightCue : QCue
{
public bool alwaysCollate
{
get
{
return (bool)propertyForKey(QOSCKey.AlwaysCollate);
}
set
{
setProperty(value, QOSCKey.AlwaysCollate);
}
}
public string lightCommandText
{
get
{
return propertyForKey(QOSCKey.LightCommandText).ToString();
}
set
{
setProperty(value, QOSCKey.LightCommandText);
}
}
public void collateAndStart()
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.CollateAndStart}");
}
public void prune()
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.Prune}");
}
public void pruneCommands()
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.PruneCommands}");
}
public void removeLightCommandsMatching(string match)
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.RemoveLightCommandsMatching}", match);
}
public void replaceLightCommand(string oldCommand, string newCommand)
{
if(this.workspace.versionParts[0] == "4" && int.Parse(this.workspace.versionParts[1]) >= 4)
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.ReplaceLightCommand}", oldCommand, newCommand);
}
else
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.UpdateLightCommand}", oldCommand, newCommand);
}
}
public void safeSort()
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.SafeSort}");
}
public void safeSortCommands()
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.SafeSortCommands}");
}
public void setLight(string light, object setting)
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.SetLight}", light, setting);
}
public void updateLightCommand(string oldCommand, string newCommand)
{
if (int.Parse(this.workspace.versionParts[0]) >= 4 && int.Parse(this.workspace.versionParts[1]) >= 4)
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.ReplaceLightCommand}", oldCommand, newCommand);
}
else
{
workspace.sendMessage($"/cue_id/{this.uid}/{QOSCKey.UpdateLightCommand}", oldCommand, newCommand);
}
}
}
}
+37
View File
@@ -0,0 +1,37 @@
using QControlKit.Constants;
namespace QControlKit.Cue
{
public class QMicCue : QCue
{
public int channelOffset
{
get
{
return (int)propertyForKey(QOSCKey.ChannelOffset);
}
}
public int channels
{
get
{
return (int)propertyForKey(QOSCKey.Channels);
}
set
{
setProperty(value, QOSCKey.Channels);
}
}
public void setDefaultLevels()
{
workspace.sendMessage($"/cue_id/{this.uid}/setDefaultLevels");
}
public void setSilientLevels()
{
workspace.sendMessage($"/cue_id/{this.uid}/setSilentLevels");
}
}
}
+31
View File
@@ -0,0 +1,31 @@
using QControlKit.Constants;
namespace QControlKit.Cue
{
public class QMidiFileCue :QCue
{
public bool patch
{
get
{
return (bool)propertyForKey(QOSCKey.Patch);
}
set
{
setProperty(value, QOSCKey.Patch);
}
}
public bool rate
{
get
{
return (bool)propertyForKey(QOSCKey.Rate);
}
set
{
setProperty(value, QOSCKey.Rate);
}
}
}
}
+104
View File
@@ -0,0 +1,104 @@
using QControlKit.Constants;
namespace QControlKit.Cue
{
public class QNetworkCue : QCue
{
public string customString
{
get
{
return propertyForKey(QOSCKey.CustomString).ToString();
}
set
{
setProperty(value, QOSCKey.CustomString);
}
}
public QNetworkMessageType messageType
{
get
{
return (QNetworkMessageType)propertyForKey(QOSCKey.MessageType);
}
set
{
setProperty(value, QOSCKey.MessageType);
}
}
public QNetworkQLabCommand qlabCommand
{
get
{
return (QNetworkQLabCommand)propertyForKey(QOSCKey.QLabCommand);
}
set
{
setProperty(value, QOSCKey.QLabCommand);
}
}
public int patch
{
get
{
return (int)propertyForKey(QOSCKey.Patch);
}
set
{
setProperty(value, QOSCKey.Patch);
}
}
public string qlabCueNumber
{
get
{
return propertyForKey(QOSCKey.QLabCueNumber).ToString();
}
set
{
setProperty(value, QOSCKey.QLabCueNumber);
}
}
public string qlabCueParameters
{
get
{
return propertyForKey(QOSCKey.QLabCueParameters).ToString();
}
set
{
setProperty(value, QOSCKey.QLabCueParameters);
}
}
public string rawString
{
get
{
return propertyForKey(QOSCKey.RawString).ToString();
}
set
{
setProperty(value, QOSCKey.RawString);
}
}
public string udpString
{
get
{
return propertyForKey(QOSCKey.UdpString).ToString();
}
set
{
setProperty(value, QOSCKey.UdpString);
}
}
}
}
+20
View File
@@ -0,0 +1,20 @@
using QControlKit.Constants;
namespace QControlKit.Cue
{
public class QScriptCue : QCue
{
public string scriptSource
{
get
{
return propertyForKey(QOSCKey.ScriptSource).ToString();
}
}
public void compileSource()
{
workspace.sendMessage($"/cue_id/{this.uid}/compileSource");
}
}
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>AnyCPU</LastUsedPlatform>
<publishUrl>bin/Release/netstandard2.0/publish</publishUrl>
<DeleteExistingFiles>false</DeleteExistingFiles>
<TargetFramework>netstandard2.0</TargetFramework>
<SelfContained>false</SelfContained>
<_IsPortable>true</_IsPortable>
</PropertyGroup>
</Project>
+6 -2
View File
@@ -6,7 +6,7 @@
<Authors>Joel Wetzell</Authors>
<Version>1.0.0-devel</Version>
<PackOnBuild>true</PackOnBuild>
<PackageVersion>0.0.17</PackageVersion>
<PackageVersion>0.0.19</PackageVersion>
<PackageId>QControlKit</PackageId>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<Summary>Unofficial C# port of Figure53's QLabKit.objc</Summary>
@@ -17,9 +17,13 @@
<ItemGroup>
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Zeroconf" Version="3.4.2" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>
<Folder Include="Constants\" />
<Folder Include="Cue\" />
</ItemGroup>
<ItemGroup>
<None Remove="Cue\" />
</ItemGroup>
</Project>
+3 -4
View File
@@ -186,7 +186,7 @@ namespace QControlKit
childCues.Add(cue);
childCuesUIDMap.Add(uid, cue);
//some sorting of the childCues needs to be done? //TODO
//reset sorting index
//reset sorting index?
}
public void removeChildCue(QCue cue) {
@@ -730,7 +730,8 @@ namespace QControlKit
if (needsSortChildCues)
{
//something about cues needing to be sorted?
childCues.Sort((q1, q2)=> q1.sortIndex.CompareTo(q2.sortIndex));
needsSortChildCues = false;
}
return needsNotifyCueUpdated;
@@ -873,8 +874,6 @@ namespace QControlKit
else
cueData.Remove(key);
//TODO: Cuelistchangedplaybackpositionid?
}
else
{
+4 -9
View File
@@ -129,19 +129,14 @@ namespace QControlKit
{
get
{
if (IsCueUpdate)
{
if (IsCueUpdate) {
return AddressParts[4];
}else if (IsPlaybackPositionUpdate)
{
} else if (IsPlaybackPositionUpdate) {
//TODO: check string cast
return arguments.Count > 0 ? (string)arguments[0] : null;
}else if (IsReplyFromCue)
{
} else if (IsReplyFromCue) {
return AddressParts[2];
}
else
{
} else {
return null;
}
}
+8 -16
View File
@@ -1,5 +1,4 @@
//TODO: workspace connection error handlers
using Newtonsoft.Json;
using Newtonsoft.Json;
using Serilog;
using System;
using System.Collections.Generic;
@@ -79,7 +78,7 @@ namespace QControlKit
client.CueUpdated += OnCueUpdated;
this.server = server;
Log.Debug($"[workspace] <{name}> on {server.name} initialized.");
Log.Debug($"[workspace] <{name}> on <{server.name}> initialized.");
}
//updateWithDictionary
@@ -160,7 +159,7 @@ namespace QControlKit
public List<QCue> cueLists { get { return root.cues; } }
public string fullNameWithCueList(QCue cueList) { return ""; }
//TODO other convenience methods
public string[] versionParts { get { return version.Split('.'); } }
public bool connectedToQLab3 { get { return versionParts[0] == "3"; } }
@@ -180,6 +179,7 @@ namespace QControlKit
if (!client.connect())
{
Log.Error($"[workspace] *** couldn't connect to server client is not connected.");
OnWorkspaceConnectionError(this, new QWorkspaceConnectionErrorArgs { status = "unreachable" });
return;
}
@@ -193,10 +193,9 @@ namespace QControlKit
private void finishConnection()
{
//TODO
connected = true;
startReceivingUpdates();
//fetchQLabVersion();
//fetchQLabVersion(); //this is not needed since the version is loaded from the workspace info call
fetchCueLists();
}
@@ -210,7 +209,6 @@ namespace QControlKit
else
connect();
//todo
}
public void disconnect()
@@ -225,9 +223,6 @@ namespace QControlKit
connected = false;
client.disconnect();
//TODO
//root.removeAllChildCues();
}
@@ -256,8 +251,8 @@ namespace QControlKit
public void stopReceivingUpdates() { client.sendMessage($"{workspacePrefix}/updates", 0); }
public void enableAlwaysReply() { client.sendMessage($"{workspacePrefix}/alwaysReply", 1); }
public void disableAlwaysReply() { client.sendMessage($"{workspacePrefix}/alwaysReply", 0); }
public void fetchQLabVersion() { client.sendMessage($"{workspacePrefix}/version"); } //TODO: EventHandler for this? Is this still needed?
public void fetchCueLists() { client.sendMessage($"{workspacePrefix}/cueLists"); } //TODO: EventHandler for CueListUpdated
public void fetchQLabVersion() { client.sendMessage($"{workspacePrefix}/version"); }
public void fetchCueLists() { client.sendMessage($"{workspacePrefix}/cueLists"); }
public void fetchPlaybackPositionForCue(QCue cue) { client.sendMessage(addressForCue(cue, QOSCKey.PlaybackPositionId)); } //EventHandler for this? can I use the CueListPlaybackPosition one?
public void go() { client.sendMessage($"{workspacePrefix}/go"); }
public void save() { client.sendMessage($"{workspacePrefix}/save"); }
@@ -356,8 +351,6 @@ namespace QControlKit
#endregion
#region Property Fetching
//TODO
public void fetchDefaultPropertiesForCue(QCue cue)
{
@@ -435,7 +428,7 @@ namespace QControlKit
}
else
{
Log.Error($"[workspace] *** Unable to connect to workspace: {name} on server: {server.name}");
Log.Error($"[workspace] *** Unable to connect to workspace: <{name}> on server: <{server.name}>");
}
WorkspaceConnectionError?.Invoke(this, new QWorkspaceConnectionErrorArgs { status = args.status });
@@ -536,7 +529,6 @@ namespace QControlKit
cueList.setProperty(args.cueID, QOSCKey.PlaybackPositionId, false);
}
//TODO: need to implement when playbackposition is "none"
Log.Debug($"[workspace] cue list <{args.cueListID}> playback position changed to <{args.cueID}>");
CueListChangedPlaybackPosition?.Invoke(this, new QCueListChangedPlaybackPositionArgs { cueListID = args.cueListID, cueID = args.cueID });
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.jwetzell.qcontrolkitxamdemo">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
<application android:label="QControlKitXamDemo.Android"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
@@ -16,7 +16,7 @@
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<TargetFrameworkVersion>v9.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
<AndroidEnableSGenConcurrent>true</AndroidEnableSGenConcurrent>
<AndroidUseAapt2>true</AndroidUseAapt2>
<AndroidHttpClientHandlerType>Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
@@ -32,6 +32,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidLinkMode>None</AndroidLinkMode>
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -56,8 +57,8 @@
<PackageReference Include="Serilog.Sinks.Xamarin">
<Version>0.2.0.64</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2012" />
<PackageReference Include="Xamarin.Essentials" Version="1.6.1" />
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2083" />
<PackageReference Include="Xamarin.Essentials" Version="1.7.0" />
</ItemGroup>
<ItemGroup>
<Compile Include="MainActivity.cs" />
@@ -130,8 +130,8 @@
<PackageReference Include="Serilog.Sinks.Xamarin">
<Version>0.2.0.64</Version>
</PackageReference>
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2012" />
<PackageReference Include="Xamarin.Essentials" Version="1.6.1" />
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2083" />
<PackageReference Include="Xamarin.Essentials" Version="1.7.0" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
<ItemGroup>
@@ -51,12 +51,15 @@ namespace QControlKitXamDemo
Device.BeginInvokeOnMainThread(() =>
{
QCue selectedCue = connectedWorkspace.cueWithID(args.cueID);
connectedWorkspace.fetchDefaultPropertiesForCue(selectedCue);
selectedCueGrid.BindingContext = new QCueViewModel(selectedCue, false);
if (cueGridDict.ContainsKey(args.cueID))
if(selectedCue != null) //TODO: I think this being null is the result of a race condition?
{
var cueGrid = cueGridDict[args.cueID]; //element to scroll to
cueListScrollView.ScrollToAsync(cueGrid, ScrollToPosition.Center, true);
connectedWorkspace.fetchDefaultPropertiesForCue(selectedCue);
selectedCueGrid.BindingContext = new QCueViewModel(selectedCue, false);
if (cueGridDict.ContainsKey(args.cueID))
{
var cueGrid = cueGridDict[args.cueID]; //element to scroll to
cueListScrollView.ScrollToAsync(cueGrid, ScrollToPosition.Center, true);
}
}
});
}
@@ -12,8 +12,8 @@
<ItemGroup>
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2012" />
<PackageReference Include="Xamarin.Essentials" Version="1.6.1" />
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2083" />
<PackageReference Include="Xamarin.Essentials" Version="1.7.0" />
</ItemGroup>
<ItemGroup>