From 0f723b300675ba3dce2b86fcebd5e947abd4dec1 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 19 Feb 2020 17:07:45 +0100 Subject: [PATCH 001/166] Super Scripts Implementation --- .../FunctionLibraries/SuperScripts.js | 135 ++++++++++++++++++ DesignSpace/Workspace/Workspace.js | 6 + 2 files changed, 141 insertions(+) create mode 100644 DesignSpace/Workspace/FunctionLibraries/SuperScripts.js diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js new file mode 100644 index 000000000..699394fd6 --- /dev/null +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -0,0 +1,135 @@ +function newSuperScriptsFunctions () { + thisObject = { + runSuperScript: runSuperScript + } + + return thisObject + + function runSuperScript (node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes) { + let clone = functionLibraryNodeCloning.getNodeClone + + function setup (templateClone, target) { + spawnPosition.x = target.payload.position.x + spawnPosition.y = target.payload.position.y + + functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target) + } + + /* Validations */ + if (node.payload.parentNode === undefined) { + node.payload.uiObject.setErrorMessage('Super Action node needs a Parent Node.') + return + } + if (node.payload.referenceParent === undefined) { + node.payload.uiObject.setErrorMessage('Super Action node needs to reference a Master Script Node.') + return + } + if (node.payload.referenceParent.javascriptCode === undefined) { + node.payload.uiObject.setErrorMessage('Master Script Node needs to have a child Javascript Code Node.') + return + } + let superAction = node + let masterScript = node.payload.referenceParent + + // eval(masterScript.javascriptCode.code) + /* Validations */ + if (superAction.payload.parentNode.type !== 'Market') { + superAction.payload.uiObject.setErrorMessage('Super Action Parent Node needs to be of type Market.') + return + } + if (superAction.payload.parentNode.baseAsset === undefined) { + superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Base Asset.') + return + } + if (superAction.payload.parentNode.quotedAsset === undefined) { + superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Quoted Asset.') + return + } + if (superAction.payload.parentNode.baseAsset.payload.referenceParent === undefined) { + superAction.payload.uiObject.setErrorMessage('Market Base Asset Node needs to reference an Asset.') + return + } + if (superAction.payload.parentNode.quotedAsset.payload.referenceParent === undefined) { + superAction.payload.uiObject.setErrorMessage('Market Quoted Asset Node needs to reference an Asset.') + return + } + if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.') + return + } + if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.') + return + } + if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.') + return + } + if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.') + return + } + if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) { + superAction.payload.uiObject.setErrorMessage('Assets must be from the same Exchange.') + return + } + if (superAction.payload.parentNode.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Market needs to be a child of Exchange Markets.') + return + } + if (superAction.payload.parentNode.payload.parentNode.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Exchange Markets needs to be a child of an Exchange.') + return + } + if (superAction.payload.parentNode.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) { + superAction.payload.uiObject.setErrorMessage('Assets and Market must be defined at the same Exchange.') + return + } + + let market = superAction.payload.parentNode + let singleMarketDate // we expect this variable to be set by a template script. + + for (let i = 0; i < masterScript.templateScripts.length; i++) { + let templateScript = masterScript.templateScripts[i] + + if (templateScript.templateStructure.javascriptCode === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Script must have a child Javascript Code.') + return + } + + // eval(templateScript.code) + + /* Validations */ + if (templateScript.templateStructure === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Structure.') + return + } + if (templateScript.templateStructure.singleMarketData === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Structure must have a child Single Market Data.') + return + } + if (templateScript.templateTarget === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Target.') + return + } + if (templateScript.templateTarget.payload.referenceParent === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Target must have a Reference Parent.') + return + } + if (templateScript.templateTarget.payload.referenceParent.type !== 'Session Independent Data') { + superAction.payload.uiObject.setErrorMessage('Template Target must have a Reference Parent of type Session Independent Data.') + return + } + + let target = templateScript.templateTarget.payload.referenceParent + let templateClone = clone(templateScript.templateStructure.singleMarketData) + target.singleMarketData.push(templateClone) + setup(templateClone, target) + templateClone.payload.referenceParent = market + + singleMarketDate = templateClone + } + + superAction.payload.uiObject.setValue('Execution Completed Successfully') + } +} diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index e9075d8a7..c08f04e17 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -56,6 +56,7 @@ function newWorkspace () { let functionLibrarySessionFunctions = newSessionFunctions() let functionLibraryShortcutKeys = newShortcutKeys() let functionLibraryOnFocus = newOnFocus() + let functionLibrarySuperScripts = newSuperScriptsFunctions() thisObject.nodeChildren = newNodeChildren() @@ -366,6 +367,11 @@ function newWorkspace () { functionLibrarySessionFunctions.stopSession(payload.node, functionLibraryProtocolNode, callBackFunction) } break + case 'Run Super Action': + { + functionLibrarySuperScripts.runSuperScript(payload.node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes) + } + break } } } From 32cad8ba7d4998906b9961245ebc3d739d282799 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 19 Feb 2020 19:17:28 +0100 Subject: [PATCH 002/166] Bug Fixed --- .../FunctionLibraries/NodeDeleter.js | 9 ++ .../FunctionLibraries/SuperScripts.js | 103 +----------------- 2 files changed, 14 insertions(+), 98 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js b/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js index 46ad39fcb..ea7e82a68 100644 --- a/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -24,6 +24,9 @@ function newNodeDeleter () { } function deleteUIObject (node, rootNodes) { + if (node.id === '0726a9e4-23b6-4d27-a8de-e91a9665a8ba') { + console.log('a') + } let nodeDefinition = APP_SCHEMA_MAP.get(node.type) if (nodeDefinition !== undefined) { /* Remove all of its own children nodes. */ @@ -55,6 +58,9 @@ function newNodeDeleter () { } } + if (node.payload === undefined) { + console.log('a') + } /* Remove node from parent */ if (node.payload.parentNode !== undefined) { let parentNodeDefinition = APP_SCHEMA_MAP.get(node.payload.parentNode.type) @@ -112,6 +118,9 @@ function newNodeDeleter () { } function cleanNode (node) { + if (node.id === '52d55987-e468-43fb-a93e-f92d720fa67e') { + console.log('a') + } node.payload.targetPosition.x = undefined node.payload.targetPosition.y = undefined node.payload.visible = undefined diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index 699394fd6..95d438f06 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -15,7 +15,7 @@ function newSuperScriptsFunctions () { functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target) } - /* Validations */ + /* Validations */ if (node.payload.parentNode === undefined) { node.payload.uiObject.setErrorMessage('Super Action node needs a Parent Node.') return @@ -31,103 +31,10 @@ function newSuperScriptsFunctions () { let superAction = node let masterScript = node.payload.referenceParent - // eval(masterScript.javascriptCode.code) - /* Validations */ - if (superAction.payload.parentNode.type !== 'Market') { - superAction.payload.uiObject.setErrorMessage('Super Action Parent Node needs to be of type Market.') - return - } - if (superAction.payload.parentNode.baseAsset === undefined) { - superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Base Asset.') - return - } - if (superAction.payload.parentNode.quotedAsset === undefined) { - superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Quoted Asset.') - return - } - if (superAction.payload.parentNode.baseAsset.payload.referenceParent === undefined) { - superAction.payload.uiObject.setErrorMessage('Market Base Asset Node needs to reference an Asset.') - return - } - if (superAction.payload.parentNode.quotedAsset.payload.referenceParent === undefined) { - superAction.payload.uiObject.setErrorMessage('Market Quoted Asset Node needs to reference an Asset.') - return - } - if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.') - return - } - if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.') - return - } - if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.') - return - } - if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.') - return - } - if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) { - superAction.payload.uiObject.setErrorMessage('Assets must be from the same Exchange.') - return - } - if (superAction.payload.parentNode.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Market needs to be a child of Exchange Markets.') - return - } - if (superAction.payload.parentNode.payload.parentNode.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Exchange Markets needs to be a child of an Exchange.') - return - } - if (superAction.payload.parentNode.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) { - superAction.payload.uiObject.setErrorMessage('Assets and Market must be defined at the same Exchange.') - return - } - - let market = superAction.payload.parentNode - let singleMarketDate // we expect this variable to be set by a template script. - - for (let i = 0; i < masterScript.templateScripts.length; i++) { - let templateScript = masterScript.templateScripts[i] - - if (templateScript.templateStructure.javascriptCode === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Script must have a child Javascript Code.') - return - } - - // eval(templateScript.code) - - /* Validations */ - if (templateScript.templateStructure === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Structure.') - return - } - if (templateScript.templateStructure.singleMarketData === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Structure must have a child Single Market Data.') - return - } - if (templateScript.templateTarget === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Target.') - return - } - if (templateScript.templateTarget.payload.referenceParent === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Target must have a Reference Parent.') - return - } - if (templateScript.templateTarget.payload.referenceParent.type !== 'Session Independent Data') { - superAction.payload.uiObject.setErrorMessage('Template Target must have a Reference Parent of type Session Independent Data.') - return - } - - let target = templateScript.templateTarget.payload.referenceParent - let templateClone = clone(templateScript.templateStructure.singleMarketData) - target.singleMarketData.push(templateClone) - setup(templateClone, target) - templateClone.payload.referenceParent = market - - singleMarketDate = templateClone + try { + eval(masterScript.javascriptCode.code) + } catch (err) { + superAction.payload.uiObject.setErrorMessage(err.message) } superAction.payload.uiObject.setValue('Execution Completed Successfully') From aba8a8256398bcf1ed266929131869bd6c86a8f6 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 19 Feb 2020 19:17:54 +0100 Subject: [PATCH 003/166] cleaning --- DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js b/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js index ea7e82a68..46ad39fcb 100644 --- a/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -24,9 +24,6 @@ function newNodeDeleter () { } function deleteUIObject (node, rootNodes) { - if (node.id === '0726a9e4-23b6-4d27-a8de-e91a9665a8ba') { - console.log('a') - } let nodeDefinition = APP_SCHEMA_MAP.get(node.type) if (nodeDefinition !== undefined) { /* Remove all of its own children nodes. */ @@ -58,9 +55,6 @@ function newNodeDeleter () { } } - if (node.payload === undefined) { - console.log('a') - } /* Remove node from parent */ if (node.payload.parentNode !== undefined) { let parentNodeDefinition = APP_SCHEMA_MAP.get(node.payload.parentNode.type) @@ -118,9 +112,6 @@ function newNodeDeleter () { } function cleanNode (node) { - if (node.id === '52d55987-e468-43fb-a93e-f92d720fa67e') { - console.log('a') - } node.payload.targetPosition.x = undefined node.payload.targetPosition.y = undefined node.payload.visible = undefined From 6344352eb2414e772be380486725745ead157b91 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 20 Feb 2020 16:07:20 +0100 Subject: [PATCH 004/166] Super Action Implemented --- .../FunctionLibraries/SuperScripts.js | 217 +++++++++++++++--- 1 file changed, 189 insertions(+), 28 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index 95d438f06..32f57d8c3 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -6,37 +6,198 @@ function newSuperScriptsFunctions () { return thisObject function runSuperScript (node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes) { - let clone = functionLibraryNodeCloning.getNodeClone - - function setup (templateClone, target) { - spawnPosition.x = target.payload.position.x - spawnPosition.y = target.payload.position.y - - functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target) - } - - /* Validations */ - if (node.payload.parentNode === undefined) { - node.payload.uiObject.setErrorMessage('Super Action node needs a Parent Node.') - return - } - if (node.payload.referenceParent === undefined) { - node.payload.uiObject.setErrorMessage('Super Action node needs to reference a Master Script Node.') - return - } - if (node.payload.referenceParent.javascriptCode === undefined) { - node.payload.uiObject.setErrorMessage('Master Script Node needs to have a child Javascript Code Node.') - return - } - let superAction = node - let masterScript = node.payload.referenceParent - try { - eval(masterScript.javascriptCode.code) + let clone = functionLibraryNodeCloning.getNodeClone + let executionResult = true + + function setup (templateClone, target) { + spawnPosition.x = target.payload.position.x + spawnPosition.y = target.payload.position.y + + functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target) + } + + /* Validations */ + if (executionResult === true && node.payload.parentNode === undefined) { + node.payload.uiObject.setErrorMessage('Super Action node needs a Parent Node.') + executionResult = false + } + if (executionResult === true && node.payload.referenceParent === undefined) { + node.payload.uiObject.setErrorMessage('Super Action node needs to reference a Master Script Node.') + executionResult = false + } + if (executionResult === true && node.payload.referenceParent.javascriptCode === undefined) { + node.payload.uiObject.setErrorMessage('Master Script Node needs to have a child Javascript Code Node.') + executionResult = false + } + + let superAction = node + let masterScript = node.payload.referenceParent + + /* + Master Script + */ + function newNewMasterScriptInstance () { + let thisObject = { + runValidations: runValidations, + runScript: runScript + } + return thisObject + + function runValidations (superAction) { + /* Validations */ + if (superAction.payload.parentNode.type !== 'Market') { + superAction.payload.uiObject.setErrorMessage('Super Action Parent Node needs to be of type Market.') + return + } + if (superAction.payload.parentNode.baseAsset === undefined) { + superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Base Asset.') + return + } + if (superAction.payload.parentNode.quotedAsset === undefined) { + superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Quoted Asset.') + return + } + if (superAction.payload.parentNode.baseAsset.payload.referenceParent === undefined) { + superAction.payload.uiObject.setErrorMessage('Market Base Asset Node needs to reference an Asset.') + return + } + if (superAction.payload.parentNode.quotedAsset.payload.referenceParent === undefined) { + superAction.payload.uiObject.setErrorMessage('Market Quoted Asset Node needs to reference an Asset.') + return + } + if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.') + return + } + if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.') + return + } + if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.') + return + } + if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.') + return + } + if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) { + superAction.payload.uiObject.setErrorMessage('Assets must be from the same Exchange.') + return + } + if (superAction.payload.parentNode.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Market needs to be a child of Exchange Markets.') + return + } + if (superAction.payload.parentNode.payload.parentNode.payload.parentNode === undefined) { + superAction.payload.uiObject.setErrorMessage('Exchange Markets needs to be a child of an Exchange.') + return + } + if (superAction.payload.parentNode.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) { + superAction.payload.uiObject.setErrorMessage('Assets and Market must be defined at the same Exchange.') + return + } + + return true + } + + function runScript (superAction, masterScript) { + let market = superAction.payload.parentNode + let singleMarketData // we expect this variable to be set by a template script. + let backSessionReference + let liveSessionReference + + for (let i = 0; i < masterScript.templateScripts.length; i++) { + let templateScript = masterScript.templateScripts[i] + + if (templateScript.javascriptCode === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Script must have a child Javascript Code.') + return + } + if (templateScript.templateStructure === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Structure.') + return + } + if (templateScript.templateTarget === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Target.') + return + } + if (templateScript.templateTarget.payload.referenceParent === undefined) { + superAction.payload.uiObject.setErrorMessage('Template Target must have a Reference Parent.') + return + } + try { + let templateScriptConstructor + + eval(templateScript.javascriptCode.code) + + /* + Template Script + */ + + /* + End of Template Script + */ + + let executionResult = true + let templateClone + let templateScriptInstance = templateScriptConstructor() + + if (executionResult === true) { + executionResult = templateScriptInstance.runValidations(superAction) + } + if (executionResult === true) { + templateClone = templateScriptInstance.runScript(superAction, templateScript) + } + + switch (templateClone.type) { + case 'Single Market Data': { + singleMarketData = templateClone + break + } + case 'Session Reference': { + if (backSessionReference === undefined) { + backSessionReference = templateClone + } else { + liveSessionReference = templateClone + } + break + } + } + + if (executionResult === false) { return false } + } catch (err) { + console.log(err.stack) + superAction.payload.uiObject.setErrorMessage(err.message) + } + } + + return true + } + } + /* + End Manster Script + */ + + // eval(masterScript.javascriptCode.code) + + let masterScriptInstance = newNewMasterScriptInstance() + + if (executionResult === true) { + executionResult = masterScriptInstance.runValidations(superAction) + } + if (executionResult === true) { + executionResult = masterScriptInstance.runScript(superAction, masterScript) + } + if (executionResult === true) { + superAction.payload.uiObject.setValue('Execution Completed Successfully') + } else { + superAction.payload.uiObject.setValue('Execution Failed') + } } catch (err) { superAction.payload.uiObject.setErrorMessage(err.message) + superAction.payload.uiObject.setValue('Execution Failed') } - - superAction.payload.uiObject.setValue('Execution Completed Successfully') } } From 285a1088f79504ed6f1a2b565950804dd39e0e80 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 20 Feb 2020 16:16:45 +0100 Subject: [PATCH 005/166] bug fixed --- Canvas.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Canvas.js b/Canvas.js index 50e4a896e..18fe9869e 100644 --- a/Canvas.js +++ b/Canvas.js @@ -922,10 +922,12 @@ 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' + if (event !== undefined) { + 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) From 188de8f56f5ce0aeb14d8a2fb797df4f334c6aba Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 20 Feb 2020 16:27:01 +0100 Subject: [PATCH 006/166] Remove Reference Button implemented --- DesignSpace/Workspace/Workspace.js | 10 ++++++++++ FloatingSpace/CircularMenuItem.js | 6 +++--- FloatingSpace/UiObjectConstructor.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index c08f04e17..0703071e5 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -372,6 +372,16 @@ function newWorkspace () { functionLibrarySuperScripts.runSuperScript(payload.node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes) } break + case 'Remove Parent': + { + + } + break + case 'Remove Reference': + { + payload.referenceParent = undefined + } + break } } } diff --git a/FloatingSpace/CircularMenuItem.js b/FloatingSpace/CircularMenuItem.js index b54779f50..c45df674b 100644 --- a/FloatingSpace/CircularMenuItem.js +++ b/FloatingSpace/CircularMenuItem.js @@ -150,15 +150,15 @@ function newCircularMenuItem () { if (thisObject.type === 'Icon Only') { switch (thisObject.ring) { case 1: { - radiusGrowthFactor = 5 + radiusGrowthFactor = 6 break } case 2: { - radiusGrowthFactor = 3.5 + radiusGrowthFactor = 4.5 break } case 3: { - radiusGrowthFactor = 2 + radiusGrowthFactor = 3 break } } diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index ac5ee4dd3..a03a3ff27 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -246,6 +246,34 @@ function newUiObjectConstructor () { } ) } + menuItemsInitialValues.push( + { + action: 'Remove Parent', + actionFunction: floatingObject.payload.onMenuItemClick, + label: undefined, + visible: true, + iconPathOn: 'kraken', + iconPathOff: 'kraken', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + ring: 3 + } + ) + menuItemsInitialValues.push( + { + action: 'Remove Reference', + actionFunction: floatingObject.payload.onMenuItemClick, + label: undefined, + visible: true, + iconPathOn: 'bitcoin', + iconPathOff: 'bitcoin', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + ring: 3 + } + ) } function getMenuItemsInitialValues (uiObject, floatingObject, payload) { From 60bd0ab1e54242fce5fcb45d4ce3110d776ccaf6 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 20 Feb 2020 16:34:24 +0100 Subject: [PATCH 007/166] Button to Detach from parent implemented --- DesignSpace/Workspace/Workspace.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 0703071e5..9bd021d39 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -374,7 +374,7 @@ function newWorkspace () { break case 'Remove Parent': { - + functionLibraryChainAttachDetach.chainDetachNode(payload.node, thisObject.workspaceNode.rootNodes) } break case 'Remove Reference': From 1883d3b17330c5332d4102a37acbad4787475bb9 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 20 Feb 2020 16:51:54 +0100 Subject: [PATCH 008/166] Bug fixed --- FloatingSpace/CircularMenuItem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/FloatingSpace/CircularMenuItem.js b/FloatingSpace/CircularMenuItem.js index c45df674b..af5c83a95 100644 --- a/FloatingSpace/CircularMenuItem.js +++ b/FloatingSpace/CircularMenuItem.js @@ -275,6 +275,7 @@ function newCircularMenuItem () { /* A Click during confirmation executes the pre-defined action. */ if (temporaryStatus === STATUS_WAITING_CONFIRMATION || temporaryStatus === STATUS_PRIMARY_WORK_DONE) { executeAction() + setStatus(thisObject.workDoneLabel, UI_COLOR.PATINATED_TURQUOISE, 100, STATUS_SECONDARY_WORK_DONE) return } } From c08f67f40dc560e80475b545ff10a29a0816428f Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 20 Feb 2020 18:29:25 +0100 Subject: [PATCH 009/166] Bug fixes --- DesignSpace/Workspace/FunctionLibraries/ChainAttachDetach.js | 1 + .../Workspace/FunctionLibraries/ReferenceAttachDetach.js | 3 +++ DesignSpace/Workspace/Workspace.js | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/ChainAttachDetach.js b/DesignSpace/Workspace/FunctionLibraries/ChainAttachDetach.js index 586a01dbd..44dd1e1db 100644 --- a/DesignSpace/Workspace/FunctionLibraries/ChainAttachDetach.js +++ b/DesignSpace/Workspace/FunctionLibraries/ChainAttachDetach.js @@ -7,6 +7,7 @@ function newChainAttachDetach () { return thisObject function chainDetachNode (node, rootNodes) { + if (node.payload.parentNode === undefined) { return } switch (node.type) { case 'Phase': { let payload = node.payload diff --git a/DesignSpace/Workspace/FunctionLibraries/ReferenceAttachDetach.js b/DesignSpace/Workspace/FunctionLibraries/ReferenceAttachDetach.js index cdf5385dc..68d2cf69f 100644 --- a/DesignSpace/Workspace/FunctionLibraries/ReferenceAttachDetach.js +++ b/DesignSpace/Workspace/FunctionLibraries/ReferenceAttachDetach.js @@ -20,5 +20,8 @@ function newReferenceAttachDetach () { function completeDetachment (node) { node.payload.referenceParent = undefined + if (node.savedPayload !== undefined) { + node.savedPayload.referenceParent = undefined + } } } diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 9bd021d39..033f8ed0b 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -374,12 +374,12 @@ function newWorkspace () { break case 'Remove Parent': { - functionLibraryChainAttachDetach.chainDetachNode(payload.node, thisObject.workspaceNode.rootNodes) + chainDetachNode(payload.node) } break case 'Remove Reference': { - payload.referenceParent = undefined + referenceDetachNode(payload.node) } break } From 0c7a166d12b61af48223cfb60623d36e0f7c653b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 20 Feb 2020 21:06:41 +0100 Subject: [PATCH 010/166] validations first --- .../FunctionLibraries/SuperScripts.js | 74 ++++++++++++------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index 32f57d8c3..6684901a0 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -44,7 +44,7 @@ function newSuperScriptsFunctions () { } return thisObject - function runValidations (superAction) { + function runValidations (superAction, masterScript) { /* Validations */ if (superAction.payload.parentNode.type !== 'Market') { superAction.payload.uiObject.setErrorMessage('Super Action Parent Node needs to be of type Market.') @@ -99,15 +99,6 @@ function newSuperScriptsFunctions () { return } - return true - } - - function runScript (superAction, masterScript) { - let market = superAction.payload.parentNode - let singleMarketData // we expect this variable to be set by a template script. - let backSessionReference - let liveSessionReference - for (let i = 0; i < masterScript.templateScripts.length; i++) { let templateScript = masterScript.templateScripts[i] @@ -132,31 +123,56 @@ function newSuperScriptsFunctions () { eval(templateScript.javascriptCode.code) - /* - Template Script - */ + let executionResult = true + let templateScriptInstance = templateScriptConstructor() - /* - End of Template Script - */ + if (executionResult === true) { + executionResult = templateScriptInstance.runValidations(superAction) + } + + if (executionResult !== true) { return false } + } catch (err) { + console.log(err.stack) + superAction.payload.uiObject.setErrorMessage(err.message) + return false + } + } + + return true + } + + function runScript (superAction, masterScript) { + let market = superAction.payload.parentNode + let singleMarketData // we expect this variable to be set by a template script. + let backSessionReference + let liveSessionReference + let testingEnvironmentTaskManager + let productionEnvironmentTaskManager + + for (let i = 0; i < masterScript.templateScripts.length; i++) { + let templateScript = masterScript.templateScripts[i] + + try { + let templateScriptConstructor + + eval(templateScript.javascriptCode.code) let executionResult = true let templateClone let templateScriptInstance = templateScriptConstructor() - if (executionResult === true) { - executionResult = templateScriptInstance.runValidations(superAction) - } if (executionResult === true) { templateClone = templateScriptInstance.runScript(superAction, templateScript) } - switch (templateClone.type) { - case 'Single Market Data': { + if (executionResult !== true) { return false } + + switch (templateClone.payload.parentNode.type) { + case 'Session Independent Data': { singleMarketData = templateClone break } - case 'Session Reference': { + case 'Session Based Data': { if (backSessionReference === undefined) { backSessionReference = templateClone } else { @@ -164,15 +180,23 @@ function newSuperScriptsFunctions () { } break } + case 'Testing Environment': { + testingEnvironmentTaskManager = templateClone + break + } + case 'Production Environment': { + productionEnvironmentTaskManager = templateClone + break + } } - if (executionResult === false) { return false } + if (executionResult !== true) { return false } } catch (err) { console.log(err.stack) superAction.payload.uiObject.setErrorMessage(err.message) + return false } } - return true } } @@ -185,7 +209,7 @@ function newSuperScriptsFunctions () { let masterScriptInstance = newNewMasterScriptInstance() if (executionResult === true) { - executionResult = masterScriptInstance.runValidations(superAction) + executionResult = masterScriptInstance.runValidations(superAction, masterScript) } if (executionResult === true) { executionResult = masterScriptInstance.runScript(superAction, masterScript) From dad23118fe84e399e05eb31330e2b16062b3679f Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 21 Feb 2020 07:21:57 +0100 Subject: [PATCH 011/166] bug fixed --- DesignSpace/Workspace/FunctionLibraries/SuperScripts.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index 6684901a0..9c75a0828 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -98,6 +98,10 @@ function newSuperScriptsFunctions () { superAction.payload.uiObject.setErrorMessage('Assets and Market must be defined at the same Exchange.') return } + if (superAction.payload.parentNode.payload.parentNode.payload.parentNode.exchangeAccounts === undefined) { + superAction.payload.uiObject.setErrorMessage('Exchange Markets needs have a child Exchange Accounts.') + return + } for (let i = 0; i < masterScript.templateScripts.length; i++) { let templateScript = masterScript.templateScripts[i] From 2b401b6de18a44b9a40a1fd939d036c66179ce19 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 21 Feb 2020 07:29:57 +0100 Subject: [PATCH 012/166] more icons --- Spaces/DesignSpace.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Spaces/DesignSpace.js b/Spaces/DesignSpace.js index d1c1f7faf..f07ee8122 100644 --- a/Spaces/DesignSpace.js +++ b/Spaces/DesignSpace.js @@ -265,7 +265,14 @@ function newDesignSpace () { 'key-down', 'key-left', 'key-right', - 'key-up' + 'key-up', + 'master-script', + 'scripts-library', + 'super-action', + 'super-scripts', + 'template-script', + 'template-structure', + 'template-target' ] for (let i = 0; i < iconsNames.length; i++) { From 7eb1c54911a4812bc85a3a8362da5489038f7d82 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 21 Feb 2020 13:13:26 +0100 Subject: [PATCH 013/166] Action Script Working --- .../FunctionLibraries/SuperScripts.js | 182 +++++++++++++++++- .../FunctionLibraries/UiObjectsFromNodes.js | 10 + FloatingSpace/UiObjectConstructor.js | 8 +- Spaces/DesignSpace.js | 4 +- 4 files changed, 195 insertions(+), 9 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index 9c75a0828..159b71c16 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -149,9 +149,12 @@ function newSuperScriptsFunctions () { let market = superAction.payload.parentNode let singleMarketData // we expect this variable to be set by a template script. let backSessionReference + let paperSessionReference let liveSessionReference let testingEnvironmentTaskManager + let fordwardSessionReference let productionEnvironmentTaskManager + let timeMachine for (let i = 0; i < masterScript.templateScripts.length; i++) { let templateScript = masterScript.templateScripts[i] @@ -177,10 +180,23 @@ function newSuperScriptsFunctions () { break } case 'Session Based Data': { - if (backSessionReference === undefined) { - backSessionReference = templateClone - } else { - liveSessionReference = templateClone + switch (templateClone.templateType) { + case 'Backtesting Session': { + backSessionReference = templateClone + break + } + case 'Paper Trading Session': { + paperSessionReference = templateClone + break + } + case 'Live Trading Session': { + liveSessionReference = templateClone + break + } + case 'Fordward Testing Session': { + fordwardSessionReference = templateClone + break + } } break } @@ -192,6 +208,10 @@ function newSuperScriptsFunctions () { productionEnvironmentTaskManager = templateClone break } + case 'Dashboard': { + timeMachine = templateClone + break + } } if (executionResult !== true) { return false } @@ -201,6 +221,160 @@ function newSuperScriptsFunctions () { return false } } + + /* Here we will find the sessions within the tasks in order to put them as a reference of the Session Reference nodes we already have */ + let session + session = findSession('Backtesting Session', testingEnvironmentTaskManager) + backSessionReference.payload.referenceParent = session + session = findSession('Paper Trading Session', testingEnvironmentTaskManager) + paperSessionReference.payload.referenceParent = session + session = findSession('Live Trading Session', productionEnvironmentTaskManager) + liveSessionReference.payload.referenceParent = session + session = findSession('Fordward Testing Session', productionEnvironmentTaskManager) + fordwardSessionReference.payload.referenceParent = session + + function findSession (sessionType, taskManager) { + for (let i = 0; i < taskManager.tasks.length; i++) { + let task = taskManager.tasks[i] + if (task.bot !== undefined) { + if (task.bot.processes !== undefined) { + for (let j = 0; j < task.bot.processes.length; j++) { + let process = task.bot.processes[j] + if (process.session !== undefined) { + if (process.session.type === sessionType) { + return process.session + } + } + } + } + } + } + } + + /* Here, we are going to connect the layers of the charts at the Time Machine */ + for (let i = 0; i < timeMachine.timelineCharts.length; i++) { + let timelineChart = timeMachine.timelineCharts[i] + switch (timelineChart.name) { + case 'Indicators': { + for (let j = 0; j < timelineChart.layersManager.layers.length; j++) { + let layer = timelineChart.layersManager.layers[j] + switch (j) { + case 0: { + let dataProduct = findDataProduct(singleMarketData, 'Candles') + layer.payload.referenceParent = dataProduct + break + } + case 1: { + let dataProduct = findDataProduct(singleMarketData, 'Bollinger Bands') + layer.payload.referenceParent = dataProduct + break + } + case 2: { + let dataProduct = findDataProduct(singleMarketData, 'Bollinger Channels Objects') + layer.payload.referenceParent = dataProduct + break + } + case 3: { + let dataProduct = findDataProduct(singleMarketData, 'Bollinger Sub-Channels Objects') + layer.payload.referenceParent = dataProduct + break + } + case 4: { + let dataProduct = findDataProduct(singleMarketData, 'Candles-Stairs') + layer.payload.referenceParent = dataProduct + break + } + } + } + break + } + case 'Volumes': { + for (let j = 0; j < timelineChart.layersManager.layers.length; j++) { + let layer = timelineChart.layersManager.layers[j] + switch (j) { + case 0: { + let dataProduct = findDataProduct(singleMarketData, 'Volumes') + layer.payload.referenceParent = dataProduct + break + } + case 1: { + let dataProduct = findDataProduct(singleMarketData, 'Volume-Stairs') + layer.payload.referenceParent = dataProduct + break + } + } + } + break + } + case 'Oscilators': { + for (let j = 0; j < timelineChart.layersManager.layers.length; j++) { + let layer = timelineChart.layersManager.layers[j] + switch (j) { + case 0: { + let dataProduct = findDataProduct(singleMarketData, 'Percentage Bandwidth') + layer.payload.referenceParent = dataProduct + break + } + } + } + break + } + case 'Backtesting': { + setupSessionReference(timelineChart, backSessionReference) + break + } + case 'Paper Trading': { + setupSessionReference(timelineChart, paperSessionReference) + break + } + case 'Live Trading': { + setupSessionReference(timelineChart, liveSessionReference) + break + } + case 'Fordward Trading': { + setupSessionReference(timelineChart, fordwardSessionReference) + break + } + } + } + + function findDataProduct (singleMarketData, name) { + for (let i = 0; i < singleMarketData.dataProducts.length; i++) { + let dataProduct = singleMarketData.dataProducts[i] + if (dataProduct.name === name) { + return dataProduct + } + } + } + function setupSessionReference (timelineChart, sessionReference) { + for (let j = 0; j < timelineChart.layersManager.layers.length; j++) { + let layer = timelineChart.layersManager.layers[j] + switch (j) { + case 0: { + let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Simulation') + layer.payload.referenceParent = dataProduct + break + } + case 1: { + let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Conditions') + layer.payload.referenceParent = dataProduct + break + } + case 2: { + let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Trades') + layer.payload.referenceParent = dataProduct + break + } + case 3: { + let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Strategies') + layer.payload.referenceParent = dataProduct + break + } + } + } + } + + timeMachine.name = superAction.payload.parentNode.payload.parentNode.payload.parentNode.name + ' ' + market.name return true } } diff --git a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js index 96f7bfef3..19f48fa43 100644 --- a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js +++ b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js @@ -189,6 +189,16 @@ function newUiObjectsFromNodes () { } } + /* Create Empty Arrays for properties of type Array */ + if (nodeDefinition.properties !== undefined) { + for (let i = 0; i < nodeDefinition.properties.length; i++) { + let property = nodeDefinition.properties[i] + if (property.type === 'array') { + object[property.name] = [] + } + } + } + if (nodeDefinition !== undefined) { if (nodeDefinition.initialValues !== undefined) { if (nodeDefinition.initialValues.code !== undefined) { diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index a03a3ff27..fa20f3cb6 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -252,8 +252,8 @@ function newUiObjectConstructor () { actionFunction: floatingObject.payload.onMenuItemClick, label: undefined, visible: true, - iconPathOn: 'kraken', - iconPathOff: 'kraken', + iconPathOn: 'detach', + iconPathOff: 'detach', rawRadius: 8, targetRadius: 0, currentRadius: 0, @@ -266,8 +266,8 @@ function newUiObjectConstructor () { actionFunction: floatingObject.payload.onMenuItemClick, label: undefined, visible: true, - iconPathOn: 'bitcoin', - iconPathOff: 'bitcoin', + iconPathOn: 'delink', + iconPathOff: 'delink', rawRadius: 8, targetRadius: 0, currentRadius: 0, diff --git a/Spaces/DesignSpace.js b/Spaces/DesignSpace.js index f07ee8122..c727b5a7b 100644 --- a/Spaces/DesignSpace.js +++ b/Spaces/DesignSpace.js @@ -272,7 +272,9 @@ function newDesignSpace () { 'super-scripts', 'template-script', 'template-structure', - 'template-target' + 'template-target', + 'delink', + 'detach' ] for (let i = 0; i < iconsNames.length; i++) { From adca5d2d1658527c46fdb31e4d99948a425046a0 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 21 Feb 2020 13:46:03 +0100 Subject: [PATCH 014/166] Bug Fixed --- FloatingSpace/UiObjectTitle.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/FloatingSpace/UiObjectTitle.js b/FloatingSpace/UiObjectTitle.js index efb8a1da2..00f7984cd 100644 --- a/FloatingSpace/UiObjectTitle.js +++ b/FloatingSpace/UiObjectTitle.js @@ -141,6 +141,11 @@ function newUiObjectTitle () { } } + /* The name becomes the title. */ + if (thisObject.payload.node.name !== undefined) { + thisObject.payload.title = thisObject.payload.node.name + } + let title = trimTitle(thisObject.payload.title) /* Here we set the dimensions and position of this object */ From 4ce34faf4b9ec2b373ad21e7d0f69426798c1457 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 21 Feb 2020 13:50:37 +0100 Subject: [PATCH 015/166] super scripts final --- .../FunctionLibraries/SuperScripts.js | 350 +----------------- 1 file changed, 1 insertion(+), 349 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index 159b71c16..a2913fda7 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -34,355 +34,7 @@ function newSuperScriptsFunctions () { let superAction = node let masterScript = node.payload.referenceParent - /* - Master Script - */ - function newNewMasterScriptInstance () { - let thisObject = { - runValidations: runValidations, - runScript: runScript - } - return thisObject - - function runValidations (superAction, masterScript) { - /* Validations */ - if (superAction.payload.parentNode.type !== 'Market') { - superAction.payload.uiObject.setErrorMessage('Super Action Parent Node needs to be of type Market.') - return - } - if (superAction.payload.parentNode.baseAsset === undefined) { - superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Base Asset.') - return - } - if (superAction.payload.parentNode.quotedAsset === undefined) { - superAction.payload.uiObject.setErrorMessage('Market Node needs to have a child Market Quoted Asset.') - return - } - if (superAction.payload.parentNode.baseAsset.payload.referenceParent === undefined) { - superAction.payload.uiObject.setErrorMessage('Market Base Asset Node needs to reference an Asset.') - return - } - if (superAction.payload.parentNode.quotedAsset.payload.referenceParent === undefined) { - superAction.payload.uiObject.setErrorMessage('Market Quoted Asset Node needs to reference an Asset.') - return - } - if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.') - return - } - if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Asset Node needs to be a child of Exchange Assets.') - return - } - if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.') - return - } - if (superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Exchange Assets needs to be a child of an Exchange Node.') - return - } - if (superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.quotedAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) { - superAction.payload.uiObject.setErrorMessage('Assets must be from the same Exchange.') - return - } - if (superAction.payload.parentNode.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Market needs to be a child of Exchange Markets.') - return - } - if (superAction.payload.parentNode.payload.parentNode.payload.parentNode === undefined) { - superAction.payload.uiObject.setErrorMessage('Exchange Markets needs to be a child of an Exchange.') - return - } - if (superAction.payload.parentNode.payload.parentNode.payload.parentNode.id !== superAction.payload.parentNode.baseAsset.payload.referenceParent.payload.parentNode.payload.parentNode.id) { - superAction.payload.uiObject.setErrorMessage('Assets and Market must be defined at the same Exchange.') - return - } - if (superAction.payload.parentNode.payload.parentNode.payload.parentNode.exchangeAccounts === undefined) { - superAction.payload.uiObject.setErrorMessage('Exchange Markets needs have a child Exchange Accounts.') - return - } - - for (let i = 0; i < masterScript.templateScripts.length; i++) { - let templateScript = masterScript.templateScripts[i] - - if (templateScript.javascriptCode === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Script must have a child Javascript Code.') - return - } - if (templateScript.templateStructure === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Structure.') - return - } - if (templateScript.templateTarget === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Script must have a child Template Target.') - return - } - if (templateScript.templateTarget.payload.referenceParent === undefined) { - superAction.payload.uiObject.setErrorMessage('Template Target must have a Reference Parent.') - return - } - try { - let templateScriptConstructor - - eval(templateScript.javascriptCode.code) - - let executionResult = true - let templateScriptInstance = templateScriptConstructor() - - if (executionResult === true) { - executionResult = templateScriptInstance.runValidations(superAction) - } - - if (executionResult !== true) { return false } - } catch (err) { - console.log(err.stack) - superAction.payload.uiObject.setErrorMessage(err.message) - return false - } - } - - return true - } - - function runScript (superAction, masterScript) { - let market = superAction.payload.parentNode - let singleMarketData // we expect this variable to be set by a template script. - let backSessionReference - let paperSessionReference - let liveSessionReference - let testingEnvironmentTaskManager - let fordwardSessionReference - let productionEnvironmentTaskManager - let timeMachine - - for (let i = 0; i < masterScript.templateScripts.length; i++) { - let templateScript = masterScript.templateScripts[i] - - try { - let templateScriptConstructor - - eval(templateScript.javascriptCode.code) - - let executionResult = true - let templateClone - let templateScriptInstance = templateScriptConstructor() - - if (executionResult === true) { - templateClone = templateScriptInstance.runScript(superAction, templateScript) - } - - if (executionResult !== true) { return false } - - switch (templateClone.payload.parentNode.type) { - case 'Session Independent Data': { - singleMarketData = templateClone - break - } - case 'Session Based Data': { - switch (templateClone.templateType) { - case 'Backtesting Session': { - backSessionReference = templateClone - break - } - case 'Paper Trading Session': { - paperSessionReference = templateClone - break - } - case 'Live Trading Session': { - liveSessionReference = templateClone - break - } - case 'Fordward Testing Session': { - fordwardSessionReference = templateClone - break - } - } - break - } - case 'Testing Environment': { - testingEnvironmentTaskManager = templateClone - break - } - case 'Production Environment': { - productionEnvironmentTaskManager = templateClone - break - } - case 'Dashboard': { - timeMachine = templateClone - break - } - } - - if (executionResult !== true) { return false } - } catch (err) { - console.log(err.stack) - superAction.payload.uiObject.setErrorMessage(err.message) - return false - } - } - - /* Here we will find the sessions within the tasks in order to put them as a reference of the Session Reference nodes we already have */ - let session - session = findSession('Backtesting Session', testingEnvironmentTaskManager) - backSessionReference.payload.referenceParent = session - session = findSession('Paper Trading Session', testingEnvironmentTaskManager) - paperSessionReference.payload.referenceParent = session - session = findSession('Live Trading Session', productionEnvironmentTaskManager) - liveSessionReference.payload.referenceParent = session - session = findSession('Fordward Testing Session', productionEnvironmentTaskManager) - fordwardSessionReference.payload.referenceParent = session - - function findSession (sessionType, taskManager) { - for (let i = 0; i < taskManager.tasks.length; i++) { - let task = taskManager.tasks[i] - if (task.bot !== undefined) { - if (task.bot.processes !== undefined) { - for (let j = 0; j < task.bot.processes.length; j++) { - let process = task.bot.processes[j] - if (process.session !== undefined) { - if (process.session.type === sessionType) { - return process.session - } - } - } - } - } - } - } - - /* Here, we are going to connect the layers of the charts at the Time Machine */ - for (let i = 0; i < timeMachine.timelineCharts.length; i++) { - let timelineChart = timeMachine.timelineCharts[i] - switch (timelineChart.name) { - case 'Indicators': { - for (let j = 0; j < timelineChart.layersManager.layers.length; j++) { - let layer = timelineChart.layersManager.layers[j] - switch (j) { - case 0: { - let dataProduct = findDataProduct(singleMarketData, 'Candles') - layer.payload.referenceParent = dataProduct - break - } - case 1: { - let dataProduct = findDataProduct(singleMarketData, 'Bollinger Bands') - layer.payload.referenceParent = dataProduct - break - } - case 2: { - let dataProduct = findDataProduct(singleMarketData, 'Bollinger Channels Objects') - layer.payload.referenceParent = dataProduct - break - } - case 3: { - let dataProduct = findDataProduct(singleMarketData, 'Bollinger Sub-Channels Objects') - layer.payload.referenceParent = dataProduct - break - } - case 4: { - let dataProduct = findDataProduct(singleMarketData, 'Candles-Stairs') - layer.payload.referenceParent = dataProduct - break - } - } - } - break - } - case 'Volumes': { - for (let j = 0; j < timelineChart.layersManager.layers.length; j++) { - let layer = timelineChart.layersManager.layers[j] - switch (j) { - case 0: { - let dataProduct = findDataProduct(singleMarketData, 'Volumes') - layer.payload.referenceParent = dataProduct - break - } - case 1: { - let dataProduct = findDataProduct(singleMarketData, 'Volume-Stairs') - layer.payload.referenceParent = dataProduct - break - } - } - } - break - } - case 'Oscilators': { - for (let j = 0; j < timelineChart.layersManager.layers.length; j++) { - let layer = timelineChart.layersManager.layers[j] - switch (j) { - case 0: { - let dataProduct = findDataProduct(singleMarketData, 'Percentage Bandwidth') - layer.payload.referenceParent = dataProduct - break - } - } - } - break - } - case 'Backtesting': { - setupSessionReference(timelineChart, backSessionReference) - break - } - case 'Paper Trading': { - setupSessionReference(timelineChart, paperSessionReference) - break - } - case 'Live Trading': { - setupSessionReference(timelineChart, liveSessionReference) - break - } - case 'Fordward Trading': { - setupSessionReference(timelineChart, fordwardSessionReference) - break - } - } - } - - function findDataProduct (singleMarketData, name) { - for (let i = 0; i < singleMarketData.dataProducts.length; i++) { - let dataProduct = singleMarketData.dataProducts[i] - if (dataProduct.name === name) { - return dataProduct - } - } - } - function setupSessionReference (timelineChart, sessionReference) { - for (let j = 0; j < timelineChart.layersManager.layers.length; j++) { - let layer = timelineChart.layersManager.layers[j] - switch (j) { - case 0: { - let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Simulation') - layer.payload.referenceParent = dataProduct - break - } - case 1: { - let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Conditions') - layer.payload.referenceParent = dataProduct - break - } - case 2: { - let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Trades') - layer.payload.referenceParent = dataProduct - break - } - case 3: { - let dataProduct = findDataProduct(sessionReference.singleMarketData, 'Strategies') - layer.payload.referenceParent = dataProduct - break - } - } - } - } - - timeMachine.name = superAction.payload.parentNode.payload.parentNode.payload.parentNode.name + ' ' + market.name - return true - } - } - /* - End Manster Script - */ - - // eval(masterScript.javascriptCode.code) + eval(masterScript.javascriptCode.code) let masterScriptInstance = newNewMasterScriptInstance() From 8ec4a1cbf8bfb1a6f343b7de264f6252ef5293c7 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 22 Feb 2020 16:40:53 +0100 Subject: [PATCH 016/166] title improved --- FloatingSpace/UiObjectTitle.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/FloatingSpace/UiObjectTitle.js b/FloatingSpace/UiObjectTitle.js index 00f7984cd..9ac05377c 100644 --- a/FloatingSpace/UiObjectTitle.js +++ b/FloatingSpace/UiObjectTitle.js @@ -136,6 +136,14 @@ function newUiObjectTitle () { } break } + default: { + if (titleReference.indexOf('Use Child @') === 0) { + let propertyName = titleReference.substring(titleReference.indexOf('@') + 1, titleReference.length) + let childNode = thisObject.payload.node[propertyName] + thisObject.payload.title = thisObject.payload.title + separator + childNode.name + thisObject.payload.node.name = thisObject.payload.node.name + separator + childNode.name + } + } } separator = ' ' } From 9293a36c607ab37bfdc2746981af6b26cd17fe52 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 22 Feb 2020 16:54:02 +0100 Subject: [PATCH 017/166] bug fixed --- Spaces/ChartingSpace.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Spaces/ChartingSpace.js b/Spaces/ChartingSpace.js index be86e976b..05da2131e 100644 --- a/Spaces/ChartingSpace.js +++ b/Spaces/ChartingSpace.js @@ -112,6 +112,7 @@ function newChartingSpace () { function getContainer (point, purpose) { if (thisObject.visible !== true) { return } + if (thisObject.viewport === undefined) { return } if (thisObject.viewport.isThisPointInViewport(point) === false) { return } let container From 373f69e7f40962e6ec96d1aafed684dc57f51227 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 22 Feb 2020 18:31:25 +0100 Subject: [PATCH 018/166] Bug Fixed --- Spaces/ChartingSpace.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Spaces/ChartingSpace.js b/Spaces/ChartingSpace.js index 05da2131e..cb82c62ba 100644 --- a/Spaces/ChartingSpace.js +++ b/Spaces/ChartingSpace.js @@ -77,8 +77,10 @@ function newChartingSpace () { thisObject.container.finalize() thisObject.container = undefined - thisObject.viewport.finalize() - thisObject.viewport = undefined + if (thisObject.viewport !== undefined) { + thisObject.viewport.finalize() + thisObject.viewport = undefined + } thisObject.payload = undefined } From 7a929e129883cfa1d001627458b91208d213717f Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 22 Feb 2020 18:38:01 +0100 Subject: [PATCH 019/166] cleaning --- PostLoader.js | 1 - 1 file changed, 1 deletion(-) diff --git a/PostLoader.js b/PostLoader.js index bb34c97ea..567be6bdf 100644 --- a/PostLoader.js +++ b/PostLoader.js @@ -1,6 +1,5 @@ let canvas let markets -let ecosystem = newEcosystem() let systemEventHandler let APP_SCHEMA_MAP = new Map() From d2ff72af7a969abdd036e869fbb0150203ce710d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 22 Feb 2020 18:59:30 +0100 Subject: [PATCH 020/166] no need to drag the initial workspace --- DesignSpace/Workspace/Workspace.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 033f8ed0b..547feb629 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -81,8 +81,7 @@ function newWorkspace () { let savedWorkspace = window.localStorage.getItem(CANVAS_APP_NAME + '.' + 'Workspace') if (savedWorkspace === null) { - thisObject.workspaceNode.type = 'Workspace' - thisObject.workspaceNode.name = 'My Workspace' + thisObject.workspaceNode = getWorkspace() } else { thisObject.workspaceNode = JSON.parse(savedWorkspace) } From 04fc66bc766bff480bcc5b4350c9dd94a5d3dc27 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 24 Feb 2020 16:40:24 +0100 Subject: [PATCH 021/166] Font size adjustment --- FloatingSpace/CodeEditor.js | 2 +- FloatingSpace/ConditionEditor.js | 2 +- FloatingSpace/ConfigEditor.js | 4 ++-- FloatingSpace/FormulaEditor.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/FloatingSpace/CodeEditor.js b/FloatingSpace/CodeEditor.js index cffba932a..833c1d5c1 100644 --- a/FloatingSpace/CodeEditor.js +++ b/FloatingSpace/CodeEditor.js @@ -90,7 +90,7 @@ function newCodeEditor () { 'box-shadow: none;' + 'overflow:hidden;' + 'font-family: ' + UI_FONT.PRIMARY + ';' + - 'font-size: 12px;' + + 'font-size: 14px;' + 'background-color: rgb(' + UI_COLOR.RUSTED_RED + ');' + 'color:rgb(255, 255, 255);' + 'width: ' + thisObject.container.frame.width + 'px;' + diff --git a/FloatingSpace/ConditionEditor.js b/FloatingSpace/ConditionEditor.js index 373c5def7..b1b66d599 100644 --- a/FloatingSpace/ConditionEditor.js +++ b/FloatingSpace/ConditionEditor.js @@ -90,7 +90,7 @@ function newConditionEditor () { 'box-shadow: none;' + 'overflow:hidden;' + 'font-family: ' + UI_FONT.PRIMARY + ';' + - 'font-size: 12px;' + + 'font-size: 14px;' + 'background-color: rgb(' + UI_COLOR.GREEN + ');' + 'color:rgb(255, 255, 255);' + 'width: ' + thisObject.container.frame.width + 'px;' + diff --git a/FloatingSpace/ConfigEditor.js b/FloatingSpace/ConfigEditor.js index 83048c84a..920c90a76 100644 --- a/FloatingSpace/ConfigEditor.js +++ b/FloatingSpace/ConfigEditor.js @@ -34,7 +34,7 @@ function newConfigEditor () { thisObject.container.frame.position.y = 0 let isMouseOver = false - let SIZE_FACTOR = 0.6 + let SIZE_FACTOR = 0.8 return thisObject @@ -97,7 +97,7 @@ function newConfigEditor () { 'box-shadow: none;' + 'overflow:hidden;' + 'font-family: ' + UI_FONT.PRIMARY + ';' + - 'font-size: 12px;' + + 'font-size: 14px;' + 'background-color: rgb(' + UI_COLOR.DARK_TURQUOISE + ');' + 'color:rgb(255, 255, 255);' + 'width: ' + thisObject.container.frame.width + 'px;' + diff --git a/FloatingSpace/FormulaEditor.js b/FloatingSpace/FormulaEditor.js index f2e805485..42f599b77 100644 --- a/FloatingSpace/FormulaEditor.js +++ b/FloatingSpace/FormulaEditor.js @@ -90,7 +90,7 @@ function newFormulaEditor () { 'box-shadow: none;' + 'overflow:hidden;' + 'font-family: ' + UI_FONT.PRIMARY + ';' + - 'font-size: 12px;' + + 'font-size: 14px;' + 'background-color: rgb(' + UI_COLOR.MANGANESE_PURPLE + ');' + 'color:rgb(255, 255, 255);' + 'width: ' + thisObject.container.frame.width + 'px;' + From 7bd19305abce04af89fc8104b403115214ccac5f Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 27 Feb 2020 16:23:25 +0100 Subject: [PATCH 022/166] bug fixed --- Spaces/FloatingSpace.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index bd84fd983..66cc1c0f4 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -92,7 +92,8 @@ function newFloatingSpace () { payload.node.type === 'Network' || payload.node.type === 'Crypto Ecosystem' || payload.node.type === 'Charting Space' || - payload.node.type === 'Data Mine' + payload.node.type === 'Data Mine' || + payload.node.type === 'Super Scripts' ) { return false } From 7bc6568f6f57685cc68c4897190632420fe9fc31 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 28 Feb 2020 15:50:20 +0100 Subject: [PATCH 023/166] bug fixes --- .../FunctionLibraries/NodeDeleter.js | 55 ++++++++++--------- .../FunctionLibraries/SuperScripts.js | 6 +- DesignSpace/Workspace/Workspace.js | 2 +- FloatingSpace/UiObjectConstructor.js | 1 + 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js b/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js index 46ad39fcb..6287b01b8 100644 --- a/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js +++ b/DesignSpace/Workspace/FunctionLibraries/NodeDeleter.js @@ -56,38 +56,40 @@ function newNodeDeleter () { } /* Remove node from parent */ - if (node.payload.parentNode !== undefined) { - let parentNodeDefinition = APP_SCHEMA_MAP.get(node.payload.parentNode.type) - if (parentNodeDefinition !== undefined) { - if (parentNodeDefinition.properties !== undefined) { - for (let i = 0; i < parentNodeDefinition.properties.length; i++) { - let property = parentNodeDefinition.properties[i] - if (nodeDefinition.propertyNameAtParent === property.name) { - switch (property.type) { - case 'node': { - node.payload.parentNode[property.name] = undefined - } - break - case 'array': { - let nodePropertyArray = node.payload.parentNode[property.name] - if (nodePropertyArray !== undefined) { - for (let j = 0; j < nodePropertyArray.length; j++) { - let arrayItem = nodePropertyArray[j] - if (arrayItem.id === node.id) { + if (node.payload !== undefined) { + if (node.payload.parentNode !== undefined) { + let parentNodeDefinition = APP_SCHEMA_MAP.get(node.payload.parentNode.type) + if (parentNodeDefinition !== undefined) { + if (parentNodeDefinition.properties !== undefined) { + for (let i = 0; i < parentNodeDefinition.properties.length; i++) { + let property = parentNodeDefinition.properties[i] + if (nodeDefinition.propertyNameAtParent === property.name) { + switch (property.type) { + case 'node': { + node.payload.parentNode[property.name] = undefined + } + break + case 'array': { + let nodePropertyArray = node.payload.parentNode[property.name] + if (nodePropertyArray !== undefined) { + for (let j = 0; j < nodePropertyArray.length; j++) { + let arrayItem = nodePropertyArray[j] + if (arrayItem.id === node.id) { /* If this object is chained to the ones of the same type we need to give the next in the chain the reference to the current chain parent */ - if (nodeDefinition.chainedToSameType === true) { - if (j < nodePropertyArray.length - 1) { - let nextArrayItem = nodePropertyArray[j + 1] - nextArrayItem.payload.chainParent = node.payload.chainParent + if (nodeDefinition.chainedToSameType === true) { + if (j < nodePropertyArray.length - 1) { + let nextArrayItem = nodePropertyArray[j + 1] + nextArrayItem.payload.chainParent = node.payload.chainParent + } } - } - nodePropertyArray.splice(j, 1) + nodePropertyArray.splice(j, 1) + } } } } + break } - break } } } @@ -112,6 +114,9 @@ function newNodeDeleter () { } function cleanNode (node) { + if (node.payload === undefined) { return } + if (node === undefined) { return } + node.payload.targetPosition.x = undefined node.payload.targetPosition.y = undefined node.payload.visible = undefined diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index a2913fda7..7103935ec 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -5,7 +5,7 @@ function newSuperScriptsFunctions () { return thisObject - function runSuperScript (node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes) { + function runSuperScript (node, rootNodes, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) { try { let clone = functionLibraryNodeCloning.getNodeClone let executionResult = true @@ -17,6 +17,10 @@ function newSuperScriptsFunctions () { functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target) } + function deleteNode (node) { + functionLibraryNodeDeleter.deleteUIObject(node, rootNodes) + } + /* Validations */ if (executionResult === true && node.payload.parentNode === undefined) { node.payload.uiObject.setErrorMessage('Super Action node needs a Parent Node.') diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 547feb629..e6ffea0bd 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -368,7 +368,7 @@ function newWorkspace () { break case 'Run Super Action': { - functionLibrarySuperScripts.runSuperScript(payload.node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes) + functionLibrarySuperScripts.runSuperScript(payload.node, thisObject.workspaceNode.rootNodes, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes, functionLibraryNodeDeleter) } break case 'Remove Parent': diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index fa20f3cb6..9d6f5bb78 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -495,6 +495,7 @@ function newUiObjectConstructor () { } function destroyUiObject (payload) { + if (payload === undefined) { return } floatingLayer.removeFloatingObject(payload.floatingObject.handle) payload.floatingObject.finalize() From 5b63ec74267c9e3beb07830fb6801ff5b2c57d3d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 28 Feb 2020 18:16:59 +0100 Subject: [PATCH 024/166] Mouse Over Layers Panel to show them --- Canvas.js | 2 +- Panels/LayersPanel.js | 29 ++++++++++++++++++++++++++--- Spaces/PanelsSpace.js | 4 ++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Canvas.js b/Canvas.js index 18fe9869e..c8821179e 100644 --- a/Canvas.js +++ b/Canvas.js @@ -783,7 +783,7 @@ function newCanvas () { /* We check if the mouse is over a panel/ */ if (thisObject.panelsSpace !== undefined) { - container = thisObject.panelsSpace.getContainer(point) + container = thisObject.panelsSpace.getContainer(point, GET_CONTAINER_PURPOSE.MOUSE_OVER) if (container !== undefined && container.detectMouseOver === true) { containerFound() diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index 9381a844b..b95821ad7 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -18,8 +18,11 @@ function newLayersPanel () { thisObject.container.initialize() thisObject.container.isDraggeable = true thisObject.container.isWheelable = true + thisObject.container.detectMouseOver = true let isInitialized = false + let isMouseOver = false + let mouseOverCounter = 0 let layersMap = new Map() let visibleLayers = [] @@ -36,10 +39,12 @@ function newLayersPanel () { let posiblePanelHeight = (layerHeight + LAYER_SEPARATION) * posibleVisibleLayers + headerHeight + footerHeight let onMouseWheelEventSuscriptionId + let onMouseOverEventSuscriptionId return thisObject function finalize () { thisObject.container.eventHandler.stopListening(onMouseWheelEventSuscriptionId) + thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId) thisObject.panelTabButton.finalize() thisObject.panelTabButton = undefined @@ -74,6 +79,7 @@ function newLayersPanel () { thisObject.panelTabButton.initialize() onMouseWheelEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseWheel', onMouseWheel) + onMouseOverEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseOver', onMouseOver) readObjectState() @@ -166,6 +172,11 @@ function newLayersPanel () { } } + function onMouseOver (event) { + isMouseOver = true + mouseOverCounter = 100 + } + function onMouseWheel (event) { delta = event.wheelDelta if (delta > 0) { @@ -239,7 +250,7 @@ function newLayersPanel () { thisObject.container.eventHandler.raiseEvent('Layer Status Changed', layer) } - function getContainer (point) { + function getContainer (point, purpose) { if (isInitialized === false || thisObject.visible === false || thisObject.isHidden === true) { return } let container @@ -261,7 +272,9 @@ function newLayersPanel () { checkPoint = thisObject.fitFunction(checkPoint) if (point.x === checkPoint.x && point.y === checkPoint.y) { - return container + if (container.isForThisPurpose(purpose)) { + return container + } } } } @@ -291,8 +304,18 @@ function newLayersPanel () { readObjectState() } + function mouseOverPhysics () { + mouseOverCounter-- + if (mouseOverCounter < 0) { + mouseOverCounter = 0 + isMouseOver = false + } + } + function physics () { if (isInitialized === false) { return } + + mouseOverPhysics() thisObject.panelTabButton.physics() saveFrame(thisObject.payload, thisObject.container.frame) syncWithConfigPhysics() @@ -369,7 +392,7 @@ function newLayersPanel () { } function draw () { - if (isInitialized === false || thisObject.visible === false || thisObject.isHidden === true) { return } + if (isInitialized === false || thisObject.visible === false || thisObject.isHidden === true || isMouseOver === false) { return } // thisObject.container.frame.draw(false, false, false, thisObject.fitFunction) diff --git a/Spaces/PanelsSpace.js b/Spaces/PanelsSpace.js index b1bd3ebc6..970226f67 100644 --- a/Spaces/PanelsSpace.js +++ b/Spaces/PanelsSpace.js @@ -326,7 +326,7 @@ function newPanelsSpace () { } } - function getContainer (point) { + function getContainer (point, purpose) { if (thisObject.visible !== true) { return } let container @@ -339,7 +339,7 @@ function newPanelsSpace () { let owner = canvas.chartingSpace.inViewport.get(panel.owner) if (owner !== undefined) { if (panel.isVisible === true && panel.isHidden === false) { - container = panel.getContainer(point) + container = panel.getContainer(point, purpose) } } if (container !== undefined) { From fba71490a897906b8bd782ab2a48ed0517070386 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 28 Feb 2020 19:06:10 +0100 Subject: [PATCH 025/166] Bug fixed with tab button --- Canvas.js | 14 +++++++++----- Panels/LayersPanel.js | 2 +- Panels/PanelTabButton.js | 12 ++---------- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/Canvas.js b/Canvas.js index c8821179e..a0a5b6ad4 100644 --- a/Canvas.js +++ b/Canvas.js @@ -550,11 +550,15 @@ function newCanvas () { container = thisObject.panelsSpace.getContainer(point) - if (container !== undefined && container.isDraggeable === true && event.shiftKey === false) { - containerBeingDragged = container - containerDragStarted = true - containerBeingDragged.eventHandler.raiseEvent('onDragStarted', point) - return + if (container !== undefined && event.shiftKey === false) { + if (container.isDraggeable === true) { + containerBeingDragged = container + containerDragStarted = true + containerBeingDragged.eventHandler.raiseEvent('onDragStarted', point) + return + } else { + return + } } if (container !== undefined && container.isClickeable === true) { diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index b95821ad7..258c9d8b7 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -174,7 +174,7 @@ function newLayersPanel () { function onMouseOver (event) { isMouseOver = true - mouseOverCounter = 100 + mouseOverCounter = 150 } function onMouseWheel (event) { diff --git a/Panels/PanelTabButton.js b/Panels/PanelTabButton.js index 2d4b37565..38de1b23c 100644 --- a/Panels/PanelTabButton.js +++ b/Panels/PanelTabButton.js @@ -19,6 +19,7 @@ function newPanelTabButton () { thisObject.container.name = 'Panel Tab Button' thisObject.container.initialize() thisObject.container.isClickeable = true + thisObject.container.isDraggeable = false thisObject.container.frame.containerName = 'Panel Tab Button' /* Animation to hide the pannel */ @@ -127,19 +128,10 @@ function newPanelTabButton () { drawButton() } - function getContainer (point) { + function getContainer (point, purpose) { let container - - /* First we check if thisObject point is inside thisObject space. */ - if (thisObject.container.frame.isThisPointHere(point, true) === true) { - /* Now we see which is the inner most container that has it */ - return thisObject.container - } else { - /* This point does not belong to thisObject space. */ - - return undefined } } From aef98c8a931bb2f698d6f507d4f5098fc9732a0b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 28 Feb 2020 19:25:57 +0100 Subject: [PATCH 026/166] bug fixed --- Canvas.js | 4 ++-- Panels/LayersPanel.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Canvas.js b/Canvas.js index a0a5b6ad4..f111d7c0f 100644 --- a/Canvas.js +++ b/Canvas.js @@ -548,7 +548,7 @@ function newCanvas () { /* We check if the mouse is over a panel/ */ - container = thisObject.panelsSpace.getContainer(point) + container = thisObject.panelsSpace.getContainer(point, GET_CONTAINER_PURPOSE.DRAGGING) if (container !== undefined && event.shiftKey === false) { if (container.isDraggeable === true) { @@ -645,7 +645,7 @@ function newCanvas () { /* We check if the mouse is over a panel/ */ - container = thisObject.panelsSpace.getContainer(point) + container = thisObject.panelsSpace.getContainer(point, GET_CONTAINER_PURPOSE.MOUSE_CLICK) if (container !== undefined && container.isClickeable === true) { container.eventHandler.raiseEvent('onMouseClick', point) diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index 258c9d8b7..b5d89fbc7 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -272,7 +272,7 @@ function newLayersPanel () { checkPoint = thisObject.fitFunction(checkPoint) if (point.x === checkPoint.x && point.y === checkPoint.y) { - if (container.isForThisPurpose(purpose)) { + if (purpose !== GET_CONTAINER_PURPOSE.MOUSE_OVER) { return container } } From f6616d53ca6c7e836c521fe1ddc507a7b87e8040 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 29 Feb 2020 11:49:21 +0100 Subject: [PATCH 027/166] Layers Managers only when at the center of the time machine --- ChartingSpace/TimeMachine.js | 2 +- Frame.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 71122a7d9..0d2fdd1db 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -394,7 +394,7 @@ function newTimeMachine () { } function panelPhysics () { - if (thisObject.container.frame.isInViewPort() && canvas.chartingSpace.viewport.zoomTargetLevel > ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS) { + if (thisObject.container.frame.isCenterInViewPort() && canvas.chartingSpace.viewport.zoomTargetLevel > ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS) { canvas.panelsSpace.unHide(thisObject.payload.node.id, 'Layers Panel') canvas.panelsSpace.unHide(thisObject.payload.node.id, 'Plotter Panel') } else { diff --git a/Frame.js b/Frame.js index 3f8bb1590..f86a0a666 100644 --- a/Frame.js +++ b/Frame.js @@ -21,6 +21,7 @@ function newFrame () { isThisPointHere: isThisPointHere, // This function return true is the point received as parameter lives within this frame. isThisScreenPointHere: isThisScreenPointHere, isInViewPort: isInViewPort, + isCenterInViewPort: isCenterInViewPort, initialize: initialize, finalize: finalize } @@ -76,6 +77,24 @@ function newFrame () { } } + function isCenterInViewPort () { + /* This function is usefull to know if the object who has this frame is currently appearing at least in part at the canvas.chartingSpace.viewport */ + + point = { + x: thisObject.width / 2, + y: thisObject.height / 2 + } + + /* Now the transformations. */ + point = transformThisPoint(point, thisObject.container) + + if (point.x < canvas.chartingSpace.viewport.visibleArea.topRight.x && point.y < canvas.chartingSpace.viewport.visibleArea.bottomRight.y && point.x > canvas.chartingSpace.viewport.visibleArea.bottomLeft.x && point.y > canvas.chartingSpace.viewport.visibleArea.topLeft.y) { + return true + } else { + return false + } + } + function frameThisPoint (point) { /* We need not to modify the point received, so me make a copy of it. */ From 4c18794f5c0e9297170e5521d98d5fbbe92a1880 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 29 Feb 2020 12:02:17 +0100 Subject: [PATCH 028/166] improved --- Frame.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Frame.js b/Frame.js index f86a0a666..01ad949db 100644 --- a/Frame.js +++ b/Frame.js @@ -78,17 +78,24 @@ function newFrame () { } function isCenterInViewPort () { - /* This function is usefull to know if the object who has this frame is currently appearing at least in part at the canvas.chartingSpace.viewport */ + /* This function is usefull to know if the object who has this frame is currently appearing at least in part at the canvas.chartingSpace.viewport */ - point = { - x: thisObject.width / 2, - y: thisObject.height / 2 + point1 = { + x: thisObject.width * 25 / 100, + y: thisObject.height * 25 / 100 } - /* Now the transformations. */ - point = transformThisPoint(point, thisObject.container) + point3 = { + x: thisObject.width * 75 / 100, + y: thisObject.height * 75 / 100 + } - if (point.x < canvas.chartingSpace.viewport.visibleArea.topRight.x && point.y < canvas.chartingSpace.viewport.visibleArea.bottomRight.y && point.x > canvas.chartingSpace.viewport.visibleArea.bottomLeft.x && point.y > canvas.chartingSpace.viewport.visibleArea.topLeft.y) { + /* Now the transformations. */ + + point1 = transformThisPoint(point1, thisObject.container) + point3 = transformThisPoint(point3, thisObject.container) + + if (point1.x < canvas.chartingSpace.viewport.visibleArea.topRight.x && point1.y < canvas.chartingSpace.viewport.visibleArea.bottomRight.y && point3.x > canvas.chartingSpace.viewport.visibleArea.bottomLeft.x && point3.y > canvas.chartingSpace.viewport.visibleArea.topLeft.y) { return true } else { return false From cf77cd52bb054b06eb04f8c8788a8f3178009842 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 29 Feb 2020 12:21:50 +0100 Subject: [PATCH 029/166] Update PanelsSpace.js --- Spaces/PanelsSpace.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Spaces/PanelsSpace.js b/Spaces/PanelsSpace.js index 970226f67..831f8fa50 100644 --- a/Spaces/PanelsSpace.js +++ b/Spaces/PanelsSpace.js @@ -347,7 +347,7 @@ function newPanelsSpace () { return container } } - thisObject.container.space = 'Panels Space' - return thisObject.container + // thisObject.container.space = 'Panels Space' + // return thisObject.container } } From 89fe5bc73d0bda929fca672fdb323df8561c46c9 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 29 Feb 2020 13:53:38 +0100 Subject: [PATCH 030/166] Changes in SHIFT --- Canvas.js | 4 +++- ChartingSpace/EdgeEditor.js | 17 ++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Canvas.js b/Canvas.js index f111d7c0f..f938244dd 100644 --- a/Canvas.js +++ b/Canvas.js @@ -578,7 +578,9 @@ function newCanvas () { return } else { if (container.isClickeable === false) { - viewPortBeingDragged = true + if (event.buttons === 2) { + viewPortBeingDragged = true + } } return } diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index f40dffd2f..d966088a9 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -77,17 +77,20 @@ function newEdgeEditor () { switch (event.buttons) { case 1: { buttonUsedForDragging = 'left mouse button' + if (event.shiftKey === true) { + buttonUsedForDragging = 'left mouse button + SHIFT' + } break } case 2: { - buttonUsedForDragging = 'right mouse button' + buttonUsedForDragging = 'right mouse button' // this will never happen as of today break } } } function getContainer (event, purpose) { - if (thisObject.container.frame.isThisPointHere(event, undefined, undefined, -EDGE_SIZE) === true && event.shiftKey !== true) { + if (thisObject.container.frame.isThisPointHere(event, undefined, undefined, -EDGE_SIZE) === true && event.buttons !== 2) { let point = { x: event.x, y: event.y @@ -143,7 +146,7 @@ function newEdgeEditor () { switch (whereIsMouseOver) { case 'center': { switch (buttonUsedForDragging) { - case 'right mouse button': { + case 'left mouse button + SHIFT': { /* This is equivalent to drag the whole Time Machine, so we will apply the translation received onto the Time Machine container. */ thisObject.container.parentContainer.frame.position.x = thisObject.container.parentContainer.frame.position.x + dragVector.x thisObject.container.parentContainer.frame.position.y = thisObject.container.parentContainer.frame.position.y + dragVector.y @@ -198,7 +201,7 @@ function newEdgeEditor () { coordinateSystem.recalculateScale(event) break } - case 'right mouse button': { + case 'left mouse button + SHIFT': { coordinateSystem.maxHeight = thisObject.container.parentContainer.frame.height coordinateSystem.recalculateScale() break @@ -231,7 +234,7 @@ function newEdgeEditor () { coordinateSystem.recalculateScale(event) break } - case 'right mouse button': { + case 'left mouse button + SHIFT': { coordinateSystem.maxHeight = thisObject.container.parentContainer.frame.height coordinateSystem.recalculateScale() break @@ -260,7 +263,7 @@ function newEdgeEditor () { coordinateSystem.recalculateScale() break } - case 'right mouse button': { + case 'left mouse button + SHIFT': { coordinateSystem.maxWidth = thisObject.container.parentContainer.frame.width coordinateSystem.recalculateScale() break @@ -289,7 +292,7 @@ function newEdgeEditor () { coordinateSystem.recalculateScale() break } - case 'right mouse button': { + case 'left mouse button + SHIFT': { coordinateSystem.maxWidth = thisObject.container.parentContainer.frame.width coordinateSystem.recalculateScale() break From c30199ca4899db47a90b74bc0b13cabfd7955049 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 1 Mar 2020 12:48:26 +0100 Subject: [PATCH 031/166] Bug Fixed --- Spaces/FloatingSpace.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 66cc1c0f4..c71a05310 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -252,10 +252,26 @@ function newFloatingSpace () { function physics () { if (visible === true) { browserZoomPhysics() + positionContraintsPhysics() thisObject.floatingLayer.physics() } } + function positionContraintsPhysics () { + if (thisObject.container.frame.position.x > 0) { + thisObject.container.frame.position.x = 0 + } + if (thisObject.container.frame.position.y > 0) { + thisObject.container.frame.position.y = 0 + } + if (thisObject.container.frame.position.x + thisObject.container.frame.width < browserCanvas.width) { + thisObject.container.frame.position.x = browserCanvas.width - thisObject.container.frame.width + } + if (thisObject.container.frame.position.y + thisObject.container.frame.height < browserCanvas.height) { + thisObject.container.frame.position.y = browserCanvas.height - thisObject.container.frame.height + } + } + function browserZoomPhysics () { if (devicePixelRatio !== window.devicePixelRatio) { devicePixelRatio = window.devicePixelRatio From 1cd2482461c7e9d8aa387c3669d40ff8eae5d1c3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 1 Mar 2020 13:20:54 +0100 Subject: [PATCH 032/166] Datamining can run all --- .../FunctionLibraries/TaskFunctions.js | 22 ++++++++++++++++++- DesignSpace/Workspace/Workspace.js | 10 +++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js b/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js index ff624cb88..449b15205 100644 --- a/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js @@ -3,7 +3,9 @@ function newTaskFunctions () { runTask: runTask, stopTask: stopTask, runAllTasks: runAllTasks, - stopAllTasks: stopAllTasks + stopAllTasks: stopAllTasks, + runAllTaskManagers: runAllTaskManagers, + stopAllTaskManagers: stopAllTaskManagers } return thisObject @@ -107,4 +109,22 @@ function newTaskFunctions () { menu.internalClick('Stop Task') } } + + function runAllTaskManagers (dataMining, functionLibraryProtocolNode) { + for (let i = 0; i < dataMining.taskManagers.length; i++) { + let node = dataMining.taskManagers[i] + let menu = node.payload.uiObject.menu + + menu.internalClick('Run All Tasks') + } + } + + function stopAllTaskManagers (dataMining, functionLibraryProtocolNode) { + for (let i = 0; i < dataMining.taskManagers.length; i++) { + let node = dataMining.taskManagers[i] + let menu = node.payload.uiObject.menu + + menu.internalClick('Stop All Tasks') + } + } } diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index e6ffea0bd..0f3174d7e 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -356,6 +356,16 @@ function newWorkspace () { functionLibraryTaskFunctions.stopAllTasks(payload.node, functionLibraryProtocolNode) } break + case 'Run All Task Managers': + { + functionLibraryTaskFunctions.runAllTaskManagers(payload.node, functionLibraryProtocolNode) + } + break + case 'Stop All Task Managers': + { + functionLibraryTaskFunctions.stopAllTaskManagers(payload.node, functionLibraryProtocolNode) + } + break case 'Run Session': { functionLibrarySessionFunctions.runSession(payload.node, functionLibraryProtocolNode, callBackFunction) From 737f17591e55436aebca8055452ce83b9ff3b1c3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 1 Mar 2020 13:58:51 +0100 Subject: [PATCH 033/166] Displaying how many are running --- FloatingSpace/UiObject.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index ee4510d2c..15cf760d1 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -277,6 +277,33 @@ function newUiObject () { chainAttachingPhysics() referenceDetachingPhysics() referenceAttachingPhysics() + childrenRunningPhysics() + } + + function childrenRunningPhysics () { + let nodeDefinition = APP_SCHEMA_MAP.get(thisObject.payload.node.type) + if (nodeDefinition.properties === undefined) { return } + for (let i = 0; i < nodeDefinition.properties.length; i++) { + let property = nodeDefinition.properties[i] + if (property.monitorChildrenRunning === true) { + let children = thisObject.payload.node[property.name] + let totalRunning = 0 + for (let j = 0; j < children.length; j++) { + let child = children[j] + if (child.payload.uiObject.isRunning === true) { + totalRunning++ + } + } + if (totalRunning > 0) { + setValue(totalRunning + ' / ' + children.length + ' Running') + thisObject.isRunning = true + } else { + thisObject.isRunning = false + } + + return + } + } } function chainAttachingPhysics () { From dd51a96a500287a7f646ea5ce0208caf113ad562 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 1 Mar 2020 15:35:18 +0100 Subject: [PATCH 034/166] Low Res Plotters --- Globals.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Globals.js b/Globals.js index 24454d260..161e1c706 100644 --- a/Globals.js +++ b/Globals.js @@ -44,7 +44,8 @@ UI_FONT = { const DEBUG = {} const ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS = 5 // This regulates some behavious changes that happens when the user zoom out below this level. const ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME = 5 // This help regulate when to change the Time Frame base on the level of zoom out. -const ZOOM_OUT_THRESHOLD_FOR_PACKING_OBJECTS_AT_THE_BOTTOM_OR_TOP_OF_VIEWPORT = 5 +const ZOOM_OUT_THRESHOLD_FOR_PACKING_OBJECTS_AT_THE_BOTTOM_OR_TOP_OF_VIEWPORT = 2 +const ZOOM_OUT_THRESHOLD_FOR_PLOTTING_IN_LOW_RESOLUTION = 3 let FONT_ASPECT_RATIO = 0.32; From df176c3a1884b2eb4234ad1069a6938c7e65310d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 14:13:57 +0100 Subject: [PATCH 035/166] Improvement, time machine icons --- ChartingSpace/TimeMachine.js | 36 +++++++++++++++++++----------------- Globals.js | 1 + 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 0d2fdd1db..6e5620fcd 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -540,24 +540,26 @@ function newTimeMachine () { if (thisObject.rateScale !== undefined && thisObject.rateScale.isVisible === true) { thisObject.rateScale.draw() } } } else { - let icon = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) - if (icon !== undefined) { - if (icon.canDrawIcon === true) { - let imageSize = 40 - let imagePosition = { - x: thisObject.container.frame.width / 2, - y: thisObject.container.frame.height / 2 + if (canvas.chartingSpace.viewport.zoomTargetLevel < ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_TIME_MACHINES_ICONIZED) { + let icon = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) + if (icon !== undefined) { + if (icon.canDrawIcon === true) { + let imageSize = 40 + let imagePosition = { + x: thisObject.container.frame.width / 2, + y: thisObject.container.frame.height / 2 + } + + imagePosition = transformThisPoint(imagePosition, thisObject.container) + imagePosition = thisObject.fitFunction(imagePosition, true) + + browserCanvasContext.drawImage( + icon, + imagePosition.x - imageSize / 2, + imagePosition.y - imageSize / 2, + imageSize, + imageSize) } - - imagePosition = transformThisPoint(imagePosition, thisObject.container) - imagePosition = thisObject.fitFunction(imagePosition, true) - - browserCanvasContext.drawImage( - icon, - imagePosition.x - imageSize / 2, - imagePosition.y - imageSize / 2, - imageSize, - imageSize) } } } diff --git a/Globals.js b/Globals.js index 161e1c706..375fd8c90 100644 --- a/Globals.js +++ b/Globals.js @@ -46,6 +46,7 @@ const ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS = 5 // This regulates some behavious const ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME = 5 // This help regulate when to change the Time Frame base on the level of zoom out. const ZOOM_OUT_THRESHOLD_FOR_PACKING_OBJECTS_AT_THE_BOTTOM_OR_TOP_OF_VIEWPORT = 2 const ZOOM_OUT_THRESHOLD_FOR_PLOTTING_IN_LOW_RESOLUTION = 3 +const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_TIME_MACHINES_ICONIZED = 4 let FONT_ASPECT_RATIO = 0.32; From d4f6394a52708bf66a13bfa422dfd6121fc60ebb Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 15:10:00 +0100 Subject: [PATCH 036/166] Improvement arrow keys to move charts --- Canvas.js | 1 + ChartingSpace/EdgeEditor.js | 58 +++++++++++++++++++++++++++--------- ChartingSpace/TimeMachine.js | 15 ++++++++++ Globals.js | 2 +- Spaces/ChartingSpace.js | 11 +++++++ 5 files changed, 72 insertions(+), 15 deletions(-) diff --git a/Canvas.js b/Canvas.js index f938244dd..7745830a2 100644 --- a/Canvas.js +++ b/Canvas.js @@ -250,6 +250,7 @@ function newCanvas () { thisObject.mouse.action = 'key down' checkMediaRecording(event) + canvas.chartingSpace.onKeyPressed(event) let nodeOnFocus = canvas.designSpace.workspace.getNodeThatIsOnFocus() if (nodeOnFocus !== undefined) { diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index d966088a9..9af754c0b 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -5,6 +5,8 @@ function newEdgeEditor () { container: undefined, fitFunction: undefined, isVisible: true, + isMouseOver: undefined, + onKeyPressed: onKeyPressed, physics: physics, drawForeground: drawForeground, getContainer: getContainer, @@ -22,8 +24,7 @@ function newEdgeEditor () { thisObject.container.isWheelable = false thisObject.container.detectMouseOver = true - let buttonUsedForDragging - let isMouseOver + let whatHappened let whereIsMouseOver = 'outside' let coordinateSystem @@ -60,7 +61,7 @@ function newEdgeEditor () { } function onMouseOver (event) { - isMouseOver = true + thisObject.isMouseOver = true mouse = { position: { x: event.x, @@ -70,25 +71,39 @@ function newEdgeEditor () { } function onMouseNotOver () { - isMouseOver = false + thisObject.isMouseOver = false } function onDragStarted (event) { switch (event.buttons) { case 1: { - buttonUsedForDragging = 'left mouse button' + whatHappened = 'left mouse button' if (event.shiftKey === true) { - buttonUsedForDragging = 'left mouse button + SHIFT' + whatHappened = 'left mouse button + SHIFT' } break } case 2: { - buttonUsedForDragging = 'right mouse button' // this will never happen as of today + whatHappened = 'right mouse button' // this will never happen as of today break } } } + function onKeyPressed (event) { + const STEP = 10 + + if (event.shiftKey === false && event.code === 'ArrowLeft') { + thisObject.container.frame.position.x = thisObject.container.frame.position.x + STEP + } + + if (event.shiftKey === false && event.code === 'ArrowRight') { + thisObject.container.frame.position.x = thisObject.container.frame.position.x - STEP + } + + whatHappened = 'left or right arrow key pressed' + } + function getContainer (event, purpose) { if (thisObject.container.frame.isThisPointHere(event, undefined, undefined, -EDGE_SIZE) === true && event.buttons !== 2) { let point = { @@ -145,7 +160,7 @@ function newEdgeEditor () { switch (whereIsMouseOver) { case 'center': { - switch (buttonUsedForDragging) { + switch (whatHappened) { case 'left mouse button + SHIFT': { /* This is equivalent to drag the whole Time Machine, so we will apply the translation received onto the Time Machine container. */ thisObject.container.parentContainer.frame.position.x = thisObject.container.parentContainer.frame.position.x + dragVector.x @@ -172,6 +187,21 @@ function newEdgeEditor () { } coordinateSystem.recalculateScale(event) } + case 'left or right arrow key pressed': { + let point = { + x: -dragVector.x, + y: 0 + } + let newMinDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) + let xDifferenceMaxMin = coordinateSystem.max.x - coordinateSystem.min.x + coordinateSystem.min.x = newMinDate.valueOf() + coordinateSystem.max.x = newMinDate.valueOf() + xDifferenceMaxMin + let event = { + type: 'center dragged', + dragVector: dragVector + } + coordinateSystem.recalculateScale(event) + } } thisObject.container.parentContainer.eventHandler.raiseEvent('onMouseOver', mouse.position) break @@ -190,7 +220,7 @@ function newEdgeEditor () { thisObject.container.parentContainer.frame.position.y = thisObject.container.parentContainer.frame.position.y + dragVector.y thisObject.container.parentContainer.frame.height = thisObject.container.parentContainer.frame.height - dragVector.y - switch (buttonUsedForDragging) { + switch (whatHappened) { case 'left mouse button': { coordinateSystem.max.y = newMaxRate coordinateSystem.maxHeight = thisObject.container.parentContainer.frame.height @@ -223,7 +253,7 @@ function newEdgeEditor () { thisObject.container.parentContainer.frame.height = thisObject.container.parentContainer.frame.height + dragVector.y - switch (buttonUsedForDragging) { + switch (whatHappened) { case 'left mouse button': { coordinateSystem.min.y = newMinRate coordinateSystem.maxHeight = thisObject.container.parentContainer.frame.height @@ -256,7 +286,7 @@ function newEdgeEditor () { thisObject.container.parentContainer.frame.position.x = thisObject.container.parentContainer.frame.position.x + dragVector.x thisObject.container.parentContainer.frame.width = thisObject.container.parentContainer.frame.width - dragVector.x - switch (buttonUsedForDragging) { + switch (whatHappened) { case 'left mouse button': { coordinateSystem.min.x = newMinDate.valueOf() coordinateSystem.maxWidth = thisObject.container.parentContainer.frame.width @@ -285,7 +315,7 @@ function newEdgeEditor () { thisObject.container.parentContainer.frame.width = thisObject.container.parentContainer.frame.width + dragVector.x - switch (buttonUsedForDragging) { + switch (whatHappened) { case 'left mouse button': { coordinateSystem.max.x = newMaxDate.valueOf() coordinateSystem.maxWidth = thisObject.container.parentContainer.frame.width @@ -309,7 +339,7 @@ function newEdgeEditor () { let edgeSize let lineWidth - if (whereIsMouseOver === 'outside' || isMouseOver === false) { + if (whereIsMouseOver === 'outside' || thisObject.isMouseOver === false) { edgeSize = EDGE_SIZE / 2 lineWidth = 0.1 } else { @@ -462,7 +492,7 @@ function newEdgeEditor () { drawEdge('left') function drawEdge (edgeType) { - if (whereIsMouseOver === edgeType && isMouseOver === true) { + if (whereIsMouseOver === edgeType && thisObject.isMouseOver === true) { browserCanvasContext.lineWidth = lineWidth browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + OPACITY + ')' browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + OPACITY + ')' diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 6e5620fcd..d6bbb9170 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -22,6 +22,8 @@ function newTimeMachine () { rateScale: undefined, payload: undefined, edgeEditor: undefined, + onFocus: undefined, + onKeyPressed: onKeyPressed, timelineCharts: [], fitFunction: fitFunction, physics: physics, @@ -157,6 +159,10 @@ function newTimeMachine () { callBackFunction() } + function onKeyPressed (event) { + thisObject.edgeEditor.onKeyPressed(event) + } + function onMouseOver (event) { drawScales = true @@ -391,6 +397,15 @@ function newTimeMachine () { syncWithDesigner() } panelPhysics() + onFocusPhysics() + } + + function onFocusPhysics () { + if (thisObject.edgeEditor.isMouseOver === true) { + thisObject.onFocus = true + } else { + thisObject.onFocus = false + } } function panelPhysics () { diff --git a/Globals.js b/Globals.js index 375fd8c90..61b579d57 100644 --- a/Globals.js +++ b/Globals.js @@ -46,7 +46,7 @@ const ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS = 5 // This regulates some behavious const ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME = 5 // This help regulate when to change the Time Frame base on the level of zoom out. const ZOOM_OUT_THRESHOLD_FOR_PACKING_OBJECTS_AT_THE_BOTTOM_OR_TOP_OF_VIEWPORT = 2 const ZOOM_OUT_THRESHOLD_FOR_PLOTTING_IN_LOW_RESOLUTION = 3 -const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_TIME_MACHINES_ICONIZED = 4 +const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_TIME_MACHINES_ICONIZED = 5 let FONT_ASPECT_RATIO = 0.32; diff --git a/Spaces/ChartingSpace.js b/Spaces/ChartingSpace.js index cb82c62ba..d1727cac8 100644 --- a/Spaces/ChartingSpace.js +++ b/Spaces/ChartingSpace.js @@ -19,6 +19,7 @@ function newChartingSpace () { timeMachines: undefined, viewport: undefined, payload: undefined, + onKeyPressed: onKeyPressed, reset: reset, oneScreenUp: oneScreenUp, oneScreenDown: oneScreenDown, @@ -263,6 +264,16 @@ function newChartingSpace () { syncWithDesigner() } + function onKeyPressed (event) { + if (thisObject.visible !== true) { return } + for (let j = 0; j < thisObject.timeMachines.length; j++) { + let timeMachine = thisObject.timeMachines[j] + if (timeMachine.onFocus === true) { + timeMachine.onKeyPressed(event) + } + } + } + function syncWithDesigner () { if (thisObject.payload === undefined) { return } if (thisObject.payload.node === undefined) { return } From 296c151c88f433f80cd678766e79d55c698bacb1 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 16:15:11 +0100 Subject: [PATCH 037/166] Layer tunned up --- Panels/Layer.js | 101 ++++++++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 41 deletions(-) diff --git a/Panels/Layer.js b/Panels/Layer.js index f17574b6c..3fde42d7e 100644 --- a/Panels/Layer.js +++ b/Panels/Layer.js @@ -11,6 +11,15 @@ function newLayer () { payload: undefined, definition: undefined, panels: undefined, + baseAsset: undefined, + quotedAsset: undefined, + market: undefined, + exchange: undefined, + plotterModule: undefined, + exchangeIcon: undefined, + plotterTypeIcon: undefined, + baseAssetIcon: undefined, + quotedAssetIcon: undefined, physics: physics, draw: draw, turnOff: turnOff, @@ -79,6 +88,8 @@ function newLayer () { return thisObject function finalize () { + thisObject.container.eventHandler.stopListening(onMouseClickEventSuscriptionId) + thisObject.container.finalize() thisObject.eventHandler.finalize() thisObject.container = undefined @@ -107,7 +118,15 @@ function newLayer () { panelsVisibleButton = undefined - thisObject.container.eventHandler.stopListening(onMouseClickEventSuscriptionId) + thisObject.baseAsset = undefined + thisObject.quotedAsset = undefined + thisObject.market = undefined + thisObject.exchange = undefined + thisObject.plotterModule = undefined + thisObject.exchangeIcon = undefined + thisObject.plotterTypeIcon = undefined + thisObject.baseAssetIcon = undefined + thisObject.quotedAssetIcon = undefined } function initialize (callBackFunction) { @@ -170,6 +189,41 @@ function newLayer () { /* Lets listen to our own events to react when we have a Mouse Click */ onMouseClickEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseClick', onMouseClick) + /* Get ready to draw this layer */ + thisObject.baseAsset = thisObject.definition.referenceParent.parentNode.referenceParent.baseAsset.referenceParent + thisObject.quotedAsset = thisObject.definition.referenceParent.parentNode.referenceParent.quotedAsset.referenceParent + thisObject.market = thisObject.baseAsset.code.codeName + '/' + thisObject.quotedAsset.code.codeName + thisObject.exchange = thisObject.definition.referenceParent.parentNode.referenceParent.parentNode.parentNode + thisObject.plotterModule = thisObject.definition.referenceParent.referenceParent.referenceParent + + thisObject.exchangeIcon = getIcon(thisObject.exchange) + + if (thisObject.plotterModule.code.icon !== undefined) { + thisObject.plotterTypeIcon = canvas.designSpace.iconCollection.get(thisObject.plotterModule.code.icon) + } + + thisObject.baseAssetIcon = getIcon(thisObject.baseAsset) + thisObject.quotedAssetIcon = getIcon(thisObject.quotedAsset) + + function getIcon (node) { + let nodeDefinition = APP_SCHEMA_MAP.get(node.type) + let iconName + if (nodeDefinition.alternativeIcons !== undefined) { + for (let i = 0; i < nodeDefinition.alternativeIcons.length; i++) { + alternativeIcon = nodeDefinition.alternativeIcons[i] + if (alternativeIcon.codeName === node.code.codeName) { + iconName = alternativeIcon.iconName + } + } + } + if (iconName !== undefined) { + icon = canvas.designSpace.iconCollection.get(iconName) + } else { + icon = canvas.designSpace.iconCollection.get(nodeDefinition.icon) + } + return icon + } + callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) } catch (err) { if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> err = ' + err.stack) } @@ -454,49 +508,14 @@ function newLayer () { } function drawLayerDisplay () { - let baseAsset = thisObject.definition.referenceParent.parentNode.referenceParent.baseAsset.referenceParent - let quotedAsset = thisObject.definition.referenceParent.parentNode.referenceParent.quotedAsset.referenceParent - let market = baseAsset.code.codeName + '/' + quotedAsset.code.codeName - let exchange = thisObject.definition.referenceParent.parentNode.referenceParent.parentNode.parentNode - let plotterModule = thisObject.definition.referenceParent.referenceParent.referenceParent - let label1 = thisObject.payload.node.name - let label2 = exchange.name.substring(0, 15) + ' - ' + market + let label2 = thisObject.exchange.name.substring(0, 15) + ' - ' + thisObject.market let label3 = thisObject.status.toUpperCase() if (label1 !== undefined) { label1 = label1.substring(0, 22) } - let icon1 = getIcon(exchange) - - let icon2 - if (plotterModule.code.icon !== undefined) { - icon2 = canvas.designSpace.iconCollection.get(plotterModule.code.icon) - } - - let icon3 = getIcon(baseAsset) - let icon4 = getIcon(quotedAsset) - - function getIcon (node) { - let nodeDefinition = APP_SCHEMA_MAP.get(node.type) - let iconName - if (nodeDefinition.alternativeIcons !== undefined) { - for (let i = 0; i < nodeDefinition.alternativeIcons.length; i++) { - alternativeIcon = nodeDefinition.alternativeIcons[i] - if (alternativeIcon.codeName === node.code.codeName) { - iconName = alternativeIcon.iconName - } - } - } - if (iconName !== undefined) { - icon = canvas.designSpace.iconCollection.get(iconName) - } else { - icon = canvas.designSpace.iconCollection.get(nodeDefinition.icon) - } - return icon - } - let backgroundColor = UI_COLOR.BLACK const RED_LINE_HIGHT = 4 @@ -523,9 +542,9 @@ function newLayer () { drawProgressBar(singleFileProgressBar, 1, -47) drawProgressBar(fileSequenceProgressBar, 1, -48) - drawIcon(icon1, 1 / 8, 2 / 10, 0, 0, 14, thisObject.container) - drawIcon(icon2, 7 / 8, 2 / 10, 0, 0, 14, thisObject.container) - drawIcon(icon3, 3.4 / 8, 2 / 10, 0, 0, 14, thisObject.container) - drawIcon(icon4, 4.6 / 8, 2 / 10, 0, 0, 14, thisObject.container) + drawIcon(thisObject.exchangeIcon, 1 / 8, 2 / 10, 0, 0, 14, thisObject.container) + drawIcon(thisObject.plotterTypeIcon, 7 / 8, 2 / 10, 0, 0, 14, thisObject.container) + drawIcon(thisObject.baseAssetIcon, 3.4 / 8, 2 / 10, 0, 0, 14, thisObject.container) + drawIcon(thisObject.quotedAssetIcon, 4.6 / 8, 2 / 10, 0, 0, 14, thisObject.container) } } From 8a3e2b71f0677f1aaefd110a8e8a1993a29ee274 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 19:02:21 +0100 Subject: [PATCH 038/166] Showing Exchange Names --- ChartingSpace/EdgeEditor.js | 6 ++-- ChartingSpace/TimeMachine.js | 56 +++++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 9af754c0b..402418a3c 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -95,13 +95,15 @@ function newEdgeEditor () { if (event.shiftKey === false && event.code === 'ArrowLeft') { thisObject.container.frame.position.x = thisObject.container.frame.position.x + STEP + whatHappened = 'left or right arrow key pressed' + return } if (event.shiftKey === false && event.code === 'ArrowRight') { thisObject.container.frame.position.x = thisObject.container.frame.position.x - STEP + whatHappened = 'left or right arrow key pressed' + return } - - whatHappened = 'left or right arrow key pressed' } function getContainer (event, purpose) { diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index d6bbb9170..e9cca3d59 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -604,23 +604,71 @@ function newTimeMachine () { x: 0, y: 0 } - let imageSize = 25 - let fontSize = 25 + let imageSize = 12 + let fontSize = 15 let opacity = 1 let icon = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) position = transformThisPoint(position, thisObject.container) - printLabel(thisObject.payload.node.name, position.x + 30, position.y - 10, opacity, fontSize) + printLabel(thisObject.payload.node.name, position.x + 30, position.y - 25, opacity, fontSize) if (icon !== undefined) { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( icon, position.x - 0, - position.y - 30, + position.y - 37, imageSize, imageSize) } } + + imageSize = 10 + let exchangeMarkets = new Map() + + for (let i = 0; i < thisObject.timelineCharts.length; i++) { + let timelinechart = thisObject.timelineCharts[i] + if (timelinechart.layersManager !== undefined) { + for (let j = 0; j < timelinechart.layersManager.layers.length; j++) { + let layer = timelinechart.layersManager.layers[j] + + exchangeMarket = { + exchangeName: layer.exchange.name, + marketName: layer.market, + exchangeIcon: layer.exchangeIcon, + baseAssetIcon: layer.baseAssetIcon, + quotedAssetIcon: layer.quotedAssetIcon + } + exchangeMarkets.set(exchangeMarket.exhangeName + '-' + exchangeMarket.marketName, exchangeMarket) + } + } + } + + const INTER_EXCHANGE_SPACE = 60 + let xOffset = 15 + + exchangeMarkets.forEach((exchangeMarket, i) => { + position = { + x: xOffset, + y: 0 + } + + icon = exchangeMarket.exchangeIcon + position = transformThisPoint(position, thisObject.container) + + if (icon !== undefined) { + if (icon.canDrawIcon === true) { + browserCanvasContext.drawImage( + icon, position.x - 0, + position.y - 20, + imageSize, + imageSize) + } + } + + printLabel(exchangeMarket.exchangeName, position.x + 15, position.y - 10, opacity, fontSize) + + xOffset = xOffset + INTER_EXCHANGE_SPACE + }) } function recalculateCoordinateSystem () { From 8c5e6013ce7231e32241a159363491adc86aa15c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 19:13:50 +0100 Subject: [PATCH 039/166] markets showing up --- ChartingSpace/TimeMachine.js | 40 ++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index e9cca3d59..882a66d99 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -622,7 +622,7 @@ function newTimeMachine () { } } - imageSize = 10 + imageSize = 12 let exchangeMarkets = new Map() for (let i = 0; i < thisObject.timelineCharts.length; i++) { @@ -644,6 +644,8 @@ function newTimeMachine () { } const INTER_EXCHANGE_SPACE = 60 + const INTER_MARKET_SPACE = 90 + let xOffset = 15 exchangeMarkets.forEach((exchangeMarket, i) => { @@ -659,7 +661,7 @@ function newTimeMachine () { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( icon, position.x - 0, - position.y - 20, + position.y - 22, imageSize, imageSize) } @@ -668,6 +670,39 @@ function newTimeMachine () { printLabel(exchangeMarket.exchangeName, position.x + 15, position.y - 10, opacity, fontSize) xOffset = xOffset + INTER_EXCHANGE_SPACE + + position = { + x: xOffset, + y: 0 + } + + position = transformThisPoint(position, thisObject.container) + + icon = exchangeMarket.baseAssetIcon + if (icon !== undefined) { + if (icon.canDrawIcon === true) { + browserCanvasContext.drawImage( + icon, position.x - 0, + position.y - 22, + imageSize, + imageSize) + } + } + + printLabel(exchangeMarket.marketName, position.x + 15, position.y - 10, opacity, fontSize) + + icon = exchangeMarket.quotedAssetIcon + if (icon !== undefined) { + if (icon.canDrawIcon === true) { + browserCanvasContext.drawImage( + icon, position.x + 70, + position.y - 22, + imageSize, + imageSize) + } + } + + xOffset = xOffset + INTER_MARKET_SPACE }) } @@ -690,3 +725,4 @@ function newTimeMachine () { ) } } + From db0cabb921a4d0b5688a5ef95715746f97e054a5 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 19:33:20 +0100 Subject: [PATCH 040/166] Almost Working --- ChartingSpace/TimeMachine.js | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 882a66d99..f7350ad0c 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -610,19 +610,20 @@ function newTimeMachine () { let icon = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) position = transformThisPoint(position, thisObject.container) - printLabel(thisObject.payload.node.name, position.x + 30, position.y - 25, opacity, fontSize) + printLabel(thisObject.payload.node.name, position.x + 15, position.y - 28, opacity, fontSize) if (icon !== undefined) { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( icon, position.x - 0, - position.y - 37, + position.y - 40, imageSize, imageSize) } } imageSize = 12 + fontSize = 15 let exchangeMarkets = new Map() for (let i = 0; i < thisObject.timelineCharts.length; i++) { @@ -646,16 +647,8 @@ function newTimeMachine () { const INTER_EXCHANGE_SPACE = 60 const INTER_MARKET_SPACE = 90 - let xOffset = 15 - exchangeMarkets.forEach((exchangeMarket, i) => { - position = { - x: xOffset, - y: 0 - } - icon = exchangeMarket.exchangeIcon - position = transformThisPoint(position, thisObject.container) if (icon !== undefined) { if (icon.canDrawIcon === true) { @@ -669,14 +662,7 @@ function newTimeMachine () { printLabel(exchangeMarket.exchangeName, position.x + 15, position.y - 10, opacity, fontSize) - xOffset = xOffset + INTER_EXCHANGE_SPACE - - position = { - x: xOffset, - y: 0 - } - - position = transformThisPoint(position, thisObject.container) + position.x = position.x + INTER_EXCHANGE_SPACE icon = exchangeMarket.baseAssetIcon if (icon !== undefined) { @@ -702,7 +688,7 @@ function newTimeMachine () { } } - xOffset = xOffset + INTER_MARKET_SPACE + position.x = position.x + INTER_MARKET_SPACE }) } @@ -725,4 +711,3 @@ function newTimeMachine () { ) } } - From d1d9876754e480a58eacb9343c9df08ab08cc6c7 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 19:38:07 +0100 Subject: [PATCH 041/166] Finished --- ChartingSpace/TimeMachine.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index f7350ad0c..ab7f8f71c 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -604,7 +604,7 @@ function newTimeMachine () { x: 0, y: 0 } - let imageSize = 12 + let imageSize = 13 let fontSize = 15 let opacity = 1 let icon = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) @@ -622,7 +622,7 @@ function newTimeMachine () { } } - imageSize = 12 + imageSize = 13 fontSize = 15 let exchangeMarkets = new Map() @@ -639,7 +639,7 @@ function newTimeMachine () { baseAssetIcon: layer.baseAssetIcon, quotedAssetIcon: layer.quotedAssetIcon } - exchangeMarkets.set(exchangeMarket.exhangeName + '-' + exchangeMarket.marketName, exchangeMarket) + exchangeMarkets.set(exchangeMarket.exchangeName + '-' + exchangeMarket.marketName, exchangeMarket) } } } @@ -711,3 +711,4 @@ function newTimeMachine () { ) } } + From d2ef55667f2ec2753dcdb974323cc8381bb7e2b4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 20:08:37 +0100 Subject: [PATCH 042/166] Less frecuency on saving --- DesignSpace/Workspace/Workspace.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 0f3174d7e..a63c790d8 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -88,7 +88,7 @@ function newWorkspace () { functionLibraryUiObjectsFromNodes.recreateWorkspace(thisObject.workspaceNode) thisObject.enabled = true - setInterval(saveWorkspace, 5000) + setInterval(saveWorkspace, 30000) } catch (err) { if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> err = ' + err.stack) } } From fb49f7d090fbcd36c8c2f347ab3835bfce55cce1 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 20:15:08 +0100 Subject: [PATCH 043/166] Bug Fixed --- ChartingSpace/TimelineChart.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChartingSpace/TimelineChart.js b/ChartingSpace/TimelineChart.js index ce39cf53d..ce9e7ede5 100644 --- a/ChartingSpace/TimelineChart.js +++ b/ChartingSpace/TimelineChart.js @@ -318,6 +318,8 @@ function newTimelineChart () { } function thisObjectPhysics () { + timelineChartCoordinateSystem.reportXValue(timeMachineCoordinateSystem.min.x) + timelineChartCoordinateSystem.reportXValue(timeMachineCoordinateSystem.max.x) timelineChartCoordinateSystem.physics() } From 9a7fe4f076cb70b711a3a6707edea1dd8d542f7c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 20:28:59 +0100 Subject: [PATCH 044/166] Bug Fixed --- Spaces/ChartingSpace.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Spaces/ChartingSpace.js b/Spaces/ChartingSpace.js index d1727cac8..cabaab4f6 100644 --- a/Spaces/ChartingSpace.js +++ b/Spaces/ChartingSpace.js @@ -138,10 +138,14 @@ function newChartingSpace () { container = thisObject.timeMachines[i].getContainer(point, purpose) if (container !== undefined) { if (purpose !== undefined) { - containerFound = container + if (containerFound === undefined) { + containerFound = container + } } else { if (thisObject.container.frame.isThisPointHere(point, true) === true) { - containerFound = container + if (containerFound === undefined) { + containerFound = container + } } } } From 58e704d01faa00c0a31722d1d0779fdf911e8225 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 20:35:48 +0100 Subject: [PATCH 045/166] Improvement on scales --- Globals.js | 1 + Scales/RateScale.js | 4 ++++ Scales/TimeFrameScale.js | 4 ++++ Scales/TimeScale.js | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/Globals.js b/Globals.js index 61b579d57..5b4aa5751 100644 --- a/Globals.js +++ b/Globals.js @@ -47,6 +47,7 @@ const ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME = 5 // This help regulate when const ZOOM_OUT_THRESHOLD_FOR_PACKING_OBJECTS_AT_THE_BOTTOM_OR_TOP_OF_VIEWPORT = 2 const ZOOM_OUT_THRESHOLD_FOR_PLOTTING_IN_LOW_RESOLUTION = 3 const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_TIME_MACHINES_ICONIZED = 5 +const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_SCALES = 3 let FONT_ASPECT_RATIO = 0.32; diff --git a/Scales/RateScale.js b/Scales/RateScale.js index 07b2396a7..a532aea1f 100644 --- a/Scales/RateScale.js +++ b/Scales/RateScale.js @@ -370,6 +370,10 @@ function newRateScale () { thisObject.isVisible = false thisObject.payload.isVisible = false } + + if (canvas.chartingSpace.viewport.zoomTargetLevel < ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_SCALES) { + thisObject.isVisible = false + } } function draw () { diff --git a/Scales/TimeFrameScale.js b/Scales/TimeFrameScale.js index 5015c1e31..05f6fbb38 100644 --- a/Scales/TimeFrameScale.js +++ b/Scales/TimeFrameScale.js @@ -212,6 +212,10 @@ function newTimeFrameScale () { thisObject.isVisible = false thisObject.payload.isVisible = false } + + if (canvas.chartingSpace.viewport.zoomTargetLevel < ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_SCALES) { + thisObject.isVisible = false + } } function onViewportZoomChanged (event) { diff --git a/Scales/TimeScale.js b/Scales/TimeScale.js index f87354e66..62a1220b3 100644 --- a/Scales/TimeScale.js +++ b/Scales/TimeScale.js @@ -245,6 +245,10 @@ function newTimeScale () { thisObject.container.frame.position.x < upCorner.x) { thisObject.isVisible = false } + + if (canvas.chartingSpace.viewport.zoomTargetLevel < ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_SCALES) { + thisObject.isVisible = false + } } function draw () { From f07339b43f1067335edb1fabe6073142ed25a982 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 2 Mar 2020 20:48:43 +0100 Subject: [PATCH 046/166] bug fixed --- ChartingSpace/TimeMachine.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index ab7f8f71c..cca99ed98 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -599,6 +599,8 @@ function newTimeMachine () { } function drawLabel () { + if (thisObject.payload.node === undefined) { return } + if (thisObject.payload === undefined) { return } /* Draw Title Above the Container */ let position = { x: 0, From e21279d3307501bcdbf07113646f07cbf32a25af Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 3 Mar 2020 12:53:54 +0100 Subject: [PATCH 047/166] Bug Fixed --- DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js b/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js index 449b15205..2927e88c1 100644 --- a/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js @@ -116,6 +116,7 @@ function newTaskFunctions () { let menu = node.payload.uiObject.menu menu.internalClick('Run All Tasks') + menu.internalClick('Run All Tasks') } } @@ -125,6 +126,7 @@ function newTaskFunctions () { let menu = node.payload.uiObject.menu menu.internalClick('Stop All Tasks') + menu.internalClick('Stop All Tasks') } } } From 89cdbe31053e8aa47c6dc85f3ea21ba6b318087d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 3 Mar 2020 14:40:59 +0100 Subject: [PATCH 048/166] Bug Fixed --- Spaces/FloatingSpace.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index c71a05310..36819e044 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -152,6 +152,7 @@ function newFloatingSpace () { } function oneScreenUp () { + if (visible === false) { return } let displaceVector = { x: 0, y: browserCanvas.height * PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT / 100 @@ -162,6 +163,7 @@ function newFloatingSpace () { } function oneScreenDown () { + if (visible === false) { return } let displaceVector = { x: 0, y: -browserCanvas.height * PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT / 100 @@ -172,6 +174,7 @@ function newFloatingSpace () { } function oneScreenLeft () { + if (visible === false) { return } let displaceVector = { x: browserCanvas.width * PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT / 100, y: 0 @@ -182,6 +185,7 @@ function newFloatingSpace () { } function oneScreenRight () { + if (visible === false) { return } let displaceVector = { x: -browserCanvas.width * PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT / 100, y: 0 @@ -223,6 +227,7 @@ function newFloatingSpace () { } function onMouseWheel (event) { + if (visible === false) { return } thisObject.floatingLayer.changeTargetRepulsion(event.wheelDelta) } @@ -235,6 +240,7 @@ function newFloatingSpace () { } function getContainer (point) { + if (visible === false) { return } let container container = thisObject.floatingLayer.getContainer(point) @@ -250,11 +256,10 @@ function newFloatingSpace () { } function physics () { - if (visible === true) { - browserZoomPhysics() - positionContraintsPhysics() - thisObject.floatingLayer.physics() - } + if (visible === false) { return } + browserZoomPhysics() + positionContraintsPhysics() + thisObject.floatingLayer.physics() } function positionContraintsPhysics () { @@ -282,10 +287,9 @@ function newFloatingSpace () { } function draw () { - if (visible === true) { - drawBackground() - thisObject.floatingLayer.draw() - } + if (visible === false) { return } + drawBackground() + thisObject.floatingLayer.draw() } function drawBackground () { From 71a5cda325ad7506505d528a8acdc43d629a1ee4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 3 Mar 2020 16:07:36 +0100 Subject: [PATCH 049/166] Bug fixed: moving a closed space --- ChartingSpace/Viewport.js | 10 ++++++++++ Spaces/ChartingSpace.js | 21 ++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 2a054191c..76b6c6528 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -20,6 +20,7 @@ function newViewport () { } let thisObject = { + visible: false, visibleArea: undefined, width: undefined, height: undefined, @@ -128,6 +129,7 @@ function newViewport () { } function raiseEvents () { + if (thisObject.visible === false) { return } let event = { newPosition: position } @@ -136,12 +138,14 @@ function newViewport () { } function physics () { + if (thisObject.visible === false) { return } animationPhysics() positioningPhysics() readObjectState() } function positioningPhysics () { + if (thisObject.visible === false) { return } if (thisObject.payload === undefined) { return } /* Save the position at the frame lavel */ let frame = {} @@ -176,6 +180,7 @@ function newViewport () { } function onMouseWheel (event) { + if (thisObject.visible === false) { return } if ((event.ctrlKey === true || event.metaKey === true)) { return } let morePower = 1 let amount = event.delta @@ -259,6 +264,7 @@ function newViewport () { } function displace (displaceVector, recalculate) { + if (thisObject.visible === false) { return } position.x = position.x + displaceVector.x position.y = position.y + displaceVector.y @@ -273,6 +279,7 @@ function newViewport () { } function changeZoom (oldLevel, newLevel) { + if (thisObject.visible === false) { return } let oldMouse = unTransformThisPoint(thisObject.mousePosition, oldLevel) let newMouse = transformThisPoint(oldMouse, newLevel) @@ -295,6 +302,7 @@ function newViewport () { } function transformThisPoint (point, level) { + if (thisObject.visible === false) { return } let transformedPoint = { x: 0, y: 0 @@ -328,6 +336,7 @@ function newViewport () { } function isThisPointVisible (point) { + if (thisObject.visible === false) { return } if (point.x < thisObject.visibleArea.topLeft.x || point.x > thisObject.visibleArea.bottomRight.x || point.y < thisObject.visibleArea.topLeft.y || point.y > thisObject.visibleArea.bottomRight.y) { return false } else { @@ -336,6 +345,7 @@ function newViewport () { } function isThisPointInViewport (point) { + if (thisObject.visible === false) { return } if (point.y > COCKPIT_SPACE_POSITION) { return false } else { diff --git a/Spaces/ChartingSpace.js b/Spaces/ChartingSpace.js index cabaab4f6..a9621a2c9 100644 --- a/Spaces/ChartingSpace.js +++ b/Spaces/ChartingSpace.js @@ -13,7 +13,7 @@ function newChartingSpace () { logger.fileName = MODULE_NAME let thisObject = { - visible: undefined, + visible: false, container: undefined, inViewport: undefined, timeMachines: undefined, @@ -170,6 +170,7 @@ function newChartingSpace () { } function oneScreenUp () { + if (thisObject.visible === false) { return } let displaceVector = { x: 0, y: browserCanvas.height * PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT / 100 @@ -179,6 +180,7 @@ function newChartingSpace () { } function oneScreenDown () { + if (thisObject.visible === false) { return } let displaceVector = { x: 0, y: -browserCanvas.height * PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT / 100 @@ -188,6 +190,7 @@ function newChartingSpace () { } function oneScreenLeft () { + if (thisObject.visible === false) { return } let displaceVector = { x: browserCanvas.width * PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT / 100, y: 0 @@ -197,6 +200,7 @@ function newChartingSpace () { } function oneScreenRight () { + if (thisObject.visible === false) { return } let displaceVector = { x: -browserCanvas.width * PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT / 100, y: 0 @@ -259,11 +263,11 @@ function newChartingSpace () { } function physics () { + thisObjectPhysics() + if (thisObject.visible !== true) { return } if (thisObject.viewport !== undefined) { thisObject.viewport.physics() } - - thisObjectPhysics() childrenPhysics() syncWithDesigner() } @@ -345,10 +349,16 @@ function newChartingSpace () { function thisObjectPhysics () { thisObject.container.frame.height = COCKPIT_SPACE_POSITION - if (thisObject.container.frame.height <= 0 / 100) { + if (thisObject.container.frame.height <= TOP_SPACE_HEIGHT) { thisObject.visible = false + if (thisObject.viewport !== undefined) { + thisObject.viewport.visible = false + } } else { thisObject.visible = true + if (thisObject.viewport !== undefined) { + thisObject.viewport.visible = true + } } if (canvas.chartingSpace.viewport !== undefined) { @@ -373,6 +383,7 @@ function newChartingSpace () { } function drawBackground () { + if (thisObject.visible === false) { return } drawSpaceBackground() for (let i = 0; i < thisObject.timeMachines.length; i++) { @@ -382,7 +393,7 @@ function newChartingSpace () { } function draw () { - if (thisObject.visible !== true) { return } + if (thisObject.visible === false) { return } drawBackground() for (let i = 0; i < thisObject.timeMachines.length; i++) { From a2d49d7b0b0fd1d57a4442ff7541a3cc2a875f17 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 3 Mar 2020 16:17:25 +0100 Subject: [PATCH 050/166] Description of Time Machine --- ChartingSpace/TimeMachine.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index cca99ed98..8bf908946 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -612,7 +612,14 @@ function newTimeMachine () { let icon = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) position = transformThisPoint(position, thisObject.container) - printLabel(thisObject.payload.node.name, position.x + 15, position.y - 28, opacity, fontSize) + + let label = thisObject.payload.node.name + let description = loadPropertyFromNodeConfig(thisObject.payload, 'description') + + if (description !== undefined) { + label = description + } + printLabel(label, position.x + 15, position.y - 28, opacity, fontSize) if (icon !== undefined) { if (icon.canDrawIcon === true) { From 74c9a7de3ce7634c26ecb0c90f19fef5d3589cde Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 3 Mar 2020 21:12:03 +0100 Subject: [PATCH 051/166] Switch to 24 hs in a clever way --- ChartingSpace/PlottersManager.js | 9 ++++++++- ChartingSpace/TimeMachine.js | 11 ++++++++++- ChartingSpace/TimelineChart.js | 7 ++++++- Globals.js | 2 +- Scales/TimeFrameScale.js | 22 +++++++++++++++------- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/ChartingSpace/PlottersManager.js b/ChartingSpace/PlottersManager.js index 3b245cf99..848f5cf1a 100644 --- a/ChartingSpace/PlottersManager.js +++ b/ChartingSpace/PlottersManager.js @@ -301,9 +301,16 @@ function newPlottersManager () { function draw () { if (thisObject.connectors === undefined) { return } // We need to wait /* First the Product Plotters. */ + let maxElementsPlotted = 0 for (let i = 0; i < thisObject.connectors.length; i++) { let connector = thisObject.connectors[thisObject.connectors.length - i - 1] - connector.plotter.draw() + let elementsPlotted = connector.plotter.draw() + if (elementsPlotted !== undefined) { + if (elementsPlotted > maxElementsPlotted) { + maxElementsPlotted = elementsPlotted + } + } } + return maxElementsPlotted } } diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 8bf908946..2f62f9c5f 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -529,9 +529,18 @@ function newTimeMachine () { function drawBackground () { drawChartsBackground() if (thisObject.container.frame.isInViewPort()) { + let maxElementsPlotted = 0 for (let i = 0; i < thisObject.timelineCharts.length; i++) { let timelineChart = thisObject.timelineCharts[thisObject.timelineCharts.length - i - 1] - timelineChart.drawBackground() + let elementsPlotted = timelineChart.drawBackground() + if (elementsPlotted !== undefined) { + if (elementsPlotted > maxElementsPlotted) { + maxElementsPlotted = elementsPlotted + } + } + } + if (thisObject.timeFrameScale !== undefined) { + thisObject.timeFrameScale.adjustTimeFrame(maxElementsPlotted) } } } diff --git a/ChartingSpace/TimelineChart.js b/ChartingSpace/TimelineChart.js index ce9e7ede5..5ae735f80 100644 --- a/ChartingSpace/TimelineChart.js +++ b/ChartingSpace/TimelineChart.js @@ -380,7 +380,12 @@ function newTimelineChart () { if (thisObject.container.frame.isInViewPort()) { drawChartsBackground() if (thisObject.plotterManager !== undefined) { - thisObject.plotterManager.draw() + let elementsPlotted = thisObject.plotterManager.draw() + if (thisObject.timeFrameScale !== undefined) { + thisObject.timeFrameScale.adjustTimeFrame(elementsPlotted) + } else { + return elementsPlotted + } } } } diff --git a/Globals.js b/Globals.js index 5b4aa5751..1a1c76a6b 100644 --- a/Globals.js +++ b/Globals.js @@ -43,7 +43,7 @@ UI_FONT = { const DEBUG = {} const ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS = 5 // This regulates some behavious changes that happens when the user zoom out below this level. -const ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME = 5 // This help regulate when to change the Time Frame base on the level of zoom out. +const ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME = 3 // This help regulate when to change the Time Frame base on the level of zoom out. const ZOOM_OUT_THRESHOLD_FOR_PACKING_OBJECTS_AT_THE_BOTTOM_OR_TOP_OF_VIEWPORT = 2 const ZOOM_OUT_THRESHOLD_FOR_PLOTTING_IN_LOW_RESOLUTION = 3 const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_TIME_MACHINES_ICONIZED = 5 diff --git a/Scales/TimeFrameScale.js b/Scales/TimeFrameScale.js index 05f6fbb38..856a1e15f 100644 --- a/Scales/TimeFrameScale.js +++ b/Scales/TimeFrameScale.js @@ -8,6 +8,7 @@ function newTimeFrameScale () { payload: undefined, isVisible: true, layersOn: undefined, + adjustTimeFrame: adjustTimeFrame, onMouseOverSomeTimeMachineContainer: onMouseOverSomeTimeMachineContainer, draw: draw, drawForeground: drawForeground, @@ -21,7 +22,7 @@ function newTimeFrameScale () { const TIME_PERIOD_DEFAULT_VALUE = 0 const MIN_HEIGHT = 50 - let previousIsVisible = true + let displayingRealTimeFrame = true let greyOutCoverLayer = false let isMouseOver @@ -119,21 +120,28 @@ function newTimeFrameScale () { function physics () { readObjectState() positioningPhysics() - zoomOutPhysics() } - function zoomOutPhysics () { - if ((thisObject.isVisible === true && previousIsVisible === false) && (canvas.chartingSpace.viewport.zoomTargetLevel >= ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME)) { + function adjustTimeFrame (elementsPlotted) { + const ELEMENTS_PLOTTED_THREASHOLD = 500 + if ( + canvas.chartingSpace.viewport.zoomTargetLevel >= ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME && + displayingRealTimeFrame === false + ) { let event = {} event.timeFrame = thisObject.timeFrame thisObject.container.eventHandler.raiseEvent('Time Frame Value Changed', event) - previousIsVisible = true + displayingRealTimeFrame = true } - if ((thisObject.isVisible === false && previousIsVisible === true) || (canvas.chartingSpace.viewport.zoomTargetLevel < ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME)) { + if ( + elementsPlotted > ELEMENTS_PLOTTED_THREASHOLD && + canvas.chartingSpace.viewport.zoomTargetLevel < ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME && + displayingRealTimeFrame === true + ) { let event = {} event.timeFrame = ONE_DAY_IN_MILISECONDS thisObject.container.eventHandler.raiseEvent('Time Frame Value Changed', event) - previousIsVisible = false + displayingRealTimeFrame = false } } From b24f08a23d69a1e767440077df88390dda4a8028 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 4 Mar 2020 09:17:21 +0100 Subject: [PATCH 052/166] bug fixed --- Utilities.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Utilities.js b/Utilities.js index 2588156b9..fe5e3b257 100644 --- a/Utilities.js +++ b/Utilities.js @@ -42,6 +42,7 @@ function loadPropertyFromNodeConfig (payload, propertyName) { } function saveFrame (payload, frame) { + if (frame.position.x === 0 && frame.position.y === 0) { return } payload.frame = { position: { x: frame.position.x, From 31bb4090a8b67ed631c9b5591d7897fafb9b729a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 4 Mar 2020 09:37:24 +0100 Subject: [PATCH 053/166] Bug fixed with datetimes calculated for daily files --- ChartingSpace/TimeMachine.js | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 2f62f9c5f..09491fa0c 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -48,8 +48,6 @@ function newTimeMachine () { let syncWithDesignerLoop = 0 let timelineChartsMap = new Map() - let onViewportPositionChangedEventSuscriptionId - let onViewportZoomChangedEventSuscriptionId let onMouseOverEventSuscriptionId let onMouseNotOverEventSuscriptionId let timeScaleMouseOverEventSuscriptionId @@ -74,8 +72,6 @@ function newTimeMachine () { } function finalize () { - canvas.chartingSpace.viewport.eventHandler.stopListening(onViewportPositionChangedEventSuscriptionId) - canvas.chartingSpace.viewport.eventHandler.stopListening(onViewportZoomChangedEventSuscriptionId) timeMachineCoordinateSystem.eventHandler.stopListening(onScaleChangedEventSubscriptionId) if (thisObject.timeScale !== undefined) { @@ -148,8 +144,6 @@ function newTimeMachine () { onMouseOverEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseOver', onMouseOver) onMouseNotOverEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseNotOver', onMouseNotOver) - onViewportPositionChangedEventSuscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent('Position Changed', onViewportPositionChanged) - onViewportZoomChangedEventSuscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent('Zoom Changed', onViewportZoomChanged) onScaleChangedEventSubscriptionId = timeMachineCoordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged) thisObject.edgeEditor = newEdgeEditor() @@ -314,36 +308,17 @@ function newTimeMachine () { } } - function onViewportZoomChanged (event) { - if (thisObject.container.frame.isInViewPort()) { - recalculateCurrentDatetime() - } - } - - function onViewportPositionChanged () { - if (thisObject.container.frame.isInViewPort()) { - recalculateCurrentDatetime() - } - } - function onScaleChanged () { recalculateCurrentDatetime() } function recalculateCurrentDatetime () { - /* - The view port was moved or the view port zoom level was changed and the center of the screen points to a different datetime that we - must calculate. - */ let center = { - x: (canvas.chartingSpace.viewport.visibleArea.bottomRight.x - canvas.chartingSpace.viewport.visibleArea.bottomLeft.x) / 2, - y: (canvas.chartingSpace.viewport.visibleArea.bottomRight.y - canvas.chartingSpace.viewport.visibleArea.topRight.y) / 2 + x: thisObject.container.frame.width / 2, + y: thisObject.container.frame.height / 2 } - center = unTransformThisPoint(center, thisObject.container) - center = timeMachineCoordinateSystem.unInverseTransform(center, thisObject.container.frame.height) - - datetime = new Date(center.x) + datetime = new Date(getDateFromPointAtContainer(center, thisObject.container, timeMachineCoordinateSystem)) for (let i = 0; i < thisObject.timelineCharts.length; i++) { let timelineChart = thisObject.timelineCharts[i] @@ -729,4 +704,3 @@ function newTimeMachine () { ) } } - From 9a3c4a3e07b81a1905ee171032968d7ec8a52a61 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 4 Mar 2020 12:09:41 +0100 Subject: [PATCH 054/166] Bug Fixed --- FloatingSpace/UiObject.js | 1 + 1 file changed, 1 insertion(+) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 15cf760d1..4ca9b759e 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -287,6 +287,7 @@ function newUiObject () { let property = nodeDefinition.properties[i] if (property.monitorChildrenRunning === true) { let children = thisObject.payload.node[property.name] + if (children === undefined) { continue } let totalRunning = 0 for (let j = 0; j < children.length; j++) { let child = children[j] From 900abb49479168b0b589d0f97301378552f70469 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 4 Mar 2020 12:34:07 +0100 Subject: [PATCH 055/166] Exchange tasks --- .../FunctionLibraries/TaskFunctions.js | 35 +++++++++++++++---- DesignSpace/Workspace/Workspace.js | 10 ++++++ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js b/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js index 2927e88c1..96ad84d41 100644 --- a/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js @@ -5,7 +5,9 @@ function newTaskFunctions () { runAllTasks: runAllTasks, stopAllTasks: stopAllTasks, runAllTaskManagers: runAllTaskManagers, - stopAllTaskManagers: stopAllTaskManagers + stopAllTaskManagers: stopAllTaskManagers, + runAllExchangeTasks: runAllExchangeTasks, + stopAllExchangeTasks: stopAllExchangeTasks } return thisObject @@ -110,9 +112,9 @@ function newTaskFunctions () { } } - function runAllTaskManagers (dataMining, functionLibraryProtocolNode) { - for (let i = 0; i < dataMining.taskManagers.length; i++) { - let node = dataMining.taskManagers[i] + function runAllTaskManagers (parent, functionLibraryProtocolNode) { + for (let i = 0; i < parent.taskManagers.length; i++) { + let node = parent.taskManagers[i] let menu = node.payload.uiObject.menu menu.internalClick('Run All Tasks') @@ -120,13 +122,32 @@ function newTaskFunctions () { } } - function stopAllTaskManagers (dataMining, functionLibraryProtocolNode) { - for (let i = 0; i < dataMining.taskManagers.length; i++) { - let node = dataMining.taskManagers[i] + function stopAllTaskManagers (parent, functionLibraryProtocolNode) { + for (let i = 0; i < parent.taskManagers.length; i++) { + let node = parent.taskManagers[i] let menu = node.payload.uiObject.menu menu.internalClick('Stop All Tasks') menu.internalClick('Stop All Tasks') } } + function runAllExchangeTasks (parent, functionLibraryProtocolNode) { + for (let i = 0; i < parent.exchangeTasks.length; i++) { + let node = parent.exchangeTasks[i] + let menu = node.payload.uiObject.menu + + menu.internalClick('Run All Task Managers') + menu.internalClick('Run All Task Managers') + } + } + + function stopAllExchangeTasks (parent, functionLibraryProtocolNode) { + for (let i = 0; i < parent.exchangeTasks.length; i++) { + let node = parent.exchangeTasks[i] + let menu = node.payload.uiObject.menu + + menu.internalClick('Stop All Task Managers') + menu.internalClick('Stop All Task Managers') + } + } } diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index a63c790d8..76abd1fd2 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -366,6 +366,16 @@ function newWorkspace () { functionLibraryTaskFunctions.stopAllTaskManagers(payload.node, functionLibraryProtocolNode) } break + case 'Run All Exchange Tasks': + { + functionLibraryTaskFunctions.runAllExchangeTasks(payload.node, functionLibraryProtocolNode) + } + break + case 'Stop All Exchange Tasks': + { + functionLibraryTaskFunctions.stopAllExchangeTasks(payload.node, functionLibraryProtocolNode) + } + break case 'Run Session': { functionLibrarySessionFunctions.runSession(payload.node, functionLibraryProtocolNode, callBackFunction) From fa0001144d7d02b493e7cdc2dccad4feae322625 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 4 Mar 2020 17:15:32 +0100 Subject: [PATCH 056/166] Exchange Nodes Added to Action Scripts --- .../FunctionLibraries/SuperScripts.js | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index 7103935ec..ed5c886e3 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -10,11 +10,40 @@ function newSuperScriptsFunctions () { let clone = functionLibraryNodeCloning.getNodeClone let executionResult = true - function setup (templateClone, target) { + function setup (templateClone, target, exchange, exchangeNodeType, arrayPropertyName) { spawnPosition.x = target.payload.position.x spawnPosition.y = target.payload.position.y - functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target) + if (exchange === undefined) { + functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target) + } else { + let definition = APP_SCHEMA_MAP.get(target.type) + for (let i = 0; i < definition.properties.length; i++) { + let property = definition.properties[i] + if (property.childType === exchangeNodeType) { + let exchanges = target[property.name] + if (exchanges === undefined) { + exchanges = [] + } + let targetExchange + for (let j = 0; j < exchanges.length; j++) { + let thisExchange = exchanges[j] + if (thisExchange.payload.referenceParent !== undefined) { + if (thisExchange.payload.referenceParent.id === exchange.id) { + targetExchange = thisExchange + } + } + } + if (targetExchange === undefined) { + targetExchange = functionLibraryUiObjectsFromNodes.addUIObject(target, exchangeNodeType) + targetExchange.payload.referenceParent = exchange + } + let nodesArray = targetExchange[arrayPropertyName] + nodesArray.push(templateClone) + functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, targetExchange, targetExchange) + } + } + } } function deleteNode (node) { From 380407c27c98b83a99d27111c34e5d2f76903883 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 4 Mar 2020 18:57:07 +0100 Subject: [PATCH 057/166] Bug Fixed --- DesignSpace/Workspace/Workspace.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 76abd1fd2..a844763d3 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -183,22 +183,16 @@ function newWorkspace () { for (let j = 0; j < rootNode.networkNodes.length; j++) { let networkNode = rootNode.networkNodes[j] if (networkNode.dataMining !== undefined) { - for (let i = 0; i < networkNode.dataMining.taskManagers.length; i++) { - let taskManager = networkNode.dataMining.taskManagers[i] - taskManager.payload.uiObject.menu.internalClick('Stop All Tasks') - } + networkNode.dataMining.payload.uiObject.menu.internalClick('Stop All Exchange Tasks') + networkNode.dataMining.payload.uiObject.menu.internalClick('Stop All Exchange Tasks') } if (networkNode.testingEnvironment !== undefined) { - for (let i = 0; i < networkNode.testingEnvironment.taskManagers.length; i++) { - let taskManager = networkNode.testingEnvironment.taskManagers[i] - taskManager.payload.uiObject.menu.internalClick('Stop All Tasks') - } + networkNode.testingEnvironment.payload.uiObject.menu.internalClick('Stop All Exchange Tasks') + networkNode.testingEnvironment.payload.uiObject.menu.internalClick('Stop All Exchange Tasks') } if (networkNode.productionEnvironment !== undefined) { - for (let i = 0; i < networkNode.productionEnvironment.taskManagers.length; i++) { - let taskManager = networkNode.productionEnvironment.taskManagers[i] - taskManager.payload.uiObject.menu.internalClick('Stop All Tasks') - } + networkNode.productionEnvironment.payload.uiObject.menu.internalClick('Stop All Exchange Tasks') + networkNode.productionEnvironment.payload.uiObject.menu.internalClick('Stop All Exchange Tasks') } } } From 1c24e10e83a2bcc655d7bbd174be82c387ee1df8 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 5 Mar 2020 12:13:11 +0100 Subject: [PATCH 058/166] CCXT implementation --- .../FunctionLibraries/CCXTFunctions.js | 55 +++++++++++++++++++ DesignSpace/Workspace/Workspace.js | 19 ++++++- FloatingSpace/UiObjectConstructor.js | 2 +- 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js diff --git a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js new file mode 100644 index 000000000..167fcd855 --- /dev/null +++ b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js @@ -0,0 +1,55 @@ +function newCCXTFunctions () { + thisObject = { + addMissingExchanges: addMissingExchanges, + addMissingAssets: addMissingAssets, + addMissingMarkets: addMissingMarkets + } + + return thisObject + + function addMissingExchanges (node, functionLibraryUiObjectsFromNodes) { + currentExchanges = new Map() + for (let j = 0; j < node.exchanges.length; j++) { + let exchange = node.exchanges[j] + let codeName = loadPropertyFromNodeConfig(exchange.payload, 'codeName') + currentExchanges.set(codeName, exchange) + } + for (let i = 0; i < ccxt.exchanges.length; i++) { + let exchangeId = ccxt.exchanges[i] + let existingExchange = currentExchanges.get(exchangeId) + if (existingExchange === undefined) { + const exchangeClass = ccxt[exchangeId] + const exchangeConstructorParams = { + 'timeout': 30000, + 'enableRateLimit': true, + verbose: false + } + + let ccxtExchange = new exchangeClass(exchangeConstructorParams) + + if (ccxtExchange.has.fetchOHLCV === true) { + if (ccxtExchange.timeframes['1m'] !== undefined) { + let newExchange = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Crypto Exchange') + newExchange.name = ccxtExchange.name + newExchange.code = '{ \n\"codeName\": \"' + ccxtExchange.id + '\"\n}' + newExchange.payload.floatingObject.collapseToggle() + newExchange.exchangeAssets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeMarkets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeAccounts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeAssets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X + newExchange.exchangeMarkets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X + newExchange.exchangeAccounts.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_025X + } + } + } + } + } + + function addMissingAssets (node, functionLibraryUiObjectsFromNodes) { + + } + + function addMissingMarkets (node, functionLibraryUiObjectsFromNodes) { + + } +} diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index a844763d3..136cce8fe 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -57,6 +57,7 @@ function newWorkspace () { let functionLibraryShortcutKeys = newShortcutKeys() let functionLibraryOnFocus = newOnFocus() let functionLibrarySuperScripts = newSuperScriptsFunctions() + let functionLibraryCCXTFunctions = newCCXTFunctions() thisObject.nodeChildren = newNodeChildren() @@ -88,7 +89,7 @@ function newWorkspace () { functionLibraryUiObjectsFromNodes.recreateWorkspace(thisObject.workspaceNode) thisObject.enabled = true - setInterval(saveWorkspace, 30000) + setInterval(saveWorkspace, 10000) } catch (err) { if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> err = ' + err.stack) } } @@ -370,6 +371,22 @@ function newWorkspace () { functionLibraryTaskFunctions.stopAllExchangeTasks(payload.node, functionLibraryProtocolNode) } break + case 'Add Missing Crypto Exchanges': + { + functionLibraryCCXTFunctions.addMissingExchanges(payload.node, functionLibraryUiObjectsFromNodes) + } + break + case 'Add Missing Assets': + { + functionLibraryCCXTFunctions.addMissingAssets(payload.node, functionLibraryUiObjectsFromNodes) + } + break + case 'Add Missing Markets': + { + functionLibraryCCXTFunctions.addMissingMarkets(payload.node, functionLibraryUiObjectsFromNodes) + } + break + case 'Run Session': { functionLibrarySessionFunctions.runSession(payload.node, functionLibraryProtocolNode, callBackFunction) diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index 9d6f5bb78..82077883e 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -84,7 +84,7 @@ function newUiObjectConstructor () { for (let j = 0; j < menuItems.length; j++) { let item = menuItems[j] item.angle = undefined - if (item.action.indexOf('Add ') >= 0 && item.action.indexOf('Missing') >= 0) { + if (item.action.indexOf('Add Missing Children') >= 0) { item.action = 'Add Missing Children' } if (item.action.indexOf('Delete ') >= 0) { From 3a21bda12390d2310824c118e195011c0748a4e4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 5 Mar 2020 13:22:39 +0100 Subject: [PATCH 059/166] fetch currencies --- .../FunctionLibraries/CCXTFunctions.js | 80 +++++++++++++++---- 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js index 167fcd855..caaf38590 100644 --- a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js @@ -9,11 +9,18 @@ function newCCXTFunctions () { function addMissingExchanges (node, functionLibraryUiObjectsFromNodes) { currentExchanges = new Map() - for (let j = 0; j < node.exchanges.length; j++) { - let exchange = node.exchanges[j] - let codeName = loadPropertyFromNodeConfig(exchange.payload, 'codeName') - currentExchanges.set(codeName, exchange) + let parent = node.payload.parentNode + if (parent !== undefined) { + for (let i = 0; i < parent.cryptoExchanges.length; i++) { + let cryptoExchanges = parent.cryptoExchanges[i] + for (let j = 0; j < cryptoExchanges.exchanges.length; j++) { + let exchange = cryptoExchanges.exchanges[j] + let codeName = loadPropertyFromNodeConfig(exchange.payload, 'codeName') + currentExchanges.set(codeName, exchange) + } + } } + for (let i = 0; i < ccxt.exchanges.length; i++) { let exchangeId = ccxt.exchanges[i] let existingExchange = currentExchanges.get(exchangeId) @@ -28,25 +35,66 @@ function newCCXTFunctions () { let ccxtExchange = new exchangeClass(exchangeConstructorParams) if (ccxtExchange.has.fetchOHLCV === true) { - if (ccxtExchange.timeframes['1m'] !== undefined) { - let newExchange = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Crypto Exchange') - newExchange.name = ccxtExchange.name - newExchange.code = '{ \n\"codeName\": \"' + ccxtExchange.id + '\"\n}' - newExchange.payload.floatingObject.collapseToggle() - newExchange.exchangeAssets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 - newExchange.exchangeMarkets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 - newExchange.exchangeAccounts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 - newExchange.exchangeAssets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X - newExchange.exchangeMarkets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X - newExchange.exchangeAccounts.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_025X + if (ccxtExchange.has.fetchCurrencies === true) { + if (ccxtExchange.has.fetchMarkets === true) { + if (ccxtExchange.timeframes['1m'] !== undefined) { + let newExchange = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Crypto Exchange') + newExchange.name = ccxtExchange.name + newExchange.code = '{ \n\"codeName\": \"' + ccxtExchange.id + '\"\n}' + newExchange.payload.floatingObject.collapseToggle() + newExchange.exchangeAssets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeMarkets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeAccounts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeAssets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X + newExchange.exchangeMarkets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X + newExchange.exchangeAccounts.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_025X + } + } } } } } } - function addMissingAssets (node, functionLibraryUiObjectsFromNodes) { + async function addMissingAssets (node, functionLibraryUiObjectsFromNodes) { + currentAssets = new Map() + for (let j = 0; j < node.assets.length; j++) { + let asset = node.assets[j] + let codeName = loadPropertyFromNodeConfig(asset.payload, 'codeName') + currentAssets.set(codeName, asset) + } + let exchangeId = loadPropertyFromNodeConfig(node.payload.parentNode.payload, 'codeName') + + const exchangeClass = ccxt[exchangeId] + const exchangeConstructorParams = { + 'timeout': 30000, + 'enableRateLimit': true, + verbose: false + } + + let ccxtExchange = new exchangeClass(exchangeConstructorParams) + + if (ccxtExchange.has.fetchCurrencies === true) { + let ccxtAssets = [] + try { + ccxtAssets = await ccxtExchange.fetchCurrencies() + } catch (err) { + node.payload.uiObject.setErrorMessage('Failed to Fetch Assets from the Exchange') + console.log(err.stack) + } + + for (let i = 0; i < ccxtAssets.length; i++) { + let ccxtAsset = ccxtAssets[i] + let newAsseet = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Asset') + newAsseet.name = ccxtAsset.name + newAsseet.code = '{ \n\"codeName\": \"' + newAsseet.id + '\"\n}' + newAsseet.exchangeAssets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_360 + newAsseet.exchangeMarkets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X + } + } else { + node.payload.uiObject.setErrorMessage('This exchange does not provide a list of supported Assets.') + } } function addMissingMarkets (node, functionLibraryUiObjectsFromNodes) { From b4711bccec21c893666d0fda4aa5ca30529c0094 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 5 Mar 2020 17:08:19 +0100 Subject: [PATCH 060/166] fetch exchanges and assets --- .../FunctionLibraries/CCXTFunctions.js | 132 +++++++++++------- 1 file changed, 78 insertions(+), 54 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js index caaf38590..472e3afc3 100644 --- a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js @@ -21,42 +21,43 @@ function newCCXTFunctions () { } } - for (let i = 0; i < ccxt.exchanges.length; i++) { - let exchangeId = ccxt.exchanges[i] - let existingExchange = currentExchanges.get(exchangeId) - if (existingExchange === undefined) { - const exchangeClass = ccxt[exchangeId] - const exchangeConstructorParams = { - 'timeout': 30000, - 'enableRateLimit': true, - verbose: false - } + let params = { + method: 'listExchanges', + has: { + fetchOHLCV: true, + fetchMarkets: true + } + } - let ccxtExchange = new exchangeClass(exchangeConstructorParams) + callServer(JSON.stringify(params), 'CCXT', onResponse) - if (ccxtExchange.has.fetchOHLCV === true) { - if (ccxtExchange.has.fetchCurrencies === true) { - if (ccxtExchange.has.fetchMarkets === true) { - if (ccxtExchange.timeframes['1m'] !== undefined) { - let newExchange = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Crypto Exchange') - newExchange.name = ccxtExchange.name - newExchange.code = '{ \n\"codeName\": \"' + ccxtExchange.id + '\"\n}' - newExchange.payload.floatingObject.collapseToggle() - newExchange.exchangeAssets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 - newExchange.exchangeMarkets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 - newExchange.exchangeAccounts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 - newExchange.exchangeAssets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X - newExchange.exchangeMarkets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X - newExchange.exchangeAccounts.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_025X - } - } - } + function onResponse (err, data) { + if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setErrorMessage('Failed to Fetch Assets from the Exchange') + return + } + + let exchanges = JSON.parse(data) + for (let i = 0; i < exchanges.length; i++) { + let exchange = exchanges[i] + let existingExchange = currentExchanges.get(exchange.id) + if (existingExchange === undefined) { + let newExchange = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Crypto Exchange') + newExchange.name = exchange.name + newExchange.code = '{ \n\"codeName\": \"' + exchange.id + '\"\n}' + newExchange.payload.floatingObject.collapseToggle() + newExchange.exchangeAssets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeMarkets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeAccounts.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newExchange.exchangeAssets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X + newExchange.exchangeMarkets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X + newExchange.exchangeAccounts.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_025X } } } } - async function addMissingAssets (node, functionLibraryUiObjectsFromNodes) { + function addMissingAssets (node, functionLibraryUiObjectsFromNodes) { currentAssets = new Map() for (let j = 0; j < node.assets.length; j++) { let asset = node.assets[j] @@ -66,34 +67,57 @@ function newCCXTFunctions () { let exchangeId = loadPropertyFromNodeConfig(node.payload.parentNode.payload, 'codeName') - const exchangeClass = ccxt[exchangeId] - const exchangeConstructorParams = { - 'timeout': 30000, - 'enableRateLimit': true, - verbose: false - } - - let ccxtExchange = new exchangeClass(exchangeConstructorParams) - - if (ccxtExchange.has.fetchCurrencies === true) { - let ccxtAssets = [] - try { - ccxtAssets = await ccxtExchange.fetchCurrencies() - } catch (err) { - node.payload.uiObject.setErrorMessage('Failed to Fetch Assets from the Exchange') - console.log(err.stack) + try { + let params = { + exchangeId: exchangeId, + method: 'fetchMarkets' } + callServer(JSON.stringify(params), 'CCXT', onResponse) - for (let i = 0; i < ccxtAssets.length; i++) { - let ccxtAsset = ccxtAssets[i] - let newAsseet = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Asset') - newAsseet.name = ccxtAsset.name - newAsseet.code = '{ \n\"codeName\": \"' + newAsseet.id + '\"\n}' - newAsseet.exchangeAssets.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_360 - newAsseet.exchangeMarkets.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X + function onResponse (err, data) { + if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setErrorMessage('Failed to Fetch Assets from the Exchange') + return + } + let queryParams = loadPropertyFromNodeConfig(node.payload, 'addMissingAssets') + + let markets = JSON.parse(data) + for (let i = 0; i < markets.length; i++) { + let market = markets[i] + + if (queryParams !== undefined) { + if (queryParams.baseAsset !== undefined) { + if (market.baseId.indexOf(queryParams.baseAsset) >= 0) { + continue + } + } + if (queryParams.quotedAsset !== undefined) { + if (market.quoteId.indexOf(queryParams.quotedAsset) >= 0) { + continue + } + } + } + if (currentAssets.get(market.baseId) === undefined) { + addAsset(market.baseId) + currentAssets.set(market.baseId, market.baseId) + } + if (currentAssets.get(market.quoteId) === undefined) { + addAsset(market.quoteId) + currentAssets.set(market.quoteId, market.quoteId) + } + + function addAsset (name) { + let newAsseet = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Asset') + newAsseet.name = name + newAsseet.code = '{ \n\"codeName\": \"' + name + '\"\n}' + newAsseet.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_360 + newAsseet.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_200X + } + } } - } else { - node.payload.uiObject.setErrorMessage('This exchange does not provide a list of supported Assets.') + } catch (err) { + node.payload.uiObject.setErrorMessage('Failed to Fetch Assets from the Exchange') + console.log(err.stack) } } From f174eb0aac50ee12b6e51a9958c6b425659a5f94 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 5 Mar 2020 19:12:46 +0100 Subject: [PATCH 061/166] add missing markets implemented --- .../FunctionLibraries/CCXTFunctions.js | 71 ++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js index 472e3afc3..385d6550b 100644 --- a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js @@ -58,7 +58,9 @@ function newCCXTFunctions () { } function addMissingAssets (node, functionLibraryUiObjectsFromNodes) { - currentAssets = new Map() + if (node.payload.parentNode === undefined) { return } + + let currentAssets = new Map() for (let j = 0; j < node.assets.length; j++) { let asset = node.assets[j] let codeName = loadPropertyFromNodeConfig(asset.payload, 'codeName') @@ -122,6 +124,73 @@ function newCCXTFunctions () { } function addMissingMarkets (node, functionLibraryUiObjectsFromNodes) { + if (node.payload.parentNode === undefined) { return } + if (node.payload.parentNode.exchangeAssets === undefined) { return } + let currentAssets = new Map() + let exchangeAssets = node.payload.parentNode.exchangeAssets + for (let j = 0; j < exchangeAssets.assets.length; j++) { + let asset = exchangeAssets.assets[j] + let codeName = loadPropertyFromNodeConfig(asset.payload, 'codeName') + currentAssets.set(codeName, asset) + } + + let currentMarkets = new Map() + let exchangeMarkets = node + for (let j = 0; j < exchangeMarkets.markets.length; j++) { + let asset = exchangeMarkets.markets[j] + let codeName = loadPropertyFromNodeConfig(asset.payload, 'codeName') + currentMarkets.set(codeName, asset) + } + + let exchangeId = loadPropertyFromNodeConfig(node.payload.parentNode.payload, 'codeName') + + try { + let params = { + exchangeId: exchangeId, + method: 'fetchMarkets' + } + callServer(JSON.stringify(params), 'CCXT', onResponse) + + function onResponse (err, data) { + if (err.result !== GLOBAL.DEFAULT_OK_RESPONSE.result) { + node.payload.uiObject.setErrorMessage('Failed to Fetch Assets from the Exchange') + return + } + + let markets = JSON.parse(data) + for (let i = 0; i < markets.length; i++) { + let market = markets[i] + let baseAsset = currentAssets.get(market.baseId) + let quotedAsset = currentAssets.get(market.quoteId) + + if (baseAsset === undefined) { + continue + } + if (quotedAsset === undefined) { + continue + } + + if (currentMarkets.get(market.symbol) === undefined) { + addMarket(market.symbol, baseAsset, quotedAsset) + } + + function addMarket (name, baseAsset, quotedAsset) { + let newMarket = functionLibraryUiObjectsFromNodes.addUIObject(node, 'Market') + newMarket.name = name + newMarket.code = '{ \n\"codeName\": \"' + name + '\"\n}' + newMarket.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newMarket.baseAsset.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_45 + newMarket.quotedAsset.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_45 + newMarket.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X + newMarket.baseAsset.payload.referenceParent = baseAsset + newMarket.quotedAsset.payload.referenceParent = quotedAsset + } + } + } + } catch (err) { + node.payload.uiObject.setErrorMessage('Failed to Fetch Assets from the Exchange') + console.log(err.stack) + } } } From 61a60d3e170cebfd33e9b0c25b08fb0c7a5e2611 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Mar 2020 08:39:35 +0100 Subject: [PATCH 062/166] Bug Fixed, time machines loosing their frame --- .../FunctionLibraries/UiObjectsFromNodes.js | 21 +++++++++++++++++++ Utilities.js | 1 - 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js index 19f48fa43..61b209594 100644 --- a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js +++ b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js @@ -399,6 +399,27 @@ function newUiObjectsFromNodes () { node.payload = payload node.type = uiObjectType + /* + Now we copy the possible frame saved to the payload where it can be used. A saved frame stores the position of a a chartingSpace object related to a node. + This will prevent that if those charting space objects never get activated, that the frame information is lost when the workspace is saved. + */ + if (node.savedPayload !== undefined) { + if (node.savedPayload.frame !== undefined) { + let frame = { + position: { + x: 0, + y: 0 + } + } + frame.position.x = node.savedPayload.frame.position.x + frame.position.y = node.savedPayload.frame.position.y + frame.width = node.savedPayload.frame.width + frame.height = node.savedPayload.frame.height + frame.radius = node.savedPayload.frame.radius + saveFrame(payload, frame) + } + } + /* Now we mount the floating object where the UIOBject will be laying on top of */ canvas.floatingSpace.uiObjectConstructor.createUiObject(userAddingNew, payload) diff --git a/Utilities.js b/Utilities.js index fe5e3b257..2588156b9 100644 --- a/Utilities.js +++ b/Utilities.js @@ -42,7 +42,6 @@ function loadPropertyFromNodeConfig (payload, propertyName) { } function saveFrame (payload, frame) { - if (frame.position.x === 0 && frame.position.y === 0) { return } payload.frame = { position: { x: frame.position.x, From e577eb4bc4c221c458164e2ad4c68f435670adbd Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Mar 2020 17:26:06 +0100 Subject: [PATCH 063/166] Super Actions cloned --- .../Workspace/FunctionLibraries/CCXTFunctions.js | 14 +++++++++++++- DesignSpace/Workspace/Workspace.js | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js index 385d6550b..f60c0900a 100644 --- a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js @@ -123,9 +123,12 @@ function newCCXTFunctions () { } } - function addMissingMarkets (node, functionLibraryUiObjectsFromNodes) { + function addMissingMarkets (node, functionLibraryUiObjectsFromNodes, functionLibraryNodeCloning) { if (node.payload.parentNode === undefined) { return } if (node.payload.parentNode.exchangeAssets === undefined) { return } + if (node.payload.parentNode.payload.parentNode === undefined) { return } + if (node.payload.parentNode.payload.parentNode.payload.parentNode === undefined) { return } + if (node.payload.parentNode.payload.parentNode.payload.parentNode.superActions === undefined) { return } let currentAssets = new Map() let exchangeAssets = node.payload.parentNode.exchangeAssets @@ -185,6 +188,15 @@ function newCCXTFunctions () { newMarket.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X newMarket.baseAsset.payload.referenceParent = baseAsset newMarket.quotedAsset.payload.referenceParent = quotedAsset + + let superActions = node.payload.parentNode.payload.parentNode.payload.parentNode.superActions + + for (let j = 0; j < superActions.superActions.length; j++) { + let superAction = superActions.superActions[j] + let clone = functionLibraryNodeCloning.getNodeClone(superAction) + functionLibraryUiObjectsFromNodes.createUiObjectFromNode(clone, newMarket, newMarket) + newMarket.superActions.push(clone) + } } } } diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 136cce8fe..415d34e58 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -383,7 +383,7 @@ function newWorkspace () { break case 'Add Missing Markets': { - functionLibraryCCXTFunctions.addMissingMarkets(payload.node, functionLibraryUiObjectsFromNodes) + functionLibraryCCXTFunctions.addMissingMarkets(payload.node, functionLibraryUiObjectsFromNodes, functionLibraryNodeCloning) } break From ec051e10a81167b50c4b3d9a7727f31025dfc6e7 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Mar 2020 18:50:03 +0100 Subject: [PATCH 064/166] Labels on the side --- ChartingSpace/TimeMachine.js | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 09491fa0c..34eb7516d 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -603,13 +603,13 @@ function newTimeMachine () { if (description !== undefined) { label = description } - printLabel(label, position.x + 15, position.y - 28, opacity, fontSize) + printLabel(label, position.x + 15, position.y - 10, opacity, fontSize) if (icon !== undefined) { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( icon, position.x - 0, - position.y - 40, + position.y - 22, imageSize, imageSize) } @@ -638,22 +638,29 @@ function newTimeMachine () { } const INTER_EXCHANGE_SPACE = 60 - const INTER_MARKET_SPACE = 90 + const INTER_MARKET_SPACE = -100 exchangeMarkets.forEach((exchangeMarket, i) => { + browserCanvasContext.save() + browserCanvasContext.translate(position.x, position.y) + browserCanvasContext.rotate(-Math.PI / 2) + + let xOffSet = -80 + icon = exchangeMarket.exchangeIcon if (icon !== undefined) { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( - icon, position.x - 0, - position.y - 22, + icon, + -15 + xOffSet, + -43, imageSize, imageSize) } } - printLabel(exchangeMarket.exchangeName, position.x + 15, position.y - 10, opacity, fontSize) + printLabel(exchangeMarket.exchangeName, -0 + xOffSet, -30, opacity, fontSize) position.x = position.x + INTER_EXCHANGE_SPACE @@ -661,27 +668,31 @@ function newTimeMachine () { if (icon !== undefined) { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( - icon, position.x - 0, - position.y - 22, + icon, + -20 + xOffSet, + -22, imageSize, imageSize) } } - printLabel(exchangeMarket.marketName, position.x + 15, position.y - 10, opacity, fontSize) + printLabel(exchangeMarket.marketName, -5 + xOffSet, -10, opacity, fontSize) icon = exchangeMarket.quotedAssetIcon if (icon !== undefined) { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( - icon, position.x + 70, - position.y - 22, + icon, + +50 + xOffSet, + -22, imageSize, imageSize) } } position.x = position.x + INTER_MARKET_SPACE + + browserCanvasContext.restore() }) } @@ -704,3 +715,4 @@ function newTimeMachine () { ) } } + From 3a6bb5740ce70dca36dae1f44a0a028d3d620231 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 6 Mar 2020 20:21:04 +0100 Subject: [PATCH 065/166] on the side --- ChartingSpace/TimeMachine.js | 59 +++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 34eb7516d..8a262e2b8 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -603,12 +603,12 @@ function newTimeMachine () { if (description !== undefined) { label = description } - printLabel(label, position.x + 15, position.y - 10, opacity, fontSize) + printLabel(label, position.x + 20, position.y - 10, opacity, fontSize) if (icon !== undefined) { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( - icon, position.x - 0, + icon, position.x + 5, position.y - 22, imageSize, imageSize) @@ -637,6 +637,8 @@ function newTimeMachine () { } } + drawTab(0, 0, exchangeMarkets.size * 40, 90, thisObject.container) + const INTER_EXCHANGE_SPACE = 60 const INTER_MARKET_SPACE = -100 @@ -653,14 +655,14 @@ function newTimeMachine () { if (icon.canDrawIcon === true) { browserCanvasContext.drawImage( icon, - -15 + xOffSet, + -20 + xOffSet, -43, imageSize, imageSize) } } - printLabel(exchangeMarket.exchangeName, -0 + xOffSet, -30, opacity, fontSize) + printLabel(exchangeMarket.exchangeName, -5 + xOffSet, -30, opacity, fontSize, UI_COLOR.GREY) position.x = position.x + INTER_EXCHANGE_SPACE @@ -676,7 +678,7 @@ function newTimeMachine () { } } - printLabel(exchangeMarket.marketName, -5 + xOffSet, -10, opacity, fontSize) + printLabel(exchangeMarket.marketName, -5 + xOffSet, -10, opacity, fontSize, UI_COLOR.GREY) icon = exchangeMarket.quotedAssetIcon if (icon !== undefined) { @@ -694,6 +696,53 @@ function newTimeMachine () { browserCanvasContext.restore() }) + + function drawTab (x, y, width, height, container) { + const GRADIENT = 0 + const X_OFFSET = -3 + const Y_OFFSET = 13 + const TAB_CORNERS_RADIUS = 5 + + let point = { + x: x, + y: y + } + point = transformThisPoint(point, container) + + let point1 = { + x: point.x + X_OFFSET, + y: point.y + Y_OFFSET + } + + let point2 = { + x: point.x + X_OFFSET, + y: point.y + height + Y_OFFSET + } + + let point3 = { + x: point.x - width + X_OFFSET, + y: point.y + height - GRADIENT + Y_OFFSET + } + + let point4 = { + x: point.x - width + X_OFFSET, + y: point.y + GRADIENT + Y_OFFSET + } + + browserCanvasContext.beginPath() + browserCanvasContext.moveTo(point1.x, point1.y) + browserCanvasContext.lineTo(point2.x, point2.y) + browserCanvasContext.lineTo(point3.x, point3.y) + browserCanvasContext.arc(point3.x, point3.y - TAB_CORNERS_RADIUS, TAB_CORNERS_RADIUS, 0.5 * Math.PI, 1.0 * Math.PI) + // browserCanvasContext.lineTo(point4.x, point4.y) + browserCanvasContext.arc(point4.x, point4.y + TAB_CORNERS_RADIUS, TAB_CORNERS_RADIUS, 1.0 * Math.PI, 1.5 * Math.PI) + browserCanvasContext.closePath() + browserCanvasContext.lineWidth = 1 + browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + '' + browserCanvasContext.stroke() + browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', ' + opacity + '' + browserCanvasContext.fill() + } } function recalculateCoordinateSystem () { From e1604d53153e71a3667ac3a3d81870eabcc8ed1e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 08:05:48 +0100 Subject: [PATCH 066/166] Tab Animation --- ChartingSpace/TimeMachine.js | 122 +++++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 8a262e2b8..e21cb3466 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -44,6 +44,10 @@ function newTimeMachine () { } } + let tabAnimation = 0 + let tabAnimationStatus = 'Close' + let tabAnimationCounter = 0 + let wasOnFocus = false let drawScales = false let syncWithDesignerLoop = 0 let timelineChartsMap = new Map() @@ -373,9 +377,36 @@ function newTimeMachine () { } panelPhysics() onFocusPhysics() + tabAnimationPhysics() + } + + function tabAnimationPhysics () { + const MAX_COUNTER_VALUE = 40 + const STEP = 10 + + if (wasOnFocus === true && thisObject.onFocus === false) { + tabAnimationStatus = 'Closing' + } + if (wasOnFocus === false && thisObject.onFocus === true) { + tabAnimationStatus = 'Opening' + } + + if (tabAnimationStatus === 'Closing') { + tabAnimationCounter = tabAnimationCounter - STEP + if (tabAnimationCounter === 0) { + tabAnimationStatus = 'Closed' + } + } + if (tabAnimationStatus === 'Opening') { + tabAnimationCounter = tabAnimationCounter + STEP + if (tabAnimationCounter === MAX_COUNTER_VALUE) { + tabAnimationStatus = 'Open' + } + } } function onFocusPhysics () { + wasOnFocus = thisObject.onFocus if (thisObject.edgeEditor.isMouseOver === true) { thisObject.onFocus = true } else { @@ -637,65 +668,71 @@ function newTimeMachine () { } } - drawTab(0, 0, exchangeMarkets.size * 40, 90, thisObject.container) + drawTab(0, 0, exchangeMarkets.size * tabAnimationCounter, 90, thisObject.container) const INTER_EXCHANGE_SPACE = 60 const INTER_MARKET_SPACE = -100 - exchangeMarkets.forEach((exchangeMarket, i) => { - browserCanvasContext.save() - browserCanvasContext.translate(position.x, position.y) - browserCanvasContext.rotate(-Math.PI / 2) + if (tabAnimationStatus === 'Open') { + drawMarketNames() + } - let xOffSet = -80 + function drawMarketNames () { + exchangeMarkets.forEach((exchangeMarket, i) => { + browserCanvasContext.save() + browserCanvasContext.translate(position.x, position.y) + browserCanvasContext.rotate(-Math.PI / 2) - icon = exchangeMarket.exchangeIcon + let xOffSet = -80 - if (icon !== undefined) { - if (icon.canDrawIcon === true) { - browserCanvasContext.drawImage( - icon, - -20 + xOffSet, - -43, - imageSize, - imageSize) + icon = exchangeMarket.exchangeIcon + + if (icon !== undefined) { + if (icon.canDrawIcon === true) { + browserCanvasContext.drawImage( + icon, + -20 + xOffSet, + -43, + imageSize, + imageSize) + } } - } - printLabel(exchangeMarket.exchangeName, -5 + xOffSet, -30, opacity, fontSize, UI_COLOR.GREY) + printLabel(exchangeMarket.exchangeName, -5 + xOffSet, -30, opacity, fontSize, UI_COLOR.GREY) - position.x = position.x + INTER_EXCHANGE_SPACE + position.x = position.x + INTER_EXCHANGE_SPACE - icon = exchangeMarket.baseAssetIcon - if (icon !== undefined) { - if (icon.canDrawIcon === true) { - browserCanvasContext.drawImage( - icon, - -20 + xOffSet, - -22, - imageSize, - imageSize) + icon = exchangeMarket.baseAssetIcon + if (icon !== undefined) { + if (icon.canDrawIcon === true) { + browserCanvasContext.drawImage( + icon, + -20 + xOffSet, + -22, + imageSize, + imageSize) + } } - } - printLabel(exchangeMarket.marketName, -5 + xOffSet, -10, opacity, fontSize, UI_COLOR.GREY) + printLabel(exchangeMarket.marketName, -5 + xOffSet, -10, opacity, fontSize, UI_COLOR.GREY) - icon = exchangeMarket.quotedAssetIcon - if (icon !== undefined) { - if (icon.canDrawIcon === true) { - browserCanvasContext.drawImage( - icon, - +50 + xOffSet, - -22, - imageSize, - imageSize) + icon = exchangeMarket.quotedAssetIcon + if (icon !== undefined) { + if (icon.canDrawIcon === true) { + browserCanvasContext.drawImage( + icon, + +50 + xOffSet, + -22, + imageSize, + imageSize) + } } - } - position.x = position.x + INTER_MARKET_SPACE + position.x = position.x + INTER_MARKET_SPACE - browserCanvasContext.restore() - }) + browserCanvasContext.restore() + }) + } function drawTab (x, y, width, height, container) { const GRADIENT = 0 @@ -764,4 +801,3 @@ function newTimeMachine () { ) } } - From a3bbceed4d2aac7eb2a0154b1050d596ca404e07 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 09:05:10 +0100 Subject: [PATCH 067/166] small border --- ChartingSpace/EdgeEditor.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 402418a3c..7850c2627 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -342,7 +342,7 @@ function newEdgeEditor () { let lineWidth if (whereIsMouseOver === 'outside' || thisObject.isMouseOver === false) { - edgeSize = EDGE_SIZE / 2 + edgeSize = 2 lineWidth = 0.1 } else { edgeSize = EDGE_SIZE @@ -508,3 +508,4 @@ function newEdgeEditor () { } } } + From c95c2a8e4c716b9f93b5cd738f5b7a57d998eadc Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 12:25:52 +0100 Subject: [PATCH 068/166] Top Working --- ChartingSpace/EdgeEditor.js | 106 ++++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 11 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 7850c2627..368a2f0fe 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -28,6 +28,7 @@ function newEdgeEditor () { let whereIsMouseOver = 'outside' let coordinateSystem + let coordinateSystemWhenDragStarted let onMouseOverEventSubscriptionId let onMouseNotOverEventSubscriptionId @@ -39,6 +40,22 @@ function newEdgeEditor () { y: 0 } } + + mouseWhenDragStarted = { + position: { + x: 0, + y: 0 + } + } + + parentFrameWhenDragStarted = { + position: { + x: 0, + y: 0 + }, + width: 0, + height: 0 + } return thisObject function finalize () { @@ -50,6 +67,16 @@ function newEdgeEditor () { thisObject.container = undefined thisObject.fitFunction = undefined mouse = undefined + mouseWhenDragStarted = undefined + parentFrameWhenDragStarted = undefined + + coordinateSystem = undefined + + if (coordinateSystemWhenDragStarted !== undefined) { + coordinateSystemWhenDragStarted.finalize() + } + + coordinateSystemWhenDragStarted = undefined } function initialize (pCoordinateSystem) { @@ -75,6 +102,36 @@ function newEdgeEditor () { } function onDragStarted (event) { + mouseWhenDragStarted = { + position: { + x: event.x, + y: event.y + } + } + + parentFrameWhenDragStarted = { + position: { + x: thisObject.container.parentContainer.frame.position.x, + y: thisObject.container.parentContainer.frame.position.y + }, + width: thisObject.container.parentContainer.frame.width, + height: thisObject.container.parentContainer.frame.height + } + + coordinateSystemWhenDragStarted = newCoordinateSystem() + + let minValue = { + x: coordinateSystem.min.x, + y: coordinateSystem.min.y + } + + let maxValue = { + x: coordinateSystem.max.x, + y: coordinateSystem.max.y + } + + coordinateSystemWhenDragStarted.initialize(minValue, maxValue, coordinateSystem.maxWidth, coordinateSystem.maxHeight) + switch (event.buttons) { case 1: { whatHappened = 'left mouse button' @@ -149,6 +206,14 @@ function newEdgeEditor () { function physics () { if (thisObject.container.frame.position.x === 0 && thisObject.container.frame.position.y === 0) { return } + let mouseNoZoom = canvas.chartingSpace.viewport.unTransformThisPoint(mouse.position) + let mouseWhenDragStartedNoZoom = canvas.chartingSpace.viewport.unTransformThisPoint(mouseWhenDragStarted.position) + + let dragVectorWhenDragStarted = { + x: mouseNoZoom.x - mouseWhenDragStartedNoZoom.x, + y: mouseNoZoom.y - mouseWhenDragStartedNoZoom.y + } + let dragVector = { x: thisObject.container.frame.position.x, y: thisObject.container.frame.position.y @@ -165,8 +230,9 @@ function newEdgeEditor () { switch (whatHappened) { case 'left mouse button + SHIFT': { /* This is equivalent to drag the whole Time Machine, so we will apply the translation received onto the Time Machine container. */ - thisObject.container.parentContainer.frame.position.x = thisObject.container.parentContainer.frame.position.x + dragVector.x - thisObject.container.parentContainer.frame.position.y = thisObject.container.parentContainer.frame.position.y + dragVector.y + thisObject.container.parentContainer.frame.position.x = parentFrameWhenDragStarted.position.x + dragVectorWhenDragStarted.x + thisObject.container.parentContainer.frame.position.y = parentFrameWhenDragStarted.position.y + dragVectorWhenDragStarted.y + snapPointToGrid(thisObject.container.parentContainer.frame.position) thisObject.container.parentContainer.eventHandler.raiseEvent('onDisplace') break } @@ -175,6 +241,7 @@ function newEdgeEditor () { x: -dragVector.x, y: -dragVector.y } + let newMinDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) let newMaxRate = getRateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) let xDifferenceMaxMin = coordinateSystem.max.x - coordinateSystem.min.x @@ -194,6 +261,7 @@ function newEdgeEditor () { x: -dragVector.x, y: 0 } + let newMinDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) let xDifferenceMaxMin = coordinateSystem.max.x - coordinateSystem.min.x coordinateSystem.min.x = newMinDate.valueOf() @@ -213,14 +281,18 @@ function newEdgeEditor () { return } - let point = { - x: dragVector.x, - y: dragVector.y - } - let newMaxRate = getRateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) + thisObject.container.parentContainer.frame.position.y = parentFrameWhenDragStarted.position.y + dragVectorWhenDragStarted.y + snapPointToGrid(thisObject.container.parentContainer.frame.position) + thisObject.container.parentContainer.frame.height = parentFrameWhenDragStarted.height + (parentFrameWhenDragStarted.position.y - thisObject.container.parentContainer.frame.position.y) - thisObject.container.parentContainer.frame.position.y = thisObject.container.parentContainer.frame.position.y + dragVector.y - thisObject.container.parentContainer.frame.height = thisObject.container.parentContainer.frame.height - dragVector.y + let point = { + x: 0, + y: (thisObject.container.parentContainer.frame.position.y - parentFrameWhenDragStarted.position.y) + } + + /* This is equivalent to getRateFromPointAtContainer, but as we do not have a container anymore because we already change it, we do it like this. */ + point = coordinateSystemWhenDragStarted.unInverseTransform(point, parentFrameWhenDragStarted.height) + let newMaxRate = point.y switch (whatHappened) { case 'left mouse button': { @@ -251,6 +323,7 @@ function newEdgeEditor () { x: dragVector.x, y: dragVector.y + thisObject.container.frame.height } + snapPointToGrid(point) let newMinRate = getRateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) thisObject.container.parentContainer.frame.height = thisObject.container.parentContainer.frame.height + dragVector.y @@ -283,6 +356,7 @@ function newEdgeEditor () { x: dragVector.x, y: dragVector.y } + snapPointToGrid(point) let newMinDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) thisObject.container.parentContainer.frame.position.x = thisObject.container.parentContainer.frame.position.x + dragVector.x @@ -313,9 +387,10 @@ function newEdgeEditor () { x: dragVector.x + thisObject.container.frame.width, y: dragVector.y } + snapPointToGrid(point) let newMaxDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) - thisObject.container.parentContainer.frame.width = thisObject.container.parentContainer.frame.width + dragVector.x + thisObject.container.parentContainer.frame.width = point.x switch (whatHappened) { case 'left mouse button': { @@ -334,6 +409,16 @@ function newEdgeEditor () { break } } + + function snapPointToGrid (point) { + point.x = snapScalarToGrid(point.x) + point.y = snapScalarToGrid(point.y) + } + + function snapScalarToGrid (scalar) { + const GRID_SIZE = 10 + return Math.trunc(scalar / GRID_SIZE) * GRID_SIZE + } } function drawForeground () { @@ -508,4 +593,3 @@ function newEdgeEditor () { } } } - From f52176f800294603aaacdb65b2353ba6ebcaccd9 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 14:21:02 +0100 Subject: [PATCH 069/166] left is done --- ChartingSpace/EdgeEditor.js | 61 +++++++++++++++++++++++------------- ChartingSpace/TimeMachine.js | 6 ++-- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 368a2f0fe..e77516690 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -222,8 +222,8 @@ function newEdgeEditor () { thisObject.container.frame.position.x = 0 thisObject.container.frame.position.y = 0 - const MIN_WIDTH = 100 - const MIN_HEIGHT = 50 + const MIN_WIDTH = 250 + const MIN_HEIGHT = 120 switch (whereIsMouseOver) { case 'center': { @@ -277,8 +277,11 @@ function newEdgeEditor () { break } case 'top' : { - if (thisObject.container.parentContainer.frame.height - dragVector.y < MIN_HEIGHT && dragVector.y > 0) { - return + dragVectorWhenDragStarted.x = 0 + + let newHight = parentFrameWhenDragStarted.height - dragVectorWhenDragStarted.y + if (newHight < MIN_HEIGHT && dragVectorWhenDragStarted.y > 0) { + dragVectorWhenDragStarted.y = parentFrameWhenDragStarted.height - MIN_HEIGHT } thisObject.container.parentContainer.frame.position.y = parentFrameWhenDragStarted.position.y + dragVectorWhenDragStarted.y @@ -315,18 +318,25 @@ function newEdgeEditor () { break } case 'bottom' : { - if (thisObject.container.parentContainer.frame.height + dragVector.y < MIN_HEIGHT && dragVector.y < 0) { - return + dragVectorWhenDragStarted.x = 0 + + let newHight = dragVectorWhenDragStarted.y + parentFrameWhenDragStarted.height + if (newHight < MIN_HEIGHT && dragVectorWhenDragStarted.y < 0) { + dragVectorWhenDragStarted.y = MIN_HEIGHT - parentFrameWhenDragStarted.height } let point = { - x: dragVector.x, - y: dragVector.y + thisObject.container.frame.height + x: 0, + y: dragVectorWhenDragStarted.y + parentFrameWhenDragStarted.height + parentFrameWhenDragStarted.position.y } snapPointToGrid(point) - let newMinRate = getRateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) + point.y = point.y - parentFrameWhenDragStarted.position.y - thisObject.container.parentContainer.frame.height = thisObject.container.parentContainer.frame.height + dragVector.y + thisObject.container.parentContainer.frame.height = point.y + + /* This is equivalent to getRateFromPointAtContainer, but as we do not have a container anymore because we already change it, we do it like this. */ + point = coordinateSystemWhenDragStarted.unInverseTransform(point, parentFrameWhenDragStarted.height) + let newMinRate = point.y switch (whatHappened) { case 'left mouse button': { @@ -349,18 +359,25 @@ function newEdgeEditor () { break } case 'left' : { - if (thisObject.container.parentContainer.frame.width - dragVector.x < MIN_WIDTH && dragVector.x > 0) { - return - } - let point = { - x: dragVector.x, - y: dragVector.y - } - snapPointToGrid(point) - let newMinDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) + dragVectorWhenDragStarted.y = 0 - thisObject.container.parentContainer.frame.position.x = thisObject.container.parentContainer.frame.position.x + dragVector.x - thisObject.container.parentContainer.frame.width = thisObject.container.parentContainer.frame.width - dragVector.x + let newWidth = parentFrameWhenDragStarted.width - dragVectorWhenDragStarted.x + if (newWidth < MIN_WIDTH && dragVectorWhenDragStarted.x > 0) { + dragVectorWhenDragStarted.x = parentFrameWhenDragStarted.width - MIN_WIDTH + } + + thisObject.container.parentContainer.frame.position.x = parentFrameWhenDragStarted.position.x + dragVectorWhenDragStarted.x + snapPointToGrid(thisObject.container.parentContainer.frame.position) + thisObject.container.parentContainer.frame.width = parentFrameWhenDragStarted.width + (parentFrameWhenDragStarted.position.x - thisObject.container.parentContainer.frame.position.x) + + let point = { + x: (thisObject.container.parentContainer.frame.position.x - parentFrameWhenDragStarted.position.x), + y: 0 + } + + /* This is equivalent to getDateFromPointAtContainer, but as we do not have a container anymore because we already change it, we do it like this. */ + point = coordinateSystemWhenDragStarted.unInverseTransform(point, parentFrameWhenDragStarted.width) + let newMinDate = point.x switch (whatHappened) { case 'left mouse button': { @@ -417,7 +434,7 @@ function newEdgeEditor () { function snapScalarToGrid (scalar) { const GRID_SIZE = 10 - return Math.trunc(scalar / GRID_SIZE) * GRID_SIZE + return Math.trunc(scalar / GRID_SIZE) * GRID_SIZE + GRID_SIZE / 2 } } diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index e21cb3466..a93192eb5 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -393,13 +393,15 @@ function newTimeMachine () { if (tabAnimationStatus === 'Closing') { tabAnimationCounter = tabAnimationCounter - STEP - if (tabAnimationCounter === 0) { + if (tabAnimationCounter <= 0) { + tabAnimationCounter = 0 tabAnimationStatus = 'Closed' } } if (tabAnimationStatus === 'Opening') { tabAnimationCounter = tabAnimationCounter + STEP - if (tabAnimationCounter === MAX_COUNTER_VALUE) { + if (tabAnimationCounter >= MAX_COUNTER_VALUE) { + tabAnimationCounter = MAX_COUNTER_VALUE tabAnimationStatus = 'Open' } } From 36c40bb3f19376cd164a37e3b82f65afc7227a59 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 14:29:14 +0100 Subject: [PATCH 070/166] edges finished --- ChartingSpace/EdgeEditor.js | 17 ++++++++++++----- Globals.js | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index e77516690..4759e9063 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -396,19 +396,26 @@ function newEdgeEditor () { break } case 'right' : { - if (thisObject.container.parentContainer.frame.width + dragVector.x < MIN_WIDTH && dragVector.x < 0) { - return + dragVectorWhenDragStarted.y = 0 + + let newWidth = dragVectorWhenDragStarted.x + parentFrameWhenDragStarted.width + if (newWidth < MIN_WIDTH && dragVectorWhenDragStarted.x < 0) { + dragVectorWhenDragStarted.x = MIN_WIDTH - parentFrameWhenDragStarted.width } let point = { - x: dragVector.x + thisObject.container.frame.width, - y: dragVector.y + x: dragVectorWhenDragStarted.x + parentFrameWhenDragStarted.width + parentFrameWhenDragStarted.position.x, + y: 0 } snapPointToGrid(point) - let newMaxDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) + point.x = point.x - parentFrameWhenDragStarted.position.x thisObject.container.parentContainer.frame.width = point.x + /* This is equivalent to getRateFromPointAtContainer, but as we do not have a container anymore because we already change it, we do it like this. */ + point = coordinateSystemWhenDragStarted.unInverseTransform(point, parentFrameWhenDragStarted.width) + let newMaxDate = point.x + switch (whatHappened) { case 'left mouse button': { coordinateSystem.max.x = newMaxDate.valueOf() diff --git a/Globals.js b/Globals.js index 1a1c76a6b..57706701e 100644 --- a/Globals.js +++ b/Globals.js @@ -213,7 +213,7 @@ const PERIOD_01_MIN = "01-min"; We define here the size of the chartingSpace. It has to bee enough big in order to accomodate all the charts we expect to display in this space. */ -const TIME_MACHINE_WIDTH = 320; +const TIME_MACHINE_WIDTH = 250; const TIME_MACHINE_HEIGHT = 120; let mediaRecorder // to downloadText canvas animation as a mediaRecorder From 45a86d05cd3b8c94a3e022b186420c25396eeebb Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 15:54:19 +0100 Subject: [PATCH 071/166] snap to grid finished, bug fixed --- ChartingSpace/EdgeEditor.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 4759e9063..17cb15c48 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -238,14 +238,15 @@ function newEdgeEditor () { } case 'left mouse button': { let point = { - x: -dragVector.x, - y: -dragVector.y + x: (-dragVectorWhenDragStarted.x), + y: (-dragVectorWhenDragStarted.y) } - let newMinDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) - let newMaxRate = getRateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) - let xDifferenceMaxMin = coordinateSystem.max.x - coordinateSystem.min.x - let yDifferenceMaxMin = coordinateSystem.max.y - coordinateSystem.min.y + let newMinDate = getDateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystemWhenDragStarted) + let newMaxRate = getRateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystemWhenDragStarted) + + let xDifferenceMaxMin = coordinateSystemWhenDragStarted.max.x - coordinateSystemWhenDragStarted.min.x + let yDifferenceMaxMin = coordinateSystemWhenDragStarted.max.y - coordinateSystemWhenDragStarted.min.y coordinateSystem.min.x = newMinDate.valueOf() coordinateSystem.max.x = newMinDate.valueOf() + xDifferenceMaxMin coordinateSystem.min.y = newMaxRate - yDifferenceMaxMin From 8c7cdce253f0400adca1a2544c58eb2a4b8557f6 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 17:54:19 +0100 Subject: [PATCH 072/166] viewport cleaned --- ChartingSpace/EdgeEditor.js | 34 ++++++++++++++++++++++++++++++++++ ChartingSpace/Viewport.js | 25 +------------------------ Globals.js | 3 +++ 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 17cb15c48..c321cb84d 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -56,6 +56,9 @@ function newEdgeEditor () { width: 0, height: 0 } + + let doubleClickCounter = 0 + return thisObject function finalize () { @@ -101,7 +104,26 @@ function newEdgeEditor () { thisObject.isMouseOver = false } + function onDoubleClick () { + doubleClickCounter = 0 + + // canvas.chartingSpace.viewport.displaceToContainer(thisObject.container.parentContainer) + + if (canvas.chartingSpace.viewport.zoomLevel === DOUBLE_CLICK_ZOOM_IN_LEVEL) { + canvas.chartingSpace.viewport.zoomAtCenter(DOUBLE_CLICK_ZOOM_OUT_LEVEL) + } else { + canvas.chartingSpace.viewport.zoomAtCenter(DOUBLE_CLICK_ZOOM_IN_LEVEL) + } + } + function onDragStarted (event) { + if (doubleClickCounter > 0) { + onDoubleClick() + return + } else { + doubleClickCounter = 50 + } + mouseWhenDragStarted = { position: { x: event.x, @@ -204,6 +226,18 @@ function newEdgeEditor () { } function physics () { + draggingPhysics() + doubleClickPhysics() + } + + function doubleClickPhysics () { + doubleClickCounter-- + if (doubleClickCounter < 0) { + doubleClickCounter = 0 + } + } + + function draggingPhysics () { if (thisObject.container.frame.position.x === 0 && thisObject.container.frame.position.y === 0) { return } let mouseNoZoom = canvas.chartingSpace.viewport.unTransformThisPoint(mouse.position) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 76b6c6528..9a5132919 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -50,14 +50,7 @@ function newViewport () { x: 0, y: 0 } - let targetPosition = { - x: 0, - y: 0 - } - let positionIncrement = { - x: 0, - y: 0 - } + thisObject.mousePosition = { x: 0, y: 0 @@ -169,14 +162,6 @@ function newViewport () { thisObject.zoomLevel = thisObject.zoomLevel - ANIMATION_INCREMENT changeZoom(thisObject.zoomLevel + ANIMATION_INCREMENT, thisObject.zoomLevel) } - - if (positionIncrement.y !== 0) { - if (Math.trunc(Math.abs(targetPosition.y - position.y) * 1000) >= Math.trunc(Math.abs(positionIncrement.y) * 1000)) { - position.y = position.y + positionIncrement.y - } else { - positionIncrement.y = 0 - } - } } function onMouseWheel (event) { @@ -290,14 +275,6 @@ function newViewport () { saveObjectState() - targetPosition.x = position.x - targetPosition.y = position.y - - positionIncrement = { - x: 0, - y: 0 - } - thisObject.eventHandler.raiseEvent('Zoom Changed') } diff --git a/Globals.js b/Globals.js index 57706701e..075f36207 100644 --- a/Globals.js +++ b/Globals.js @@ -168,6 +168,9 @@ const _3_MINUTES_IN_MILISECONDS = 3 * 60 * 1000; const _2_MINUTES_IN_MILISECONDS = 2 * 60 * 1000; const _1_MINUTE_IN_MILISECONDS = 1 * 60 * 1000; +const DOUBLE_CLICK_ZOOM_OUT_LEVEL = 0 +const DOUBLE_CLICK_ZOOM_IN_LEVEL = 2 + let NEW_SESSION_INITIAL_DATE = new Date(); // This value will be overwritten at the canvas.chartingSpace.viewport.initialize if the user had a prevous session with this same browser. let INITIAL_ZOOM_LEVEL = -28.25 // This is the zoom level at the view port in which the APP starts. let INITIAL_TIME_PERIOD = ONE_DAY_IN_MILISECONDS // This value will be overwritten at the canvas.chartingSpace.viewport.initialize if the user had a prevous session with this same browser. From 82985b04e4341a59beece9a6bac2daed5ff104f3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 17:56:13 +0100 Subject: [PATCH 073/166] zoom at center --- ChartingSpace/Viewport.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 9a5132919..9032e654a 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -30,6 +30,7 @@ function newViewport () { mousePosition: undefined, margins: MARGINS, payload: undefined, + zoomAtCenter: zoomAtCenter, changeZoom: changeZoom, onMouseWheel: onMouseWheel, transformThisPoint: transformThisPoint, @@ -62,6 +63,8 @@ function newViewport () { thisObject.zoomTargetLevel = MIN_ZOOM_LEVEL INITIAL_TIME_PERIOD = recalculatePeriod(thisObject.zoomLevel) + let overrideMousePositionCounter = 0 + return thisObject function finalize () { @@ -263,6 +266,11 @@ function newViewport () { thisObject.eventHandler.raiseEvent('Position Changed', event) } + function zoomAtCenter (level) { + thisObject.zoomTargetLevel = level + overrideMousePositionCounter = 10 + } + function changeZoom (oldLevel, newLevel) { if (thisObject.visible === false) { return } let oldMouse = unTransformThisPoint(thisObject.mousePosition, oldLevel) From d8d1a0ddf51d30f6197d8f9304939164eb1043a1 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 18:02:12 +0100 Subject: [PATCH 074/166] Bug fixed --- ChartingSpace/Viewport.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 9032e654a..cacfaf5ad 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -133,8 +133,22 @@ function newViewport () { thisObject.eventHandler.raiseEvent('Position Changed', event) } + function mousePositionPhysics () { + if (overrideMousePositionCounter > 0) { + thisObject.mousePosition.x = browserCanvas.width / 2 + thisObject.mousePosition.y = (browserCanvas.height - TOP_SPACE_HEIGHT) / 2 + TOP_SPACE_HEIGHT + + console.log('SETTING MOUSE TO CENTER', overrideMousePositionCounter, thisObject.zoomLevel, thisObject.zoomTargetLevel) + overrideMousePositionCounter-- + if (overrideMousePositionCounter < 0) { + overrideMousePositionCounter = 0 + } + } + } + function physics () { if (thisObject.visible === false) { return } + mousePositionPhysics() animationPhysics() positioningPhysics() readObjectState() From 72a12c346bdae2fa13b928266b359b8201b8eeae Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 18:23:10 +0100 Subject: [PATCH 075/166] Rounding --- ChartingSpace/Viewport.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index cacfaf5ad..c4de37f78 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -166,17 +166,17 @@ function newViewport () { function animationPhysics () { if (thisObject.zoomLevel < thisObject.zoomTargetLevel) { if (thisObject.zoomTargetLevel - thisObject.zoomLevel < ANIMATION_INCREMENT) { - ANIMATION_INCREMENT = Math.abs(thisObject.zoomTargetLevel - thisObject.zoomLevel) + ANIMATION_INCREMENT = Math.round(Math.abs(thisObject.zoomTargetLevel - thisObject.zoomLevel) * 100) / 100 } - thisObject.zoomLevel = thisObject.zoomLevel + ANIMATION_INCREMENT + thisObject.zoomLevel = Math.round((thisObject.zoomLevel + ANIMATION_INCREMENT) * 100) / 100 changeZoom(thisObject.zoomLevel - ANIMATION_INCREMENT, thisObject.zoomLevel) } if (thisObject.zoomLevel > thisObject.zoomTargetLevel) { if (thisObject.zoomLevel - thisObject.zoomTargetLevel < ANIMATION_INCREMENT) { - ANIMATION_INCREMENT = Math.abs(thisObject.zoomTargetLevel - thisObject.zoomLevel) + ANIMATION_INCREMENT = Math.round(Math.abs(thisObject.zoomTargetLevel - thisObject.zoomLevel) * 100) / 100 } - thisObject.zoomLevel = thisObject.zoomLevel - ANIMATION_INCREMENT + thisObject.zoomLevel = Math.round((thisObject.zoomLevel - ANIMATION_INCREMENT) * 100) / 100 changeZoom(thisObject.zoomLevel + ANIMATION_INCREMENT, thisObject.zoomLevel) } } @@ -293,10 +293,9 @@ function newViewport () { position.x = position.x - newMouse.x + thisObject.mousePosition.x position.y = position.y - newMouse.y + thisObject.mousePosition.y - let testPoint = unTransformThisPoint(thisObject.mousePosition, newLevel) - saveObjectState() + console.log('ZOOM LEVEL CHANGED', oldLevel, newLevel) thisObject.eventHandler.raiseEvent('Zoom Changed') } From ba66db2907fc3058c08ce6842e9e06d91fe02f27 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 18:41:49 +0100 Subject: [PATCH 076/166] almost there --- ChartingSpace/EdgeEditor.js | 2 +- ChartingSpace/Viewport.js | 23 +++++++++++++++++------ Globals.js | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index c321cb84d..3b8527410 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -107,7 +107,7 @@ function newEdgeEditor () { function onDoubleClick () { doubleClickCounter = 0 - // canvas.chartingSpace.viewport.displaceToContainer(thisObject.container.parentContainer) + canvas.chartingSpace.viewport.displaceToContainer(thisObject.container.parentContainer) if (canvas.chartingSpace.viewport.zoomLevel === DOUBLE_CLICK_ZOOM_IN_LEVEL) { canvas.chartingSpace.viewport.zoomAtCenter(DOUBLE_CLICK_ZOOM_OUT_LEVEL) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index c4de37f78..12a27c44b 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -40,6 +40,7 @@ function newViewport () { fitIntoVisibleArea: fitIntoVisibleArea, fitIntoViewport: fitIntoViewport, displace: displace, + displaceToContainer: displaceToContainer, physics: physics, raiseEvents: raiseEvents, resize: resize, @@ -133,10 +134,24 @@ function newViewport () { thisObject.eventHandler.raiseEvent('Position Changed', event) } + function displaceToContainer (container) { + let targetPoint = { + x: -container.frame.position.x - container.frame.width / 2, + y: -container.frame.position.y - container.frame.height / 2 + TOP_SPACE_HEIGHT + } + position.x = targetPoint.x + thisObject.width / 2 + position.y = targetPoint.y + thisObject.height / 2 + } + + function zoomAtCenter (level) { + thisObject.zoomTargetLevel = level + overrideMousePositionCounter = 50 + } + function mousePositionPhysics () { if (overrideMousePositionCounter > 0) { thisObject.mousePosition.x = browserCanvas.width / 2 - thisObject.mousePosition.y = (browserCanvas.height - TOP_SPACE_HEIGHT) / 2 + TOP_SPACE_HEIGHT + thisObject.mousePosition.y = (browserCanvas.height - TOP_SPACE_HEIGHT) / 2 - TOP_SPACE_HEIGHT / 2 console.log('SETTING MOUSE TO CENTER', overrideMousePositionCounter, thisObject.zoomLevel, thisObject.zoomTargetLevel) overrideMousePositionCounter-- @@ -280,11 +295,6 @@ function newViewport () { thisObject.eventHandler.raiseEvent('Position Changed', event) } - function zoomAtCenter (level) { - thisObject.zoomTargetLevel = level - overrideMousePositionCounter = 10 - } - function changeZoom (oldLevel, newLevel) { if (thisObject.visible === false) { return } let oldMouse = unTransformThisPoint(thisObject.mousePosition, oldLevel) @@ -406,3 +416,4 @@ function newViewport () { } } } + diff --git a/Globals.js b/Globals.js index 075f36207..949cb3941 100644 --- a/Globals.js +++ b/Globals.js @@ -169,7 +169,7 @@ const _2_MINUTES_IN_MILISECONDS = 2 * 60 * 1000; const _1_MINUTE_IN_MILISECONDS = 1 * 60 * 1000; const DOUBLE_CLICK_ZOOM_OUT_LEVEL = 0 -const DOUBLE_CLICK_ZOOM_IN_LEVEL = 2 +const DOUBLE_CLICK_ZOOM_IN_LEVEL = 7 let NEW_SESSION_INITIAL_DATE = new Date(); // This value will be overwritten at the canvas.chartingSpace.viewport.initialize if the user had a prevous session with this same browser. let INITIAL_ZOOM_LEVEL = -28.25 // This is the zoom level at the view port in which the APP starts. From 8090745478b9d80c09057de8401f1eaa2600c0a0 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 19:08:01 +0100 Subject: [PATCH 077/166] double click working --- ChartingSpace/EdgeEditor.js | 8 ++------ ChartingSpace/Viewport.js | 13 +++++++++---- Globals.js | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 3b8527410..fa46141a4 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -106,12 +106,8 @@ function newEdgeEditor () { function onDoubleClick () { doubleClickCounter = 0 - - canvas.chartingSpace.viewport.displaceToContainer(thisObject.container.parentContainer) - - if (canvas.chartingSpace.viewport.zoomLevel === DOUBLE_CLICK_ZOOM_IN_LEVEL) { - canvas.chartingSpace.viewport.zoomAtCenter(DOUBLE_CLICK_ZOOM_OUT_LEVEL) - } else { + if (canvas.chartingSpace.viewport.zoomLevel === DOUBLE_CLICK_ZOOM_OUT_LEVEL) { + canvas.chartingSpace.viewport.displaceToContainer(thisObject.container.parentContainer) canvas.chartingSpace.viewport.zoomAtCenter(DOUBLE_CLICK_ZOOM_IN_LEVEL) } } diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 12a27c44b..bd650b24d 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -146,6 +146,7 @@ function newViewport () { function zoomAtCenter (level) { thisObject.zoomTargetLevel = level overrideMousePositionCounter = 50 + ANIMATION_INCREMENT = 0.5 } function mousePositionPhysics () { @@ -153,7 +154,7 @@ function newViewport () { thisObject.mousePosition.x = browserCanvas.width / 2 thisObject.mousePosition.y = (browserCanvas.height - TOP_SPACE_HEIGHT) / 2 - TOP_SPACE_HEIGHT / 2 - console.log('SETTING MOUSE TO CENTER', overrideMousePositionCounter, thisObject.zoomLevel, thisObject.zoomTargetLevel) + console.log('SETTING MOUSE TO CENTER ', 'COUNTER ' + overrideMousePositionCounter, 'zoomLevel ' + thisObject.zoomLevel, 'zoomTargetLevel ' + thisObject.zoomTargetLevel) overrideMousePositionCounter-- if (overrideMousePositionCounter < 0) { overrideMousePositionCounter = 0 @@ -185,6 +186,8 @@ function newViewport () { } thisObject.zoomLevel = Math.round((thisObject.zoomLevel + ANIMATION_INCREMENT) * 100) / 100 changeZoom(thisObject.zoomLevel - ANIMATION_INCREMENT, thisObject.zoomLevel) + + console.log('ANIMATION_INCREMENT ' + ANIMATION_INCREMENT) } if (thisObject.zoomLevel > thisObject.zoomTargetLevel) { @@ -193,6 +196,8 @@ function newViewport () { } thisObject.zoomLevel = Math.round((thisObject.zoomLevel - ANIMATION_INCREMENT) * 100) / 100 changeZoom(thisObject.zoomLevel + ANIMATION_INCREMENT, thisObject.zoomLevel) + + console.log('ANIMATION_INCREMENT ' + ANIMATION_INCREMENT) } } @@ -222,9 +227,9 @@ function newViewport () { if (thisObject.zoomTargetLevel + amount * morePower < MIN_ZOOM_LEVEL) { return false } - thisObject.zoomTargetLevel = thisObject.zoomTargetLevel + amount * morePower + thisObject.zoomTargetLevel = Math.round(thisObject.zoomTargetLevel + amount * morePower) - ANIMATION_INCREMENT = Math.abs(thisObject.zoomTargetLevel - thisObject.zoomLevel) / ANIMATION_STEPS + ANIMATION_INCREMENT = Math.round(Math.abs(thisObject.zoomTargetLevel - thisObject.zoomLevel) / ANIMATION_STEPS * 100) / 100 let newEvent = { newLevel: thisObject.zoomTargetLevel, @@ -305,7 +310,7 @@ function newViewport () { saveObjectState() - console.log('ZOOM LEVEL CHANGED', oldLevel, newLevel) + console.log('ZOOM LEVEL CHANGED', 'oldLevel = ' + oldLevel, 'newLevel = ' + newLevel) thisObject.eventHandler.raiseEvent('Zoom Changed') } diff --git a/Globals.js b/Globals.js index 949cb3941..f9f463746 100644 --- a/Globals.js +++ b/Globals.js @@ -169,7 +169,7 @@ const _2_MINUTES_IN_MILISECONDS = 2 * 60 * 1000; const _1_MINUTE_IN_MILISECONDS = 1 * 60 * 1000; const DOUBLE_CLICK_ZOOM_OUT_LEVEL = 0 -const DOUBLE_CLICK_ZOOM_IN_LEVEL = 7 +const DOUBLE_CLICK_ZOOM_IN_LEVEL = 8 let NEW_SESSION_INITIAL_DATE = new Date(); // This value will be overwritten at the canvas.chartingSpace.viewport.initialize if the user had a prevous session with this same browser. let INITIAL_ZOOM_LEVEL = -28.25 // This is the zoom level at the view port in which the APP starts. From 1b1175938d7d3d6da0a273e73114a15193a907ab Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 19:09:18 +0100 Subject: [PATCH 078/166] no logs --- ChartingSpace/Viewport.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index bd650b24d..2f5dad3e7 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -154,7 +154,6 @@ function newViewport () { thisObject.mousePosition.x = browserCanvas.width / 2 thisObject.mousePosition.y = (browserCanvas.height - TOP_SPACE_HEIGHT) / 2 - TOP_SPACE_HEIGHT / 2 - console.log('SETTING MOUSE TO CENTER ', 'COUNTER ' + overrideMousePositionCounter, 'zoomLevel ' + thisObject.zoomLevel, 'zoomTargetLevel ' + thisObject.zoomTargetLevel) overrideMousePositionCounter-- if (overrideMousePositionCounter < 0) { overrideMousePositionCounter = 0 @@ -186,8 +185,6 @@ function newViewport () { } thisObject.zoomLevel = Math.round((thisObject.zoomLevel + ANIMATION_INCREMENT) * 100) / 100 changeZoom(thisObject.zoomLevel - ANIMATION_INCREMENT, thisObject.zoomLevel) - - console.log('ANIMATION_INCREMENT ' + ANIMATION_INCREMENT) } if (thisObject.zoomLevel > thisObject.zoomTargetLevel) { @@ -196,8 +193,6 @@ function newViewport () { } thisObject.zoomLevel = Math.round((thisObject.zoomLevel - ANIMATION_INCREMENT) * 100) / 100 changeZoom(thisObject.zoomLevel + ANIMATION_INCREMENT, thisObject.zoomLevel) - - console.log('ANIMATION_INCREMENT ' + ANIMATION_INCREMENT) } } @@ -310,7 +305,6 @@ function newViewport () { saveObjectState() - console.log('ZOOM LEVEL CHANGED', 'oldLevel = ' + oldLevel, 'newLevel = ' + newLevel) thisObject.eventHandler.raiseEvent('Zoom Changed') } From f9b89acb271a23dc462dfd355b677817a19c9802 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 7 Mar 2020 19:39:42 +0100 Subject: [PATCH 079/166] bug fixed --- Panels/LayersPanel.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index b5d89fbc7..c3c04f019 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -314,6 +314,7 @@ function newLayersPanel () { function physics () { if (isInitialized === false) { return } + if (thisObject.payload.node === undefined) { return } mouseOverPhysics() thisObject.panelTabButton.physics() @@ -344,6 +345,7 @@ function newLayersPanel () { calculateVisbleLayers() function syncWithDesignerLayers () { + if (thisObject.payload.node === undefined) { return } let layerManager = thisObject.payload.node for (let p = 0; p < layerManager.layers.length; p++) { let layerNode = layerManager.layers[p] From fbd7a771e4810a803becd1e6971c6fd83db3468a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Mar 2020 17:17:56 +0100 Subject: [PATCH 080/166] not hidding layers managers --- ChartingSpace/TimeMachine.js | 2 +- Globals.js | 14 ++++++++------ Panels/LayersPanel.js | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index a93192eb5..acff57ffd 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -417,7 +417,7 @@ function newTimeMachine () { } function panelPhysics () { - if (thisObject.container.frame.isCenterInViewPort() && canvas.chartingSpace.viewport.zoomTargetLevel > ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS) { + if (thisObject.container.frame.isCenterInViewPort() && canvas.chartingSpace.viewport.zoomTargetLevel >= ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS) { canvas.panelsSpace.unHide(thisObject.payload.node.id, 'Layers Panel') canvas.panelsSpace.unHide(thisObject.payload.node.id, 'Plotter Panel') } else { diff --git a/Globals.js b/Globals.js index f9f463746..dfddf6b50 100644 --- a/Globals.js +++ b/Globals.js @@ -41,13 +41,16 @@ UI_FONT = { SECONDARY: "Source Code Pro" }; +const DOUBLE_CLICK_ZOOM_OUT_LEVEL = 0 +const DOUBLE_CLICK_ZOOM_IN_LEVEL = 7 + const DEBUG = {} -const ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS = 5 // This regulates some behavious changes that happens when the user zoom out below this level. +const ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS = 7 // This regulates some behavious changes that happens when the user zoom out below this level. const ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME = 3 // This help regulate when to change the Time Frame base on the level of zoom out. const ZOOM_OUT_THRESHOLD_FOR_PACKING_OBJECTS_AT_THE_BOTTOM_OR_TOP_OF_VIEWPORT = 2 -const ZOOM_OUT_THRESHOLD_FOR_PLOTTING_IN_LOW_RESOLUTION = 3 -const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_TIME_MACHINES_ICONIZED = 5 -const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_SCALES = 3 +const ZOOM_OUT_THRESHOLD_FOR_PLOTTING_IN_LOW_RESOLUTION = 3 +const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_TIME_MACHINES_ICONIZED = 5 +const ZOOM_OUT_THRESHOLD_FOR_DISPLAYING_SCALES = 3 let FONT_ASPECT_RATIO = 0.32; @@ -168,8 +171,7 @@ const _3_MINUTES_IN_MILISECONDS = 3 * 60 * 1000; const _2_MINUTES_IN_MILISECONDS = 2 * 60 * 1000; const _1_MINUTE_IN_MILISECONDS = 1 * 60 * 1000; -const DOUBLE_CLICK_ZOOM_OUT_LEVEL = 0 -const DOUBLE_CLICK_ZOOM_IN_LEVEL = 8 + let NEW_SESSION_INITIAL_DATE = new Date(); // This value will be overwritten at the canvas.chartingSpace.viewport.initialize if the user had a prevous session with this same browser. let INITIAL_ZOOM_LEVEL = -28.25 // This is the zoom level at the view port in which the APP starts. diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index c3c04f019..ee8bbcd7c 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -394,7 +394,7 @@ function newLayersPanel () { } function draw () { - if (isInitialized === false || thisObject.visible === false || thisObject.isHidden === true || isMouseOver === false) { return } + if (isInitialized === false || thisObject.visible === false || thisObject.isHidden === true) { return } // thisObject.container.frame.draw(false, false, false, thisObject.fitFunction) From ec996bd41ba40aa7509e74b80ec331e189e5cbe1 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Mar 2020 18:17:58 +0100 Subject: [PATCH 081/166] Improvements on layer panels --- ChartingSpace/TimeMachine.js | 5 ++++- Frame.js | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index acff57ffd..cfa079129 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -417,7 +417,10 @@ function newTimeMachine () { } function panelPhysics () { - if (thisObject.container.frame.isCenterInViewPort() && canvas.chartingSpace.viewport.zoomTargetLevel >= ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS) { + if ( + thisObject.container.frame.isCenterInViewPort() && + canvas.chartingSpace.viewport.zoomLevel >= ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS + ) { canvas.panelsSpace.unHide(thisObject.payload.node.id, 'Layers Panel') canvas.panelsSpace.unHide(thisObject.payload.node.id, 'Plotter Panel') } else { diff --git a/Frame.js b/Frame.js index 01ad949db..04cec82ad 100644 --- a/Frame.js +++ b/Frame.js @@ -81,13 +81,13 @@ function newFrame () { /* This function is usefull to know if the object who has this frame is currently appearing at least in part at the canvas.chartingSpace.viewport */ point1 = { - x: thisObject.width * 25 / 100, - y: thisObject.height * 25 / 100 + x: thisObject.width * 40 / 100, + y: thisObject.height * 40 / 100 } point3 = { - x: thisObject.width * 75 / 100, - y: thisObject.height * 75 / 100 + x: thisObject.width * 40 / 100, + y: thisObject.height * 40 / 100 } /* Now the transformations. */ From 9239867f119645e4d47fd6e6fb65332e99471960 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Mar 2020 18:20:01 +0100 Subject: [PATCH 082/166] cleaning unused code --- Panels/LayersPanel.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index ee8bbcd7c..ba6823d27 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -21,7 +21,6 @@ function newLayersPanel () { thisObject.container.detectMouseOver = true let isInitialized = false - let isMouseOver = false let mouseOverCounter = 0 let layersMap = new Map() @@ -39,12 +38,10 @@ function newLayersPanel () { let posiblePanelHeight = (layerHeight + LAYER_SEPARATION) * posibleVisibleLayers + headerHeight + footerHeight let onMouseWheelEventSuscriptionId - let onMouseOverEventSuscriptionId return thisObject function finalize () { thisObject.container.eventHandler.stopListening(onMouseWheelEventSuscriptionId) - thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId) thisObject.panelTabButton.finalize() thisObject.panelTabButton = undefined @@ -79,7 +76,6 @@ function newLayersPanel () { thisObject.panelTabButton.initialize() onMouseWheelEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseWheel', onMouseWheel) - onMouseOverEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseOver', onMouseOver) readObjectState() @@ -172,11 +168,6 @@ function newLayersPanel () { } } - function onMouseOver (event) { - isMouseOver = true - mouseOverCounter = 150 - } - function onMouseWheel (event) { delta = event.wheelDelta if (delta > 0) { @@ -304,19 +295,10 @@ function newLayersPanel () { readObjectState() } - function mouseOverPhysics () { - mouseOverCounter-- - if (mouseOverCounter < 0) { - mouseOverCounter = 0 - isMouseOver = false - } - } - function physics () { if (isInitialized === false) { return } if (thisObject.payload.node === undefined) { return } - mouseOverPhysics() thisObject.panelTabButton.physics() saveFrame(thisObject.payload, thisObject.container.frame) syncWithConfigPhysics() From fcbf83f0f42dc75ea3b6b54dce43d3f4cd78996f Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 8 Mar 2020 20:21:15 +0100 Subject: [PATCH 083/166] bug mac users --- ChartingSpace/Viewport.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 2f5dad3e7..7ec366e40 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -197,6 +197,8 @@ function newViewport () { } function onMouseWheel (event) { + const MAC_AMOUNT_FACTOR = 5 + if (thisObject.visible === false) { return } if ((event.ctrlKey === true || event.metaKey === true)) { return } let morePower = 1 @@ -204,7 +206,7 @@ function newViewport () { if (event.buttons === 4) { morePower = 2 } // Mouse wheel pressed. /* We adjust the sensitivity for Mac Users */ let isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0 - if (isMac) { amount = amount / 5 } + if (isMac) { amount = amount / MAC_AMOUNT_FACTOR } if (thisObject.zoomTargetLevel > 10) { amount = amount * 2 @@ -222,7 +224,7 @@ function newViewport () { if (thisObject.zoomTargetLevel + amount * morePower < MIN_ZOOM_LEVEL) { return false } - thisObject.zoomTargetLevel = Math.round(thisObject.zoomTargetLevel + amount * morePower) + thisObject.zoomTargetLevel = Math.round((thisObject.zoomTargetLevel + amount * morePower) * MAC_AMOUNT_FACTOR) / MAC_AMOUNT_FACTOR ANIMATION_INCREMENT = Math.round(Math.abs(thisObject.zoomTargetLevel - thisObject.zoomLevel) / ANIMATION_STEPS * 100) / 100 From aa6376275747829a0053a9768699e4cfb409502e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 9 Mar 2020 11:23:29 +0100 Subject: [PATCH 084/166] Bug Fixed --- .../Workspace/FunctionLibraries/UiObjectsFromNodes.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js index 61b209594..a951ce6e0 100644 --- a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js +++ b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js @@ -428,7 +428,9 @@ function newUiObjectsFromNodes () { /* Check if there are tasks to run */ if (userAddingNew === false && uiObjectType === 'Task' && node.savedPayload !== undefined) { if (node.savedPayload.uiObject.isRunning === true) { - tasksToRun.push(node) + if (node.payload.parentNode !== undefined) { + tasksToRun.push(node) + } } } @@ -436,7 +438,9 @@ function newUiObjectsFromNodes () { if (userAddingNew === false && node.savedPayload !== undefined) { if (uiObjectType === 'Live Trading Session' || uiObjectType === 'Fordward Testing Session' || uiObjectType === 'Backtesting Session' || uiObjectType === 'Paper Trading Session') { if (node.savedPayload.uiObject.isRunning === true) { - sessionsToRun.push(node) + if (node.payload.parentNode !== undefined) { + sessionsToRun.push(node) + } } } } From e443166ce3f4c3c796d3d57c45bd88a5e7f2211a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 9 Mar 2020 14:14:51 +0100 Subject: [PATCH 085/166] bug fixed with no heartbeat --- FloatingSpace/UiObject.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 4ca9b759e..69abec6fa 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -96,6 +96,7 @@ function newUiObject () { let eventSubscriptionIdHeartbeat let eventSubscriptionIdOnStopped + let lastHeartBeat return thisObject @@ -143,6 +144,7 @@ function newUiObject () { icon = undefined chainAttachToNode = undefined referenceAttachToNode = undefined + lastHeartBeat = undefined } function initialize (payload, menuItemsInitialValues) { @@ -280,6 +282,17 @@ function newUiObject () { childrenRunningPhysics() } + function heartBeatPhysics () { + if (lastHeartBeat !== undefined) { + const ONE_MIN = 60000 + nowTimestamp = (new Date()).valueOf() + if (nowTimestamp - lastHeartBeat.valueOf() > ONE_MIN) { + lastHeartBeat = undefined + thisObject.isRunning = false + } + } + } + function childrenRunningPhysics () { let nodeDefinition = APP_SCHEMA_MAP.get(thisObject.payload.node.type) if (nodeDefinition.properties === undefined) { return } @@ -634,6 +647,7 @@ function newUiObject () { function onHeartBeat () { if (thisObject.payload === undefined) { return } + lastHeartBeat = new Date() let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + '-' + thisObject.payload.node.id systemEventHandler.stopListening(key, eventSubscriptionIdHeartbeat, 'UiObject') @@ -681,6 +695,7 @@ function newUiObject () { thisObject.circularProgressBar = undefined } thisObject.isRunning = false + lastHeartBeat = undefined } } From 4d63f2e3d0ffa90e7fa54edda9727b8c3f6682eb Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 9 Mar 2020 17:57:46 +0100 Subject: [PATCH 086/166] Bug fixed --- FloatingSpace/UiObject.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 69abec6fa..cbba06149 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -711,8 +711,10 @@ function newUiObject () { } if (nodeDefinition.alternativeIcons === 'Use Reference Grandparent') { if (thisObject.payload.node.payload.referenceParent !== undefined) { - if (thisObject.payload.node.payload.referenceParent.payload.referenceParent !== undefined) { - nodeToUse = thisObject.payload.node.payload.referenceParent.payload.referenceParent + if (thisObject.payload.node.payload.referenceParent.payload !== undefined) { + if (thisObject.payload.node.payload.referenceParent.payload.referenceParent !== undefined) { + nodeToUse = thisObject.payload.node.payload.referenceParent.payload.referenceParent + } } } } From 9087d1b52f6447d603191b6b97be5a76e8ab8b19 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 9 Mar 2020 18:15:59 +0100 Subject: [PATCH 087/166] uppercase bug fixed --- .../FunctionLibraries/CCXTFunctions.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js index f60c0900a..8917f4617 100644 --- a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js @@ -89,23 +89,23 @@ function newCCXTFunctions () { if (queryParams !== undefined) { if (queryParams.baseAsset !== undefined) { - if (market.baseId.indexOf(queryParams.baseAsset) >= 0) { + if (market.base.indexOf(queryParams.baseAsset) >= 0) { continue } } if (queryParams.quotedAsset !== undefined) { - if (market.quoteId.indexOf(queryParams.quotedAsset) >= 0) { + if (market.quote.indexOf(queryParams.quotedAsset) >= 0) { continue } } } - if (currentAssets.get(market.baseId) === undefined) { - addAsset(market.baseId) - currentAssets.set(market.baseId, market.baseId) + if (currentAssets.get(market.base) === undefined) { + addAsset(market.base) + currentAssets.set(market.base, market.base) } - if (currentAssets.get(market.quoteId) === undefined) { - addAsset(market.quoteId) - currentAssets.set(market.quoteId, market.quoteId) + if (currentAssets.get(market.quote) === undefined) { + addAsset(market.quote) + currentAssets.set(market.quote, market.quote) } function addAsset (name) { @@ -164,8 +164,8 @@ function newCCXTFunctions () { let markets = JSON.parse(data) for (let i = 0; i < markets.length; i++) { let market = markets[i] - let baseAsset = currentAssets.get(market.baseId) - let quotedAsset = currentAssets.get(market.quoteId) + let baseAsset = currentAssets.get(market.base) + let quotedAsset = currentAssets.get(market.quote) if (baseAsset === undefined) { continue From c174ae57b10d8f65936644c990b7eadb7ebfb909 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Mar 2020 11:28:32 +0100 Subject: [PATCH 088/166] Performance Improvement at Designer --- FloatingSpace/FloatingLayer.js | 22 ++++++++++++++++++---- FloatingSpace/FloatingObject.js | 17 +++-------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/FloatingSpace/FloatingLayer.js b/FloatingSpace/FloatingLayer.js index 621404fbb..066533c25 100644 --- a/FloatingSpace/FloatingLayer.js +++ b/FloatingSpace/FloatingLayer.js @@ -200,10 +200,24 @@ function newFloatingLayer () { } } + function collapsePhysics (thisObject) { + let parent = thisObject.payload.chainParent + if (parent === undefined) { return } + if (parent.payload === undefined) { return } + if (parent.payload.floatingObject === undefined) { return } + + thisObject.isParentCollapsed = parent.payload.floatingObject.isCollapsed + if (thisObject.collapsedManually === false) { + thisObject.isCollapsed = parent.payload.floatingObject.isCollapsed + } + } + function makeVisible () { for (let i = 0; i < invisibleFloatingObjects.length; i++) { let floatingObject = invisibleFloatingObjects[i] + collapsePhysics(floatingObject) + if (floatingObject.isFrozen === false && floatingObject.isParentCollapsed === false) { visibleFloatingObjects.push(floatingObject) invisibleFloatingObjects.splice(i, 1) // Delete item from array. @@ -217,6 +231,8 @@ function newFloatingLayer () { for (let i = 0; i < visibleFloatingObjects.length; i++) { let floatingObject = visibleFloatingObjects[i] + collapsePhysics(floatingObject) + if (floatingObject.isFrozen === true || floatingObject.isParentCollapsed === true) { invisibleFloatingObjects.push(floatingObject) visibleFloatingObjects.splice(i, 1) // Delete item from array. @@ -256,10 +272,8 @@ function newFloatingLayer () { /* This function makes all the calculations to apply phisycs on all visible floatingObjects in this layer. */ try { - for (let i = 0; i < invisibleFloatingObjects.length; i++) { - let floatingObject = invisibleFloatingObjects[i] - floatingObject.physics() - } + DEBUG.variable1 = 'Invisible Floating Objets: ' + invisibleFloatingObjects.length + DEBUG.variable2 = 'Visible Floating Objets: ' + visibleFloatingObjects.length for (let i = 0; i < visibleFloatingObjects.length; i++) { let floatingObject = visibleFloatingObjects[i] diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index 6e9ce5833..15f4dd0f3 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -219,12 +219,13 @@ function newFloatingObject () { } function physics () { - collapsePhysics() frozenPhysics() /* From here on, only if they are not too far. */ if (canvas.floatingSpace.isItFar(thisObject.payload)) { return } thisObjectPhysics() - thisObject.payload.uiObject.physics() + if (thisObject.payload.uiObject !== undefined) { + thisObject.payload.uiObject.physics() + } positionContraintsPhysics() } @@ -241,18 +242,6 @@ function newFloatingObject () { } } - function collapsePhysics () { - let parent = thisObject.payload.chainParent - if (parent === undefined) { return } - if (parent.payload === undefined) { return } - if (parent.payload.floatingObject === undefined) { return } - - thisObject.isParentCollapsed = parent.payload.floatingObject.isCollapsed - if (thisObject.collapsedManually === false) { - thisObject.isCollapsed = parent.payload.floatingObject.isCollapsed - } - } - function positionContraintsPhysics () { if (thisObject.angleToParent !== ANGLE_TO_PARENT.NOT_FIXED && thisObject.isOnFocus !== true) { let parent = thisObject.payload.chainParent From 35e41271edf29d0dec4ffa01f02984f0aa8d94a6 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Mar 2020 13:00:40 +0100 Subject: [PATCH 089/166] Help Implementation --- Canvas.js | 2 +- DesignSpace/Workspace/Workspace.js | 11 +++++++++++ FloatingSpace/CircularMenu.js | 13 ++++++++----- FloatingSpace/CircularMenuItem.js | 10 +++++++--- FloatingSpace/UiObject.js | 6 +++--- FloatingSpace/UiObjectConstructor.js | 15 +++++++++++++++ Frame.js | 2 +- Spaces/DesignSpace.js | 2 +- 8 files changed, 47 insertions(+), 14 deletions(-) diff --git a/Canvas.js b/Canvas.js index 7745830a2..cb22a7308 100644 --- a/Canvas.js +++ b/Canvas.js @@ -758,7 +758,7 @@ function newCanvas () { let container - /* We check if the mouse is over an element of the Strategy Space / */ + /* We check if the mouse is over an element of the Designe Space / */ if (thisObject.designSpace !== undefined) { container = thisObject.designSpace.getContainer(point) diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 415d34e58..41d4fd779 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -412,6 +412,17 @@ function newWorkspace () { referenceDetachNode(payload.node) } break + case 'Open Documentation': + { + let definition = APP_SCHEMA_MAP.get(payload.node.type) + if (definition !== undefined) { + if (definition.docURL !== undefined) { + let newTab = window.open(definition.docURL, '_blank') + newTab.focus() + } + } + } + break } } } diff --git a/FloatingSpace/CircularMenu.js b/FloatingSpace/CircularMenu.js index 0e81863c4..93a940068 100644 --- a/FloatingSpace/CircularMenu.js +++ b/FloatingSpace/CircularMenu.js @@ -49,7 +49,7 @@ function newCircularMenu () { let iconAndTextArray = [] let iconOnlyArray - let ringsArray = [[], [], []] + let ringsArray = [[], [], [], []] for (let i = 0; i < menuItemsInitialValues.length; i++) { let menuItem = newCircularMenuItem() @@ -103,15 +103,18 @@ function newCircularMenu () { menuItems.push(menuItem) } - /* There are 3 possible rings of icons, we will go through each of them here. */ - let amplitudeArray = [80, 50, 40] - let initialAngleArray = [220, 205, 200] - for (let j = 1; j < 4; j++) { + /* There are 4 possible rings of icons, we will go through each of them here. */ + let amplitudeArray = [80, 50, 40, 80] + let initialAngleArray = [220, 205, 200, 180] + for (let j = 1; j < ringsArray.length + 1; j++) { let iconOnlyArray = ringsArray[j - 1] /* Here we calculate the angles for each menu item, and then apply it if it was not previously defined. */ let amplitude = amplitudeArray[j - 1] let initialAngle = initialAngleArray[j - 1] let step = amplitude / (iconOnlyArray.length - 1) + if (iconOnlyArray.length === 1) { + step = 0 + } for (let i = 0; i < iconOnlyArray.length; i++) { let menuItem = iconOnlyArray[i] diff --git a/FloatingSpace/CircularMenuItem.js b/FloatingSpace/CircularMenuItem.js index af5c83a95..64c2d220f 100644 --- a/FloatingSpace/CircularMenuItem.js +++ b/FloatingSpace/CircularMenuItem.js @@ -150,15 +150,19 @@ function newCircularMenuItem () { if (thisObject.type === 'Icon Only') { switch (thisObject.ring) { case 1: { - radiusGrowthFactor = 6 + radiusGrowthFactor = 6.5 break } case 2: { - radiusGrowthFactor = 4.5 + radiusGrowthFactor = 5.0 break } case 3: { - radiusGrowthFactor = 3 + radiusGrowthFactor = 3.5 + break + } + case 4: { + radiusGrowthFactor = 2.5 break } } diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index cbba06149..1d94d1b7f 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -54,7 +54,7 @@ function newUiObject () { let executingIcon let selfFocusEventSubscriptionId - let selfNotFocuskEventSubscriptionId + let selfNotFocusEventSubscriptionId let selfDisplaceEventSubscriptionId let selfDragStartedEventSubscriptionId let selfDragFinishedEventSubscriptionId @@ -106,7 +106,7 @@ function newUiObject () { systemEventHandler.stopListening(key, eventSubscriptionIdOnStopped, 'UiObject') thisObject.container.eventHandler.stopListening(selfFocusEventSubscriptionId) - thisObject.container.eventHandler.stopListening(selfNotFocuskEventSubscriptionId) + thisObject.container.eventHandler.stopListening(selfNotFocusEventSubscriptionId) thisObject.container.eventHandler.stopListening(selfDisplaceEventSubscriptionId) thisObject.container.eventHandler.stopListening(selfDragStartedEventSubscriptionId) thisObject.container.eventHandler.stopListening(selfDragFinishedEventSubscriptionId) @@ -168,7 +168,7 @@ function newUiObject () { iconPhysics() selfFocusEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onFocus', onFocus) - selfNotFocuskEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onNotFocus', onNotFocus) + selfNotFocusEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onNotFocus', onNotFocus) selfDisplaceEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onDisplace', onDisplace) selfDragStartedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onDragStarted', onDragStarted) selfDragFinishedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onDragFinished', onDragFinished) diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index 82077883e..215f9f742 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -274,6 +274,21 @@ function newUiObjectConstructor () { ring: 3 } ) + + menuItemsInitialValues.push( + { + action: 'Open Documentation', + actionFunction: floatingObject.payload.onMenuItemClick, + label: undefined, + visible: true, + iconPathOn: 'quality', + iconPathOff: 'quality', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + ring: 4 + } + ) } function getMenuItemsInitialValues (uiObject, floatingObject, payload) { diff --git a/Frame.js b/Frame.js index 04cec82ad..ea2b7ab12 100644 --- a/Frame.js +++ b/Frame.js @@ -209,7 +209,7 @@ function newFrame () { } /* Now we check if the resulting point is whin the current Frame. */ - + if (isNaN(checkPoint.x) || isNaN(checkPoint.y)) { return false } if (thisObject.type === 'Circle') { let distance = Math.sqrt(Math.pow(thisObject.position.x - point.x, 2) + Math.pow(thisObject.position.y - point.y, 2)) diff --git a/Spaces/DesignSpace.js b/Spaces/DesignSpace.js index c727b5a7b..cea2a4637 100644 --- a/Spaces/DesignSpace.js +++ b/Spaces/DesignSpace.js @@ -1,6 +1,6 @@ function newDesignSpace () { - const MODULE_NAME = 'Strategy Space' + const MODULE_NAME = 'Designe Space' let thisObject = { sidePanel: undefined, container: undefined, From e75d8a09ad6bb396d688c3b1a87062765337040d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Mar 2020 14:10:41 +0100 Subject: [PATCH 090/166] changing the size of nodes --- FloatingSpace/UiObjectConstructor.js | 32 +++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index 215f9f742..7bfdb7b1c 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -370,7 +370,9 @@ function newUiObjectConstructor () { function setFloatingObjectBasicProperties (floatingObject, payload) { const FRICTION = 0.95 const INITIAL_FRICTION = 0.97 - const INITIAL_FONT_SIZE = 12 + const INITIAL_FONT_SIZE = 12 * 1.5 + const INITIAL_RADIOUS = 45 * 1.5 + const INITIAL_IMAGE_SIZE = 80 * 1.2 switch (payload.node.type) { case 'Workspace': { @@ -417,8 +419,8 @@ function newUiObjectConstructor () { floatingObject.friction = INITIAL_FRICTION floatingObject.initializeMass(500) - floatingObject.initializeRadius(45) - floatingObject.initializeImageSize(80) + floatingObject.initializeRadius(INITIAL_RADIOUS) + floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) floatingObject.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', 1)' @@ -428,8 +430,8 @@ function newUiObjectConstructor () { floatingObject.friction = INITIAL_FRICTION floatingObject.initializeMass(600) - floatingObject.initializeRadius(45) - floatingObject.initializeImageSize(80) + floatingObject.initializeRadius(INITIAL_RADIOUS) + floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) floatingObject.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', 1)' @@ -443,8 +445,8 @@ function newUiObjectConstructor () { floatingObject.friction = INITIAL_FRICTION floatingObject.initializeMass(300) - floatingObject.initializeRadius(40) - floatingObject.initializeImageSize(70) + floatingObject.initializeRadius(INITIAL_RADIOUS - 5) + floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 10) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) floatingObject.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', 1)' @@ -458,8 +460,8 @@ function newUiObjectConstructor () { floatingObject.friction = INITIAL_FRICTION floatingObject.initializeMass(150) - floatingObject.initializeRadius(35) - floatingObject.initializeImageSize(60) + floatingObject.initializeRadius(INITIAL_RADIOUS - 10) + floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 20) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) floatingObject.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', 1)' @@ -473,8 +475,8 @@ function newUiObjectConstructor () { floatingObject.friction = INITIAL_FRICTION floatingObject.initializeMass(75) - floatingObject.initializeRadius(30) - floatingObject.initializeImageSize(50) + floatingObject.initializeRadius(INITIAL_RADIOUS - 15) + floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 30) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) floatingObject.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)' @@ -488,8 +490,8 @@ function newUiObjectConstructor () { floatingObject.friction = INITIAL_FRICTION floatingObject.initializeMass(50) - floatingObject.initializeRadius(25) - floatingObject.initializeImageSize(40) + floatingObject.initializeRadius(INITIAL_RADIOUS - 20) + floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 40) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) floatingObject.fillStyle = 'rgba(' + UI_COLOR.RED + ', 1)' @@ -499,8 +501,8 @@ function newUiObjectConstructor () { floatingObject.friction = INITIAL_FRICTION floatingObject.initializeMass(25) - floatingObject.initializeRadius(20) - floatingObject.initializeImageSize(30) + floatingObject.initializeRadius(INITIAL_RADIOUS - 25) + floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 50) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) floatingObject.fillStyle = 'rgba(' + UI_COLOR.RED + ', 1)' From 9bb4a7ca8ec5fb7740bffef01ebdd37fa3f48275 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Mar 2020 15:21:21 +0100 Subject: [PATCH 091/166] Menu items size re adjusted --- FloatingSpace/CircularMenuItem.js | 10 +++++----- FloatingSpace/UiObjectConstructor.js | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/FloatingSpace/CircularMenuItem.js b/FloatingSpace/CircularMenuItem.js index 64c2d220f..8d69396af 100644 --- a/FloatingSpace/CircularMenuItem.js +++ b/FloatingSpace/CircularMenuItem.js @@ -57,7 +57,7 @@ function newCircularMenuItem () { thisObject.container.frame.position.x = 0 thisObject.container.frame.position.y = 0 thisObject.container.frame.width = 0 - thisObject.container.frame.height = 30 + thisObject.container.frame.height = 40 let isMouseOver = false @@ -112,7 +112,7 @@ function newCircularMenuItem () { selfMouseNotOverEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseNotOver', onMouseNotOver) if (thisObject.type === 'Icon & Text') { - thisObject.container.frame.width = 150 + thisObject.container.frame.width = 200 } else { thisObject.container.frame.width = 50 } @@ -375,13 +375,13 @@ function newCircularMenuItem () { backgroundColor = UI_COLOR.GREY } let params = { - cornerRadius: 3, + cornerRadius: 5, lineWidth: 0.1, container: thisObject.container, borderColor: UI_COLOR.DARK, backgroundColor: backgroundColor, castShadow: false, - xOffset: 40 + xOffset: 60 } if (isMouseOver === true) { @@ -422,7 +422,7 @@ function newCircularMenuItem () { if (thisObject.type === 'Icon & Text') { let labelPoint - let fontSize = 10 + let fontSize = 15 browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index 7bfdb7b1c..881389769 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -134,7 +134,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'menu-fix-pinned', iconPathOff: 'menu-fix-unpinned', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 1 @@ -149,7 +149,7 @@ function newUiObjectConstructor () { label: undefined, visible: true, icons: ['angle-to-parent-000', 'angle-to-parent-360', 'angle-to-parent-180', 'angle-to-parent-090', 'angle-to-parent-045'], - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 1 @@ -164,7 +164,7 @@ function newUiObjectConstructor () { label: undefined, visible: true, icons: ['distance-to-parent-000', 'distance-to-parent-025', 'distance-to-parent-050', 'distance-to-parent-100', 'distance-to-parent-150', 'distance-to-parent-200'], - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 1 @@ -180,7 +180,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'menu-mobility-unfreeze', iconPathOff: 'menu-mobility-freeze', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 1 @@ -196,7 +196,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'menu-tree-plus', iconPathOff: 'menu-tree-minus', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 1 @@ -210,7 +210,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'menu-backup', iconPathOff: 'menu-backup', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 2 @@ -224,7 +224,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'clone', iconPathOff: 'clone', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 2 @@ -239,7 +239,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'menu-share', iconPathOff: 'menu-share', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 2 @@ -254,7 +254,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'detach', iconPathOff: 'detach', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 3 @@ -268,7 +268,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'delink', iconPathOff: 'delink', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 3 @@ -283,7 +283,7 @@ function newUiObjectConstructor () { visible: true, iconPathOn: 'quality', iconPathOff: 'quality', - rawRadius: 8, + rawRadius: 12, targetRadius: 0, currentRadius: 0, ring: 4 @@ -347,7 +347,7 @@ function newUiObjectConstructor () { } if (newMenuItem.rawRadius === undefined) { - newMenuItem.rawRadius = 8 + newMenuItem.rawRadius = 12 } if (newMenuItem.targetRadius === undefined) { From 9e46c9296ed9e6c6706c54b7a1c8b1d931a2644a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Mar 2020 15:45:47 +0100 Subject: [PATCH 092/166] fixed --- FloatingSpace/CircularMenuItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/CircularMenuItem.js b/FloatingSpace/CircularMenuItem.js index 8d69396af..d340658a4 100644 --- a/FloatingSpace/CircularMenuItem.js +++ b/FloatingSpace/CircularMenuItem.js @@ -112,7 +112,7 @@ function newCircularMenuItem () { selfMouseNotOverEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseNotOver', onMouseNotOver) if (thisObject.type === 'Icon & Text') { - thisObject.container.frame.width = 200 + thisObject.container.frame.width = 220 } else { thisObject.container.frame.width = 50 } From aa8d5d4c71d4fc1b1256fd54e4c7c3499cf94c11 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Mar 2020 17:46:36 +0100 Subject: [PATCH 093/166] bug fixed with double click after dragging --- Canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Canvas.js b/Canvas.js index cb22a7308..94450dd9b 100644 --- a/Canvas.js +++ b/Canvas.js @@ -907,7 +907,7 @@ function newCanvas () { floatingObjectDragStarted || viewPortBeingDragged ) { - ignoreNextClick = true + ignoreNextClick = false } /* Turn off all the possible things that can be dragged. */ From 27dfde0ad0644831a2ff9bf13e130ba85eb25994 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Mar 2020 17:58:14 +0100 Subject: [PATCH 094/166] mac users bug fixed --- Canvas.js | 2 ++ ChartingSpace/Viewport.js | 6 ++---- Globals.js | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Canvas.js b/Canvas.js index 94450dd9b..0de5abe37 100644 --- a/Canvas.js +++ b/Canvas.js @@ -834,6 +834,8 @@ function newCanvas () { function onMouseWheel (event) { try { + if (IS_MAC) { event.delta = event.delta / MAC_AMOUNT_FACTOR } + thisObject.mouse.event = event thisObject.mouse.position.x = event.pageX thisObject.mouse.position.y = event.pageY - CURRENT_TOP_MARGIN diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 7ec366e40..4a432ac99 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -197,16 +197,14 @@ function newViewport () { } function onMouseWheel (event) { - const MAC_AMOUNT_FACTOR = 5 - if (thisObject.visible === false) { return } if ((event.ctrlKey === true || event.metaKey === true)) { return } let morePower = 1 let amount = event.delta if (event.buttons === 4) { morePower = 2 } // Mouse wheel pressed. /* We adjust the sensitivity for Mac Users */ - let isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0 - if (isMac) { amount = amount / MAC_AMOUNT_FACTOR } + + if (IS_MAC) { amount = amount / MAC_AMOUNT_FACTOR } if (thisObject.zoomTargetLevel > 10) { amount = amount * 2 diff --git a/Globals.js b/Globals.js index dfddf6b50..b6d1bb722 100644 --- a/Globals.js +++ b/Globals.js @@ -41,6 +41,9 @@ UI_FONT = { SECONDARY: "Source Code Pro" }; +const MAC_AMOUNT_FACTOR = 5 +const IS_MAC = navigator.platform.toUpperCase().indexOf('MAC') >= 0 + const DOUBLE_CLICK_ZOOM_OUT_LEVEL = 0 const DOUBLE_CLICK_ZOOM_IN_LEVEL = 7 From 153ed44f81c6721a55aba71a2771b5f6bff7acd7 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 10 Mar 2020 20:53:35 +0100 Subject: [PATCH 095/166] Scales Tunned --- Canvas.js | 5 ++-- ChartingSpace/Viewport.js | 2 -- FloatingSpace/FloatingObject.js | 26 +++++++++++++++-- FloatingSpace/UiObject.js | 2 +- FloatingSpace/UiObjectConstructor.js | 8 ++++++ Scales/RateScale.js | 40 ++++++++++++++++++++++++++ Scales/TimeFrameScale.js | 42 +++++++++++++++++++++++++++- Scales/TimeScale.js | 39 ++++++++++++++++++++++++++ 8 files changed, 156 insertions(+), 8 deletions(-) diff --git a/Canvas.js b/Canvas.js index 0de5abe37..c4e8eb2b6 100644 --- a/Canvas.js +++ b/Canvas.js @@ -834,8 +834,6 @@ function newCanvas () { function onMouseWheel (event) { try { - if (IS_MAC) { event.delta = event.delta / MAC_AMOUNT_FACTOR } - thisObject.mouse.event = event thisObject.mouse.position.x = event.pageX thisObject.mouse.position.y = event.pageY - CURRENT_TOP_MARGIN @@ -844,6 +842,9 @@ function newCanvas () { // cross-browser wheel delta var event = window.event || event // old IE support event.delta = Math.max(-1, Math.min(1, event.wheelDelta || -event.detail)) + if (IS_MAC) { + event.delta = event.delta / MAC_AMOUNT_FACTOR + } /* We try first with panels. */ diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 4a432ac99..84104e0ee 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -204,8 +204,6 @@ function newViewport () { if (event.buttons === 4) { morePower = 2 } // Mouse wheel pressed. /* We adjust the sensitivity for Mac Users */ - if (IS_MAC) { amount = amount / MAC_AMOUNT_FACTOR } - if (thisObject.zoomTargetLevel > 10) { amount = amount * 2 } diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index 15f4dd0f3..cccc6d18b 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -45,6 +45,7 @@ function newFloatingObject () { initializeRadius: initializeRadius, initializeImageSize: initializeImageSize, initializeFontSize: initializeFontSize, + initializeHierarchyRing: initializeHierarchyRing, initializeCurrentPosition: initializeCurrentPosition, radomizeCurrentSpeed: radomizeCurrentSpeed, drawBackground: drawBackground, @@ -366,6 +367,14 @@ function newFloatingObject () { } } + if (Math.abs(thisObject.currentHierarchyRing - thisObject.targetHierarchyRing) >= 10) { + if (thisObject.currentHierarchyRing < thisObject.targetHierarchyRing) { + thisObject.currentHierarchyRing = thisObject.currentHierarchyRing + 10 + } else { + thisObject.currentHierarchyRing = thisObject.currentHierarchyRing - 10 + } + } + /* Floating object position in screen coordinates */ thisObject.payload.position.x = thisObject.container.frame.position.x @@ -377,6 +386,7 @@ function newFloatingObject () { thisObject.targetRadius = thisObject.rawRadius * 6.0 thisObject.targetImageSize = thisObject.rawImageSize * 2.0 thisObject.targetFontSize = thisObject.rawFontSize * 2.0 + thisObject.targetHierarchyRing = thisObject.rawHierarchyRing * 8.0 thisObject.payload.uiObject.container.eventHandler.raiseEvent('onFocus', point) @@ -409,6 +419,7 @@ function newFloatingObject () { thisObject.targetRadius = thisObject.rawRadius * 1 thisObject.targetImageSize = thisObject.rawImageSize * 1 thisObject.targetFontSize = thisObject.rawFontSize * 1 + thisObject.targetHierarchyRing = thisObject.rawHierarchyRing * 1 thisObject.payload.uiObject.container.eventHandler.raiseEvent('onNotFocus') @@ -473,7 +484,7 @@ function newFloatingObject () { } function initializeImageSize (suggestedValue) { - var size = suggestedValue + let size = suggestedValue if (size < 2) { size = 2 } @@ -484,7 +495,7 @@ function newFloatingObject () { } function initializeFontSize (suggestedValue) { - var size = suggestedValue + let size = suggestedValue if (size < 3) { size = 3 } @@ -494,6 +505,17 @@ function newFloatingObject () { thisObject.currentFontSize = size / 3 } + function initializeHierarchyRing (suggestedValue) { + let radius = suggestedValue + if (radius < 3) { + radius = 3 + } + + thisObject.rawHierarchyRing = radius + thisObject.targetHierarchyRing = radius + thisObject.currentHierarchyRing = radius + } + function initializeCurrentPosition (arroundPoint) { let position = {} diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 1d94d1b7f..fd700603e 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -1239,7 +1239,7 @@ function newUiObject () { let nodeDefinition = APP_SCHEMA_MAP.get(thisObject.payload.node.type) if (nodeDefinition !== undefined) { if (nodeDefinition.isHierarchyHead === true) { - VISIBLE_RADIUS = thisObject.container.frame.radius * 2 + VISIBLE_RADIUS = thisObject.payload.floatingObject.currentHierarchyRing * 2.8 let OPACITY = 1 browserCanvasContext.beginPath() diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index 881389769..275ae7afe 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -373,6 +373,7 @@ function newUiObjectConstructor () { const INITIAL_FONT_SIZE = 12 * 1.5 const INITIAL_RADIOUS = 45 * 1.5 const INITIAL_IMAGE_SIZE = 80 * 1.2 + const INITIAL_HIERARCHY_RING = 20 switch (payload.node.type) { case 'Workspace': { @@ -420,6 +421,7 @@ function newUiObjectConstructor () { floatingObject.initializeMass(500) floatingObject.initializeRadius(INITIAL_RADIOUS) + floatingObject.initializeHierarchyRing(INITIAL_HIERARCHY_RING) floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) @@ -431,6 +433,7 @@ function newUiObjectConstructor () { floatingObject.initializeMass(600) floatingObject.initializeRadius(INITIAL_RADIOUS) + floatingObject.initializeHierarchyRing(INITIAL_HIERARCHY_RING) floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) @@ -446,6 +449,7 @@ function newUiObjectConstructor () { floatingObject.initializeMass(300) floatingObject.initializeRadius(INITIAL_RADIOUS - 5) + floatingObject.initializeHierarchyRing(INITIAL_HIERARCHY_RING) floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 10) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) @@ -461,6 +465,7 @@ function newUiObjectConstructor () { floatingObject.initializeMass(150) floatingObject.initializeRadius(INITIAL_RADIOUS - 10) + floatingObject.initializeHierarchyRing(INITIAL_HIERARCHY_RING) floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 20) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) @@ -476,6 +481,7 @@ function newUiObjectConstructor () { floatingObject.initializeMass(75) floatingObject.initializeRadius(INITIAL_RADIOUS - 15) + floatingObject.initializeHierarchyRing(INITIAL_HIERARCHY_RING) floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 30) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) @@ -491,6 +497,7 @@ function newUiObjectConstructor () { floatingObject.initializeMass(50) floatingObject.initializeRadius(INITIAL_RADIOUS - 20) + floatingObject.initializeHierarchyRing(INITIAL_HIERARCHY_RING) floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 40) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) @@ -502,6 +509,7 @@ function newUiObjectConstructor () { floatingObject.initializeMass(25) floatingObject.initializeRadius(INITIAL_RADIOUS - 25) + floatingObject.initializeHierarchyRing(INITIAL_HIERARCHY_RING) floatingObject.initializeImageSize(INITIAL_IMAGE_SIZE - 50) floatingObject.initializeFontSize(INITIAL_FONT_SIZE) diff --git a/Scales/RateScale.js b/Scales/RateScale.js index a532aea1f..4fafa81f9 100644 --- a/Scales/RateScale.js +++ b/Scales/RateScale.js @@ -56,6 +56,10 @@ function newRateScale () { let scaleDisplayTimer = 0 let autoScaleButton + + let wheelDeltaDirection + let wheelDeltaCounter = 0 + return thisObject function finalize () { @@ -134,6 +138,42 @@ function newRateScale () { } function onMouseWheel (event) { + if (IS_MAC) { + let sensitivity + if (event.wheelDelta < 0) { + if (event.shiftKey === true) { + sensitivity = 20 + } else { + sensitivity = 5 + } + if (wheelDeltaDirection === -1) { + wheelDeltaCounter++ + if (wheelDeltaCounter < sensitivity) { + return + } else { + wheelDeltaCounter = 0 + } + } else { + wheelDeltaCounter = 0 + wheelDeltaDirection = -1 + return + } + } else { + if (wheelDeltaDirection === 1) { + wheelDeltaCounter++ + if (wheelDeltaCounter < sensitivity) { + return + } else { + wheelDeltaCounter = 0 + } + } else { + wheelDeltaCounter = 0 + wheelDeltaDirection = 1 + return + } + } + } + if (event.shiftKey === true) { autoScaleButton.container.eventHandler.raiseEvent('onMouseWheel', event) return diff --git a/Scales/TimeFrameScale.js b/Scales/TimeFrameScale.js index 856a1e15f..9c718e28e 100644 --- a/Scales/TimeFrameScale.js +++ b/Scales/TimeFrameScale.js @@ -45,6 +45,10 @@ function newTimeFrameScale () { } } setupContainer() + + let wheelDeltaDirection + let wheelDeltaCounter = 0 + return thisObject function setupContainer () { @@ -249,7 +253,43 @@ function newTimeFrameScale () { } function onMouseWheel (event) { - delta = event.wheelDelta + if (IS_MAC) { + let sensitivity + if (event.wheelDelta < 0) { + if (event.shiftKey === true) { + sensitivity = 20 + } else { + sensitivity = 5 + } + if (wheelDeltaDirection === -1) { + wheelDeltaCounter++ + if (wheelDeltaCounter < sensitivity) { + return + } else { + wheelDeltaCounter = 0 + } + } else { + wheelDeltaCounter = 0 + wheelDeltaDirection = -1 + return + } + } else { + if (wheelDeltaDirection === 1) { + wheelDeltaCounter++ + if (wheelDeltaCounter < sensitivity) { + return + } else { + wheelDeltaCounter = 0 + } + } else { + wheelDeltaCounter = 0 + wheelDeltaDirection = 1 + return + } + } + } + + let delta = event.wheelDelta if (delta < 0) { timeFrameIndex-- if (timeFrameIndex < 0) { diff --git a/Scales/TimeScale.js b/Scales/TimeScale.js index 62a1220b3..c51840b55 100644 --- a/Scales/TimeScale.js +++ b/Scales/TimeScale.js @@ -48,6 +48,9 @@ function newTimeScale () { } } + let wheelDeltaDirection + let wheelDeltaCounter = 0 + return thisObject function finalize () { @@ -116,6 +119,42 @@ function newTimeScale () { } function onMouseWheel (event) { + if (IS_MAC) { + let sensitivity + if (event.wheelDelta < 0) { + if (event.shiftKey === true) { + sensitivity = 20 + } else { + sensitivity = 5 + } + if (wheelDeltaDirection === -1) { + wheelDeltaCounter++ + if (wheelDeltaCounter < sensitivity) { + return + } else { + wheelDeltaCounter = 0 + } + } else { + wheelDeltaCounter = 0 + wheelDeltaDirection = -1 + return + } + } else { + if (wheelDeltaDirection === 1) { + wheelDeltaCounter++ + if (wheelDeltaCounter < sensitivity) { + return + } else { + wheelDeltaCounter = 0 + } + } else { + wheelDeltaCounter = 0 + wheelDeltaDirection = 1 + return + } + } + } + if (event.shiftKey === true) { autoScaleButton.container.eventHandler.raiseEvent('onMouseWheel', event) return From d7756f5913ceb2dc3f2c3b96a75308851032dc58 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 11 Mar 2020 08:53:17 +0100 Subject: [PATCH 096/166] bug fixed layers turning off --- Panels/Layer.js | 12 ++++++++++++ Panels/LayersPanel.js | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Panels/Layer.js b/Panels/Layer.js index 3fde42d7e..5958076f0 100644 --- a/Panels/Layer.js +++ b/Panels/Layer.js @@ -20,6 +20,7 @@ function newLayer () { plotterTypeIcon: undefined, baseAssetIcon: undefined, quotedAssetIcon: undefined, + checkStatusAtShutDown: checkStatusAtShutDown, physics: physics, draw: draw, turnOff: turnOff, @@ -230,6 +231,17 @@ function newLayer () { } } + function checkStatusAtShutDown () { + /* Mechanism to recover a layer that was left loading the last time the browser was shut dowm. */ + let storedValue = loadPropertyFromNodeConfig(thisObject.payload, 'status') + if (storedValue !== undefined) { + if (storedValue === LAYER_STATUS.LOADING) { + resetProgressBars() + changeStatusTo(LAYER_STATUS.LOADING) + } + } + } + function getContainer (point) { if (panelsVisibleButton !== undefined) { let container = panelsVisibleButton.getContainer(point) diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index ba6823d27..f9b5ad4a8 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -163,7 +163,9 @@ function newLayersPanel () { layer.onLayerStatusChangedEventSuscriptionId = layer.container.eventHandler.listenToEvent('Status Changed', onLayerStatusChanged) layer.onMouseWheelEventSuscriptionId = layer.container.eventHandler.listenToEvent('onMouseWheel', onMouseWheel) - return layer + layer.checkStatusAtShutDown() + + return } } } From ba20dbfc26ef41c866f2ee88ad8ab7336d509c1e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 11 Mar 2020 17:56:27 +0100 Subject: [PATCH 097/166] Update CircularMenuItem.js --- FloatingSpace/CircularMenuItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/CircularMenuItem.js b/FloatingSpace/CircularMenuItem.js index d340658a4..ca2d77c7e 100644 --- a/FloatingSpace/CircularMenuItem.js +++ b/FloatingSpace/CircularMenuItem.js @@ -428,7 +428,7 @@ function newCircularMenuItem () { if (thisObject.currentRadius >= thisObject.targetRadius) { labelPoint = { - x: menuPosition.x + thisObject.currentRadius + 20, + x: menuPosition.x + thisObject.currentRadius + 25, y: menuPosition.y + fontSize * FONT_ASPECT_RATIO } From d6d66105add1ac5a4dbe12a0997dbd8dbd3afae3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 12 Mar 2020 11:09:16 +0100 Subject: [PATCH 098/166] bug fixed --- FloatingSpace/UiObject.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index fd700603e..ff6efe81b 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -289,7 +289,11 @@ function newUiObject () { if (nowTimestamp - lastHeartBeat.valueOf() > ONE_MIN) { lastHeartBeat = undefined thisObject.isRunning = false + setValue('') } + } else { + thisObject.isRunning = false + setValue('') } } @@ -313,9 +317,12 @@ function newUiObject () { thisObject.isRunning = true } else { thisObject.isRunning = false + setValue('') } return + } else { + heartBeatPhysics() } } } From 269e89fa673a4615149ed6a9019251a2c153281a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 12 Mar 2020 13:31:56 +0100 Subject: [PATCH 099/166] decimals fixed --- Scales/RateScale.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Scales/RateScale.js b/Scales/RateScale.js index 4fafa81f9..7e1c54b3b 100644 --- a/Scales/RateScale.js +++ b/Scales/RateScale.js @@ -445,7 +445,11 @@ function newRateScale () { rate = coordinateSystem.max.y } - let label = (rate - Math.trunc(rate)).toFixed(2) + let decimals = 2 + if (rate < 1) { decimals = 4 } + if (Math.trunc(rate * 100) < 1) { decimals = 6 } + if (Math.trunc(rate * 10000) < 1) { decimals = 8 } + let label = (rate - Math.trunc(rate)).toFixed(decimals) let labelArray = label.split('.') let label1 = thisObject.payload.node.payload.parentNode.name let label2 = (Math.trunc(rate)).toLocaleString() From baa9fd59c9a460f53e48f24ed54e33f03c2aada4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 12 Mar 2020 13:42:42 +0100 Subject: [PATCH 100/166] rate decimal handling improved --- Scales/RateScale.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Scales/RateScale.js b/Scales/RateScale.js index 7e1c54b3b..e94a56a6f 100644 --- a/Scales/RateScale.js +++ b/Scales/RateScale.js @@ -449,6 +449,7 @@ function newRateScale () { if (rate < 1) { decimals = 4 } if (Math.trunc(rate * 100) < 1) { decimals = 6 } if (Math.trunc(rate * 10000) < 1) { decimals = 8 } + if (Math.trunc(rate * 1000000) < 1) { decimals = 10 } let label = (rate - Math.trunc(rate)).toFixed(decimals) let labelArray = label.split('.') let label1 = thisObject.payload.node.payload.parentNode.name @@ -456,6 +457,11 @@ function newRateScale () { let label3 = labelArray[1] if (label3 === undefined) { label3 = '00' } + if (rate < 1) { + label2 = label + label3 = '' + } + let icon1 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.payload.parentNode.type) let icon2 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) From 9eb6803e70a9ce84266fbc950b82540912cd16ef Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 12 Mar 2020 17:44:10 +0100 Subject: [PATCH 101/166] Rate Scale Improved --- Animation.js | 1 + ChartingSpace/TimeMachine.js | 5 +++ ChartingSpace/TimelineChart.js | 4 +++ FloatingSpace/UiObject.js | 12 +++++++ Scales/RateScale.js | 52 +++++++++++++++++++++++---- Utilities/RoundedCornersBackground.js | 13 +++++-- VideoRecorder.js | 24 +++++++++++-- 7 files changed, 99 insertions(+), 12 deletions(-) diff --git a/Animation.js b/Animation.js index 41ec4c976..14b9f8376 100644 --- a/Animation.js +++ b/Animation.js @@ -139,6 +139,7 @@ function newAnimation () { } /* Media Recording */ + videoRecorder.physics() if (areWeRecording === true) { videoRecorder.recordCanvas() } diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index cfa079129..30c4dc509 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -540,6 +540,11 @@ function newTimeMachine () { function drawBackground () { drawChartsBackground() if (thisObject.container.frame.isInViewPort()) { + if (drawScales === true) { + // if (thisObject.timeScale !== undefined && thisObject.timeScale.isVisible === true) { thisObject.timeScale.drawBackground() } + if (thisObject.rateScale !== undefined && thisObject.rateScale.isVisible === true) { thisObject.rateScale.drawBackground() } + } + let maxElementsPlotted = 0 for (let i = 0; i < thisObject.timelineCharts.length; i++) { let timelineChart = thisObject.timelineCharts[thisObject.timelineCharts.length - i - 1] diff --git a/ChartingSpace/TimelineChart.js b/ChartingSpace/TimelineChart.js index 5ae735f80..27caf7181 100644 --- a/ChartingSpace/TimelineChart.js +++ b/ChartingSpace/TimelineChart.js @@ -378,6 +378,10 @@ function newTimelineChart () { function drawBackground () { if (thisObject.container.frame.isInViewPort()) { + if (drawScales === true) { + // if (thisObject.timeScale !== undefined && thisObject.timeScale.isVisible === true) { thisObject.timeScale.drawBackground() } + if (thisObject.rateScale !== undefined && thisObject.rateScale.isVisible === true) { thisObject.rateScale.drawBackground() } + } drawChartsBackground() if (thisObject.plotterManager !== undefined) { let elementsPlotted = thisObject.plotterManager.draw() diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index ff6efe81b..f714168c6 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -97,6 +97,7 @@ function newUiObject () { let eventSubscriptionIdHeartbeat let eventSubscriptionIdOnStopped let lastHeartBeat + let newUiObjectCounter = 25 return thisObject @@ -280,6 +281,14 @@ function newUiObject () { referenceDetachingPhysics() referenceAttachingPhysics() childrenRunningPhysics() + newObjectPhysics() + } + + function newObjectPhysics () { + newUiObjectCounter-- + if (newUiObjectCounter < 0) { + newUiObjectCounter = 0 + } } function heartBeatPhysics () { @@ -940,6 +949,9 @@ function newUiObject () { if (thisObject.payload.floatingObject.isFrozen === true) { LINE_STYLE = UI_COLOR.TURQUOISE } + if (newUiObjectCounter > 0) { + LINE_STYLE = UI_COLOR.GREY + } browserCanvasContext.beginPath() browserCanvasContext.moveTo(position.x, position.y) diff --git a/Scales/RateScale.js b/Scales/RateScale.js index e94a56a6f..36141e714 100644 --- a/Scales/RateScale.js +++ b/Scales/RateScale.js @@ -14,6 +14,7 @@ function newRateScale () { onMouseOverSomeTimeMachineContainer: onMouseOverSomeTimeMachineContainer, physics: physics, draw: draw, + drawBackground: drawBackground, drawForeground: drawForeground, getContainer: getContainer, initialize: initialize, @@ -431,13 +432,55 @@ function newRateScale () { } } + function drawBackground () { + drawScale() + } + + function drawScale () { + const SEPARATION = 50 + const NUMBER_OF_LABELS = Math.trunc(canvas.chartingSpace.viewport.height / SEPARATION) + const FONT_SIZE = 15 + + for (let i = 0; i <= NUMBER_OF_LABELS; i++) { + let ratePoint1 = { + x: 0, + y: TOP_SPACE_HEIGHT + SEPARATION * (i + 1) + } + let ratePoint2 = { + x: 0, + y: TOP_SPACE_HEIGHT + SEPARATION * (i + 1) - FONT_SIZE + } + + let rate = getRateFromPointAtBrowserCanvas(ratePoint1, rateCalculationsContainer, coordinateSystem) + let labels = scaleLabels(rate) + let decimalsDisplace = labels[1].length * FONT_SIZE * FONT_ASPECT_RATIO + + let fitPoint1 = thisObject.fitFunction(ratePoint1) + let fitPoint2 = thisObject.fitFunction(ratePoint2) + + if (fitPoint1.y === ratePoint1.y && fitPoint2.y === ratePoint2.y) { + drawLabel(labels[1], 1 / 2, 0, 0, 0, FONT_SIZE, thisObject.container, UI_COLOR.GREY, undefined, ratePoint1.y) + drawLabel(labels[2], 1 / 2, 0, decimalsDisplace, -5, 9, thisObject.container, UI_COLOR.GREY, undefined, ratePoint1.y) + } + } + } + function drawScaleBox () { if (thisObject.rate === undefined) { return } if (thisObject.payload === undefined) { return } if (thisObject.payload.node === undefined) { return } - let rate = thisObject.rate + let icon1 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.payload.parentNode.type) + let icon2 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) + let backgroundColor = UI_COLOR.BLACK + let rate = thisObject.rate + let labels = scaleLabels(rate) + + drawScaleDisplay(labels[0], labels[1], labels[2], 0, 0, 0, icon1, icon2, thisObject.container, backgroundColor) + } + + function scaleLabels (rate) { if (rate < coordinateSystem.min.y) { rate = coordinateSystem.min.y } @@ -462,16 +505,11 @@ function newRateScale () { label3 = '' } - let icon1 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.payload.parentNode.type) - let icon2 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) - - let backgroundColor = UI_COLOR.BLACK - if (scaleDisplayTimer > 0) { label2 = (coordinateSystem.scale.y * 10000).toFixed(2) label3 = 'SCALE' } - drawScaleDisplay(label1, label2, label3, 0, 0, 0, icon1, icon2, thisObject.container, backgroundColor) + return [label1, label2, label3] } } diff --git a/Utilities/RoundedCornersBackground.js b/Utilities/RoundedCornersBackground.js index 7ce98884c..e21100bf3 100644 --- a/Utilities/RoundedCornersBackground.js +++ b/Utilities/RoundedCornersBackground.js @@ -105,8 +105,9 @@ function roundedCornersBackground (params) { browserCanvasContext.stroke() } -function drawLabel (label, xFactor, yFactor, xOffset, yOffset, fontSize, container) { +function drawLabel (label, xFactor, yFactor, xOffset, yOffset, fontSize, container, fontColor, noFrameX, noFrameY) { if (label === undefined) { return } + if (fontColor === undefined) { fontColor = UI_COLOR.WHITE } let fontOffset = label.length * fontSize * FONT_ASPECT_RATIO + 10 let labelPoint = { @@ -116,8 +117,16 @@ function drawLabel (label, xFactor, yFactor, xOffset, yOffset, fontSize, contain labelPoint = container.frame.frameThisPoint(labelPoint) + if (noFrameX !== undefined) { + labelPoint.x = noFrameX + xOffset + } + + if (noFrameY !== undefined) { + labelPoint.y = noFrameY + yOffset + } + browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', 1)' + browserCanvasContext.fillStyle = 'rgba(' + fontColor + ', 1)' browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) } diff --git a/VideoRecorder.js b/VideoRecorder.js index e84336c95..f57152845 100644 --- a/VideoRecorder.js +++ b/VideoRecorder.js @@ -1,12 +1,23 @@ function newVideoRecorder () { let thisObject = { - recordCanvas: recordCanvas + recordCanvas: recordCanvas, + physics: physics } let lastAction + let wheelAnimationCounter = 0 + let lastWheelPointerIcon return thisObject + function physics () { + wheelAnimationCounter-- + if (wheelAnimationCounter < 0) { + wheelAnimationCounter = 0 + } + } + function recordCanvas () { { + console.log(canvas.mouse.action, wheelAnimationCounter) const DISTANCE_BETWEEN_ICONS = 35 const ICON_SIZES = 50 @@ -33,16 +44,24 @@ function newVideoRecorder () { break } case 'wheel': { + wheelAnimationCounter = 25 if (canvas.mouse.event.delta > 0) { pointerIcon = canvas.designSpace.iconCollection.get('mouse-wheel-up') + lastWheelPointerIcon = pointerIcon } else { pointerIcon = canvas.designSpace.iconCollection.get('mouse-wheel-down') + lastWheelPointerIcon = pointerIcon } break } case 'key down': { - pointerIcon = mousePointerIcon + if (wheelAnimationCounter > 0) { + pointerIcon = lastWheelPointerIcon + } else { + pointerIcon = mousePointerIcon + } + break } case 'key up': { @@ -170,4 +189,3 @@ function newVideoRecorder () { } } } - From ade18a4502a49a80c1f4fada1e19dc0add6bb86d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 13 Mar 2020 12:01:26 +0100 Subject: [PATCH 102/166] Time Scale finished --- ChartingSpace/TimeMachine.js | 2 +- ChartingSpace/TimelineChart.js | 1 - Scales/RateScale.js | 5 ++- Scales/TimeScale.js | 58 ++++++++++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 30c4dc509..1d99bfeeb 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -541,7 +541,7 @@ function newTimeMachine () { drawChartsBackground() if (thisObject.container.frame.isInViewPort()) { if (drawScales === true) { - // if (thisObject.timeScale !== undefined && thisObject.timeScale.isVisible === true) { thisObject.timeScale.drawBackground() } + if (thisObject.timeScale !== undefined && thisObject.timeScale.isVisible === true) { thisObject.timeScale.drawBackground() } if (thisObject.rateScale !== undefined && thisObject.rateScale.isVisible === true) { thisObject.rateScale.drawBackground() } } diff --git a/ChartingSpace/TimelineChart.js b/ChartingSpace/TimelineChart.js index 27caf7181..f827726c0 100644 --- a/ChartingSpace/TimelineChart.js +++ b/ChartingSpace/TimelineChart.js @@ -379,7 +379,6 @@ function newTimelineChart () { function drawBackground () { if (thisObject.container.frame.isInViewPort()) { if (drawScales === true) { - // if (thisObject.timeScale !== undefined && thisObject.timeScale.isVisible === true) { thisObject.timeScale.drawBackground() } if (thisObject.rateScale !== undefined && thisObject.rateScale.isVisible === true) { thisObject.rateScale.drawBackground() } } drawChartsBackground() diff --git a/Scales/RateScale.js b/Scales/RateScale.js index 36141e714..2c728aa11 100644 --- a/Scales/RateScale.js +++ b/Scales/RateScale.js @@ -448,7 +448,7 @@ function newRateScale () { } let ratePoint2 = { x: 0, - y: TOP_SPACE_HEIGHT + SEPARATION * (i + 1) - FONT_SIZE + y: TOP_SPACE_HEIGHT + SEPARATION * (i + 0) } let rate = getRateFromPointAtBrowserCanvas(ratePoint1, rateCalculationsContainer, coordinateSystem) @@ -474,8 +474,7 @@ function newRateScale () { let icon2 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) let backgroundColor = UI_COLOR.BLACK - let rate = thisObject.rate - let labels = scaleLabels(rate) + let labels = scaleLabels(thisObject.rate) drawScaleDisplay(labels[0], labels[1], labels[2], 0, 0, 0, icon1, icon2, thisObject.container, backgroundColor) } diff --git a/Scales/TimeScale.js b/Scales/TimeScale.js index c51840b55..1065fffa3 100644 --- a/Scales/TimeScale.js +++ b/Scales/TimeScale.js @@ -12,6 +12,7 @@ function newTimeScale () { onMouseOverSomeTimeMachineContainer: onMouseOverSomeTimeMachineContainer, physics: physics, draw: draw, + drawBackground: drawBackground, drawForeground: drawForeground, getContainer: getContainer, initialize: initialize, @@ -290,6 +291,44 @@ function newTimeScale () { } } + function drawBackground () { + drawScale() + } + + function drawScale () { + const SEPARATION = 150 + const NUMBER_OF_LABELS = Math.trunc(canvas.chartingSpace.viewport.width / SEPARATION) + const FONT_SIZE = 15 + + for (let i = 0; i <= NUMBER_OF_LABELS; i++) { + let timePoint = { + x: SEPARATION * (i + 1), + y: 0 + } + + let time = getDateFromPointAtBrowserCanvas(timePoint, limitingContainer, coordinateSystem) + let labels = scaleLabels(time) + let labelDisplace = labels[1].length * FONT_SIZE * FONT_ASPECT_RATIO + + let timePoint1 = { + x: SEPARATION * (i + 1) - labelDisplace, + y: 0 + } + let timePoint2 = { + x: SEPARATION * (i + 1) + labelDisplace, + y: 0 + } + + let fitPoint1 = thisObject.fitFunction(timePoint1) + let fitPoint2 = thisObject.fitFunction(timePoint2) + + if (fitPoint1.x === timePoint1.x && fitPoint2.x === timePoint2.x) { + drawLabel(labels[1], 1 / 2, 0, 0, 17, FONT_SIZE, thisObject.container, UI_COLOR.GREY, timePoint1.x, undefined) + drawLabel(labels[2], 1 / 2, 0, 20, 27, 9, thisObject.container, UI_COLOR.GREY, timePoint1.x, undefined) + } + } + } + function draw () { drawScaleBox() autoScaleButton.draw() @@ -308,17 +347,22 @@ function newTimeScale () { function drawScaleBox () { if (thisObject.date === undefined) { return } - let label = thisObject.date.toUTCString() + let icon1 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.payload.parentNode.type) + let icon2 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) + + let backgroundColor = UI_COLOR.BLACK + let labels = scaleLabels(thisObject.date) + + drawScaleDisplay(labels[0], labels[1], labels[2], 0, 0, 0, icon1, icon2, thisObject.container, backgroundColor) + } + + function scaleLabels (date) { + let label = date.toUTCString() let labelArray = label.split(' ') let label1 = thisObject.payload.node.payload.parentNode.name let label2 = labelArray[1] + ' ' + labelArray[2] + ' ' + labelArray[3] let label3 = labelArray[4] - let icon1 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.payload.parentNode.type) - let icon2 = canvas.designSpace.iconByUiObjectType.get(thisObject.payload.node.type) - - let backgroundColor = UI_COLOR.BLACK - - drawScaleDisplay(label1, label2, label3, 0, 0, 0, icon1, icon2, thisObject.container, backgroundColor) + return [label1, label2, label3] } } From 785722193d2ebb5cffc9c2e4b4ca8fabfa7142ce Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 13 Mar 2020 12:17:30 +0100 Subject: [PATCH 103/166] scale fixed --- Scales/TimeScale.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Scales/TimeScale.js b/Scales/TimeScale.js index 1065fffa3..5ceeb9492 100644 --- a/Scales/TimeScale.js +++ b/Scales/TimeScale.js @@ -307,7 +307,7 @@ function newTimeScale () { } let time = getDateFromPointAtBrowserCanvas(timePoint, limitingContainer, coordinateSystem) - let labels = scaleLabels(time) + let labels = scaleLabels(time, true) let labelDisplace = labels[1].length * FONT_SIZE * FONT_ASPECT_RATIO let timePoint1 = { @@ -323,8 +323,8 @@ function newTimeScale () { let fitPoint2 = thisObject.fitFunction(timePoint2) if (fitPoint1.x === timePoint1.x && fitPoint2.x === timePoint2.x) { - drawLabel(labels[1], 1 / 2, 0, 0, 17, FONT_SIZE, thisObject.container, UI_COLOR.GREY, timePoint1.x, undefined) - drawLabel(labels[2], 1 / 2, 0, 20, 27, 9, thisObject.container, UI_COLOR.GREY, timePoint1.x, undefined) + drawLabel(labels[1], 1 / 2, 0, 18, 17, FONT_SIZE, thisObject.container, UI_COLOR.GREY, timePoint1.x, undefined) + drawLabel(labels[2], 1 / 2, 0, 18, 30, 12, thisObject.container, UI_COLOR.GREY, timePoint1.x, undefined) } } } @@ -356,13 +356,18 @@ function newTimeScale () { drawScaleDisplay(labels[0], labels[1], labels[2], 0, 0, 0, icon1, icon2, thisObject.container, backgroundColor) } - function scaleLabels (date) { + function scaleLabels (date, excludeYear) { let label = date.toUTCString() let labelArray = label.split(' ') let label1 = thisObject.payload.node.payload.parentNode.name let label2 = labelArray[1] + ' ' + labelArray[2] + ' ' + labelArray[3] let label3 = labelArray[4] + if (excludeYear === true) { + label2 = labelArray[1] + ' ' + labelArray[2] + } + return [label1, label2, label3] } } + From bf1f9858aa5c792e1b9082acdff97f059375d624 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 13 Mar 2020 17:21:39 +0100 Subject: [PATCH 104/166] Bug Fixed --- DesignSpace/Workspace/FunctionLibraries/SuperScripts.js | 2 +- Panels/LayersPanel.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js index ed5c886e3..3965fe328 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js +++ b/DesignSpace/Workspace/FunctionLibraries/SuperScripts.js @@ -9,6 +9,7 @@ function newSuperScriptsFunctions () { try { let clone = functionLibraryNodeCloning.getNodeClone let executionResult = true + let superAction = node function setup (templateClone, target, exchange, exchangeNodeType, arrayPropertyName) { spawnPosition.x = target.payload.position.x @@ -64,7 +65,6 @@ function newSuperScriptsFunctions () { executionResult = false } - let superAction = node let masterScript = node.payload.referenceParent eval(masterScript.javascriptCode.code) diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index f9b5ad4a8..3498f8765 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -391,6 +391,11 @@ function newLayersPanel () { } function drawHeader () { + if (thisObject.payload === undefined) { return } + if (thisObject.payload.node === undefined) { return } + if (thisObject.payload.node.payload.parentNode === undefined) { return } + if (thisObject.payload.node.payload.parentNode.payload.parentNode === undefined) { return } + let label1 = thisObject.payload.node.payload.parentNode.payload.parentNode.name.substring(0, 18) let label2 = thisObject.payload.node.payload.parentNode.name.substring(0, 18) let label3 = '' From 9b2c8ed357d76933f7f5f097c0aaeef81a7e570e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 13 Mar 2020 19:02:51 +0100 Subject: [PATCH 105/166] Bug Fixed --- FloatingSpace/UiObject.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index f714168c6..e6c246cfe 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -298,17 +298,17 @@ function newUiObject () { if (nowTimestamp - lastHeartBeat.valueOf() > ONE_MIN) { lastHeartBeat = undefined thisObject.isRunning = false - setValue('') + valueCounter = 0 } } else { thisObject.isRunning = false - setValue('') } } function childrenRunningPhysics () { let nodeDefinition = APP_SCHEMA_MAP.get(thisObject.payload.node.type) if (nodeDefinition.properties === undefined) { return } + let monitorChildrenRunning = false for (let i = 0; i < nodeDefinition.properties.length; i++) { let property = nodeDefinition.properties[i] if (property.monitorChildrenRunning === true) { @@ -326,14 +326,15 @@ function newUiObject () { thisObject.isRunning = true } else { thisObject.isRunning = false - setValue('') + valueCounter = 0 } - + monitorChildrenRunning = true return - } else { - heartBeatPhysics() } } + if (monitorChildrenRunning === false) { + heartBeatPhysics() + } } function chainAttachingPhysics () { @@ -638,7 +639,7 @@ function newUiObject () { if (value !== undefined) { currentValue = value hasValue = true - valueCounter = 500 + valueCounter = 100 } } @@ -667,6 +668,8 @@ function newUiObject () { let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + '-' + thisObject.payload.node.id systemEventHandler.stopListening(key, eventSubscriptionIdHeartbeat, 'UiObject') + thisObject.isRunning = true + if (callBackFunction !== undefined) { callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) } @@ -687,8 +690,6 @@ function newUiObject () { type: 'Secondary Action Already Executed' } stop(callBackFunction, event) - - thisObject.isRunning = true } function stop (callBackFunction, event) { @@ -1114,6 +1115,7 @@ function newUiObject () { function drawValue () { if (hasValue === false) { return } + // if (currentValue === undefined || currentValue === '') { return } /* Text Follows */ let position = { From 6b127356c6dcb4a893da481d37c5bccca0601f8d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 14 Mar 2020 14:23:09 +0100 Subject: [PATCH 106/166] Cleaned with Logs --- Plotter.js | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/Plotter.js b/Plotter.js index e23e87dc3..6bdbdb8ca 100644 --- a/Plotter.js +++ b/Plotter.js @@ -24,7 +24,6 @@ function newPlotter () { thisObject.container = container let coordinateSystem - let plotterModuleConfig let slotHeight = (canvas.chartingSpace.viewport.visibleArea.bottomRight.y - canvas.chartingSpace.viewport.visibleArea.topLeft.y) / 10 // This is the amount of slots available let mustRecalculateDataPoints = false let atMousePositionFillStyles = new Map() @@ -58,6 +57,7 @@ function newPlotter () { return thisObject function finalize () { + console.log('finalize') try { /* Stop listening to the necesary events. */ thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId) @@ -82,7 +82,6 @@ function newPlotter () { finalizeCoordinateSystem() coordinateSystem = undefined - plotterModuleConfig = undefined slotHeight = undefined mustRecalculateDataPoints = undefined atMousePositionFillStyles = undefined @@ -93,6 +92,7 @@ function newPlotter () { } function initialize (pStorage, pDatetime, pTimeFrame, pCoordinateSystem, callBackFunction, pProductDefinition) { + console.log('initialize') try { /* Store the information received. */ marketFiles = pStorage.marketFiles[0] @@ -135,24 +135,29 @@ function newPlotter () { } function initializeCoordinateSystem () { + console.log('initializeCoordinateSystem') scaleChangedEventSubscriptionId = coordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged) } function finalizeCoordinateSystem () { + console.log('finalizeCoordinateSystem') coordinateSystem.eventHandler.stopListening(scaleChangedEventSubscriptionId) } function onScaleChanged () { + console.log('onScaleChanged') mustRecalculateDataPoints = true recalculate() } function onMouseOver (event) { + console.log('onMouseOver') let userPosition = getDateFromPointAtBrowserCanvas(event, thisObject.container, coordinateSystem) userPositionDate = userPosition.valueOf() } function onMarketFilesUpdated () { + console.log('onMarketFilesUpdated') try { let newMarketFile = marketFiles.getFile(timeFrame) if (newMarketFile !== undefined) { @@ -166,6 +171,7 @@ function newPlotter () { } function onDailyFilesUpdated () { + console.log('onDailyFilesUpdated') try { let newFileCursor = dailyFiles.getFileCursor(timeFrame) if (newFileCursor !== undefined) { @@ -179,6 +185,7 @@ function newPlotter () { } function getContainer (point) { + console.log('getContainer') try { let container /* First we check if this point is inside this space. */ @@ -194,6 +201,7 @@ function newPlotter () { } function setTimeFrame (pTimeFrame) { + console.log('setTimeFrame') try { if (timeFrame !== pTimeFrame) { timeFrame = pTimeFrame @@ -220,16 +228,19 @@ function newPlotter () { } function setDatetime (pDatetime) { + console.log('setDatetime') datetime = pDatetime } function setCoordinateSystem (pCoordinateSystem) { + console.log('setCoordinateSystem') finalizeCoordinateSystem() coordinateSystem = pCoordinateSystem initializeCoordinateSystem() } function onDailyFileLoaded (event) { + console.log('onDailyFileLoaded') try { if (event.currentValue === event.totalValue) { /* This happens only when all of the files in the cursor have been loaded. */ @@ -241,6 +252,7 @@ function newPlotter () { } function draw () { + console.log('draw') try { thisObject.container.frame.draw() plotChart() @@ -250,6 +262,7 @@ function newPlotter () { } function recalculate () { + console.log('recalculate') try { if (timeFrame >= _1_HOUR_IN_MILISECONDS) { recalculateUsingMarketFiles() @@ -263,6 +276,7 @@ function newPlotter () { } function jsonifyDataFile (dataFile, recordDefinition, farLeftDate, farRightDate) { + console.log('jsonifyDataFile') /* This function has as an input the raw data on files and creates with it an array of JSON objects with not calculated properties for later being consumed by Formulas @@ -299,6 +313,7 @@ function newPlotter () { } function calculationsProcedure (jsonArray, recordDefinition, calculationsProcedure, timeFrame) { + console.log('calculationsProcedure') /* This function has as an input an array of JSON objects, and it adds calculated properties to complete the set of properties that will be available. @@ -370,6 +385,7 @@ function newPlotter () { } function recalculateUsingDailyFiles () { + console.log('recalculateUsingDailyFiles') try { if (fileCursor === undefined) { return } // We need to wait until there is a fileCursor if (fileCursor.files.size === 0) { return } // We need to wait until there are files in the cursor @@ -424,6 +440,7 @@ function newPlotter () { } function recalculateUsingMarketFiles () { + console.log('recalculateUsingMarketFiles') try { if (marketFile === undefined) { return } // Initialization not complete yet. @@ -463,6 +480,7 @@ function newPlotter () { } function recalculateScale () { + console.log('recalculateScale') try { if (coordinateSystem.maxValue > 0) { return } // Already calculated. /* First we calculate the default scale */ @@ -488,6 +506,7 @@ function newPlotter () { } function plotChart () { + console.log('plotChart') try { /* Clean the pannel at places where there is no record. */ let currentRecord = { @@ -498,6 +517,10 @@ function newPlotter () { for (let i = 0; i < records.length; i++) { let record = records[i] + /* + In the formulas to create plotters, we allos users to reference the previous record. + To enable that we need to link all records to the previous one in this way. + */ if (i == 0) { record.previous = record } else { @@ -555,7 +578,7 @@ function newPlotter () { if (logged === false) { logged = true } - /* Only calculate the datapoints for this record, if we have not calculate it before. */ + /* It seems we need to calculate the data points this time. */ for (let k = 0; k < productDefinition.referenceParent.shapes.chartPoints.length; k++) { let chartPoints = productDefinition.referenceParent.shapes.chartPoints[k] for (let j = 0; j < chartPoints.points.length; j++) { @@ -582,13 +605,6 @@ function newPlotter () { /* Store the data point at the local map */ dataPoints.set(point.id, dataPoint) - - if (plotterModuleConfig !== undefined) { - if (plotterModuleConfig.slot !== undefined) { - /* We reset the y coordinate since it will be transformed with another coordinate system to fit into a slot. */ - dataPoint.y = (-1) * y * coordinateSystem.scale.y + (plotterModuleConfig.slot.number - 1) * slotHeight + canvas.chartingSpace.viewport.visibleArea.topLeft.y - } - } } } } @@ -769,7 +785,7 @@ function newPlotter () { } } - if (coordinateSystem.autoMinYScale === true || coordinateSystem.autosMaxScale === true) { + if (coordinateSystem.autoMinYScale === true || coordinateSystem.autoMinYScale === true) { mustRecalculateDataPoints = true } else { mustRecalculateDataPoints = false @@ -782,6 +798,7 @@ function newPlotter () { } function onViewportZoomChanged (event) { + console.log('onViewportZoomChanged') try { mustRecalculateDataPoints = true recalculate() @@ -791,6 +808,7 @@ function newPlotter () { } function onDragFinished () { + console.log('onDragFinished') try { recalculate() } catch (err) { @@ -799,14 +817,17 @@ function newPlotter () { } function onDisplace (event) { + console.log('onDisplace') recalculateAll(event) } function onViewportPositionChanged (event) { + console.log('onViewportPositionChanged') recalculateAll(event) } function recalculateAll (event) { + console.log('recalculateAll') mustRecalculateDataPoints = true if (event !== undefined) { if (event.recalculate === true) { From 6446556fe374b7641f5da910006bf5c0f5cf0b63 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 14 Mar 2020 15:51:23 +0100 Subject: [PATCH 107/166] Preformance Improvements in Charts --- Animation.js | 13 ++++--------- Plotter.js | 26 -------------------------- 2 files changed, 4 insertions(+), 35 deletions(-) diff --git a/Animation.js b/Animation.js index 14b9f8376..b06c4eb6d 100644 --- a/Animation.js +++ b/Animation.js @@ -61,11 +61,11 @@ function newAnimation () { try { if (window.canvasApp.visible === true) { /* We set the canvas to its normal width and height */ - browserCanvas.width = window.innerWidth - browserCanvas.height = window.innerHeight - CURRENT_TOP_MARGIN + // browserCanvas.width = window.innerWidth + // browserCanvas.height = window.innerHeight - CURRENT_TOP_MARGIN /* First thing is to clear the actual canvas */ - // clearBrowserCanvas() + clearBrowserCanvas() /* We loop through the callback functions collections and execute them all. */ let performanceMap = new Map() @@ -162,12 +162,7 @@ function newAnimation () { } function clearBrowserCanvas () { - browserCanvasContext.beginPath() - - browserCanvasContext.rect(0, 0, browserCanvas.width, browserCanvas.height) browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', 1)' - - browserCanvasContext.closePath() - browserCanvasContext.fill() + browserCanvasContext.clearRect(0, 0, browserCanvas.width, browserCanvas.height) } } diff --git a/Plotter.js b/Plotter.js index 6bdbdb8ca..fdd1cce45 100644 --- a/Plotter.js +++ b/Plotter.js @@ -57,7 +57,6 @@ function newPlotter () { return thisObject function finalize () { - console.log('finalize') try { /* Stop listening to the necesary events. */ thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId) @@ -92,7 +91,6 @@ function newPlotter () { } function initialize (pStorage, pDatetime, pTimeFrame, pCoordinateSystem, callBackFunction, pProductDefinition) { - console.log('initialize') try { /* Store the information received. */ marketFiles = pStorage.marketFiles[0] @@ -135,29 +133,24 @@ function newPlotter () { } function initializeCoordinateSystem () { - console.log('initializeCoordinateSystem') scaleChangedEventSubscriptionId = coordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged) } function finalizeCoordinateSystem () { - console.log('finalizeCoordinateSystem') coordinateSystem.eventHandler.stopListening(scaleChangedEventSubscriptionId) } function onScaleChanged () { - console.log('onScaleChanged') mustRecalculateDataPoints = true recalculate() } function onMouseOver (event) { - console.log('onMouseOver') let userPosition = getDateFromPointAtBrowserCanvas(event, thisObject.container, coordinateSystem) userPositionDate = userPosition.valueOf() } function onMarketFilesUpdated () { - console.log('onMarketFilesUpdated') try { let newMarketFile = marketFiles.getFile(timeFrame) if (newMarketFile !== undefined) { @@ -171,7 +164,6 @@ function newPlotter () { } function onDailyFilesUpdated () { - console.log('onDailyFilesUpdated') try { let newFileCursor = dailyFiles.getFileCursor(timeFrame) if (newFileCursor !== undefined) { @@ -185,7 +177,6 @@ function newPlotter () { } function getContainer (point) { - console.log('getContainer') try { let container /* First we check if this point is inside this space. */ @@ -201,7 +192,6 @@ function newPlotter () { } function setTimeFrame (pTimeFrame) { - console.log('setTimeFrame') try { if (timeFrame !== pTimeFrame) { timeFrame = pTimeFrame @@ -228,19 +218,16 @@ function newPlotter () { } function setDatetime (pDatetime) { - console.log('setDatetime') datetime = pDatetime } function setCoordinateSystem (pCoordinateSystem) { - console.log('setCoordinateSystem') finalizeCoordinateSystem() coordinateSystem = pCoordinateSystem initializeCoordinateSystem() } function onDailyFileLoaded (event) { - console.log('onDailyFileLoaded') try { if (event.currentValue === event.totalValue) { /* This happens only when all of the files in the cursor have been loaded. */ @@ -252,7 +239,6 @@ function newPlotter () { } function draw () { - console.log('draw') try { thisObject.container.frame.draw() plotChart() @@ -262,7 +248,6 @@ function newPlotter () { } function recalculate () { - console.log('recalculate') try { if (timeFrame >= _1_HOUR_IN_MILISECONDS) { recalculateUsingMarketFiles() @@ -276,7 +261,6 @@ function newPlotter () { } function jsonifyDataFile (dataFile, recordDefinition, farLeftDate, farRightDate) { - console.log('jsonifyDataFile') /* This function has as an input the raw data on files and creates with it an array of JSON objects with not calculated properties for later being consumed by Formulas @@ -313,7 +297,6 @@ function newPlotter () { } function calculationsProcedure (jsonArray, recordDefinition, calculationsProcedure, timeFrame) { - console.log('calculationsProcedure') /* This function has as an input an array of JSON objects, and it adds calculated properties to complete the set of properties that will be available. @@ -385,7 +368,6 @@ function newPlotter () { } function recalculateUsingDailyFiles () { - console.log('recalculateUsingDailyFiles') try { if (fileCursor === undefined) { return } // We need to wait until there is a fileCursor if (fileCursor.files.size === 0) { return } // We need to wait until there are files in the cursor @@ -440,7 +422,6 @@ function newPlotter () { } function recalculateUsingMarketFiles () { - console.log('recalculateUsingMarketFiles') try { if (marketFile === undefined) { return } // Initialization not complete yet. @@ -480,7 +461,6 @@ function newPlotter () { } function recalculateScale () { - console.log('recalculateScale') try { if (coordinateSystem.maxValue > 0) { return } // Already calculated. /* First we calculate the default scale */ @@ -506,7 +486,6 @@ function newPlotter () { } function plotChart () { - console.log('plotChart') try { /* Clean the pannel at places where there is no record. */ let currentRecord = { @@ -798,7 +777,6 @@ function newPlotter () { } function onViewportZoomChanged (event) { - console.log('onViewportZoomChanged') try { mustRecalculateDataPoints = true recalculate() @@ -808,7 +786,6 @@ function newPlotter () { } function onDragFinished () { - console.log('onDragFinished') try { recalculate() } catch (err) { @@ -817,17 +794,14 @@ function newPlotter () { } function onDisplace (event) { - console.log('onDisplace') recalculateAll(event) } function onViewportPositionChanged (event) { - console.log('onViewportPositionChanged') recalculateAll(event) } function recalculateAll (event) { - console.log('recalculateAll') mustRecalculateDataPoints = true if (event !== undefined) { if (event.recalculate === true) { From 7f350d4b629fb5c2346876715a6724e6dee2fae8 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 14 Mar 2020 19:00:44 +0100 Subject: [PATCH 108/166] Cool line animations --- FloatingSpace/UiObject.js | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index e6c246cfe..fcf5f623a 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -98,6 +98,8 @@ function newUiObject () { let eventSubscriptionIdOnStopped let lastHeartBeat let newUiObjectCounter = 25 + let referenceLineCounter = 0 + let chainLineCounter = 0 return thisObject @@ -282,6 +284,22 @@ function newUiObject () { referenceAttachingPhysics() childrenRunningPhysics() newObjectPhysics() + referenceLinePhysics() + chainLinePhysics() + } + + function referenceLinePhysics () { + referenceLineCounter = referenceLineCounter + 2 + if (referenceLineCounter > 500) { + referenceLineCounter = 0 + } + } + + function chainLinePhysics () { + chainLineCounter = chainLineCounter - 5 + if (chainLineCounter < 0) { + chainLineCounter = 500 + } } function newObjectPhysics () { @@ -954,6 +972,15 @@ function newUiObject () { LINE_STYLE = UI_COLOR.GREY } + browserCanvasContext.beginPath() + browserCanvasContext.moveTo(position.x, position.y) + browserCanvasContext.lineTo(targetPoint.x, targetPoint.y) + browserCanvasContext.strokeStyle = 'rgba(' + LINE_STYLE + ', 1)' + browserCanvasContext.setLineDash([0, chainLineCounter, 5, 500 - chainLineCounter]) + browserCanvasContext.lineWidth = 2 + browserCanvasContext.stroke() + browserCanvasContext.setLineDash([0, 0]) + browserCanvasContext.beginPath() browserCanvasContext.moveTo(position.x, position.y) browserCanvasContext.lineTo(targetPoint.x, targetPoint.y) @@ -1019,7 +1046,7 @@ function newUiObject () { browserCanvasContext.moveTo(position.x, position.y) browserCanvasContext.lineTo(targetPoint.x, targetPoint.y) browserCanvasContext.strokeStyle = 'rgba(' + LINE_STYLE + ', 1)' - browserCanvasContext.setLineDash([1, 9, 2, 8, 3, 7, 4, 6, 0, 500]) + browserCanvasContext.setLineDash([0, referenceLineCounter, 1, 9, 2, 8, 3, 7, 4, 6, 0, 500 - referenceLineCounter]) browserCanvasContext.lineWidth = 4 browserCanvasContext.stroke() browserCanvasContext.setLineDash([0, 0]) @@ -1455,3 +1482,4 @@ function newUiObject () { } } } + From 8de17de8796f63bc360f5aa08e7f84b9e31da310 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 14 Mar 2020 19:13:38 +0100 Subject: [PATCH 109/166] Update UiObject.js --- FloatingSpace/UiObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index fcf5f623a..ccec4c308 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -976,7 +976,7 @@ function newUiObject () { browserCanvasContext.moveTo(position.x, position.y) browserCanvasContext.lineTo(targetPoint.x, targetPoint.y) browserCanvasContext.strokeStyle = 'rgba(' + LINE_STYLE + ', 1)' - browserCanvasContext.setLineDash([0, chainLineCounter, 5, 500 - chainLineCounter]) + browserCanvasContext.setLineDash([0, chainLineCounter, 2, 3, 0, 500 - chainLineCounter]) browserCanvasContext.lineWidth = 2 browserCanvasContext.stroke() browserCanvasContext.setLineDash([0, 0]) From a40c2e27c856e76c07c528317047684916940781 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 11:03:08 +0100 Subject: [PATCH 110/166] showing map --- FloatingSpace/UiObject.js | 33 +++++++++++++++++++++++++++- Spaces/FloatingSpace.js | 46 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index ccec4c308..302d9b4f8 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -960,6 +960,11 @@ function newUiObject () { targetPoint = canvas.floatingSpace.container.frame.frameThisPoint(targetPoint) position = thisObject.container.frame.frameThisPoint(position) + if (canvas.floatingSpace.inMapMode === true) { + targetPoint = canvas.floatingSpace.transformPoointToMap(targetPoint) + position = canvas.floatingSpace.transformPoointToMap(position) + } + if (thisObject.container.frame.radius > 1) { let LINE_STYLE = UI_COLOR.TITANIUM_YELLOW if (thisObject.payload.floatingObject.angleToParent !== ANGLE_TO_PARENT.NOT_FIXED) { @@ -1030,6 +1035,11 @@ function newUiObject () { targetPoint = canvas.floatingSpace.container.frame.frameThisPoint(targetPoint) position = thisObject.container.frame.frameThisPoint(position) + if (canvas.floatingSpace.inMapMode === true) { + position = canvas.floatingSpace.transformPoointToMap(position) + targetPoint = canvas.floatingSpace.transformPoointToMap(targetPoint) + } + let LINE_STYLE = UI_COLOR.GREY if (thisObject.container.frame.radius > 1) { @@ -1072,6 +1082,10 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) + if (canvas.floatingSpace.inMapMode === true) { + position = canvas.floatingSpace.transformPoointToMap(position) + } + let radius = thisObject.container.frame.radius /* Label Text */ let labelPoint @@ -1112,6 +1126,10 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) + if (canvas.floatingSpace.inMapMode === true) { + position = canvas.floatingSpace.transformPoointToMap(position) + } + let radius = thisObject.container.frame.radius * 3.5 /* Label Text */ let labelPoint @@ -1152,6 +1170,10 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) + if (canvas.floatingSpace.inMapMode === true) { + position = canvas.floatingSpace.transformPoointToMap(position) + } + let radius = thisObject.container.frame.radius * 1.5 /* Label Text */ let labelPoint @@ -1255,6 +1277,10 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) + if (canvas.floatingSpace.inMapMode === true) { + position = canvas.floatingSpace.transformPoointToMap(position) + } + let radius = thisObject.container.frame.radius if (radius > 0.5) { @@ -1266,7 +1292,12 @@ function newUiObject () { } visiblePosition = thisObject.container.frame.frameThisPoint(visiblePosition) - visiblePosition = thisObject.fitFunction(visiblePosition) + + if (canvas.floatingSpace.inMapMode === true) { + visiblePosition = canvas.floatingSpace.transformPoointToMap(visiblePosition) + } else { + visiblePosition = thisObject.fitFunction(visiblePosition) + } browserCanvasContext.beginPath() browserCanvasContext.arc(visiblePosition.x, visiblePosition.y, VISIBLE_RADIUS, 0, Math.PI * 2, true) diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 36819e044..3aaaafaf9 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -11,6 +11,8 @@ function newFloatingSpace () { floatingLayer: undefined, // This is the array of floatingObjects being displayed uiObjectConstructor: undefined, container: undefined, + inMapMode: false, + transformPoointToMap: transformPoointToMap, oneScreenUp: oneScreenUp, oneScreenDown: oneScreenDown, oneScreenLeft: oneScreenLeft, @@ -34,6 +36,7 @@ function newFloatingSpace () { thisObject.container.isDraggeable = true thisObject.container.isWheelable = true thisObject.container.detectMouseOver = true + thisObject.container.isClickeable = false thisObject.container.frame.radius = 0 let devicePixelRatio = window.devicePixelRatio @@ -48,11 +51,15 @@ function newFloatingSpace () { const PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT = 25 let eventSubscriptionId + let onDragStartedEventSubscriptionId + + let doubleClickCounter = 0 return thisObject function finalize () { thisObject.container.eventHandler.stopListening(eventSubscriptionId) + thisObject.container.eventHandler.stopListening(onDragStartedEventSubscriptionId) thisObject.floatingLayer.finalize() thisObject.uiObjectConstructor.finalize() @@ -71,6 +78,37 @@ function newFloatingSpace () { thisObject.uiObjectConstructor.initialize(thisObject.floatingLayer) eventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseWheel', onMouseWheel) + onDragStartedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onDragStarted', onDragStarted) + } + + function transformPoointToMap (point) { + let returnPoint = { + x: point.x - thisObject.container.frame.position.x, + y: point.y - thisObject.container.frame.position.y + } + returnPoint.x = returnPoint.x / SPACE_SIZE * browserCanvas.width + returnPoint.y = returnPoint.y / SPACE_SIZE * browserCanvas.height + return returnPoint + } + + function onDoubleClick () { + doubleClickCounter = 0 + + if (thisObject.inMapMode === false) { + thisObject.inMapMode = true + } else { + thisObject.inMapMode = false + } + console.log(thisObject.inMapMode) + } + + function onDragStarted (event) { + if (doubleClickCounter > 0) { + onDoubleClick() + return + } else { + doubleClickCounter = 10 + } } function isItFar (payload, dontCheckParent) { @@ -260,6 +298,14 @@ function newFloatingSpace () { browserZoomPhysics() positionContraintsPhysics() thisObject.floatingLayer.physics() + doubleClickPhysics() + } + + function doubleClickPhysics () { + doubleClickCounter-- + if (doubleClickCounter < 0) { + doubleClickCounter = 0 + } } function positionContraintsPhysics () { From 386bf9e57dcdbf2491229715b0c34fb29191f82d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 11:23:42 +0100 Subject: [PATCH 111/166] typo fixed --- FloatingSpace/UiObject.js | 19 +++++++++---------- Spaces/FloatingSpace.js | 9 +++++++-- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 302d9b4f8..7b0cab182 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -961,8 +961,8 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) if (canvas.floatingSpace.inMapMode === true) { - targetPoint = canvas.floatingSpace.transformPoointToMap(targetPoint) - position = canvas.floatingSpace.transformPoointToMap(position) + targetPoint = canvas.floatingSpace.transformPointToMap(targetPoint) + position = canvas.floatingSpace.transformPointToMap(position) } if (thisObject.container.frame.radius > 1) { @@ -1036,8 +1036,8 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) if (canvas.floatingSpace.inMapMode === true) { - position = canvas.floatingSpace.transformPoointToMap(position) - targetPoint = canvas.floatingSpace.transformPoointToMap(targetPoint) + position = canvas.floatingSpace.transformPointToMap(position) + targetPoint = canvas.floatingSpace.transformPointToMap(targetPoint) } let LINE_STYLE = UI_COLOR.GREY @@ -1083,7 +1083,7 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) if (canvas.floatingSpace.inMapMode === true) { - position = canvas.floatingSpace.transformPoointToMap(position) + position = canvas.floatingSpace.transformPointToMap(position) } let radius = thisObject.container.frame.radius @@ -1127,7 +1127,7 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) if (canvas.floatingSpace.inMapMode === true) { - position = canvas.floatingSpace.transformPoointToMap(position) + position = canvas.floatingSpace.transformPointToMap(position) } let radius = thisObject.container.frame.radius * 3.5 @@ -1171,7 +1171,7 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) if (canvas.floatingSpace.inMapMode === true) { - position = canvas.floatingSpace.transformPoointToMap(position) + position = canvas.floatingSpace.transformPointToMap(position) } let radius = thisObject.container.frame.radius * 1.5 @@ -1278,7 +1278,7 @@ function newUiObject () { position = thisObject.container.frame.frameThisPoint(position) if (canvas.floatingSpace.inMapMode === true) { - position = canvas.floatingSpace.transformPoointToMap(position) + position = canvas.floatingSpace.transformPointToMap(position) } let radius = thisObject.container.frame.radius @@ -1294,7 +1294,7 @@ function newUiObject () { visiblePosition = thisObject.container.frame.frameThisPoint(visiblePosition) if (canvas.floatingSpace.inMapMode === true) { - visiblePosition = canvas.floatingSpace.transformPoointToMap(visiblePosition) + visiblePosition = canvas.floatingSpace.transformPointToMap(visiblePosition) } else { visiblePosition = thisObject.fitFunction(visiblePosition) } @@ -1513,4 +1513,3 @@ function newUiObject () { } } } - diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 3aaaafaf9..998d308ad 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -12,7 +12,7 @@ function newFloatingSpace () { uiObjectConstructor: undefined, container: undefined, inMapMode: false, - transformPoointToMap: transformPoointToMap, + transformPointToMap: transformPointToMap, oneScreenUp: oneScreenUp, oneScreenDown: oneScreenDown, oneScreenLeft: oneScreenLeft, @@ -81,7 +81,7 @@ function newFloatingSpace () { onDragStartedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onDragStarted', onDragStarted) } - function transformPoointToMap (point) { + function transformPointToMap (point) { let returnPoint = { x: point.x - thisObject.container.frame.position.x, y: point.y - thisObject.container.frame.position.y @@ -91,6 +91,11 @@ function newFloatingSpace () { return returnPoint } + function transformRadiusToMap (radius) { + const RADIUS_REDUCTION_FACTOR = 1 + return radius / RADIUS_REDUCTION_FACTOR + } + function onDoubleClick () { doubleClickCounter = 0 From c1b36b5e1ecbd5c20bf0829c5000e9c604c3740c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 11:32:55 +0100 Subject: [PATCH 112/166] image and radius resizing working --- FloatingSpace/UiObject.js | 6 +++++- Spaces/FloatingSpace.js | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 7b0cab182..94437d6f7 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -1295,6 +1295,8 @@ function newUiObject () { if (canvas.floatingSpace.inMapMode === true) { visiblePosition = canvas.floatingSpace.transformPointToMap(visiblePosition) + radius = canvas.floatingSpace.transformRadiusToMap(radius) + VISIBLE_RADIUS = canvas.floatingSpace.transformRadiusToMap(VISIBLE_RADIUS) } else { visiblePosition = thisObject.fitFunction(visiblePosition) } @@ -1488,7 +1490,9 @@ function newUiObject () { let additionalImageSize = 0 if (thisObject.isExecuting === true || isReadyToReferenceAttach === true || isReadyToChainAttach === true) { additionalImageSize = 20 } let totalImageSize = additionalImageSize + thisObject.payload.floatingObject.currentImageSize - + if (canvas.floatingSpace.inMapMode === true) { + totalImageSize = canvas.floatingSpace.transformImagesizeToMap(totalImageSize) + } browserCanvasContext.drawImage( icon, position.x - totalImageSize / 2, position.y - totalImageSize / 2, diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 998d308ad..aaefa22a7 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -13,6 +13,8 @@ function newFloatingSpace () { container: undefined, inMapMode: false, transformPointToMap: transformPointToMap, + transformRadiusToMap: transformRadiusToMap, + transformImagesizeToMap: transformImagesizeToMap, oneScreenUp: oneScreenUp, oneScreenDown: oneScreenDown, oneScreenLeft: oneScreenLeft, @@ -92,10 +94,15 @@ function newFloatingSpace () { } function transformRadiusToMap (radius) { - const RADIUS_REDUCTION_FACTOR = 1 + const RADIUS_REDUCTION_FACTOR = 2 return radius / RADIUS_REDUCTION_FACTOR } + function transformImagesizeToMap (imageSize) { + const IMAGE_REDUCTION_FACTOR = 5 + return imageSize / IMAGE_REDUCTION_FACTOR + } + function onDoubleClick () { doubleClickCounter = 0 From 842f7296f87231061f0c3ac98ba4bfb955e0fed4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 11:50:30 +0100 Subject: [PATCH 113/166] titles solved --- FloatingSpace/UiObject.js | 14 ++++++++++++++ FloatingSpace/UiObjectTitle.js | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 94437d6f7..472b12385 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -1108,6 +1108,16 @@ function newUiObject () { y: position.y + radius * 4 / 5 + fontSize * FONT_ASPECT_RATIO + 15 } + if (canvas.floatingSpace.inMapMode === true) { + labelPoint.y = labelPoint.y - 20 + let nodeDefinition = APP_SCHEMA_MAP.get(thisObject.payload.node.type) + if (nodeDefinition !== undefined) { + if (nodeDefinition.isHierarchyHead !== true) { + return + } + } + } + browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY browserCanvasContext.fillStyle = thisObject.payload.floatingObject.labelStrokeStyle browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) @@ -1321,6 +1331,9 @@ function newUiObject () { if (nodeDefinition !== undefined) { if (nodeDefinition.isHierarchyHead === true) { VISIBLE_RADIUS = thisObject.payload.floatingObject.currentHierarchyRing * 2.8 + if (canvas.floatingSpace.inMapMode === true) { + VISIBLE_RADIUS = canvas.floatingSpace.transformRadiusToMap(VISIBLE_RADIUS) + } let OPACITY = 1 browserCanvasContext.beginPath() @@ -1517,3 +1530,4 @@ function newUiObject () { } } } + diff --git a/FloatingSpace/UiObjectTitle.js b/FloatingSpace/UiObjectTitle.js index 9ac05377c..6fde27c23 100644 --- a/FloatingSpace/UiObjectTitle.js +++ b/FloatingSpace/UiObjectTitle.js @@ -292,6 +292,19 @@ function newUiObjectTitle () { labelPoint = thisObject.container.frame.frameThisPoint(labelPoint) + if (canvas.floatingSpace.inMapMode === true) { + labelPoint = canvas.floatingSpace.transformPointToMap(labelPoint) + labelPoint.x = labelPoint.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO + labelPoint.y = labelPoint.y - 35 + + let nodeDefinition = APP_SCHEMA_MAP.get(thisObject.payload.node.type) + if (nodeDefinition !== undefined) { + if (nodeDefinition.isHierarchyHead !== true) { + return + } + } + } + browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY browserCanvasContext.fillStyle = thisObject.payload.floatingObject.labelStrokeStyle browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) @@ -309,3 +322,4 @@ function newUiObjectTitle () { return title } } + From 38e9e83317e05bbaa861158af430397ac4d473ac Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 12:04:48 +0100 Subject: [PATCH 114/166] map working --- FloatingSpace/UiObject.js | 6 ++++++ Spaces/FloatingSpace.js | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 472b12385..2bda0d9ff 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -1505,6 +1505,12 @@ function newUiObject () { let totalImageSize = additionalImageSize + thisObject.payload.floatingObject.currentImageSize if (canvas.floatingSpace.inMapMode === true) { totalImageSize = canvas.floatingSpace.transformImagesizeToMap(totalImageSize) + let nodeDefinition = APP_SCHEMA_MAP.get(thisObject.payload.node.type) + if (nodeDefinition !== undefined) { + if (nodeDefinition.isHierarchyHead !== true) { + totalImageSize = totalImageSize / 4 + } + } } browserCanvasContext.drawImage( icon, position.x - totalImageSize / 2, diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index aaefa22a7..dacf9cfb1 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -99,7 +99,7 @@ function newFloatingSpace () { } function transformImagesizeToMap (imageSize) { - const IMAGE_REDUCTION_FACTOR = 5 + const IMAGE_REDUCTION_FACTOR = 3 return imageSize / IMAGE_REDUCTION_FACTOR } @@ -126,6 +126,7 @@ function newFloatingSpace () { function isItFar (payload, dontCheckParent) { /* If for any reason the paylaod is undefined we return false */ if (payload === undefined) { return false } + if (thisObject.inMapMode === true) { return false } let radarFactor = 2 // How big is the margin From 2538fad12e03fefc6bc2b2fb8264f628aaa4853e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 14:01:32 +0100 Subject: [PATCH 115/166] teleporting working --- Spaces/FloatingSpace.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index dacf9cfb1..b448c255e 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -105,21 +105,22 @@ function newFloatingSpace () { function onDoubleClick () { doubleClickCounter = 0 - - if (thisObject.inMapMode === false) { - thisObject.inMapMode = true - } else { - thisObject.inMapMode = false - } - console.log(thisObject.inMapMode) + thisObject.inMapMode = true } function onDragStarted (event) { - if (doubleClickCounter > 0) { - onDoubleClick() - return + if (thisObject.inMapMode === false) { + if (doubleClickCounter > 0) { + onDoubleClick() + return + } else { + doubleClickCounter = 10 + } } else { - doubleClickCounter = 10 + thisObject.inMapMode = false + doubleClickCounter = 0 + thisObject.container.frame.position.x = -event.x / browserCanvas.width * SPACE_SIZE + browserCanvas.width / 2 + thisObject.container.frame.position.y = -event.y / browserCanvas.height * SPACE_SIZE + browserCanvas.height / 2 } } From 22c5197c55df578a20f9fea1da4656b3acf27961 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 14:06:43 +0100 Subject: [PATCH 116/166] no container --- FloatingSpace/FloatingObject.js | 1 + 1 file changed, 1 insertion(+) diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index cccc6d18b..dd939259f 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -108,6 +108,7 @@ function newFloatingObject () { function getContainer (point) { if ((thisObject.isCollapsed === true && thisObject.collapsedManually === false) || thisObject.isParentCollapsed === true) { return } + if (canvas.floatingSpace.inMapMode === true) { return } let container container = thisObject.payload.uiObject.getContainer(point) From 38b443e9e91bc5766cc10e6446e64c3a8646478b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 14:13:36 +0100 Subject: [PATCH 117/166] escape --- Canvas.js | 4 ++++ Spaces/FloatingSpace.js | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Canvas.js b/Canvas.js index c4e8eb2b6..fb901f6ab 100644 --- a/Canvas.js +++ b/Canvas.js @@ -252,6 +252,10 @@ function newCanvas () { checkMediaRecording(event) canvas.chartingSpace.onKeyPressed(event) + if (event.key === 'Escape' && canvas.floatingSpace.inMapMode === true) { + canvas.floatingSpace.exitMapMode() + } + let nodeOnFocus = canvas.designSpace.workspace.getNodeThatIsOnFocus() if (nodeOnFocus !== undefined) { if (nodeOnFocus.payload.uiObject.codeEditor !== undefined) { diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index b448c255e..24237e442 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -12,6 +12,7 @@ function newFloatingSpace () { uiObjectConstructor: undefined, container: undefined, inMapMode: false, + exitMapMode: exitMapMode, transformPointToMap: transformPointToMap, transformRadiusToMap: transformRadiusToMap, transformImagesizeToMap: transformImagesizeToMap, @@ -108,6 +109,11 @@ function newFloatingSpace () { thisObject.inMapMode = true } + function exitMapMode () { + thisObject.inMapMode = false + doubleClickCounter = 0 + } + function onDragStarted (event) { if (thisObject.inMapMode === false) { if (doubleClickCounter > 0) { @@ -117,10 +123,9 @@ function newFloatingSpace () { doubleClickCounter = 10 } } else { - thisObject.inMapMode = false - doubleClickCounter = 0 thisObject.container.frame.position.x = -event.x / browserCanvas.width * SPACE_SIZE + browserCanvas.width / 2 thisObject.container.frame.position.y = -event.y / browserCanvas.height * SPACE_SIZE + browserCanvas.height / 2 + exitMapMode() } } From 1a4d84b0880c5cef3a97851f73ebf15255ae1580 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 14:31:48 +0100 Subject: [PATCH 118/166] m --- Canvas.js | 4 ++++ Spaces/FloatingSpace.js | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Canvas.js b/Canvas.js index fb901f6ab..4bc5bb3dc 100644 --- a/Canvas.js +++ b/Canvas.js @@ -256,6 +256,10 @@ function newCanvas () { canvas.floatingSpace.exitMapMode() } + if (event.key === 'M' || event.key === 'm') { + canvas.floatingSpace.toggleMapMode() + } + let nodeOnFocus = canvas.designSpace.workspace.getNodeThatIsOnFocus() if (nodeOnFocus !== undefined) { if (nodeOnFocus.payload.uiObject.codeEditor !== undefined) { diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 24237e442..68c801a98 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -12,6 +12,7 @@ function newFloatingSpace () { uiObjectConstructor: undefined, container: undefined, inMapMode: false, + toggleMapMode: toggleMapMode, exitMapMode: exitMapMode, transformPointToMap: transformPointToMap, transformRadiusToMap: transformRadiusToMap, @@ -114,13 +115,21 @@ function newFloatingSpace () { doubleClickCounter = 0 } + function toggleMapMode () { + if (thisObject.inMapMode === false) { + thisObject.inMapMode = true + } else { + exitMapMode() + } + } + function onDragStarted (event) { if (thisObject.inMapMode === false) { if (doubleClickCounter > 0) { onDoubleClick() return } else { - doubleClickCounter = 10 + doubleClickCounter = 8 } } else { thisObject.container.frame.position.x = -event.x / browserCanvas.width * SPACE_SIZE + browserCanvas.width / 2 From c1e701d42e7028b07fc5527fd187883169fa1d2f Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 14:37:53 +0100 Subject: [PATCH 119/166] wheel cleanned --- FloatingSpace/FloatingLayer.js | 19 ------------------- Spaces/FloatingSpace.js | 8 -------- 2 files changed, 27 deletions(-) diff --git a/FloatingSpace/FloatingLayer.js b/FloatingSpace/FloatingLayer.js index 066533c25..8be7ec11f 100644 --- a/FloatingSpace/FloatingLayer.js +++ b/FloatingSpace/FloatingLayer.js @@ -24,7 +24,6 @@ function newFloatingLayer () { removeFloatingObject: removeFloatingObject, getFloatingObject: getFloatingObject, physics: physics, - changeTargetRepulsion: changeTargetRepulsion, draw: draw, getContainer: getContainer, initialize: initialize, @@ -619,24 +618,6 @@ function newFloatingLayer () { } } - function changeTargetRepulsion (pDelta) { - try { - if (pDelta > 0) { - pDelta = 1 - } else { - pDelta = -1 - } - - maxTargetRepulsionForce = maxTargetRepulsionForce + pDelta / 1000 - - if (maxTargetRepulsionForce < 0.0000000001) { - maxTargetRepulsionForce = 0.0000000001 - } - } catch (err) { - if (ERROR_LOG === true) { logger.write('[ERROR] changeTargetRepulsion -> err= ' + err.stack) } - } - } - function colliding (floatingObject1, floatingObject2) { try { /* This function detects weather 2 floatingObjects collide with each other. */ diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 68c801a98..8153e8383 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -54,7 +54,6 @@ function newFloatingSpace () { let visible = false const PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT = 25 - let eventSubscriptionId let onDragStartedEventSubscriptionId let doubleClickCounter = 0 @@ -62,7 +61,6 @@ function newFloatingSpace () { return thisObject function finalize () { - thisObject.container.eventHandler.stopListening(eventSubscriptionId) thisObject.container.eventHandler.stopListening(onDragStartedEventSubscriptionId) thisObject.floatingLayer.finalize() @@ -81,7 +79,6 @@ function newFloatingSpace () { thisObject.uiObjectConstructor = newUiObjectConstructor() thisObject.uiObjectConstructor.initialize(thisObject.floatingLayer) - eventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseWheel', onMouseWheel) onDragStartedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onDragStarted', onDragStarted) } @@ -292,11 +289,6 @@ function newFloatingSpace () { return true } - function onMouseWheel (event) { - if (visible === false) { return } - thisObject.floatingLayer.changeTargetRepulsion(event.wheelDelta) - } - function makeVisible () { visible = true } From a80f1d945497cdc2ae2eef29f09708b92ac89959 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 14:50:04 +0100 Subject: [PATCH 120/166] no double click, but right click --- Spaces/FloatingSpace.js | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 8153e8383..706da7ffb 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -13,6 +13,7 @@ function newFloatingSpace () { container: undefined, inMapMode: false, toggleMapMode: toggleMapMode, + enterMapMode: enterMapMode, exitMapMode: exitMapMode, transformPointToMap: transformPointToMap, transformRadiusToMap: transformRadiusToMap, @@ -56,8 +57,6 @@ function newFloatingSpace () { const PERCENTAGE_OF_SCREEN_FOR_DISPLACEMENT = 25 let onDragStartedEventSubscriptionId - let doubleClickCounter = 0 - return thisObject function finalize () { @@ -102,19 +101,17 @@ function newFloatingSpace () { return imageSize / IMAGE_REDUCTION_FACTOR } - function onDoubleClick () { - doubleClickCounter = 0 + function enterMapMode () { thisObject.inMapMode = true } function exitMapMode () { thisObject.inMapMode = false - doubleClickCounter = 0 } function toggleMapMode () { if (thisObject.inMapMode === false) { - thisObject.inMapMode = true + enterMapMode() } else { exitMapMode() } @@ -122,13 +119,11 @@ function newFloatingSpace () { function onDragStarted (event) { if (thisObject.inMapMode === false) { - if (doubleClickCounter > 0) { - onDoubleClick() - return - } else { - doubleClickCounter = 8 - } + if (event.buttons !== 2) { return } + + enterMapMode() } else { + if (event.buttons !== 1) { return } thisObject.container.frame.position.x = -event.x / browserCanvas.width * SPACE_SIZE + browserCanvas.width / 2 thisObject.container.frame.position.y = -event.y / browserCanvas.height * SPACE_SIZE + browserCanvas.height / 2 exitMapMode() @@ -318,14 +313,6 @@ function newFloatingSpace () { browserZoomPhysics() positionContraintsPhysics() thisObject.floatingLayer.physics() - doubleClickPhysics() - } - - function doubleClickPhysics () { - doubleClickCounter-- - if (doubleClickCounter < 0) { - doubleClickCounter = 0 - } } function positionContraintsPhysics () { From 1228cd444dd8e4a82b5f8db747381055c21daa04 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 15:26:37 +0100 Subject: [PATCH 121/166] snapping working --- DesignSpace/Workspace/Workspace.js | 15 +++++++++++++ Spaces/FloatingSpace.js | 35 ++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/DesignSpace/Workspace/Workspace.js b/DesignSpace/Workspace/Workspace.js index 41d4fd779..48e48b21c 100644 --- a/DesignSpace/Workspace/Workspace.js +++ b/DesignSpace/Workspace/Workspace.js @@ -11,6 +11,7 @@ function newWorkspace () { container: undefined, enabled: false, nodeChildren: undefined, + getHierarchyHeads: getHierarchyHeads, getNodeThatIsOnFocus: getNodeThatIsOnFocus, getNodeByShortcutKey: getNodeByShortcutKey, stopAllRunningTasks: stopAllRunningTasks, @@ -217,6 +218,20 @@ function newWorkspace () { } } + function getHierarchyHeads () { + let nodes = [] + for (let i = 0; i < thisObject.workspaceNode.rootNodes.length; i++) { + let rootNode = thisObject.workspaceNode.rootNodes[i] + let nodeDefinition = APP_SCHEMA_MAP.get(rootNode.type) + if (nodeDefinition !== undefined) { + if (nodeDefinition.isHierarchyHead === true) { + nodes.push(rootNode) + } + } + } + return nodes + } + function spawn (nodeText, mousePointer) { try { let point = { diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 706da7ffb..2f6acb310 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -124,8 +124,38 @@ function newFloatingSpace () { enterMapMode() } else { if (event.buttons !== 1) { return } - thisObject.container.frame.position.x = -event.x / browserCanvas.width * SPACE_SIZE + browserCanvas.width / 2 - thisObject.container.frame.position.y = -event.y / browserCanvas.height * SPACE_SIZE + browserCanvas.height / 2 + + let mousePosition = { + x: event.x, + y: event.y + } + + let mouseAtSpace = { + x: mousePosition.x / browserCanvas.width * SPACE_SIZE, + y: mousePosition.y / browserCanvas.height * SPACE_SIZE + } + /* Let's see if we can snap to some of the root nodes that are isHierarchyHead */ + let snapCandidateNodes = canvas.designSpace.workspace.getHierarchyHeads() + for (let i = 0; i < snapCandidateNodes.length; i++) { + let node = snapCandidateNodes[i] + let nodePosition = { + x: node.payload.floatingObject.container.frame.position.x, + y: node.payload.floatingObject.container.frame.position.y + } + // nodePosition = node.payload.floatingObject.container.frame.frameThisPoint(nodePosition) + + let distance = Math.sqrt(Math.pow(mouseAtSpace.x - nodePosition.x, 2) + Math.pow(mouseAtSpace.y - nodePosition.y, 2)) + const SNAP_THREASHOLD = 1000 + if (distance < SNAP_THREASHOLD) { + mousePosition.x = nodePosition.x / SPACE_SIZE * browserCanvas.width + mousePosition.y = nodePosition.y / SPACE_SIZE * browserCanvas.height + } + } + + /* Movign the Floating Space to where the mouse is. */ + thisObject.container.frame.position.x = -mousePosition.x / browserCanvas.width * SPACE_SIZE + browserCanvas.width / 2 + thisObject.container.frame.position.y = -mousePosition.y / browserCanvas.height * SPACE_SIZE + browserCanvas.height / 2 + exitMapMode() } } @@ -355,3 +385,4 @@ function newFloatingSpace () { browserCanvasContext.fill() } } + From 8284c8fa50137f375731965d611f8e0b72711ade Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 18:19:07 +0100 Subject: [PATCH 122/166] better arrangement for many markets --- .../Workspace/FunctionLibraries/CCXTFunctions.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js index 8917f4617..ced087469 100644 --- a/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/CCXTFunctions.js @@ -183,9 +183,11 @@ function newCCXTFunctions () { newMarket.name = name newMarket.code = '{ \n\"codeName\": \"' + name + '\"\n}' newMarket.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_180 + newMarket.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X newMarket.baseAsset.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_45 newMarket.quotedAsset.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_45 - newMarket.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X + newMarket.baseAsset.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_100X + newMarket.quotedAsset.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_150X newMarket.baseAsset.payload.referenceParent = baseAsset newMarket.quotedAsset.payload.referenceParent = quotedAsset @@ -196,6 +198,14 @@ function newCCXTFunctions () { let clone = functionLibraryNodeCloning.getNodeClone(superAction) functionLibraryUiObjectsFromNodes.createUiObjectFromNode(clone, newMarket, newMarket) newMarket.superActions.push(clone) + switch (j) { + case 0: + clone.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_025X + break + case 1: + clone.payload.floatingObject.distanceToParent = DISTANCE_TO_PARENT.PARENT_050X + break + } } } } From 0da45d9593c836003500d229a7f96951c990d185 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 18:30:21 +0100 Subject: [PATCH 123/166] toggle draw reference lines --- Canvas.js | 6 ++++++ FloatingSpace/UiObject.js | 1 + Spaces/FloatingSpace.js | 10 ++++++++++ 3 files changed, 17 insertions(+) diff --git a/Canvas.js b/Canvas.js index 4bc5bb3dc..6447bb4ac 100644 --- a/Canvas.js +++ b/Canvas.js @@ -258,6 +258,12 @@ function newCanvas () { if (event.key === 'M' || event.key === 'm') { canvas.floatingSpace.toggleMapMode() + return + } + + if (event.key === 'R' || event.key === 'r') { + canvas.floatingSpace.toggleDrawReferenceLines() + return } let nodeOnFocus = canvas.designSpace.workspace.getNodeThatIsOnFocus() diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 2bda0d9ff..41c03c6dd 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -1017,6 +1017,7 @@ function newUiObject () { } function drawReferenceLine () { + if (canvas.floatingSpace.drawReferenceLines === false) { return } if (thisObject.payload.referenceParent === undefined) { return } if (thisObject.payload.referenceParent.payload === undefined) { return } if (thisObject.payload.referenceParent.payload.floatingObject === undefined) { return } diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 2f6acb310..353491361 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -12,6 +12,8 @@ function newFloatingSpace () { uiObjectConstructor: undefined, container: undefined, inMapMode: false, + drawReferenceLines: true, + toggleDrawReferenceLines: toggleDrawReferenceLines, toggleMapMode: toggleMapMode, enterMapMode: enterMapMode, exitMapMode: exitMapMode, @@ -81,6 +83,14 @@ function newFloatingSpace () { onDragStartedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onDragStarted', onDragStarted) } + function toggleDrawReferenceLines () { + if (thisObject.drawReferenceLines === true) { + thisObject.drawReferenceLines = false + } else { + thisObject.drawReferenceLines = true + } + } + function transformPointToMap (point) { let returnPoint = { x: point.x - thisObject.container.frame.position.x, From ab52593899f6cbe6805cddb9d8e57d0ba0e27946 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 18:51:24 +0100 Subject: [PATCH 124/166] new toggles --- Canvas.js | 15 ++++++++++----- FloatingSpace/UiObject.js | 1 + Spaces/FloatingSpace.js | 11 ++++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Canvas.js b/Canvas.js index 6447bb4ac..f86a717cf 100644 --- a/Canvas.js +++ b/Canvas.js @@ -246,6 +246,9 @@ function newCanvas () { } function onKeyDown (event) { + /* From here we prevent the default behaviour */ + event.preventDefault() + thisObject.mouse.event = event thisObject.mouse.action = 'key down' @@ -256,16 +259,21 @@ function newCanvas () { canvas.floatingSpace.exitMapMode() } - if (event.key === 'M' || event.key === 'm') { + if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'M' || event.key === 'm')) { canvas.floatingSpace.toggleMapMode() return } - if (event.key === 'R' || event.key === 'r') { + if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'R' || event.key === 'r')) { canvas.floatingSpace.toggleDrawReferenceLines() return } + if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'C' || event.key === 'c')) { + canvas.floatingSpace.toggleDrawChainLines() + return + } + let nodeOnFocus = canvas.designSpace.workspace.getNodeThatIsOnFocus() if (nodeOnFocus !== undefined) { if (nodeOnFocus.payload.uiObject.codeEditor !== undefined) { @@ -392,9 +400,6 @@ function newCanvas () { if ((event.ctrlKey === true || event.metaKey === true) && event.altKey === true) { if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 65 && event.keyCode <= 90)) { - /* From here we prevent the default behaviour */ - event.preventDefault() - let nodeUsingThisKey = canvas.designSpace.workspace.getNodeByShortcutKey(event.key) if (nodeOnFocus === undefined && nodeUsingThisKey !== undefined) { diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 41c03c6dd..0b203c3ad 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -945,6 +945,7 @@ function newUiObject () { } function drawChainLine () { + if (canvas.floatingSpace.drawChainLines === false) { return } if (thisObject.payload.chainParent === undefined) { return } let targetPoint = { diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 353491361..bde841e0e 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -13,6 +13,8 @@ function newFloatingSpace () { container: undefined, inMapMode: false, drawReferenceLines: true, + drawChainLines: true, + toggleDrawChainLines: toggleDrawChainLines, toggleDrawReferenceLines: toggleDrawReferenceLines, toggleMapMode: toggleMapMode, enterMapMode: enterMapMode, @@ -91,6 +93,14 @@ function newFloatingSpace () { } } + function toggleDrawChainLines () { + if (thisObject.drawChainLines === true) { + thisObject.drawChainLines = false + } else { + thisObject.drawChainLines = true + } + } + function transformPointToMap (point) { let returnPoint = { x: point.x - thisObject.container.frame.position.x, @@ -395,4 +405,3 @@ function newFloatingSpace () { browserCanvasContext.fill() } } - From e23e426b159485a436adb4a1e9a27f79014c16ed Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 15 Mar 2020 19:20:56 +0100 Subject: [PATCH 125/166] bug fixed --- Canvas.js | 9 ++++++--- Spaces/FloatingSpace.js | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Canvas.js b/Canvas.js index f86a717cf..975aa841b 100644 --- a/Canvas.js +++ b/Canvas.js @@ -246,9 +246,6 @@ function newCanvas () { } function onKeyDown (event) { - /* From here we prevent the default behaviour */ - event.preventDefault() - thisObject.mouse.event = event thisObject.mouse.action = 'key down' @@ -261,16 +258,19 @@ function newCanvas () { if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'M' || event.key === 'm')) { canvas.floatingSpace.toggleMapMode() + event.preventDefault() return } if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'R' || event.key === 'r')) { canvas.floatingSpace.toggleDrawReferenceLines() + event.preventDefault() return } if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'C' || event.key === 'c')) { canvas.floatingSpace.toggleDrawChainLines() + event.preventDefault() return } @@ -400,6 +400,9 @@ function newCanvas () { if ((event.ctrlKey === true || event.metaKey === true) && event.altKey === true) { if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 65 && event.keyCode <= 90)) { + /* From here we prevent the default behaviour. Putting it earlier prevents imput box and text area to receive keystrokes */ + event.preventDefault() + let nodeUsingThisKey = canvas.designSpace.workspace.getNodeByShortcutKey(event.key) if (nodeOnFocus === undefined && nodeUsingThisKey !== undefined) { diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index bde841e0e..706b571ba 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -12,7 +12,7 @@ function newFloatingSpace () { uiObjectConstructor: undefined, container: undefined, inMapMode: false, - drawReferenceLines: true, + drawReferenceLines: false, drawChainLines: true, toggleDrawChainLines: toggleDrawChainLines, toggleDrawReferenceLines: toggleDrawReferenceLines, From 6076c7d4b252326709578f10d670cb25dadca100 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 08:11:48 +0100 Subject: [PATCH 126/166] Refactoring --- Panels/LayersPanel.js | 26 +++++++++---------- Panels/PlotterPanel.js | 20 +++++++------- Panels/{PanelTabButton.js => UpDownButton.js} | 4 +-- Spaces/PanelsSpace.js | 4 +-- 4 files changed, 27 insertions(+), 27 deletions(-) rename Panels/{PanelTabButton.js => UpDownButton.js} (99%) diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index 3498f8765..6d37195da 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -6,7 +6,7 @@ function newLayersPanel () { layers: [], payload: undefined, isVisible: true, - panelTabButton: undefined, + upDownButton: undefined, physics: physics, draw: draw, getContainer: getContainer, @@ -43,8 +43,8 @@ function newLayersPanel () { function finalize () { thisObject.container.eventHandler.stopListening(onMouseWheelEventSuscriptionId) - thisObject.panelTabButton.finalize() - thisObject.panelTabButton = undefined + thisObject.upDownButton.finalize() + thisObject.upDownButton = undefined layersMap = undefined visibleLayers = undefined @@ -69,11 +69,11 @@ function newLayersPanel () { thisObject.container.frame.position = position loadFrame(thisObject.payload, thisObject.container.frame) - thisObject.panelTabButton = newPanelTabButton() - thisObject.panelTabButton.parentContainer = thisObject.container - thisObject.panelTabButton.container.frame.parentFrame = thisObject.container.frame - thisObject.panelTabButton.fitFunction = thisObject.fitFunction - thisObject.panelTabButton.initialize() + thisObject.upDownButton = newUpDownButton() + thisObject.upDownButton.parentContainer = thisObject.container + thisObject.upDownButton.container.frame.parentFrame = thisObject.container.frame + thisObject.upDownButton.fitFunction = thisObject.fitFunction + thisObject.upDownButton.initialize() onMouseWheelEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseWheel', onMouseWheel) @@ -87,7 +87,7 @@ function newLayersPanel () { } function saveObjectStatePanelLocation () { - savePropertyAtNodeConfig(thisObject.payload, 'panelLocation', thisObject.panelTabButton.status) + savePropertyAtNodeConfig(thisObject.payload, 'panelLocation', thisObject.upDownButton.status) } function readObjectState () { @@ -123,7 +123,7 @@ function newLayersPanel () { saveObjectStatePanelLocation() // this overrides any invalid value at the config. return } - thisObject.panelTabButton.setStatus(storedValue) + thisObject.upDownButton.setStatus(storedValue) saveObjectStatePanelLocation() } } @@ -247,7 +247,7 @@ function newLayersPanel () { if (isInitialized === false || thisObject.visible === false || thisObject.isHidden === true) { return } let container - container = thisObject.panelTabButton.getContainer(point) + container = thisObject.upDownButton.getContainer(point) if (container !== undefined) { return container } /* First we check if thisObject point is inside thisObject space. */ @@ -301,7 +301,7 @@ function newLayersPanel () { if (isInitialized === false) { return } if (thisObject.payload.node === undefined) { return } - thisObject.panelTabButton.physics() + thisObject.upDownButton.physics() saveFrame(thisObject.payload, thisObject.container.frame) syncWithConfigPhysics() @@ -387,7 +387,7 @@ function newLayersPanel () { visibleLayers[i].draw() } drawScrollBar() - thisObject.panelTabButton.draw() + thisObject.upDownButton.draw() } function drawHeader () { diff --git a/Panels/PlotterPanel.js b/Panels/PlotterPanel.js index 24ef4f91f..783657718 100644 --- a/Panels/PlotterPanel.js +++ b/Panels/PlotterPanel.js @@ -22,7 +22,7 @@ function newPlotterPanel () { let heightFactor = 1 let currentRecord - let panelTabButton + let upDownButton let panelNode return thisObject @@ -35,8 +35,8 @@ function newPlotterPanel () { heightFactor = undefined currentRecord = undefined - panelTabButton.finalize() - panelTabButton = undefined + upDownButton.finalize() + upDownButton = undefined panelNode = undefined } @@ -50,18 +50,18 @@ function newPlotterPanel () { thisObject.container.frame.position.x = canvas.chartingSpace.viewport.visibleArea.topRight.x - thisObject.container.frame.width - thisObject.container.frame.width * Math.random() * 8 thisObject.container.frame.position.y = canvas.chartingSpace.viewport.visibleArea.bottomLeft.y - thisObject.container.frame.height - thisObject.container.frame.height * Math.random() * 1.5 - panelTabButton = newPanelTabButton() - panelTabButton.parentContainer = thisObject.container - panelTabButton.container.frame.parentFrame = thisObject.container.frame - panelTabButton.fitFunction = thisObject.fitFunction - panelTabButton.initialize() + upDownButton = newUpDownButton() + upDownButton.parentContainer = thisObject.container + upDownButton.container.frame.parentFrame = thisObject.container.frame + upDownButton.fitFunction = thisObject.fitFunction + upDownButton.initialize() } function getContainer (point) { if (thisObject.isVisible !== true) { return } let container - container = panelTabButton.getContainer(point) + container = upDownButton.getContainer(point) if (container !== undefined) { return container } if (thisObject.container.frame.isThisPointHere(point, true) === true) { @@ -87,7 +87,7 @@ function newPlotterPanel () { thisObject.container.frame.draw(false, false, true, thisObject.fitFunction) plotCurrentRecordData() - panelTabButton.draw() + upDownButton.draw() } function plotCurrentRecordData () { diff --git a/Panels/PanelTabButton.js b/Panels/UpDownButton.js similarity index 99% rename from Panels/PanelTabButton.js rename to Panels/UpDownButton.js index 38de1b23c..e68e9fdf1 100644 --- a/Panels/PanelTabButton.js +++ b/Panels/UpDownButton.js @@ -1,4 +1,4 @@ -function newPanelTabButton () { +function newUpDownButton () { let thisObject = { container: undefined, fitFunction: undefined, @@ -48,7 +48,7 @@ function newPanelTabButton () { thisObject.container.frame.width = 10 thisObject.container.frame.height = 10 - var position = { + let position = { x: thisObject.parentContainer.frame.width - 14, y: 1 } diff --git a/Spaces/PanelsSpace.js b/Spaces/PanelsSpace.js index 831f8fa50..45f154f31 100644 --- a/Spaces/PanelsSpace.js +++ b/Spaces/PanelsSpace.js @@ -165,8 +165,8 @@ function newPanelsSpace () { let verticalLine = (canvas.chartingSpace.viewport.visibleArea.topRight.x - canvas.chartingSpace.viewport.visibleArea.topLeft.x) / 2 + canvas.chartingSpace.viewport.visibleArea.topLeft.x let horizontalLine = (canvas.chartingSpace.viewport.visibleArea.bottomRight.y - canvas.chartingSpace.viewport.visibleArea.topRight.y) / 2 + canvas.chartingSpace.viewport.visibleArea.topRight.y - if (panel.panelTabButton !== undefined) { - if (panel.panelTabButton.status === 'up') { + if (panel.upDownButton !== undefined) { + if (panel.upDownButton.status === 'up') { if (centerPoint.x < verticalLine) { panel.gravitatesTowards = 'topLeft' } else { From cf4946276052d43e47d17c9889e1761de7554a3a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 09:25:56 +0100 Subject: [PATCH 127/166] only with mouse over --- Panels/LayersPanel.js | 57 ++++++++- Panels/LeftRightButton.js | 245 ++++++++++++++++++++++++++++++++++++++ Panels/UpDownButton.js | 13 +- 3 files changed, 302 insertions(+), 13 deletions(-) create mode 100644 Panels/LeftRightButton.js diff --git a/Panels/LayersPanel.js b/Panels/LayersPanel.js index 6d37195da..b5bed93e9 100644 --- a/Panels/LayersPanel.js +++ b/Panels/LayersPanel.js @@ -7,6 +7,7 @@ function newLayersPanel () { payload: undefined, isVisible: true, upDownButton: undefined, + leftRightButton: undefined, physics: physics, draw: draw, getContainer: getContainer, @@ -38,13 +39,23 @@ function newLayersPanel () { let posiblePanelHeight = (layerHeight + LAYER_SEPARATION) * posibleVisibleLayers + headerHeight + footerHeight let onMouseWheelEventSuscriptionId + let onMouseOverEventSubscriptionId + let onMouseNotOverEventSubscriptionId + + let isMouseOver return thisObject function finalize () { thisObject.container.eventHandler.stopListening(onMouseWheelEventSuscriptionId) + thisObject.container.eventHandler.stopListening(onMouseOverEventSubscriptionId) + thisObject.container.eventHandler.stopListening(onMouseNotOverEventSubscriptionId) thisObject.upDownButton.finalize() thisObject.upDownButton = undefined + + thisObject.leftRightButton.finalize() + thisObject.leftRightButton = undefined + layersMap = undefined visibleLayers = undefined @@ -75,19 +86,39 @@ function newLayersPanel () { thisObject.upDownButton.fitFunction = thisObject.fitFunction thisObject.upDownButton.initialize() + thisObject.leftRightButton = newLeftRightButton() + thisObject.leftRightButton.parentContainer = thisObject.container + thisObject.leftRightButton.container.frame.parentFrame = thisObject.container.frame + thisObject.leftRightButton.fitFunction = thisObject.fitFunction + thisObject.leftRightButton.initialize() + onMouseWheelEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseWheel', onMouseWheel) + onMouseOverEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseOver', onMouseOver) + onMouseNotOverEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseNotOver', onMouseNotOver) readObjectState() isInitialized = true } + function onMouseOver (event) { + isMouseOver = true + } + + function onMouseNotOver () { + isMouseOver = false + } + function saveObjectStateVisibleLayers () { savePropertyAtNodeConfig(thisObject.payload, 'visibleLayers', desiredVisibleLayers) } function saveObjectStatePanelLocation () { - savePropertyAtNodeConfig(thisObject.payload, 'panelLocation', thisObject.upDownButton.status) + let panelLocation = { + upOrDown: thisObject.upDownButton.status, + leftOrRight: thisObject.leftRightButton.status + } + savePropertyAtNodeConfig(thisObject.payload, 'panelLocation', panelLocation) } function readObjectState () { @@ -119,11 +150,16 @@ function newLayersPanel () { saveObjectStatePanelLocation() // this overrides any invalid value at the config. return } else { - if (storedValue !== 'up' && storedValue !== 'down') { + if (storedValue.upOrDown !== 'up' && storedValue.upOrDown !== 'down') { saveObjectStatePanelLocation() // this overrides any invalid value at the config. return } - thisObject.upDownButton.setStatus(storedValue) + if (storedValue.leftOrRight !== 'left' && storedValue.leftOrRight !== 'right') { + saveObjectStatePanelLocation() // this overrides any invalid value at the config. + return + } + thisObject.upDownButton.setStatus(storedValue.upOrDown) + thisObject.leftRightButton.setStatus(storedValue.leftOrRight) saveObjectStatePanelLocation() } } @@ -247,8 +283,13 @@ function newLayersPanel () { if (isInitialized === false || thisObject.visible === false || thisObject.isHidden === true) { return } let container - container = thisObject.upDownButton.getContainer(point) - if (container !== undefined) { return container } + if (isMouseOver === true && purpose !== GET_CONTAINER_PURPOSE.MOUSE_OVER) { + container = thisObject.upDownButton.getContainer(point) + if (container !== undefined) { return container } + + container = thisObject.leftRightButton.getContainer(point) + if (container !== undefined) { return container } + } /* First we check if thisObject point is inside thisObject space. */ if (thisObject.container.frame.isThisPointHere(point, true) === true) { @@ -302,6 +343,7 @@ function newLayersPanel () { if (thisObject.payload.node === undefined) { return } thisObject.upDownButton.physics() + thisObject.leftRightButton.physics() saveFrame(thisObject.payload, thisObject.container.frame) syncWithConfigPhysics() @@ -387,7 +429,10 @@ function newLayersPanel () { visibleLayers[i].draw() } drawScrollBar() - thisObject.upDownButton.draw() + if (isMouseOver === true) { + thisObject.upDownButton.draw() + thisObject.leftRightButton.draw() + } } function drawHeader () { diff --git a/Panels/LeftRightButton.js b/Panels/LeftRightButton.js new file mode 100644 index 000000000..1ff62802b --- /dev/null +++ b/Panels/LeftRightButton.js @@ -0,0 +1,245 @@ +function newLeftRightButton () { + let thisObject = { + container: undefined, + fitFunction: undefined, + parentContainer: undefined, + status: undefined, + setStatus: setStatus, + physics: physics, + draw: draw, + getContainer: getContainer, // returns the inner most container that holds the point received by parameter. + initialize: initialize, + finalize: finalize + } + + let isInitialized = false + /* Cointainer stuff */ + + thisObject.container = newContainer() + thisObject.container.name = 'Left Right Button' + thisObject.container.initialize() + thisObject.container.isClickeable = true + thisObject.container.isDraggeable = false + thisObject.container.frame.containerName = 'Left Right Button' + + thisObject.status = 'left' + let leftPosition = {} + let rightPosition = {} + let transitionPosition = {} + + let onMouseClickEventSuscriptionId + return thisObject + + function finalize () { + thisObject.container.eventHandler.stopListening(onMouseClickEventSuscriptionId) + thisObject.container.finalize() + thisObject.container = undefined + thisObject.fitFunction = undefined + thisObject.parentContainer = undefined + + thisObject.status = undefined + leftPosition = undefined + rightPosition = undefined + transitionPosition = undefined + } + + function initialize () { + thisObject.container.frame.width = 12 + thisObject.container.frame.height = 12 + + let position = { + x: thisObject.container.frame.parentFrame.width * 2.25 / 8 - thisObject.container.frame.width / 2, + y: 40 * 4 / 8 - thisObject.container.frame.height / 2 + } + + thisObject.container.frame.position = position + + leftPosition.x = thisObject.parentContainer.frame.position.x + leftPosition.y = thisObject.parentContainer.frame.position.y + + rightPosition.x = thisObject.parentContainer.frame.position.x + rightPosition.y = canvas.chartingSpace.viewport.visibleArea.bottomRight.y + + transitionPosition.x = leftPosition.x + transitionPosition.y = leftPosition.y + + /* Lets listen to our own events to react when we have a Mouse Click */ + onMouseClickEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseClick', onMouseClick) + + isInitialized = true + } + + function setStatus (value) { + if (value === 'left' && thisObject.status === 'right') { + thisObject.status = 'going left' + } + if (value === 'right' && thisObject.status === 'left') { + thisObject.status = 'going right' + } + } + + function onMouseClick (event) { + if (thisObject.status === 'left') { + transitionPosition.x = leftPosition.x + transitionPosition.y = leftPosition.y + + thisObject.status = 'going right' + } else { + transitionPosition.x = rightPosition.x + transitionPosition.y = rightPosition.y + + thisObject.status = 'going left' + } + } + + function physics () { + return + if (isInitialized === false) { return } + + leftPosition.x = thisObject.parentContainer.frame.position.x + leftPosition.y = canvas.chartingSpace.viewport.visibleArea.topRight.y + + rightPosition.x = thisObject.parentContainer.frame.position.x + rightPosition.y = canvas.chartingSpace.viewport.visibleArea.bottomRight.y + + if (thisObject.status === 'going right') { + if (transitionPosition.x < rightPosition.x) { + transitionPosition.x = transitionPosition.x + 50 + thisObject.parentContainer.frame.position.x = transitionPosition.x + } else { + thisObject.parentContainer.frame.position.x = rightPosition.x + thisObject.status = 'right' + } + } + if (thisObject.status === 'going left') { + if (transitionPosition.x > leftPosition.x) { + transitionPosition.x = transitionPosition.x - 50 + thisObject.parentContainer.frame.position.x = transitionPosition.x + } else { + thisObject.parentContainer.frame.position.x = leftPosition.x + thisObject.status = 'left' + } + } + } + + function draw () { + if (isInitialized === false) { return } + + drawButton() + } + + function getContainer (point, purpose) { + let container + if (thisObject.container.frame.isThisPointHere(point, true) === true) { + return thisObject.container + } + } + + function drawButton () { + let point1 + let point2 + let point3 + + switch (thisObject.status) { + case 'left': { + point1 = { + x: 3, + y: 3 + } + + point2 = { + x: 3, + y: thisObject.container.frame.height - 3 + } + + point3 = { + x: thisObject.container.frame.width - 3, + y: thisObject.container.frame.height / 2 + } + break + } + + case 'going right': { + point1 = { + x: 4, + y: 4 + } + + point2 = { + x: 4, + y: thisObject.container.frame.height - 4 + } + + point3 = { + x: thisObject.container.frame.width - 4, + y: thisObject.container.frame.height / 2 + } + break + } + + case 'going left': { + point1 = { + x: thisObject.container.frame.width - 4, + y: 4 + } + + point2 = { + x: thisObject.container.frame.width - 4, + y: thisObject.container.frame.height - 4 + } + + point3 = { + x: 4, + y: thisObject.container.frame.height / 2 + } + break + } + + case 'right': { + point1 = { + x: thisObject.container.frame.width - 3, + y: 3 + } + + point2 = { + x: thisObject.container.frame.width - 3, + y: thisObject.container.frame.height - 3 + } + + point3 = { + x: 3, + y: thisObject.container.frame.height / 2 + } + break + } + } + + /* Now the transformations. */ + + point1 = thisObject.container.frame.frameThisPoint(point1) + point2 = thisObject.container.frame.frameThisPoint(point2) + point3 = thisObject.container.frame.frameThisPoint(point3) + + if (thisObject.fitFunction !== undefined) { + point1 = thisObject.fitFunction(point1) + point2 = thisObject.fitFunction(point2) + point3 = thisObject.fitFunction(point3) + } + + /* Lets start the drawing. */ + + browserCanvasContext.beginPath() + browserCanvasContext.moveTo(point1.x, point1.y) + browserCanvasContext.lineTo(point2.x, point2.y) + browserCanvasContext.lineTo(point3.x, point3.y) + browserCanvasContext.lineTo(point1.x, point1.y) + browserCanvasContext.closePath() + + browserCanvasContext.strokeStyle = 'rgba(250, 250, 250, 1)' + browserCanvasContext.lineWidth = 1 + browserCanvasContext.stroke() + + browserCanvasContext.fillStyle = 'rgba(250, 250, 250, 1)' + browserCanvasContext.fill() + } +} diff --git a/Panels/UpDownButton.js b/Panels/UpDownButton.js index e68e9fdf1..bb542d183 100644 --- a/Panels/UpDownButton.js +++ b/Panels/UpDownButton.js @@ -16,13 +16,12 @@ function newUpDownButton () { /* Cointainer stuff */ thisObject.container = newContainer() - thisObject.container.name = 'Panel Tab Button' + thisObject.container.name = 'Up Down Button' thisObject.container.initialize() thisObject.container.isClickeable = true thisObject.container.isDraggeable = false - thisObject.container.frame.containerName = 'Panel Tab Button' + thisObject.container.frame.containerName = 'Up Down Button' - /* Animation to hide the pannel */ thisObject.status = 'up' let upPosition = {} let downPosition = {} @@ -45,12 +44,12 @@ function newUpDownButton () { } function initialize () { - thisObject.container.frame.width = 10 - thisObject.container.frame.height = 10 + thisObject.container.frame.width = 12 + thisObject.container.frame.height = 12 let position = { - x: thisObject.parentContainer.frame.width - 14, - y: 1 + x: thisObject.container.frame.parentFrame.width * 5.75 / 8 - thisObject.container.frame.width / 2, + y: 40 * 4 / 8 - thisObject.container.frame.height / 2 } thisObject.container.frame.position = position From b37611fda729308f2d0e74fc5bbbff7eb5f5d777 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 09:44:18 +0100 Subject: [PATCH 128/166] left right button working well --- Panels/LeftRightButton.js | 9 ++++----- Spaces/PanelsSpace.js | 28 ++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Panels/LeftRightButton.js b/Panels/LeftRightButton.js index 1ff62802b..cac7c7345 100644 --- a/Panels/LeftRightButton.js +++ b/Panels/LeftRightButton.js @@ -93,14 +93,13 @@ function newLeftRightButton () { } function physics () { - return if (isInitialized === false) { return } - leftPosition.x = thisObject.parentContainer.frame.position.x - leftPosition.y = canvas.chartingSpace.viewport.visibleArea.topRight.y + leftPosition.x = canvas.chartingSpace.viewport.visibleArea.topLeft.x + leftPosition.y = thisObject.parentContainer.frame.position.y - rightPosition.x = thisObject.parentContainer.frame.position.x - rightPosition.y = canvas.chartingSpace.viewport.visibleArea.bottomRight.y + rightPosition.x = canvas.chartingSpace.viewport.visibleArea.bottomRight.x + rightPosition.y = thisObject.parentContainer.frame.position.y if (thisObject.status === 'going right') { if (transitionPosition.x < rightPosition.x) { diff --git a/Spaces/PanelsSpace.js b/Spaces/PanelsSpace.js index 45f154f31..4a7dc2dac 100644 --- a/Spaces/PanelsSpace.js +++ b/Spaces/PanelsSpace.js @@ -167,16 +167,32 @@ function newPanelsSpace () { if (panel.upDownButton !== undefined) { if (panel.upDownButton.status === 'up') { - if (centerPoint.x < verticalLine) { - panel.gravitatesTowards = 'topLeft' + if (panel.leftRightButton !== undefined) { + if (panel.leftRightButton.status === 'left') { + panel.gravitatesTowards = 'topLeft' + } else { + panel.gravitatesTowards = 'topRight' + } } else { - panel.gravitatesTowards = 'topRight' + if (centerPoint.x < verticalLine) { + panel.gravitatesTowards = 'topLeft' + } else { + panel.gravitatesTowards = 'topRight' + } } } else { - if (centerPoint.x < verticalLine) { - panel.gravitatesTowards = 'bottomLeft' + if (panel.leftRightButton !== undefined) { + if (panel.leftRightButton.status === 'left') { + panel.gravitatesTowards = 'bottomLeft' + } else { + panel.gravitatesTowards = 'bottomRight' + } } else { - panel.gravitatesTowards = 'bottomRight' + if (centerPoint.x < verticalLine) { + panel.gravitatesTowards = 'bottomLeft' + } else { + panel.gravitatesTowards = 'bottomRight' + } } } } else { From 7d22c08bbc527f898424e2fb6ee260cc23dc7880 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 09:54:26 +0100 Subject: [PATCH 129/166] not pushing when not needed --- Spaces/PanelsSpace.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Spaces/PanelsSpace.js b/Spaces/PanelsSpace.js index 4a7dc2dac..fbfb144f6 100644 --- a/Spaces/PanelsSpace.js +++ b/Spaces/PanelsSpace.js @@ -213,6 +213,10 @@ function newPanelsSpace () { /* According to the quadrant we push the panels to the sides */ if (panel.gravitatesTowards === 'topLeft' || panel.gravitatesTowards === 'bottomLeft') { panel.container.frame.position.x = panel.container.frame.position.x - panel.container.speed.x + if (panel.leftRightButton !== undefined) { + if (panel.leftRightButton.status === 'left' || panel.leftRightButton.status === 'right') { // we avoid pushing other panels while in transition + } + } isOverlapping(i, panel.container) if (panel.container.frame.position.x < 0) { panel.container.frame.position.x = 0 @@ -262,6 +266,11 @@ function newPanelsSpace () { for (let i = 0; i < currentIndex; i++) { let panel = thisObject.panels[i] + if (panel.leftRightButton !== undefined) { + if (panel.leftRightButton.status !== 'left' && panel.leftRightButton.status !== 'right') { // we avoid pushing other panels while in transition + continue + } + } if (panel.isVisible === true && panel.isHidden === false) { if (isThisPointInsideThisFrame(corner1, panel.container.frame) === true) { pushOut(currentContainer, panel.container, panel.gravitatesTowards) From 5a80e7e7378c57a64d01d88f9fb90c8076e98909 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 10:52:56 +0100 Subject: [PATCH 130/166] not hidding charts when zoomed in --- ChartingSpace/TimeMachine.js | 8 ++++++++ Globals.js | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 1d99bfeeb..2173d7f21 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -417,6 +417,14 @@ function newTimeMachine () { } function panelPhysics () { + if ( + thisObject.container.frame.isInViewPort() && + canvas.chartingSpace.viewport.zoomLevel >= ZOOM_OUT_THRESHOLD_FOR_NOT_HIDDING_PANELS) { + canvas.panelsSpace.unHide(thisObject.payload.node.id, 'Layers Panel') + canvas.panelsSpace.unHide(thisObject.payload.node.id, 'Plotter Panel') + return + } + if ( thisObject.container.frame.isCenterInViewPort() && canvas.chartingSpace.viewport.zoomLevel >= ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS diff --git a/Globals.js b/Globals.js index b6d1bb722..36d8932c9 100644 --- a/Globals.js +++ b/Globals.js @@ -48,7 +48,8 @@ const DOUBLE_CLICK_ZOOM_OUT_LEVEL = 0 const DOUBLE_CLICK_ZOOM_IN_LEVEL = 7 const DEBUG = {} -const ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS = 7 // This regulates some behavious changes that happens when the user zoom out below this level. +const ZOOM_OUT_THRESHOLD_FOR_NOT_HIDDING_PANELS = 12 +const ZOOM_OUT_THRESHOLD_FOR_HIDDING_PANELS = 7 const ZOOM_OUT_THRESHOLD_FOR_CHANGING_TIME_FRAME = 3 // This help regulate when to change the Time Frame base on the level of zoom out. const ZOOM_OUT_THRESHOLD_FOR_PACKING_OBJECTS_AT_THE_BOTTOM_OR_TOP_OF_VIEWPORT = 2 const ZOOM_OUT_THRESHOLD_FOR_PLOTTING_IN_LOW_RESOLUTION = 3 From 4563d41bcfd28b65e2812bf2e0c4310e83294c9d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 11:11:02 +0100 Subject: [PATCH 131/166] time machine size gets dynamic --- ChartingSpace/TimeMachine.js | 4 ++-- Globals.js | 4 ++-- Spaces/ChartingSpace.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ChartingSpace/TimeMachine.js b/ChartingSpace/TimeMachine.js index 2173d7f21..5a6c07b75 100644 --- a/ChartingSpace/TimeMachine.js +++ b/ChartingSpace/TimeMachine.js @@ -71,8 +71,8 @@ function newTimeMachine () { thisObject.container.insideViewport = true thisObject.container.detectMouseOver = true - thisObject.container.frame.width = TIME_MACHINE_WIDTH - thisObject.container.frame.height = TIME_MACHINE_HEIGHT + thisObject.container.frame.width = browserCanvas.width / TIME_MACHINE_WIDTH + thisObject.container.frame.height = (browserCanvas.height - TOP_SPACE_HEIGHT - COCKPIT_SPACE_HEIGHT) / TIME_MACHINE_HEIGHT } function finalize () { diff --git a/Globals.js b/Globals.js index 36d8932c9..feb75b0ad 100644 --- a/Globals.js +++ b/Globals.js @@ -222,8 +222,8 @@ const PERIOD_01_MIN = "01-min"; We define here the size of the chartingSpace. It has to bee enough big in order to accomodate all the charts we expect to display in this space. */ -const TIME_MACHINE_WIDTH = 250; -const TIME_MACHINE_HEIGHT = 120; +const TIME_MACHINE_WIDTH = 8; +const TIME_MACHINE_HEIGHT = 8; let mediaRecorder // to downloadText canvas animation as a mediaRecorder let areWeRecording = false diff --git a/Spaces/ChartingSpace.js b/Spaces/ChartingSpace.js index a9621a2c9..dba998962 100644 --- a/Spaces/ChartingSpace.js +++ b/Spaces/ChartingSpace.js @@ -332,8 +332,8 @@ function newChartingSpace () { timeMachine.payload.uiObject.setValue('Loading...') /* Setting up the new time machine. */ - timeMachine.container.frame.position.x = browserCanvas.width / 2 - TIME_MACHINE_WIDTH / 2 - timeMachine.container.frame.position.y = browserCanvas.height / 2 - TIME_MACHINE_HEIGHT / 2 + timeMachine.container.frame.position.x = browserCanvas.width / 2 - browserCanvas.width / TIME_MACHINE_WIDTH / 2 + timeMachine.container.frame.position.y = browserCanvas.height / 2 - (browserCanvas.height - TOP_SPACE_HEIGHT - COCKPIT_SPACE_HEIGHT) / TIME_MACHINE_HEIGHT / 2 timeMachine.initialize(onTimeMachineInitialized) function onTimeMachineInitialized () { From c3f6b94479c0d808ebddc520188ab1f72e7d5202 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 11:53:12 +0100 Subject: [PATCH 132/166] Double zoom in in --- ChartingSpace/EdgeEditor.js | 21 +++++++++++++++++++++ ChartingSpace/Viewport.js | 9 ++++----- Globals.js | 3 ++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index fa46141a4..f723b605b 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -109,6 +109,11 @@ function newEdgeEditor () { if (canvas.chartingSpace.viewport.zoomLevel === DOUBLE_CLICK_ZOOM_OUT_LEVEL) { canvas.chartingSpace.viewport.displaceToContainer(thisObject.container.parentContainer) canvas.chartingSpace.viewport.zoomAtCenter(DOUBLE_CLICK_ZOOM_IN_LEVEL) + return + } + if (canvas.chartingSpace.viewport.zoomLevel === DOUBLE_CLICK_ZOOM_IN_LEVEL) { + canvas.chartingSpace.viewport.zoomAtCenter(DOUBLE_CLICK_ZOOM_IN_IN_LEVEL) + return } } @@ -476,7 +481,23 @@ function newEdgeEditor () { } } + function testDraw () { + let y = (browserCanvas.height - TOP_SPACE_HEIGHT - COCKPIT_SPACE_HEIGHT) / 2 + TOP_SPACE_HEIGHT + + browserCanvasContext.beginPath() + browserCanvasContext.moveTo(0, y) + browserCanvasContext.lineTo(2000, y) + browserCanvasContext.moveTo(browserCanvas.width / 2, 0) + browserCanvasContext.lineTo(browserCanvas.width / 2, 2000) + browserCanvasContext.closePath() + + browserCanvasContext.lineWidth = 1 + browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + 1 + ')' + browserCanvasContext.stroke() + } + function drawForeground () { + testDraw() let MARGIN = 1 let edgeSize let lineWidth diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index 84104e0ee..a8107ed42 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -137,10 +137,10 @@ function newViewport () { function displaceToContainer (container) { let targetPoint = { x: -container.frame.position.x - container.frame.width / 2, - y: -container.frame.position.y - container.frame.height / 2 + TOP_SPACE_HEIGHT + y: -container.frame.position.y - container.frame.height / 2 } - position.x = targetPoint.x + thisObject.width / 2 - position.y = targetPoint.y + thisObject.height / 2 + position.x = targetPoint.x + browserCanvas.width / 2 + position.y = targetPoint.y + (browserCanvas.height - COCKPIT_SPACE_HEIGHT - TOP_SPACE_HEIGHT) / 2 + TOP_SPACE_HEIGHT } function zoomAtCenter (level) { @@ -152,7 +152,7 @@ function newViewport () { function mousePositionPhysics () { if (overrideMousePositionCounter > 0) { thisObject.mousePosition.x = browserCanvas.width / 2 - thisObject.mousePosition.y = (browserCanvas.height - TOP_SPACE_HEIGHT) / 2 - TOP_SPACE_HEIGHT / 2 + thisObject.mousePosition.y = (browserCanvas.height - TOP_SPACE_HEIGHT - COCKPIT_SPACE_HEIGHT) / 2 + TOP_SPACE_HEIGHT overrideMousePositionCounter-- if (overrideMousePositionCounter < 0) { @@ -413,4 +413,3 @@ function newViewport () { } } } - diff --git a/Globals.js b/Globals.js index feb75b0ad..860fa5d29 100644 --- a/Globals.js +++ b/Globals.js @@ -45,7 +45,8 @@ const MAC_AMOUNT_FACTOR = 5 const IS_MAC = navigator.platform.toUpperCase().indexOf('MAC') >= 0 const DOUBLE_CLICK_ZOOM_OUT_LEVEL = 0 -const DOUBLE_CLICK_ZOOM_IN_LEVEL = 7 +const DOUBLE_CLICK_ZOOM_IN_LEVEL = 6 +const DOUBLE_CLICK_ZOOM_IN_IN_LEVEL = 7 const DEBUG = {} const ZOOM_OUT_THRESHOLD_FOR_NOT_HIDDING_PANELS = 12 From b121a161e12e07dd4bbdc566787c313774dfcfaa Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 11:54:15 +0100 Subject: [PATCH 133/166] cleaning --- ChartingSpace/EdgeEditor.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index f723b605b..700850809 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -481,23 +481,7 @@ function newEdgeEditor () { } } - function testDraw () { - let y = (browserCanvas.height - TOP_SPACE_HEIGHT - COCKPIT_SPACE_HEIGHT) / 2 + TOP_SPACE_HEIGHT - - browserCanvasContext.beginPath() - browserCanvasContext.moveTo(0, y) - browserCanvasContext.lineTo(2000, y) - browserCanvasContext.moveTo(browserCanvas.width / 2, 0) - browserCanvasContext.lineTo(browserCanvas.width / 2, 2000) - browserCanvasContext.closePath() - - browserCanvasContext.lineWidth = 1 - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + 1 + ')' - browserCanvasContext.stroke() - } - function drawForeground () { - testDraw() let MARGIN = 1 let edgeSize let lineWidth From dbbd25559fe7a45308bc1a3767f1fa0b0cf4e268 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 12:23:01 +0100 Subject: [PATCH 134/166] Reset Aspect Ration Implemented --- ChartingSpace/EdgeEditor.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 700850809..1b4cfca64 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -6,6 +6,7 @@ function newEdgeEditor () { fitFunction: undefined, isVisible: true, isMouseOver: undefined, + resetAspectRatio: resetAspectRatio, onKeyPressed: onKeyPressed, physics: physics, drawForeground: drawForeground, @@ -104,7 +105,18 @@ function newEdgeEditor () { thisObject.isMouseOver = false } - function onDoubleClick () { + function resetAspectRatio () { + /* Resize the Time Machine to match the current screen aspect ration */ + + thisObject.container.parentContainer.frame.width = browserCanvas.width / TIME_MACHINE_WIDTH + thisObject.container.parentContainer.frame.height = (browserCanvas.height - TOP_SPACE_HEIGHT - COCKPIT_SPACE_HEIGHT) / TIME_MACHINE_HEIGHT + coordinateSystem.maxHeight = thisObject.container.parentContainer.frame.height + coordinateSystem.maxWidth = thisObject.container.parentContainer.frame.width + coordinateSystem.recalculateScale() + thisObject.container.parentContainer.eventHandler.raiseEvent('Dimmensions Changed', event) + } + + function onDoubleClick (event) { doubleClickCounter = 0 if (canvas.chartingSpace.viewport.zoomLevel === DOUBLE_CLICK_ZOOM_OUT_LEVEL) { canvas.chartingSpace.viewport.displaceToContainer(thisObject.container.parentContainer) @@ -119,7 +131,7 @@ function newEdgeEditor () { function onDragStarted (event) { if (doubleClickCounter > 0) { - onDoubleClick() + onDoubleClick(event) return } else { doubleClickCounter = 50 @@ -184,6 +196,11 @@ function newEdgeEditor () { whatHappened = 'left or right arrow key pressed' return } + + if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'R' || event.key === 'r')) { + resetAspectRatio() + return + } } function getContainer (event, purpose) { From a1cfd82ab32ba1361a92fafe7b01bcbb79b0ee58 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 14:35:13 +0100 Subject: [PATCH 135/166] dynamicDecimals --- Scales/RateScale.js | 7 +------ Utilities.js | 9 +++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Scales/RateScale.js b/Scales/RateScale.js index 2c728aa11..8e208d9b3 100644 --- a/Scales/RateScale.js +++ b/Scales/RateScale.js @@ -487,12 +487,7 @@ function newRateScale () { rate = coordinateSystem.max.y } - let decimals = 2 - if (rate < 1) { decimals = 4 } - if (Math.trunc(rate * 100) < 1) { decimals = 6 } - if (Math.trunc(rate * 10000) < 1) { decimals = 8 } - if (Math.trunc(rate * 1000000) < 1) { decimals = 10 } - let label = (rate - Math.trunc(rate)).toFixed(decimals) + let label = dynamicDecimals(rate) let labelArray = label.split('.') let label1 = thisObject.payload.node.payload.parentNode.name let label2 = (Math.trunc(rate)).toLocaleString() diff --git a/Utilities.js b/Utilities.js index 2588156b9..8b4262173 100644 --- a/Utilities.js +++ b/Utilities.js @@ -22,6 +22,15 @@ function drawContainerBackground (container, color, opacity, fitFunction) { browserCanvasContext.fill() } +function dynamicDecimals (value) { + let decimals = 2 + if (value < 1) { decimals = 4 } + if (Math.trunc(value * 100) < 1) { decimals = 6 } + if (Math.trunc(value * 10000) < 1) { decimals = 8 } + if (Math.trunc(value * 1000000) < 1) { decimals = 10 } + return (value - Math.trunc(value)).toFixed(decimals) +} + function savePropertyAtNodeConfig (payload, propertyName, value) { try { let code = JSON.parse(payload.node.code) From 1ae194e7a6193d2f7716ed6711d4c4e4afccf786 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 18:05:44 +0100 Subject: [PATCH 136/166] bug fixed --- FloatingSpace/UiObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 0b203c3ad..97d398271 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -1172,6 +1172,7 @@ function newUiObject () { function drawValue () { if (hasValue === false) { return } + if (canvas.floatingSpace.inMapMode === true) { return } // if (currentValue === undefined || currentValue === '') { return } /* Text Follows */ @@ -1538,4 +1539,3 @@ function newUiObject () { } } } - From 34260c9f3cda8739ff928a51e50225e240f836b9 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 16 Mar 2020 18:19:54 +0100 Subject: [PATCH 137/166] Bug Fixed --- FloatingSpace/UiObjectTitle.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FloatingSpace/UiObjectTitle.js b/FloatingSpace/UiObjectTitle.js index 6fde27c23..78d4d66e1 100644 --- a/FloatingSpace/UiObjectTitle.js +++ b/FloatingSpace/UiObjectTitle.js @@ -215,6 +215,8 @@ function newUiObjectTitle () { thisObject.payload.node.name = input.value } } + let inputDiv = document.getElementById('inputDiv') + inputDiv.style = 'position:absolute; top:' + '-100' + 'px; left:' + '-100' + 'px; z-index:1; ' } function enterEditMode () { From 7fe31017b4985942ca30ad8e393cd0ea957916eb Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 10:22:02 +0100 Subject: [PATCH 138/166] quoted asset fix --- .../FunctionLibraries/SessionFunctions.js | 4 +-- Globals.js | 25 +++---------------- 2 files changed, 6 insertions(+), 23 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js b/DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js index 5b967b29d..7257e42ba 100644 --- a/DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js @@ -33,7 +33,7 @@ function newSessionFunctions () { let lightingPath = '' + 'Trading System->' + 'Parameters->' + - 'Base Asset->Time Range->Time Frame->Slippage->Fee Structure->' + + 'Base Asset->Quoted Asset->Time Range->Time Frame->Slippage->Fee Structure->' + 'Exchange Account Asset->Asset->' + 'Strategy->' + 'Trigger Stage->Trigger On Event->Trigger Off Event->Take Position Event->' + @@ -53,7 +53,7 @@ function newSessionFunctions () { lightingPath = '' + 'Backtesting Session->Paper Trading Session->Fordward Testing Session->Live Trading Session->' + 'Parameters->' + - 'Base Asset->Time Range->Time Frame->Slippage->Fee Structure->' + + 'Base Asset->Quoted Asset->Time Range->Time Frame->Slippage->Fee Structure->' + 'Exchange Account Asset->Asset->' let session = functionLibraryProtocolNode.getProtocolNode(node, false, true, true, false, false, lightingPath) diff --git a/Globals.js b/Globals.js index 860fa5d29..dfe29698b 100644 --- a/Globals.js +++ b/Globals.js @@ -3,20 +3,7 @@ const CANVAS_APP_NAME = 'Canvas App' -const SUPPORTED_EXCHANGES = ["Poloniex"]; -const SUPPORTED_MARKETS = [ - { - baseAsset: "USDT", - quotedAsset: "BTC", - } -]; -const DEFAULT_EXCHANGE = "Poloniex"; -const DEFAULT_MARKET = { - baseAsset: "USDT", - quotedAsset: "BTC", -}; - -UI_COLOR = { +const UI_COLOR = { DARK: "48, 48, 54", LIGHT: "234, 226, 222", GREY: "150, 150, 150", @@ -36,7 +23,7 @@ UI_COLOR = { /* User Interface Fonts */ -UI_FONT = { +const UI_FONT = { PRIMARY: "Saira Condensed", SECONDARY: "Source Code Pro" }; @@ -86,7 +73,7 @@ const DISTANCE_TO_PARENT = { /* User Interface Panels */ -UI_PANEL = { +const UI_PANEL = { WIDTH: { SMALL: 100, NORMAL: 150, @@ -132,7 +119,7 @@ let dailyFilePeriods = dailyFilePeriods = JSON.parse(dailyFilePeriods); -SHOW_ANIMATION_PERFORMACE = false; +let SHOW_ANIMATION_PERFORMACE = false; let testUser = window.localStorage.getItem("test_user") let LOGGED_IN_USER_LOCAL_STORAGE_KEY @@ -146,10 +133,6 @@ if (testUser !== null) { LOGGED_IN_ACCESS_TOKEN_LOCAL_STORAGE_KEY = "access_token" } -const DEFAULT_CONFIG_TEXT = '// Write your config here' -const DEFAULT_FORMULA_TEXT = '// Write your formula here' -const DEFAULT_CODE_TEXT = '// Write your code here' - const MAX_DEFAULT_RATE_SCALE_VALUE = 35000; // This is needed to know the scale of the market time line. const WIDHTER_VOLUME_BAR_BASE_FACTOR = 2.5; From e2a278c66ed59783f6b3cadd74b585399ee0c882 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 11:38:48 +0100 Subject: [PATCH 139/166] improving printLabel --- Utilities.js | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/Utilities.js b/Utilities.js index 8b4262173..ab6621dd2 100644 --- a/Utilities.js +++ b/Utilities.js @@ -28,6 +28,8 @@ function dynamicDecimals (value) { if (Math.trunc(value * 100) < 1) { decimals = 6 } if (Math.trunc(value * 10000) < 1) { decimals = 8 } if (Math.trunc(value * 1000000) < 1) { decimals = 10 } + if (Math.trunc(value * 100000000) < 1) { decimals = 12 } + if (Math.trunc(value * 10000000000) < 1) { decimals = 0 } return (value - Math.trunc(value)).toFixed(decimals) } @@ -203,7 +205,7 @@ function getMilisecondsFromPoint (point, container, coordinateSystem) { return point.x } -function moveToUserPosition (container, currentDate, currentRate, coordinateSystem, ignoreX, ignoreY, mousePosition) { +function moveToUserPosition (container, currentDate, currentRate, coordinateSystem, ignoreX, ignoreY, mousePosition, fitFunction) { let targetPoint = { x: currentDate.valueOf(), y: currentRate @@ -237,15 +239,42 @@ function removeTime (datetime) { return dateOnly } -function printLabel (labelToPrint, x, y, opacity, fontSize, color) { +function printLabel (labelToPrint, x, y, opacity, fontSize, color, center, container, fitFunction) { let labelPoint if (color === undefined) { color = UI_COLOR.DARK } + if (fontSize === undefined) { fontSize = 10 }; browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY - let label = '' + labelToPrint + let label = labelToPrint + if (isNaN(label) === false && label !== '') { + label = dynamicDecimals(labelToPrint) + label = label.toLocaleString() + } + let xOffset = label.length / 2 * fontSize * FONT_ASPECT_RATIO + + if (center === true) { + labelPoint = { + x: x - xOffset, + y: y + } + } else { + labelPoint = { + x: x, + y: y + } + } + + if (container !== undefined) { + labelPoint = container.frame.frameThisPoint(labelPoint) + } + + if (fitFunction !== undefined) { + labelPoint = fitFunction(labelPoint) + } + browserCanvasContext.fillStyle = 'rgba(' + color + ', ' + opacity + ')' - browserCanvasContext.fillText(label, x, y) + browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) } function newUniqueId () { From 785804a301950554c1c1db25c043972a5f34c90b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 12:16:56 +0100 Subject: [PATCH 140/166] bug fixed --- Utilities.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Utilities.js b/Utilities.js index ab6621dd2..fae5f22a5 100644 --- a/Utilities.js +++ b/Utilities.js @@ -30,7 +30,8 @@ function dynamicDecimals (value) { if (Math.trunc(value * 1000000) < 1) { decimals = 10 } if (Math.trunc(value * 100000000) < 1) { decimals = 12 } if (Math.trunc(value * 10000000000) < 1) { decimals = 0 } - return (value - Math.trunc(value)).toFixed(decimals) + let returnValue = Number(value).toFixed(decimals) + return returnValue } function savePropertyAtNodeConfig (payload, propertyName, value) { From 5722cb9c0e19fe6b2d93e74cf4d7cbcf27dcb75d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 12:58:53 +0100 Subject: [PATCH 141/166] standarizing print label --- Panels/PlotterPanel.js | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/Panels/PlotterPanel.js b/Panels/PlotterPanel.js index 783657718..9dde50073 100644 --- a/Panels/PlotterPanel.js +++ b/Panels/PlotterPanel.js @@ -153,33 +153,8 @@ function newPlotterPanel () { valuePosition = panelData.code.valuePosition } - printLabel(labelText, X_AXIS, PANEL_HEIGHT * labelPosition / 100 / heightFactor, '1') - printLabel(value, X_AXIS, PANEL_HEIGHT * valuePosition / 100 / heightFactor, '0.50') + printLabel(labelText, X_AXIS, PANEL_HEIGHT * labelPosition / 100 / heightFactor, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction) + printLabel(value, X_AXIS, PANEL_HEIGHT * valuePosition / 100 / heightFactor, '1.00', 15, undefined, true, thisObject.container, thisObject.fitFunction) } - - function printLabel (labelToPrint, x, y, opacity) { - let labelPoint - let fontSize = 10 - - browserCanvasContext.font = fontSize + 'px ' + UI_FONT.SECONDARY - - let label = '' + labelToPrint - - let xOffset = label.length / 2 * fontSize * FONT_ASPECT_RATIO - - labelPoint = { - x: x - xOffset, - y: y - } - - labelPoint = thisObject.container.frame.frameThisPoint(labelPoint) - labelPoint = thisObject.fitFunction(labelPoint) - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.DARK + ', ' + opacity + ')' - browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) - } - - browserCanvasContext.closePath() - browserCanvasContext.fill() } } From d4e1b101bbb732ce6c1ca6089c7a5f260300c247 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 15:45:48 +0100 Subject: [PATCH 142/166] fix --- ChartingSpace/EdgeEditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index 1b4cfca64..c8d47b7ea 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -197,7 +197,7 @@ function newEdgeEditor () { return } - if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'R' || event.key === 'r')) { + if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'A' || event.key === 'a')) { resetAspectRatio() return } From c38ecae794923d3f0b47144c23e7d11db0cfcf83 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 15:56:53 +0100 Subject: [PATCH 143/166] bug fixed --- Utilities.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Utilities.js b/Utilities.js index fae5f22a5..7878498c3 100644 --- a/Utilities.js +++ b/Utilities.js @@ -25,11 +25,12 @@ function drawContainerBackground (container, color, opacity, fitFunction) { function dynamicDecimals (value) { let decimals = 2 if (value < 1) { decimals = 4 } - if (Math.trunc(value * 100) < 1) { decimals = 6 } - if (Math.trunc(value * 10000) < 1) { decimals = 8 } - if (Math.trunc(value * 1000000) < 1) { decimals = 10 } - if (Math.trunc(value * 100000000) < 1) { decimals = 12 } - if (Math.trunc(value * 10000000000) < 1) { decimals = 0 } + if (Math.abs(Math.trunc(value * 100)) < 1) { decimals = 6 } + if (Math.abs(Math.trunc(value * 10000)) < 1) { decimals = 8 } + if (Math.abs(Math.trunc(value * 1000000)) < 1) { decimals = 10 } + if (Math.abs(Math.trunc(value * 100000000)) < 1) { decimals = 12 } + if (Math.abs(Math.trunc(value * 10000000000)) < 1) { value = 0; decimals = 0 } + if (Math.trunc(value) === value) { decimals = 0 } let returnValue = Number(value).toFixed(decimals) return returnValue } From f6c7148b482c56370c8bc527a61bc6986d3abe3d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 16:30:28 +0100 Subject: [PATCH 144/166] Asset Balances on Panel --- CockpitSpace/AssetBalances.js | 5 ++++- CockpitSpace/Speedometer.js | 6 ++++-- Spaces/CockpitSpace.js | 6 ------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/CockpitSpace/AssetBalances.js b/CockpitSpace/AssetBalances.js index 6cb267ef4..166a68880 100644 --- a/CockpitSpace/AssetBalances.js +++ b/CockpitSpace/AssetBalances.js @@ -1,5 +1,5 @@ -function newQuotedAssetalances () { +function newAssetalances () { const MODULE_NAME = 'Asset Balances' let thisObject = { @@ -38,6 +38,9 @@ function newQuotedAssetalances () { let speedometer = newSpeedometer() speedometer.initialize() + speedometer.container.connectToParent(thisObject.container) + speedometer.container.frame.position.x = thisObject.container.frame.width / 2 + speedometer.container.frame.position.y = thisObject.container.frame.height * (2 + i * 2) / 5 thisObject.speedometers.push(speedometer) } } diff --git a/CockpitSpace/Speedometer.js b/CockpitSpace/Speedometer.js index 7a2f0a857..499b08a42 100644 --- a/CockpitSpace/Speedometer.js +++ b/CockpitSpace/Speedometer.js @@ -56,10 +56,12 @@ function newSpeedometer () { const OPACITY = 1 let centerPoint = { - x: thisObject.params.LEFT_OFFSET, - y: COCKPIT_SPACE_POSITION - COCKPIT_SPACE_HEIGHT / 2 - 9 + x: 0, + y: 0 } + centerPoint = thisObject.container.frame.frameThisPoint(centerPoint) + browserCanvasContext.beginPath() browserCanvasContext.arc(centerPoint.x, centerPoint.y, RADIUS + RED_LINE_HIGHT, 0.85 * Math.PI, 2.15 * Math.PI) browserCanvasContext.closePath() diff --git a/Spaces/CockpitSpace.js b/Spaces/CockpitSpace.js index 01fea0e08..3291428ec 100644 --- a/Spaces/CockpitSpace.js +++ b/Spaces/CockpitSpace.js @@ -5,7 +5,6 @@ let thisObject = { container: undefined, status: 'BOTTOM', - assetBalances: undefined, fullscreen: undefined, toTop: toTop, toBottom: toBottom, @@ -40,7 +39,6 @@ thisObject.container.finalize() thisObject.container = undefined - thisObject.assetBalances = undefined thisObject.fullscreen = undefined } @@ -65,9 +63,6 @@ canvasBrowserResizedEventSubscriptionId = canvas.eventHandler.listenToEvent('Browser Resized', resize) selfMouseClickEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseClick', onMouseClick) - thisObject.assetBalances = newQuotedAssetalances() - thisObject.assetBalances.initialize() - thisObject.fullscreen = newFullScreen() thisObject.fullscreen.container.connectToParent(thisObject.container) thisObject.fullscreen.initialize() @@ -185,7 +180,6 @@ drawBackground() - thisObject.assetBalances.draw() // thisObject.fullscreen.draw() } From 7dc5d81f6e0a5cd856611a458216b36e0d165a56 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 17:34:37 +0100 Subject: [PATCH 145/166] fix --- CockpitSpace/Speedometer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CockpitSpace/Speedometer.js b/CockpitSpace/Speedometer.js index 499b08a42..a1c7c35aa 100644 --- a/CockpitSpace/Speedometer.js +++ b/CockpitSpace/Speedometer.js @@ -63,7 +63,7 @@ function newSpeedometer () { centerPoint = thisObject.container.frame.frameThisPoint(centerPoint) browserCanvasContext.beginPath() - browserCanvasContext.arc(centerPoint.x, centerPoint.y, RADIUS + RED_LINE_HIGHT, 0.85 * Math.PI, 2.15 * Math.PI) + browserCanvasContext.arc(centerPoint.x, centerPoint.y, RADIUS + RED_LINE_HIGHT, 0 * Math.PI, 2.0 * Math.PI) browserCanvasContext.closePath() browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + OPACITY + ')' From 194dc9be95ce031bc4defa38bf7f708c16876359 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 17 Mar 2020 17:52:05 +0100 Subject: [PATCH 146/166] new icons --- FloatingSpace/UiObjectConstructor.js | 4 ++-- Spaces/DesignSpace.js | 6 +++++- VideoRecorder.js | 31 ++++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/FloatingSpace/UiObjectConstructor.js b/FloatingSpace/UiObjectConstructor.js index 275ae7afe..4fe03a6bd 100644 --- a/FloatingSpace/UiObjectConstructor.js +++ b/FloatingSpace/UiObjectConstructor.js @@ -281,8 +281,8 @@ function newUiObjectConstructor () { actionFunction: floatingObject.payload.onMenuItemClick, label: undefined, visible: true, - iconPathOn: 'quality', - iconPathOff: 'quality', + iconPathOn: 'help', + iconPathOff: 'help', rawRadius: 12, targetRadius: 0, currentRadius: 0, diff --git a/Spaces/DesignSpace.js b/Spaces/DesignSpace.js index cea2a4637..55b345426 100644 --- a/Spaces/DesignSpace.js +++ b/Spaces/DesignSpace.js @@ -274,7 +274,11 @@ function newDesignSpace () { 'template-structure', 'template-target', 'delink', - 'detach' + 'detach', + 'help', + 'key-a', + 'key-m', + 'key-r' ] for (let i = 0; i < iconsNames.length; i++) { diff --git a/VideoRecorder.js b/VideoRecorder.js index f57152845..f222a8358 100644 --- a/VideoRecorder.js +++ b/VideoRecorder.js @@ -17,7 +17,6 @@ function newVideoRecorder () { function recordCanvas () { { - console.log(canvas.mouse.action, wheelAnimationCounter) const DISTANCE_BETWEEN_ICONS = 35 const ICON_SIZES = 50 @@ -61,7 +60,35 @@ function newVideoRecorder () { } else { pointerIcon = mousePointerIcon } - + let key = canvas.mouse.event.key + if (key === undefined) { break } + switch (key.toLowerCase()) { + case 'Escape': + { + pointerIcon = canvas.designSpace.iconCollection.get('key-m') + break + } + case 'm': + { + pointerIcon = canvas.designSpace.iconCollection.get('key-m') + break + } + case 'a': + { + pointerIcon = canvas.designSpace.iconCollection.get('key-a') + break + } + case 'r': + { + pointerIcon = canvas.designSpace.iconCollection.get('key-r') + break + } + case 'c': + { + pointerIcon = canvas.designSpace.iconCollection.get('key-r') + break + } + } break } case 'key up': { From 5ef91bbe40f23cac6ecdb6833e5c8c036cc2b769 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 18 Mar 2020 11:43:19 +0100 Subject: [PATCH 147/166] Update Utilities.js --- Utilities.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Utilities.js b/Utilities.js index 7878498c3..c29e0a4f1 100644 --- a/Utilities.js +++ b/Utilities.js @@ -241,7 +241,7 @@ function removeTime (datetime) { return dateOnly } -function printLabel (labelToPrint, x, y, opacity, fontSize, color, center, container, fitFunction) { +function printLabel (labelToPrint, x, y, opacity, fontSize, color, center, container, fitFunction, noDecimals) { let labelPoint if (color === undefined) { color = UI_COLOR.DARK } if (fontSize === undefined) { fontSize = 10 }; @@ -251,6 +251,9 @@ function printLabel (labelToPrint, x, y, opacity, fontSize, color, center, conta if (isNaN(label) === false && label !== '') { label = dynamicDecimals(labelToPrint) label = label.toLocaleString() + if (noDecimals === true) { + label = Math.trunc(label) + } } let xOffset = label.length / 2 * fontSize * FONT_ASPECT_RATIO From 9e1bae5911b705283fc87e93a233d79b3c0a093a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 18 Mar 2020 11:57:54 +0100 Subject: [PATCH 148/166] improvements in decimals --- CockpitSpace/Speedometer.js | 4 ++-- Utilities.js | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CockpitSpace/Speedometer.js b/CockpitSpace/Speedometer.js index a1c7c35aa..12f8cc14e 100644 --- a/CockpitSpace/Speedometer.js +++ b/CockpitSpace/Speedometer.js @@ -198,8 +198,8 @@ function newSpeedometer () { if (isNaN(label) === false) { label = Number(label) - label = Math.trunc(label * Math.pow(10, thisObject.params.DECIMALS)) / Math.pow(10, thisObject.params.DECIMALS) - if (label === 0) { label = label.toFixed(2) } else { label = label.toLocaleString() } + label = dynamicDecimals(label, 2) + if (label === 0) { label = label.toFixed(2) } } // label = label.substring(0, 6) diff --git a/Utilities.js b/Utilities.js index c29e0a4f1..48750b49b 100644 --- a/Utilities.js +++ b/Utilities.js @@ -22,7 +22,10 @@ function drawContainerBackground (container, color, opacity, fitFunction) { browserCanvasContext.fill() } -function dynamicDecimals (value) { +function dynamicDecimals (value, minDecimals) { + if (minDecimals === undefined) { + minDecimals = 0 + } let decimals = 2 if (value < 1) { decimals = 4 } if (Math.abs(Math.trunc(value * 100)) < 1) { decimals = 6 } @@ -30,7 +33,7 @@ function dynamicDecimals (value) { if (Math.abs(Math.trunc(value * 1000000)) < 1) { decimals = 10 } if (Math.abs(Math.trunc(value * 100000000)) < 1) { decimals = 12 } if (Math.abs(Math.trunc(value * 10000000000)) < 1) { value = 0; decimals = 0 } - if (Math.trunc(value) === value) { decimals = 0 } + if (Math.trunc(value) === value) { decimals = minDecimals } let returnValue = Number(value).toFixed(decimals) return returnValue } From 18333a1a4ee9af69f169f532c4cfb7b7cf18bf7b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 19 Mar 2020 11:19:20 +0100 Subject: [PATCH 149/166] Update UiObjectsFromNodes.js --- .../FunctionLibraries/UiObjectsFromNodes.js | 170 ++++++++++-------- 1 file changed, 91 insertions(+), 79 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js index a951ce6e0..3b6d3192b 100644 --- a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js +++ b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js @@ -160,111 +160,91 @@ function newUiObjectsFromNodes () { let parentNodeDefinition = APP_SCHEMA_MAP.get(parentNode.type) if (parentNodeDefinition !== undefined) { + console.log('Cannot addUIOBject from parent of ' + type + ' because that type it is not defined at the APP_SCHEMA.') + } /* Resolve Initial Values */ - let nodeDefinition = APP_SCHEMA_MAP.get(object.type) + let nodeDefinition = APP_SCHEMA_MAP.get(object.type) - if (nodeDefinition.isHierarchyHead === true) { - parentNode.rootNodes.push(object) - createUiObject(true, object.type, object.name, object, parentNode, undefined) - return object + if (nodeDefinition === undefined) { + console.log('Cannot addUIOBject of ' + type + ' because that type it is not defined at the APP_SCHEMA.') + } + + if (nodeDefinition.initialValues !== undefined) { + if (nodeDefinition.initialValues.code !== undefined) { + object.code = nodeDefinition.initialValues.code } + } + + if (nodeDefinition.isHierarchyHead === true) { + parentNode.rootNodes.push(object) + createUiObject(true, object.type, object.name, object, parentNode, undefined) + return object + } /* For the cases where an node is not chained to its parent but to the one at the parent before it at its collection */ - let chainParent = parentNode - if (nodeDefinition.chainedToSameType === true) { - if (parentNodeDefinition.properties !== undefined) { - for (let i = 0; i < parentNodeDefinition.properties.length; i++) { - let property = parentNodeDefinition.properties[i] - if (property.childType === type) { - if (property.type === 'array') { - if (parentNode[property.name] !== undefined) { - if (parentNode[property.name].length > 0) { - let nodeChildren = parentNode[property.name] - chainParent = nodeChildren[nodeChildren.length - 1] - } - } - } - } - } - } - } - - /* Create Empty Arrays for properties of type Array */ - if (nodeDefinition.properties !== undefined) { - for (let i = 0; i < nodeDefinition.properties.length; i++) { - let property = nodeDefinition.properties[i] - if (property.type === 'array') { - object[property.name] = [] - } - } - } - - if (nodeDefinition !== undefined) { - if (nodeDefinition.initialValues !== undefined) { - if (nodeDefinition.initialValues.code !== undefined) { - object.code = nodeDefinition.initialValues.code - } - } - } - - /* Connect to Parent */ + let chainParent = parentNode + if (nodeDefinition.chainedToSameType === true) { if (parentNodeDefinition.properties !== undefined) { - let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children. for (let i = 0; i < parentNodeDefinition.properties.length; i++) { let property = parentNodeDefinition.properties[i] if (property.childType === type) { - switch (property.type) { - case 'node': { - if (property.name !== previousPropertyName) { - parentNode[property.name] = object - previousPropertyName = property.name + if (property.type === 'array') { + if (parentNode[property.name] !== undefined) { + if (parentNode[property.name].length > 0) { + let nodeChildren = parentNode[property.name] + chainParent = nodeChildren[nodeChildren.length - 1] } } - break - case 'array': { - if (parentNode[property.name] === undefined) { - parentNode[property.name] = [] - } - if (property.maxItems !== undefined) { - if (parentNode[property.name].length < property.maxItems) { - parentNode[property.name].push(object) - } else { - return // Object can not be created. - } - } else { - parentNode[property.name].push(object) - } - } - break } } } } + } - createUiObject(true, object.type, object.name, object, parentNode, chainParent) + /* Create Empty Arrays for properties of type Array */ + if (nodeDefinition.properties !== undefined) { + for (let i = 0; i < nodeDefinition.properties.length; i++) { + let property = nodeDefinition.properties[i] + if (property.type === 'array') { + object[property.name] = [] + } + } + } - /* Auto Add more Children */ - if (nodeDefinition.properties !== undefined) { - let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children. - for (let i = 0; i < nodeDefinition.properties.length; i++) { - let property = nodeDefinition.properties[i] + if (nodeDefinition !== undefined) { + if (nodeDefinition.initialValues !== undefined) { + if (nodeDefinition.initialValues.code !== undefined) { + object.code = nodeDefinition.initialValues.code + } + } + } + /* Connect to Parent */ + if (parentNodeDefinition.properties !== undefined) { + let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children. + for (let i = 0; i < parentNodeDefinition.properties.length; i++) { + let property = parentNodeDefinition.properties[i] + if (property.childType === type) { switch (property.type) { case 'node': { if (property.name !== previousPropertyName) { - if (property.autoAdd === true) { - addUIObject(object, property.childType) - previousPropertyName = property.name - } + parentNode[property.name] = object + previousPropertyName = property.name } } break case 'array': { - if (property.autoAdd === true) { - if (object[property.name] === undefined) { - object[property.name] = [] + if (parentNode[property.name] === undefined) { + parentNode[property.name] = [] + } + if (property.maxItems !== undefined) { + if (parentNode[property.name].length < property.maxItems) { + parentNode[property.name].push(object) + } else { + return // Object can not be created. } - addUIObject(object, property.childType) + } else { + parentNode[property.name].push(object) } } break @@ -272,6 +252,38 @@ function newUiObjectsFromNodes () { } } } + + createUiObject(true, object.type, object.name, object, parentNode, chainParent) + + /* Auto Add more Children */ + if (nodeDefinition.properties !== undefined) { + let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children. + for (let i = 0; i < nodeDefinition.properties.length; i++) { + let property = nodeDefinition.properties[i] + + switch (property.type) { + case 'node': { + if (property.name !== previousPropertyName) { + if (property.autoAdd === true) { + addUIObject(object, property.childType) + previousPropertyName = property.name + } + } + } + break + case 'array': { + if (property.autoAdd === true) { + if (object[property.name] === undefined) { + object[property.name] = [] + } + addUIObject(object, property.childType) + } + } + break + } + } + } + return object } From 82f6e08467acca0344c2c52d9a6561a4fa08d22b Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 19 Mar 2020 16:29:39 +0100 Subject: [PATCH 150/166] bug fixed --- Canvas.js | 6 ++++++ Spaces/FloatingSpace.js | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Canvas.js b/Canvas.js index 975aa841b..70bda0737 100644 --- a/Canvas.js +++ b/Canvas.js @@ -616,6 +616,12 @@ function newCanvas () { containerDragStarted = true floatingObjectDragStarted = true containerBeingDragged.eventHandler.raiseEvent('onDragStarted', point) + + if (event.candelDragging === true) { + containerBeingDragged = undefined + containerDragStarted = false + floatingObjectDragStarted = false + } return } diff --git a/Spaces/FloatingSpace.js b/Spaces/FloatingSpace.js index 706b571ba..f04a22767 100644 --- a/Spaces/FloatingSpace.js +++ b/Spaces/FloatingSpace.js @@ -140,10 +140,13 @@ function newFloatingSpace () { function onDragStarted (event) { if (thisObject.inMapMode === false) { if (event.buttons !== 2) { return } - + event.candelDragging = true enterMapMode() } else { - if (event.buttons !== 1) { return } + if (event.buttons !== 1) { + event.candelDragging = true + return + } let mousePosition = { x: event.x, From 8bf42aa4a2224450a7e3b08869dab51ba8662409 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 19 Mar 2020 16:36:48 +0100 Subject: [PATCH 151/166] Bug Fixed --- FloatingSpace/CircularProgressBar.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FloatingSpace/CircularProgressBar.js b/FloatingSpace/CircularProgressBar.js index 0e59f3cf5..be412c47d 100644 --- a/FloatingSpace/CircularProgressBar.js +++ b/FloatingSpace/CircularProgressBar.js @@ -59,6 +59,7 @@ function newCircularProgressBar () { } function getContainer (point) { + if (canvas.floatingSpace.inMapMode === true) { return } let container for (let i = 0; i < menuItems.length; i++) { @@ -83,6 +84,7 @@ function newCircularProgressBar () { } function drawBackground (pFloatingObject) { + if (canvas.floatingSpace.inMapMode === true) { return } const VISIBLE_RADIUS = thisObject.container.frame.radius * 2 let visiblePosition = { From 93caf3d0a48b2fc33e41d8b593d235ef52b1c913 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Thu, 19 Mar 2020 20:52:59 +0100 Subject: [PATCH 152/166] percentage --- FloatingSpace/CircularProgressBar.js | 3 +- FloatingSpace/UiObject.js | 81 ++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/FloatingSpace/CircularProgressBar.js b/FloatingSpace/CircularProgressBar.js index be412c47d..614f0c559 100644 --- a/FloatingSpace/CircularProgressBar.js +++ b/FloatingSpace/CircularProgressBar.js @@ -55,7 +55,8 @@ function newCircularProgressBar () { if (thisObject.payload === undefined) { return } if (thisObject.payload.uiObject === undefined) { return } opacityCounters[message.event.seconds] = 2000 - thisObject.payload.uiObject.setValue(message.event.processingDate) + thisObject.payload.uiObject.setValue(message.event.processingDate, 2000) + thisObject.payload.uiObject.setPercentage(message.event.percentage, 2000) } function getContainer (point) { diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 97d398271..a1544d5b8 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -32,6 +32,7 @@ function newUiObject () { highlight: highlight, setErrorMessage: setErrorMessage, setValue: setValue, + setPercentage: setPercentage, physics: physics, drawBackground: drawBackground, drawMiddleground: drawMiddleground, @@ -68,6 +69,9 @@ function newUiObject () { let hasValue let valueCounter = 0 + let hasPercentage + let percentageCounter = 0 + let previousDistanceToChainParent let readyToChainAttachDisplayCounter = 5 let readyToChainAttachDisplayIncrement = 0.1 @@ -92,6 +96,7 @@ function newUiObject () { let errorMessage = '' let currentValue = 0 + let currentPercentage = '' let rightDragging = false let eventSubscriptionIdHeartbeat @@ -278,6 +283,7 @@ function newUiObject () { highlightPhisycs() errorMessagePhisycs() valuePhisycs() + percentagePhisycs() chainDetachingPhysics() chainAttachingPhysics() referenceDetachingPhysics() @@ -639,6 +645,14 @@ function newUiObject () { } } + function percentagePhisycs () { + percentageCounter-- + if (percentageCounter < 0) { + percentageCounter = 0 + hasPercentage = false + } + } + function highlight () { isHighlighted = true highlightCounter = 30 @@ -653,11 +667,27 @@ function newUiObject () { } } - function setValue (value) { + function setValue (value, counter) { if (value !== undefined) { currentValue = value hasValue = true - valueCounter = 100 + if (counter !== undefined) { + valueCounter = counter + } else { + valueCounter = 100 + } + } + } + + function setPercentage (percentage, counter) { + if (percentage !== undefined) { + currentPercentage = percentage + hasPercentage = true + if (counter !== undefined) { + percentageCounter = counter + } else { + percentageCounter = 100 + } } } @@ -858,6 +888,7 @@ function newUiObject () { function drawMiddleground () { if (thisObject.isOnFocus === false) { drawValue() + drawPercentage() drawText() thisObject.uiObjectTitle.draw() } @@ -936,6 +967,7 @@ function newUiObject () { drawErrorMessage() drawValue() + drawPercentage() drawText() if (drawTitle === true) { @@ -1187,7 +1219,7 @@ function newUiObject () { position = canvas.floatingSpace.transformPointToMap(position) } - let radius = thisObject.container.frame.radius * 1.5 + let radius = thisObject.container.frame.radius * 1.35 /* Label Text */ let labelPoint let fontSize = thisObject.payload.floatingObject.currentFontSize * 6 / 4 @@ -1220,6 +1252,49 @@ function newUiObject () { } } + function drawPercentage () { + if (hasPercentage === false) { return } + if (canvas.floatingSpace.inMapMode === true) { return } + + let position = { + x: 0, + y: 0 + } + + position = thisObject.container.frame.frameThisPoint(position) + + if (canvas.floatingSpace.inMapMode === true) { + position = canvas.floatingSpace.transformPointToMap(position) + } + + let radius = thisObject.container.frame.radius * 1.75 + /* Label Text */ + let labelPoint + let fontSize = thisObject.payload.floatingObject.currentFontSize * 6 / 4 + let label + + if (radius > 6) { + const MAX_LABEL_LENGTH = 65 + + label = currentPercentage + + if (label !== undefined) { + if (label.length > MAX_LABEL_LENGTH) { + label = label.substring(0, MAX_LABEL_LENGTH) + '...' + } + + labelPoint = { + x: position.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO - 5, + y: position.y + radius * 7 / 5 + fontSize * FONT_ASPECT_RATIO + 15 + } + + browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY + browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TURQUOISE + ', 1)' + browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) + } + } + } + function addIndexNumber (label) { switch (thisObject.payload.node.type) { case 'Phase': { From 970541ed3f8f2774d26304205456a32849963c58 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 20 Mar 2020 11:02:19 +0100 Subject: [PATCH 153/166] logging improved --- FloatingSpace/UiObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index a1544d5b8..257623268 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -1276,7 +1276,7 @@ function newUiObject () { if (radius > 6) { const MAX_LABEL_LENGTH = 65 - label = currentPercentage + label = Number(currentPercentage).toFixed(0) + '%' if (label !== undefined) { if (label.length > MAX_LABEL_LENGTH) { From 365fdca92b795abf0c68fc50d35f2e5ed44cb022 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 20 Mar 2020 13:46:28 +0100 Subject: [PATCH 154/166] Process Status Working --- FloatingSpace/CircularProgressBar.js | 11 +++- FloatingSpace/FloatingObject.js | 8 +-- FloatingSpace/UiObject.js | 79 ++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/FloatingSpace/CircularProgressBar.js b/FloatingSpace/CircularProgressBar.js index 614f0c559..2fa62cfbb 100644 --- a/FloatingSpace/CircularProgressBar.js +++ b/FloatingSpace/CircularProgressBar.js @@ -55,8 +55,15 @@ function newCircularProgressBar () { if (thisObject.payload === undefined) { return } if (thisObject.payload.uiObject === undefined) { return } opacityCounters[message.event.seconds] = 2000 - thisObject.payload.uiObject.setValue(message.event.processingDate, 2000) - thisObject.payload.uiObject.setPercentage(message.event.percentage, 2000) + if (message.event.processingDate !== undefined) { + thisObject.payload.uiObject.setValue(message.event.processingDate, 2000) + } + if (message.event.percentage !== undefined) { + thisObject.payload.uiObject.setPercentage(message.event.percentage, 2000) + } + if (message.event.status !== undefined) { + thisObject.payload.uiObject.setStatus(message.event.status, 200000) + } } function getContainer (point) { diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index dd939259f..70dc25f4c 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -339,11 +339,11 @@ function newFloatingObject () { function thisObjectPhysics () { // The radius also have a target. - if (Math.abs(thisObject.container.frame.radius - thisObject.targetRadius) >= 15) { + if (Math.abs(thisObject.container.frame.radius - thisObject.targetRadius) >= 10) { if (thisObject.container.frame.radius < thisObject.targetRadius) { - thisObject.container.frame.radius = thisObject.container.frame.radius + 15 + thisObject.container.frame.radius = thisObject.container.frame.radius + 10 } else { - thisObject.container.frame.radius = thisObject.container.frame.radius - 15 + thisObject.container.frame.radius = thisObject.container.frame.radius - 10 } thisObject.container.eventHandler.raiseEvent('Dimmensions Changed', event) } @@ -479,7 +479,7 @@ function newFloatingObject () { thisObject.rawRadius = radius thisObject.targetRadius = radius - thisObject.container.frame.radius = radius / 3 + thisObject.container.frame.radius = radius / 5 thisObject.container.eventHandler.raiseEvent('Dimmensions Changed', event) } diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 257623268..af80bbdb0 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -33,6 +33,7 @@ function newUiObject () { setErrorMessage: setErrorMessage, setValue: setValue, setPercentage: setPercentage, + setStatus: setStatus, physics: physics, drawBackground: drawBackground, drawMiddleground: drawMiddleground, @@ -72,6 +73,9 @@ function newUiObject () { let hasPercentage let percentageCounter = 0 + let hasStatus + let statusCounter = 0 + let previousDistanceToChainParent let readyToChainAttachDisplayCounter = 5 let readyToChainAttachDisplayIncrement = 0.1 @@ -97,6 +101,7 @@ function newUiObject () { let errorMessage = '' let currentValue = 0 let currentPercentage = '' + let currentStatus = '' let rightDragging = false let eventSubscriptionIdHeartbeat @@ -284,6 +289,7 @@ function newUiObject () { errorMessagePhisycs() valuePhisycs() percentagePhisycs() + statusPhisycs() chainDetachingPhysics() chainAttachingPhysics() referenceDetachingPhysics() @@ -653,6 +659,14 @@ function newUiObject () { } } + function statusPhisycs () { + statusCounter-- + if (statusCounter < 0) { + statusCounter = 0 + hasStatus = false + } + } + function highlight () { isHighlighted = true highlightCounter = 30 @@ -691,6 +705,18 @@ function newUiObject () { } } + function setStatus (status, counter) { + if (status !== undefined) { + currentStatus = status + hasStatus = true + if (counter !== undefined) { + statusCounter = counter + } else { + statusCounter = 100 + } + } + } + function run (callBackFunction) { /* We setup the circular progress bar. */ if (thisObject.circularProgressBar !== undefined) { @@ -760,6 +786,9 @@ function newUiObject () { thisObject.circularProgressBar = undefined } thisObject.isRunning = false + hasValue = false + hasPercentage = false + hasStatus = false lastHeartBeat = undefined } } @@ -889,6 +918,7 @@ function newUiObject () { if (thisObject.isOnFocus === false) { drawValue() drawPercentage() + drawStatus() drawText() thisObject.uiObjectTitle.draw() } @@ -968,6 +998,7 @@ function newUiObject () { drawErrorMessage() drawValue() drawPercentage() + drawStatus() drawText() if (drawTitle === true) { @@ -1240,6 +1271,10 @@ function newUiObject () { label = label.substring(0, MAX_LABEL_LENGTH) + '...' } + if (label.length > 30) { + fontSize = fontSize / 2 + } + labelPoint = { x: position.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO - 5, y: position.y + radius * 7 / 5 + fontSize * FONT_ASPECT_RATIO + 15 @@ -1295,6 +1330,49 @@ function newUiObject () { } } + function drawStatus () { + if (hasStatus === false) { return } + if (canvas.floatingSpace.inMapMode === true) { return } + + let position = { + x: 0, + y: 0 + } + + position = thisObject.container.frame.frameThisPoint(position) + + if (canvas.floatingSpace.inMapMode === true) { + position = canvas.floatingSpace.transformPointToMap(position) + } + + let radius = thisObject.container.frame.radius * 1.4 + /* Label Text */ + let labelPoint + let fontSize = thisObject.payload.floatingObject.currentFontSize * 6 / 4 / 2 + let label + + if (radius > 6) { + const MAX_LABEL_LENGTH = 65 + + label = currentStatus + + if (label !== undefined) { + if (label.length > MAX_LABEL_LENGTH) { + label = label.substring(0, MAX_LABEL_LENGTH) + '...' + } + + labelPoint = { + x: position.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO - 15, + y: position.y - radius * 7 / 5 + fontSize * FONT_ASPECT_RATIO + 15 + } + + browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY + browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)' + browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y) + } + } + } + function addIndexNumber (label) { switch (thisObject.payload.node.type) { case 'Phase': { @@ -1614,3 +1692,4 @@ function newUiObject () { } } } + From 8c9c9c353bad92d8e3f2d246036debd2f92a3e12 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 20 Mar 2020 14:12:21 +0100 Subject: [PATCH 155/166] status implemented --- FloatingSpace/UiObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index af80bbdb0..ea74d27e8 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -1362,7 +1362,7 @@ function newUiObject () { } labelPoint = { - x: position.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO - 15, + x: position.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO - 10, y: position.y - radius * 7 / 5 + fontSize * FONT_ASPECT_RATIO + 15 } From 447c9d0eb568444eb852ccee95c72af3082b3462 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 20 Mar 2020 15:45:46 +0100 Subject: [PATCH 156/166] bug fixed --- DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js | 2 +- FloatingSpace/UiObject.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js b/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js index 96ad84d41..330c6d668 100644 --- a/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js +++ b/DesignSpace/Workspace/FunctionLibraries/TaskFunctions.js @@ -81,9 +81,9 @@ function newTaskFunctions () { taskId: node.id, taskName: node.name } - systemEventHandler.raiseEvent('Task Manager', 'Stop Task', event) node.payload.uiObject.stop(callBackFunction) + systemEventHandler.raiseEvent('Task Manager', 'Stop Task', event) if (node.bot === undefined) { return } if (node.bot.processes.length === 0) { return } diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index ea74d27e8..ebddc6dae 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -730,13 +730,13 @@ function newUiObject () { /* We will wait to hear the first onHeartBeat in order to confirm the execution was really started */ let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + '-' + thisObject.payload.node.id - systemEventHandler.listenToEvent(key, 'Heartbeat', undefined, 'UiObject', onResponse, onHeartBeat) + systemEventHandler.listenToEvent(key, 'Running', undefined, 'UiObject', onResponse, onRunning) function onResponse (message) { eventSubscriptionIdHeartbeat = message.eventSubscriptionId } - function onHeartBeat () { + function onRunning () { if (thisObject.payload === undefined) { return } lastHeartBeat = new Date() let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + '-' + thisObject.payload.node.id @@ -1276,7 +1276,7 @@ function newUiObject () { } labelPoint = { - x: position.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO - 5, + x: position.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO - 10, y: position.y + radius * 7 / 5 + fontSize * FONT_ASPECT_RATIO + 15 } From 5762fca26ba0631729468b9c89a1f0267711b418 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 10:36:31 +0100 Subject: [PATCH 157/166] Bug fixed --- FloatingSpace/CircularProgressBar.js | 2 ++ FloatingSpace/UiObject.js | 16 +++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/FloatingSpace/CircularProgressBar.js b/FloatingSpace/CircularProgressBar.js index 2fa62cfbb..5a9c64d8d 100644 --- a/FloatingSpace/CircularProgressBar.js +++ b/FloatingSpace/CircularProgressBar.js @@ -64,6 +64,8 @@ function newCircularProgressBar () { if (message.event.status !== undefined) { thisObject.payload.uiObject.setStatus(message.event.status, 200000) } + + thisObject.payload.uiObject.heartBeat() } function getContainer (point) { diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index ebddc6dae..b8c08a3e1 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -25,6 +25,7 @@ function newUiObject () { shortcutKey: undefined, run: run, stop: stop, + heartBeat: heartBeat, getReadyToChainAttach: getReadyToChainAttach, showAvailabilityToChainAttach: showAvailabilityToChainAttach, getReadyToReferenceAttach: getReadyToReferenceAttach, @@ -104,7 +105,7 @@ function newUiObject () { let currentStatus = '' let rightDragging = false - let eventSubscriptionIdHeartbeat + let eventSubscriptionIdOnRunning let eventSubscriptionIdOnStopped let lastHeartBeat let newUiObjectCounter = 25 @@ -115,7 +116,7 @@ function newUiObject () { function finalize () { let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + '-' + thisObject.payload.node.id - systemEventHandler.stopListening(key, eventSubscriptionIdHeartbeat, 'UiObject') + systemEventHandler.stopListening(key, eventSubscriptionIdOnRunning, 'UiObject') systemEventHandler.stopListening(key, eventSubscriptionIdOnStopped, 'UiObject') thisObject.container.eventHandler.stopListening(selfFocusEventSubscriptionId) @@ -717,6 +718,11 @@ function newUiObject () { } } + function heartBeat () { + lastHeartBeat = new Date() + thisObject.isRunning = true + } + function run (callBackFunction) { /* We setup the circular progress bar. */ if (thisObject.circularProgressBar !== undefined) { @@ -733,14 +739,14 @@ function newUiObject () { systemEventHandler.listenToEvent(key, 'Running', undefined, 'UiObject', onResponse, onRunning) function onResponse (message) { - eventSubscriptionIdHeartbeat = message.eventSubscriptionId + eventSubscriptionIdOnRunning = message.eventSubscriptionId } function onRunning () { if (thisObject.payload === undefined) { return } - lastHeartBeat = new Date() + let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + '-' + thisObject.payload.node.id - systemEventHandler.stopListening(key, eventSubscriptionIdHeartbeat, 'UiObject') + systemEventHandler.stopListening(key, eventSubscriptionIdOnRunning, 'UiObject') thisObject.isRunning = true From b37479af036403a5ed547f73c78e6eac1979cd52 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 11:17:18 +0100 Subject: [PATCH 158/166] Bug Fixes --- FloatingSpace/UiObject.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index b8c08a3e1..8e22ac890 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -108,6 +108,9 @@ function newUiObject () { let eventSubscriptionIdOnRunning let eventSubscriptionIdOnStopped let lastHeartBeat + let onRunningCallBackFunction + let onRunningCallBackFunctionWasCalled = false + let newUiObjectCounter = 25 let referenceLineCounter = 0 let chainLineCounter = 0 @@ -159,6 +162,8 @@ function newUiObject () { chainAttachToNode = undefined referenceAttachToNode = undefined lastHeartBeat = undefined + + onRunningCallBackFunction = undefined } function initialize (payload, menuItemsInitialValues) { @@ -721,6 +726,11 @@ function newUiObject () { function heartBeat () { lastHeartBeat = new Date() thisObject.isRunning = true + + if (onRunningCallBackFunctionWasCalled === false) { + onRunningCallBackFunctionWasCalled = true + onRunningCallBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) + } } function run (callBackFunction) { @@ -738,6 +748,8 @@ function newUiObject () { let key = thisObject.payload.node.name + '-' + thisObject.payload.node.type + '-' + thisObject.payload.node.id systemEventHandler.listenToEvent(key, 'Running', undefined, 'UiObject', onResponse, onRunning) + onRunningCallBackFunction = callBackFunction + function onResponse (message) { eventSubscriptionIdOnRunning = message.eventSubscriptionId } @@ -752,6 +764,7 @@ function newUiObject () { if (callBackFunction !== undefined) { callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) + onRunningCallBackFunctionWasCalled = true } } From 1f2e02ac79386cc96e131d3b381ab98658e7a5ba Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 11:57:04 +0100 Subject: [PATCH 159/166] bug fixed --- ChartingSpace/EdgeEditor.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index c8d47b7ea..f45fea578 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -274,8 +274,8 @@ function newEdgeEditor () { thisObject.container.frame.position.x = 0 thisObject.container.frame.position.y = 0 - const MIN_WIDTH = 250 - const MIN_HEIGHT = 120 + const MIN_WIDTH = 200 + const MIN_HEIGHT = 100 switch (whereIsMouseOver) { case 'center': { @@ -493,8 +493,14 @@ function newEdgeEditor () { } function snapScalarToGrid (scalar) { + let sign + if (scalar < 0) { + sign = -1 + } else { + sign = 1 + } const GRID_SIZE = 10 - return Math.trunc(scalar / GRID_SIZE) * GRID_SIZE + GRID_SIZE / 2 + return Math.trunc(scalar / GRID_SIZE) * GRID_SIZE + GRID_SIZE / 2 * sign } } From d2b0395775284d3977fe20210d020ded30fc3139 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 12:10:48 +0100 Subject: [PATCH 160/166] Update CodeEditor.js --- FloatingSpace/CodeEditor.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FloatingSpace/CodeEditor.js b/FloatingSpace/CodeEditor.js index 833c1d5c1..37dc5d2c5 100644 --- a/FloatingSpace/CodeEditor.js +++ b/FloatingSpace/CodeEditor.js @@ -129,8 +129,8 @@ function newCodeEditor () { thisObject.container.frame.position.x = 0 thisObject.container.frame.position.y = 0 - thisObject.container.frame.width = thisObject.container.frame.radius * 1.8 * 2 - thisObject.container.frame.height = thisObject.container.frame.radius * 1 * 2 + thisObject.container.frame.width = thisObject.container.frame.radius * 1.8 * 1.5 + thisObject.container.frame.height = thisObject.container.frame.radius * 1 * 1.5 let textAreaPosition = { x: 0 - thisObject.container.frame.width / 2, @@ -162,7 +162,7 @@ function newCodeEditor () { position = thisObject.container.frame.frameThisPoint(position) - let radius = thisObject.container.frame.radius * 2 + let radius = thisObject.container.frame.radius * 1.5 if (radius > 0.5) { browserCanvasContext.beginPath() From b9cee5f2c7bafe4caf2d150dc8d09fb46cddbb60 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 12:37:58 +0100 Subject: [PATCH 161/166] Update CodeEditor.js --- FloatingSpace/CodeEditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/CodeEditor.js b/FloatingSpace/CodeEditor.js index 37dc5d2c5..e88d72a87 100644 --- a/FloatingSpace/CodeEditor.js +++ b/FloatingSpace/CodeEditor.js @@ -130,7 +130,7 @@ function newCodeEditor () { thisObject.container.frame.position.y = 0 thisObject.container.frame.width = thisObject.container.frame.radius * 1.8 * 1.5 - thisObject.container.frame.height = thisObject.container.frame.radius * 1 * 1.5 + thisObject.container.frame.height = thisObject.container.frame.radius * 1 * 1.4 let textAreaPosition = { x: 0 - thisObject.container.frame.width / 2, From 39b1984998c9d3b18131382e1872b5a01ec0f39e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 15:02:39 +0100 Subject: [PATCH 162/166] new title --- FloatingSpace/FloatingObject.js | 2 +- FloatingSpace/UiObjectTitle.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index 70dc25f4c..cd4f32a8f 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -321,7 +321,7 @@ function newFloatingObject () { thisObject.payload.distance = distanceToParent - if (distanceToParent > 2000 || thisObject.isPinned === true) { return } // this is introduced to avoid edges cases when importing workspaces. + if (distanceToParent > 3000 || thisObject.isPinned === true) { return } // this is introduced to avoid edges cases when importing workspaces. newPosition = { x: parent.payload.position.x + distanceToParent * Math.cos(toRadians(thisObject.payload.angle)), diff --git a/FloatingSpace/UiObjectTitle.js b/FloatingSpace/UiObjectTitle.js index 78d4d66e1..cb723a0b0 100644 --- a/FloatingSpace/UiObjectTitle.js +++ b/FloatingSpace/UiObjectTitle.js @@ -136,6 +136,20 @@ function newUiObjectTitle () { } break } + case 'Use Reference Parent Parent Parent': { + let nodeToUse = thisObject.payload.node.payload.referenceParent + if (nodeToUse !== undefined && nodeToUse.payload !== undefined) { + nodeToUse = thisObject.payload.node.payload.referenceParent.payload.parentNode + if (nodeToUse !== undefined && nodeToUse.payload !== undefined) { + nodeToUse = thisObject.payload.node.payload.referenceParent.payload.parentNode.payload.parentNode + if (nodeToUse !== undefined && nodeToUse.payload !== undefined) { + thisObject.payload.title = thisObject.payload.title + separator + nodeToUse.payload.title + thisObject.payload.node.name = thisObject.payload.node.name + separator + nodeToUse.payload.node.name + } + } + } + break + } default: { if (titleReference.indexOf('Use Child @') === 0) { let propertyName = titleReference.substring(titleReference.indexOf('@') + 1, titleReference.length) From bcdb3c0f1c1d19f96caef8357d76346e2d7c1559 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 19:15:51 +0100 Subject: [PATCH 163/166] Update UiObject.js --- FloatingSpace/UiObject.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FloatingSpace/UiObject.js b/FloatingSpace/UiObject.js index 8e22ac890..67c1d812f 100644 --- a/FloatingSpace/UiObject.js +++ b/FloatingSpace/UiObject.js @@ -729,7 +729,9 @@ function newUiObject () { if (onRunningCallBackFunctionWasCalled === false) { onRunningCallBackFunctionWasCalled = true - onRunningCallBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) + if (onRunningCallBackFunction !== undefined) { + onRunningCallBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) + } } } From b67b916ff25b7c7ad82abc991b210c1705981486 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 19:31:38 +0100 Subject: [PATCH 164/166] Update EdgeEditor.js --- ChartingSpace/EdgeEditor.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/ChartingSpace/EdgeEditor.js b/ChartingSpace/EdgeEditor.js index f45fea578..43329b0c0 100644 --- a/ChartingSpace/EdgeEditor.js +++ b/ChartingSpace/EdgeEditor.js @@ -197,6 +197,18 @@ function newEdgeEditor () { return } + if (event.shiftKey === false && event.code === 'ArrowUp') { + thisObject.container.frame.position.y = thisObject.container.frame.position.y + STEP + whatHappened = 'up or down arrow key pressed' + return + } + + if (event.shiftKey === false && event.code === 'ArrowDown') { + thisObject.container.frame.position.y = thisObject.container.frame.position.y - STEP + whatHappened = 'up or down arrow key pressed' + return + } + if (event.shiftKey === true && (event.ctrlKey === true || event.metaKey === true) && (event.key === 'A' || event.key === 'a')) { resetAspectRatio() return @@ -309,6 +321,7 @@ function newEdgeEditor () { } coordinateSystem.recalculateScale(event) } + break case 'left or right arrow key pressed': { let point = { x: -dragVector.x, @@ -325,6 +338,24 @@ function newEdgeEditor () { } coordinateSystem.recalculateScale(event) } + break + case 'up or down arrow key pressed': { + let point = { + x: 0, + y: -dragVector.y + } + + let newMaxRate = getRateFromPointAtContainer(point, thisObject.container.parentContainer, coordinateSystem) + let yDifferenceMaxMin = coordinateSystem.max.y - coordinateSystem.min.y + coordinateSystem.min.y = newMaxRate - yDifferenceMaxMin + coordinateSystem.max.y = newMaxRate + let event = { + type: 'center dragged', + dragVector: dragVector + } + coordinateSystem.recalculateScale(event) + } + break } thisObject.container.parentContainer.eventHandler.raiseEvent('onMouseOver', mouse.position) break From c9598eb41ce43135661dee24e84f85700a8b9d8d Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 21 Mar 2020 19:41:10 +0100 Subject: [PATCH 165/166] Bug fixed --- ChartingSpace/Viewport.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChartingSpace/Viewport.js b/ChartingSpace/Viewport.js index a8107ed42..27f59ef1c 100644 --- a/ChartingSpace/Viewport.js +++ b/ChartingSpace/Viewport.js @@ -397,7 +397,7 @@ function newViewport () { } function newZoomLevel (level) { - thisObject.zoomLevel = level + thisObject.zoomLevel = Math.round(level) thisObject.zoomTargetLevel = level INITIAL_TIME_PERIOD = recalculatePeriod(level) saveObjectState() From 612f835fea8cf7bd2f6bbbd0b85823ae50898bdd Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 22 Mar 2020 14:27:31 +0100 Subject: [PATCH 166/166] Update UiObjectsFromNodes.js --- DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js index 3b6d3192b..772681f5c 100644 --- a/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js +++ b/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js @@ -159,7 +159,7 @@ function newUiObjectsFromNodes () { } let parentNodeDefinition = APP_SCHEMA_MAP.get(parentNode.type) - if (parentNodeDefinition !== undefined) { + if (parentNodeDefinition === undefined) { console.log('Cannot addUIOBject from parent of ' + type + ' because that type it is not defined at the APP_SCHEMA.') } /* Resolve Initial Values */