recording improved

This commit is contained in:
Luis Fernando Molina committed 2020-02-18 16:24:36 +01:00
1 parent 2df3bceb1d
commit 1e9302df34
23 files changed
+250 -13

No files matched your search

+6 -3
View File
@@ -27,15 +27,18 @@ function newAnimation () {
let totalConsumption = 0
let totalCounter = 0
let pointerIcon
let videoRecorder
return thisObject
function finalize () {
thisObject.stop()
pointerIcon = undefined
videoRecorder = undefined
}
function initialize () {
videoRecorder = newVideoRecorder()
}
function start () {
@@ -137,7 +140,7 @@ function newAnimation () {
/* Media Recording */
if (areWeRecording === true) {
mediaRecorder.capture(browserCanvas)
videoRecorder.recordCanvas()
}
/* We request the next frame to be drawn, and stablishing a loop */
+50
View File
@@ -39,6 +39,7 @@ function newCanvas () {
bottomSpace: undefined,
designSpace: undefined,
animation: undefined,
mouse: undefined,
initialize: initialize,
finalize: finalize
}
@@ -49,6 +50,13 @@ function newCanvas () {
let lastContainerMouseOver
let lastShortcutKeyRejection
thisObject.mouse = {
position: {
x: 0,
y: 0
},
action: ''
}
return thisObject
function finalize () {
@@ -73,9 +81,12 @@ function newCanvas () {
browserCanvas.removeEventListener('drop', onDragDrop, false)
browserCanvas.removeEventListener('keydown', onKeyDown, false)
browserCanvas.removeEventListener('keyup', onKeyUp, false)
splashScreen = undefined
lastContainerMouseOver = undefined
hisObject.mouse = undefined
} catch (err) {
if (ERROR_LOG === true) { logger.write('[ERROR] finalize -> err = ' + err.stack) }
}
@@ -155,6 +166,7 @@ function newCanvas () {
/* Keyboard events */
window.addEventListener('keydown', onKeyDown, true)
window.addEventListener('keyup', onKeyUp, true)
/* Mouse Events */
browserCanvas.addEventListener('mousedown', onMouseDown, false)
@@ -228,7 +240,15 @@ function newCanvas () {
}
}
function onKeyUp (event) {
thisObject.mouse.event = event
thisObject.mouse.action = 'key up'
}
function onKeyDown (event) {
thisObject.mouse.event = event
thisObject.mouse.action = 'key down'
checkMediaRecording(event)
let nodeOnFocus = canvas.designSpace.workspace.getNodeThatIsOnFocus()
@@ -461,6 +481,20 @@ function newCanvas () {
function onMouseDown (event) {
try {
thisObject.mouse.event = event
thisObject.mouse.position.x = event.pageX
thisObject.mouse.position.y = event.pageY - CURRENT_TOP_MARGIN
switch (event.buttons) {
case 1: {
thisObject.mouse.action = 'clicking with left button'
break
}
case 2: {
thisObject.mouse.action = 'clicking with right button'
break
}
}
let point = event
point.x = event.pageX
point.y = event.pageY - CURRENT_TOP_MARGIN
@@ -571,6 +605,7 @@ function newCanvas () {
ignoreNextClick = false
return
}
let point = event
point.x = event.pageX
point.y = event.pageY - CURRENT_TOP_MARGIN
@@ -651,6 +686,11 @@ function newCanvas () {
function onMouseMove (event) {
try {
thisObject.mouse.event = event
thisObject.mouse.position.x = event.pageX
thisObject.mouse.position.y = event.pageY - CURRENT_TOP_MARGIN
thisObject.mouse.action = 'moving'
/* Processing the event */
let point = event
point.x = event.pageX
@@ -787,6 +827,11 @@ function newCanvas () {
function onMouseWheel (event) {
try {
thisObject.mouse.event = event
thisObject.mouse.position.x = event.pageX
thisObject.mouse.position.y = event.pageY - CURRENT_TOP_MARGIN
thisObject.mouse.action = 'wheel'
// cross-browser wheel delta
var event = window.event || event // old IE support
event.delta = Math.max(-1, Math.min(1, event.wheelDelta || -event.detail))
@@ -877,6 +922,11 @@ function newCanvas () {
function checkDrag (event) {
try {
if (containerDragStarted === true || floatingObjectDragStarted === true || viewPortBeingDragged === true) {
thisObject.mouse.event = event
thisObject.mouse.position.x = event.pageX
thisObject.mouse.position.y = event.pageY - CURRENT_TOP_MARGIN
thisObject.mouse.action = 'dragging'
browserCanvas.style.cursor = 'grabbing'
thisObject.eventHandler.raiseEvent('Dragging', undefined)
@@ -327,6 +327,7 @@ function newUiObjectConstructor () {
function setFloatingObjectBasicProperties (floatingObject, payload) {
const FRICTION = 0.95
const INITIAL_FRICTION = 0.97
const INITIAL_FONT_SIZE = 12
switch (payload.node.type) {
case 'Workspace': {
@@ -375,7 +376,7 @@ function newUiObjectConstructor () {
floatingObject.initializeMass(500)
floatingObject.initializeRadius(45)
floatingObject.initializeImageSize(80)
floatingObject.initializeFontSize(10)
floatingObject.initializeFontSize(INITIAL_FONT_SIZE)
floatingObject.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', 1)'
}
@@ -386,7 +387,7 @@ function newUiObjectConstructor () {
floatingObject.initializeMass(600)
floatingObject.initializeRadius(45)
floatingObject.initializeImageSize(80)
floatingObject.initializeFontSize(10)
floatingObject.initializeFontSize(INITIAL_FONT_SIZE)
floatingObject.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', 1)'
@@ -401,7 +402,7 @@ function newUiObjectConstructor () {
floatingObject.initializeMass(300)
floatingObject.initializeRadius(40)
floatingObject.initializeImageSize(70)
floatingObject.initializeFontSize(10)
floatingObject.initializeFontSize(INITIAL_FONT_SIZE)
floatingObject.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', 1)'
@@ -416,7 +417,7 @@ function newUiObjectConstructor () {
floatingObject.initializeMass(150)
floatingObject.initializeRadius(35)
floatingObject.initializeImageSize(60)
floatingObject.initializeFontSize(10)
floatingObject.initializeFontSize(INITIAL_FONT_SIZE)
floatingObject.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', 1)'
@@ -431,7 +432,7 @@ function newUiObjectConstructor () {
floatingObject.initializeMass(75)
floatingObject.initializeRadius(30)
floatingObject.initializeImageSize(50)
floatingObject.initializeFontSize(10)
floatingObject.initializeFontSize(INITIAL_FONT_SIZE)
floatingObject.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'
@@ -446,7 +447,7 @@ function newUiObjectConstructor () {
floatingObject.initializeMass(50)
floatingObject.initializeRadius(25)
floatingObject.initializeImageSize(40)
floatingObject.initializeFontSize(10)
floatingObject.initializeFontSize(INITIAL_FONT_SIZE)
floatingObject.fillStyle = 'rgba(' + UI_COLOR.RED + ', 1)'
}
@@ -457,7 +458,7 @@ function newUiObjectConstructor () {
floatingObject.initializeMass(25)
floatingObject.initializeRadius(20)
floatingObject.initializeImageSize(30)
floatingObject.initializeFontSize(10)
floatingObject.initializeFontSize(INITIAL_FONT_SIZE)
floatingObject.fillStyle = 'rgba(' + UI_COLOR.RED + ', 1)'
}
+1 -1
View File
@@ -273,7 +273,7 @@ function newUiObjectTitle () {
label = trimTitle(label)
labelPoint = {
x: 0,
x: 5,
y: thisObject.container.frame.height * 0.8
}
+15 -1
View File
@@ -251,7 +251,21 @@ function newDesignSpace () {
'toggle-auto-time-scale-auto-min',
'toggle-auto-time-scale-auto-max',
'toggle-auto-time-scale-auto-min-max',
'toggle-auto-time-scale-manual'
'toggle-auto-time-scale-manual',
'mouse-pointer',
'mouse-left-click',
'mouse-right-click',
'mouse-wheel-up',
'mouse-wheel-down',
'mouse-wheel-click',
'key-alt',
'key-shift',
'key-ctrl',
'hand-drag',
'key-down',
'key-left',
'key-right',
'key-up'
]
for (let i = 0; i < iconsNames.length; i++) {
+168
View File
@@ -0,0 +1,168 @@
function newVideoRecorder () {
let thisObject = {
recordCanvas: recordCanvas
}
let lastAction
return thisObject
function recordCanvas () {
{
const DISTANCE_BETWEEN_ICONS = 60
const ICON_SIZES = 50
let mousePointerIcon = canvas.designSpace.iconCollection.get('mouse-pointer')
let draggingIcon = canvas.designSpace.iconCollection.get('hand-drag')
let leftClickIcon = canvas.designSpace.iconCollection.get('mouse-left-click')
let rightClickIcon = canvas.designSpace.iconCollection.get('mouse-right-click')
let wheelClickIcon = canvas.designSpace.iconCollection.get('mouse-wheel-click')
let imagePosition
let buttonPressedIcon
if (canvas.mouse.action === 'key down' && lastAction === 'dragging') {
canvas.mouse.action = 'dragging'
}
switch (canvas.mouse.action) {
case 'moving': {
pointerIcon = mousePointerIcon
break
}
case 'dragging': {
pointerIcon = draggingIcon
break
}
case 'wheel': {
if (canvas.mouse.event.delta > 0) {
pointerIcon = canvas.designSpace.iconCollection.get('mouse-wheel-up')
} else {
pointerIcon = canvas.designSpace.iconCollection.get('mouse-wheel-down')
}
break
}
case 'key down': {
pointerIcon = mousePointerIcon
break
}
case 'key up': {
pointerIcon = mousePointerIcon
break
}
}
lastAction = canvas.mouse.action
imagePosition = {
x: canvas.mouse.position.x,
y: canvas.mouse.position.y
}
drawMousePointer(pointerIcon, imagePosition, ICON_SIZES)
switch (canvas.mouse.event.buttons) {
case 0: {
buttonPressedIcon = undefined
break
}
case 1: {
buttonPressedIcon = leftClickIcon
break
}
case 2: {
buttonPressedIcon = rightClickIcon
break
}
case 3: {
buttonPressedIcon = undefined
break
}
case 4: {
buttonPressedIcon = wheelClickIcon
break
}
}
imagePosition = {
x: canvas.mouse.position.x + DISTANCE_BETWEEN_ICONS,
y: canvas.mouse.position.y
}
drawMousePointer(buttonPressedIcon, imagePosition, ICON_SIZES)
if (canvas.mouse.event.shiftKey === true) {
let icon = canvas.designSpace.iconCollection.get('key-shift')
imagePosition = {
x: canvas.mouse.position.x - DISTANCE_BETWEEN_ICONS,
y: canvas.mouse.position.y - DISTANCE_BETWEEN_ICONS
}
drawMousePointer(icon, imagePosition, ICON_SIZES)
}
if (canvas.mouse.event.ctrlKey === true || canvas.mouse.event.metaKey === true) {
let icon = canvas.designSpace.iconCollection.get('key-ctrl')
imagePosition = {
x: canvas.mouse.position.x - DISTANCE_BETWEEN_ICONS,
y: canvas.mouse.position.y + DISTANCE_BETWEEN_ICONS
}
drawMousePointer(icon, imagePosition, ICON_SIZES)
}
if (canvas.mouse.event.altKey === true) {
let icon = canvas.designSpace.iconCollection.get('key-alt')
imagePosition = {
x: canvas.mouse.position.x - DISTANCE_BETWEEN_ICONS,
y: canvas.mouse.position.y - 0
}
drawMousePointer(icon, imagePosition, ICON_SIZES)
}
if (canvas.mouse.event.code === 'ArrowUp') {
let icon = canvas.designSpace.iconCollection.get('key-up')
imagePosition = {
x: canvas.mouse.position.x - 0,
y: canvas.mouse.position.y + DISTANCE_BETWEEN_ICONS
}
drawMousePointer(icon, imagePosition, ICON_SIZES)
}
if (canvas.mouse.event.code === 'ArrowDown') {
let icon = canvas.designSpace.iconCollection.get('key-down')
imagePosition = {
x: canvas.mouse.position.x - 0,
y: canvas.mouse.position.y + DISTANCE_BETWEEN_ICONS * 2
}
drawMousePointer(icon, imagePosition, ICON_SIZES)
}
if (canvas.mouse.event.code === 'ArrowLeft') {
let icon = canvas.designSpace.iconCollection.get('key-left')
imagePosition = {
x: canvas.mouse.position.x - DISTANCE_BETWEEN_ICONS,
y: canvas.mouse.position.y + DISTANCE_BETWEEN_ICONS * 2
}
drawMousePointer(icon, imagePosition, ICON_SIZES)
}
if (canvas.mouse.event.code === 'ArrowRight') {
let icon = canvas.designSpace.iconCollection.get('key-right')
imagePosition = {
x: canvas.mouse.position.x + DISTANCE_BETWEEN_ICONS,
y: canvas.mouse.position.y + DISTANCE_BETWEEN_ICONS * 2
}
drawMousePointer(icon, imagePosition, ICON_SIZES)
}
function drawMousePointer (icon, imagePosition, imageSize) {
if (icon !== undefined) {
if (icon.canDrawIcon === true) {
browserCanvasContext.drawImage(
icon, imagePosition.x,
imagePosition.y,
imageSize,
imageSize)
}
}
}
mediaRecorder.capture(browserCanvas)
}
}
}
+1 -1
View File
@@ -1 +1 @@
{"type":"Workspace","name":"My Workspace","rootNodes":[{"type":"Network","name":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","dataStorage":{"type":"Data Storage","name":"New Data Storage","sessionIndependentData":{"type":"Session Independent Data","name":"New Session Independent Data","singleMarketData":[{"type":"Single Market Data","name":"Poloniex BTC/USDT","dataProducts":[{"type":"Data Product","name":"Candles","id":"55e735a5-60c9-4e2d-a582-a6c6eddf3502","savedPayload":{"position":{"x":21875.142961213118,"y":29966.24245599242},"targetPosition":{"x":21481.213679589873,"y":29403.65313764483},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Candles","id":"36ae2d5d-6734-4526-b2f8-31c89a0c4fc1"}}},{"type":"Data Product","name":"Volumes","id":"ffaf5a8e-12d6-4040-922d-57845eb3377c","savedPayload":{"position":{"x":21771.465680365036,"y":30026.10056199891},"targetPosition":{"x":21481.213679589873,"y":29403.65313764483},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Volumes","id":"b2d5ba69-67ac-490f-9e74-28239b35a92e"}}},{"type":"Data Product","name":"Candle-Stairs","id":"e1c46e1f-09d1-46a2-b738-e761b4e04cd9","savedPayload":{"position":{"x":21658.969239347996,"y":30067.04591798999},"targetPosition":{"x":21481.213679589873,"y":29403.65313764483},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Candle-Stairs","id":"642474e9-da61-4168-97dc-7f7869bebc02"}}},{"type":"Data Product","name":"Volume-Stairs","id":"eefaf182-ffe4-457e-a7fa-f43dfabdc086","savedPayload":{"position":{"x":21541.071785596363,"y":30087.834420043237},"targetPosition":{"x":21481.213679589873,"y":29403.65313764483},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Volume-Stairs","id":"846e9572-c4d6-4c7e-942e-c82402c5ecea"}}},{"type":"Data Product","name":"Bollinger Bands","id":"3576cfd0-1774-4094-b8a0-66e182fc4c41","savedPayload":{"position":{"x":21421.355573583383,"y":30087.834420043237},"targetPosition":{"x":21481.213679589873,"y":29403.65313764483},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Bollinger Bands","id":"29088877-8d63-4217-8d34-8742afc262f4"}}},{"type":"Data Product","name":"Percentage Bandwidth","id":"4dfde44c-0bbf-4204-91de-ce99ecba4cf2","savedPayload":{"position":{"x":21303.45811983175,"y":30067.04591798999},"targetPosition":{"x":21481.213679589873,"y":29403.65313764483},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Percentage Bandwidth","id":"3b7885a0-cd72-4a3f-a38b-3dc8c47bd068"}}},{"type":"Data Product","name":"Bollinger Channels Objects","id":"6986bcb1-119c-48c9-a00b-d046e9e07951","savedPayload":{"position":{"x":21190.96167881471,"y":30026.10056199891},"targetPosition":{"x":21481.213679589873,"y":29403.65313764483},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Bollinger Channels Objects","id":"1f111f72-624f-4166-9f99-ab8d785d5267"}}},{"type":"Data Product","name":"Bollinger Sub-Channels Objects","id":"85098ab8-a125-49f1-b24d-416c2090c7a0","savedPayload":{"position":{"x":21087.28439796663,"y":29966.24245599242},"targetPosition":{"x":21481.213679589873,"y":29403.65313764483},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Bollinger Sub-Channels Objects","id":"080c87fc-4546-4482-ab11-180a33f6d9ab"}}}],"id":"49a747b4-2eb7-41d6-b0e2-493f43ceed44","savedPayload":{"position":{"x":21481.213679589873,"y":29403.65313764483},"targetPosition":{"x":21481.213679589873,"y":28716.858393897463},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":4},"uiObject":{},"referenceParent":{"type":"Market","name":"BTC/USDT","id":"d4098b73-7e25-434e-8fd9-342393cbb400"}}},{"type":"Single Market Data","name":"Kraken ETH/BTC","dataProducts":[{"type":"Data Product","name":"Candles","id":"fce50098-d674-4006-94ad-cce46f3d59a4","savedPayload":{"position":{"x":21041.962079231715,"y":30051.727908310717},"targetPosition":{"x":21173.718426647905,"y":29355.378865975883},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleTLine truncated
{"type":"Workspace","name":"My Workspace","rootNodes":[{"type":"Network","name":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","dataStorage":{"type":"Data Storage","name":"New Data Storage","sessionIndependentData":{"type":"Session Independent Data","name":"New Session Independent Data","singleMarketData":[{"type":"Single Market Data","name":"Poloniex BTC/USDT","dataProducts":[{"type":"Data Product","name":"Candles","id":"55e735a5-60c9-4e2d-a582-a6c6eddf3502","savedPayload":{"position":{"x":20539.95488621884,"y":29594.63790500938},"targetPosition":{"x":20872.24233158646,"y":29007.32183364947},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Candles","id":"36ae2d5d-6734-4526-b2f8-31c89a0c4fc1"}}},{"type":"Data Product","name":"Volumes","id":"ffaf5a8e-12d6-4040-922d-57845eb3377c","savedPayload":{"position":{"x":20443.01671365366,"y":29528.01414484369},"targetPosition":{"x":20872.24233158646,"y":29007.32183364947},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Volumes","id":"b2d5ba69-67ac-490f-9e74-28239b35a92e"}}},{"type":"Data Product","name":"Candle-Stairs","id":"e1c46e1f-09d1-46a2-b738-e761b4e04cd9","savedPayload":{"position":{"x":20359.12034429072,"y":29445.56941228539},"targetPosition":{"x":20872.24233158646,"y":29007.32183364947},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Candle-Stairs","id":"642474e9-da61-4168-97dc-7f7869bebc02"}}},{"type":"Data Product","name":"Volume-Stairs","id":"eefaf182-ffe4-457e-a7fa-f43dfabdc086","savedPayload":{"position":{"x":20290.81492685951,"y":29349.808748814212},"targetPosition":{"x":20872.24233158646,"y":29007.32183364947},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Volume-Stairs","id":"846e9572-c4d6-4c7e-942e-c82402c5ecea"}}},{"type":"Data Product","name":"Bollinger Bands","id":"3576cfd0-1774-4094-b8a0-66e182fc4c41","savedPayload":{"position":{"x":20240.175886904468,"y":29243.641793732495},"targetPosition":{"x":20872.24233158646,"y":29007.32183364947},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Bollinger Bands","id":"29088877-8d63-4217-8d34-8742afc262f4"}}},{"type":"Data Product","name":"Percentage Bandwidth","id":"4dfde44c-0bbf-4204-91de-ce99ecba4cf2","savedPayload":{"position":{"x":20208.741866030035,"y":29130.294376247326},"targetPosition":{"x":20872.24233158646,"y":29007.32183364947},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Percentage Bandwidth","id":"3b7885a0-cd72-4a3f-a38b-3dc8c47bd068"}}},{"type":"Data Product","name":"Bollinger Channels Objects","id":"6986bcb1-119c-48c9-a00b-d046e9e07951","savedPayload":{"position":{"x":20197.467971054095,"y":29013.21050028243},"targetPosition":{"x":20872.24233158646,"y":29007.32183364947},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Bollinger Channels Objects","id":"1f111f72-624f-4166-9f99-ab8d785d5267"}}},{"type":"Data Product","name":"Bollinger Sub-Channels Objects","id":"85098ab8-a125-49f1-b24d-416c2090c7a0","savedPayload":{"position":{"x":20206.69675357063,"y":28895.947700161698},"targetPosition":{"x":20872.24233158646,"y":29007.32183364947},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3},"uiObject":{},"referenceParent":{"type":"Product Definition","name":"Bollinger Sub-Channels Objects","id":"080c87fc-4546-4482-ab11-180a33f6d9ab"}}}],"id":"49a747b4-2eb7-41d6-b0e2-493f43ceed44","savedPayload":{"position":{"x":20872.24233158646,"y":29007.32183364947},"targetPosition":{"x":21481.306930973227,"y":28716.812921909375},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":4},"uiObject":{},"referenceParent":{"type":"Market","name":"BTC/USDT","id":"d4098b73-7e25-434e-8fd9-342393cbb400"}}},{"type":"Single Market Data","name":"Kraken ETH/BTC","dataProducts":[{"type":"Data Product","name":"Candles","id":"fce50098-d674-4006-94ad-cce46f3d59a4","savedPayload":{"position":{"x":20165.65867678313,"y":28960.65391280681},"targetPosition":{"x":20807.43166614526,"y":28752.12922805278},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"dLine truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

+1
View File
@@ -106,6 +106,7 @@ function newAppLoader() {
'SystemEventHandler.js',
'VideoRecorder.js',
'Plotter.js',
'LegacyPlotter.js',
'PlotterPanel.js',