382 lines
17 KiB
JavaScript
382 lines
17 KiB
JavaScript
/*
|
|
|
|
The Panel Space y the place where all panels live, no matter who create them.
|
|
|
|
*/
|
|
function newFoundationsPanelSpace() {
|
|
let thisObject = {
|
|
visible: true,
|
|
container: undefined,
|
|
unHide: unHide,
|
|
hide: hide,
|
|
createNewPanel: createNewPanel,
|
|
destroyPanel: destroyPanel,
|
|
getPanel: getPanel,
|
|
physics: physics,
|
|
draw: draw,
|
|
panels: [],
|
|
getContainer: getContainer, // returns the inner most container that holds the point received by parameter.
|
|
initialize: initialize
|
|
}
|
|
|
|
let container = newContainer()
|
|
container.initialize()
|
|
thisObject.container = container
|
|
thisObject.container.isDraggeable = false
|
|
|
|
container.frame.containerName = 'Panels Space'
|
|
|
|
return thisObject
|
|
|
|
function initialize() {
|
|
|
|
/* The space does not create any Panels for itself, it just sits and waits others need panels. */
|
|
|
|
}
|
|
|
|
function createNewPanel(pType, pParameters, pOwner, pSession) {
|
|
let panel
|
|
|
|
switch (pType) {
|
|
|
|
case 'Layers Panel':
|
|
{
|
|
panel = newLayersPanel()
|
|
panel.fitFunction = UI.projects.foundations.spaces.chartingSpace.fitFunction
|
|
panel.container.isVisibleFunction = UI.projects.foundations.spaces.chartingSpace.isThisPointVisible
|
|
panel.type = 'Layers Panel'
|
|
break
|
|
}
|
|
case 'Plotter Panel':
|
|
{
|
|
let panelConfig = pParameters.panelNode.config
|
|
|
|
if (panelConfig.isLegacy !== true) {
|
|
panel = newPlotterPanel()
|
|
panel.fitFunction = UI.projects.foundations.spaces.chartingSpace.fitFunction
|
|
panel.container.isVisibleFunction = UI.projects.foundations.spaces.chartingSpace.isThisPointVisible
|
|
panel.session = pSession
|
|
panel.initialize(pParameters.panelNode)
|
|
} else {
|
|
panel = getNewPlotterPanel(pParameters.mine, pParameters.plotterCodeName, pParameters.moduleCodeName, panelConfig.codeName)
|
|
panel.fitFunction = UI.projects.foundations.spaces.chartingSpace.fitFunction
|
|
panel.container.isVisibleFunction = UI.projects.foundations.spaces.chartingSpace.isThisPointVisible
|
|
panel.session = pSession
|
|
panel.initialize()
|
|
}
|
|
panel.type = 'Plotter Panel'
|
|
break
|
|
}
|
|
}
|
|
|
|
panel.owner = pOwner
|
|
thisObject.panels.push(panel)
|
|
|
|
panel.handle = newUniqueId()
|
|
|
|
return panel.handle
|
|
}
|
|
|
|
function unHide(owner, type) {
|
|
for (let i = 0; i < thisObject.panels.length; i++) {
|
|
let panel = thisObject.panels[i]
|
|
if (panel.owner === owner && panel.type === type) {
|
|
panel.isHidden = false
|
|
}
|
|
}
|
|
}
|
|
|
|
function hide(owner, type) {
|
|
for (let i = 0; i < thisObject.panels.length; i++) {
|
|
let panel = thisObject.panels[i]
|
|
if (panel.owner === owner && panel.type === type) {
|
|
panel.isHidden = true
|
|
}
|
|
}
|
|
}
|
|
|
|
function destroyPanel(pPanelHandle) {
|
|
for (let i = 0; i < thisObject.panels.length; i++) {
|
|
let panel = thisObject.panels[i]
|
|
|
|
if (panel.handle === pPanelHandle) {
|
|
if (panel.finalize !== undefined) {
|
|
panel.finalize()
|
|
}
|
|
|
|
thisObject.panels.splice(i, 1) // Delete item from array.
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
function getPanel(pPanelHandle) {
|
|
for (let i = 0; i < thisObject.panels.length; i++) {
|
|
let panel = thisObject.panels[i]
|
|
|
|
if (panel.handle === pPanelHandle) {
|
|
return panel
|
|
}
|
|
}
|
|
}
|
|
|
|
function physics() {
|
|
if (thisObject.visible !== true) { return }
|
|
|
|
childrenPhysics()
|
|
positioningPhysics()
|
|
}
|
|
|
|
function childrenPhysics() {
|
|
if (thisObject.panels !== undefined) {
|
|
for (let i = 0; i < thisObject.panels.length; i++) {
|
|
let panel = thisObject.panels[i]
|
|
let owner = UI.projects.foundations.spaces.chartingSpace.inViewport.get(panel.owner)
|
|
if (owner !== undefined) {
|
|
if (panel.physics !== undefined) {
|
|
panel.physics()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function positioningPhysics() {
|
|
if (thisObject.panels !== undefined) {
|
|
for (let i = 0; i < thisObject.panels.length; i++) {
|
|
let panel = thisObject.panels[i]
|
|
if (panel.isVisible === false || panel.isHidden === true) { continue }
|
|
/* setting the speed of the panel */
|
|
if (panel.container.speed === undefined) {
|
|
panel.container.speed = {
|
|
x: 2,
|
|
y: 2
|
|
}
|
|
}
|
|
|
|
/* Trying to move the panel and see if it is possible */
|
|
let centerPoint = {
|
|
x: panel.container.frame.position.x,
|
|
y: panel.container.frame.position.y
|
|
}
|
|
centerPoint.x = centerPoint.x + panel.container.frame.width / 2
|
|
centerPoint.y = centerPoint.y + panel.container.frame.height / 2
|
|
|
|
/* Lets see which quadrant the panel is at */
|
|
let verticalLine = (UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topRight.x - UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topLeft.x) / 2 + UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topLeft.x
|
|
let horizontalLine = (UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomRight.y - UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topRight.y) / 2 + UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topRight.y
|
|
|
|
if (panel.upDownButton !== undefined) {
|
|
if (panel.upDownButton.status === 'up') {
|
|
if (panel.leftRightButton !== undefined) {
|
|
if (panel.leftRightButton.status === 'left') {
|
|
panel.gravitatesTowards = 'topLeft'
|
|
} else {
|
|
panel.gravitatesTowards = 'topRight'
|
|
}
|
|
} else {
|
|
if (centerPoint.x < verticalLine) {
|
|
panel.gravitatesTowards = 'topLeft'
|
|
} else {
|
|
panel.gravitatesTowards = 'topRight'
|
|
}
|
|
}
|
|
} else {
|
|
if (panel.leftRightButton !== undefined) {
|
|
if (panel.leftRightButton.status === 'left') {
|
|
panel.gravitatesTowards = 'bottomLeft'
|
|
} else {
|
|
panel.gravitatesTowards = 'bottomRight'
|
|
}
|
|
} else {
|
|
if (centerPoint.x < verticalLine) {
|
|
panel.gravitatesTowards = 'bottomLeft'
|
|
} else {
|
|
panel.gravitatesTowards = 'bottomRight'
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (centerPoint.x < verticalLine && centerPoint.y < horizontalLine) {
|
|
panel.gravitatesTowards = 'topLeft'
|
|
}
|
|
if (centerPoint.x >= verticalLine && centerPoint.y < horizontalLine) {
|
|
panel.gravitatesTowards = 'topRight'
|
|
}
|
|
if (centerPoint.x < verticalLine && centerPoint.y >= horizontalLine) {
|
|
panel.gravitatesTowards = 'bottomLeft'
|
|
}
|
|
if (centerPoint.x >= verticalLine && centerPoint.y >= horizontalLine) {
|
|
panel.gravitatesTowards = 'bottomRight'
|
|
}
|
|
}
|
|
|
|
/* 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
|
|
}
|
|
} else {
|
|
panel.container.frame.position.x = panel.container.frame.position.x + panel.container.speed.x
|
|
isOverlapping(i, panel.container)
|
|
if (panel.container.frame.position.x + panel.container.frame.width > browserCanvas.width) {
|
|
panel.container.frame.position.x = browserCanvas.width - panel.container.frame.width
|
|
}
|
|
}
|
|
if (panel.container.frame.height <= UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomRight.y - UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topRight.y) {
|
|
if (panel.gravitatesTowards === 'topLeft' || panel.gravitatesTowards === 'topRight') {
|
|
panel.container.frame.position.y = panel.container.frame.position.y - panel.container.speed.y
|
|
isOverlapping(i, panel.container)
|
|
if (panel.container.frame.position.y < UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topLeft.y) {
|
|
panel.container.frame.position.y = UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topLeft.y
|
|
}
|
|
} else {
|
|
panel.container.frame.position.y = panel.container.frame.position.y + panel.container.speed.y
|
|
isOverlapping(i, panel.container)
|
|
if (panel.container.frame.position.y + panel.container.frame.height > UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomRight.y) {
|
|
panel.container.frame.position.y = UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomRight.y - panel.container.frame.height
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function isOverlapping(currentIndex, currentContainer) {
|
|
let corner1 = {
|
|
x: currentContainer.frame.position.x,
|
|
y: currentContainer.frame.position.y
|
|
}
|
|
let corner2 = {
|
|
x: currentContainer.frame.position.x + currentContainer.frame.width,
|
|
y: currentContainer.frame.position.y
|
|
}
|
|
let corner3 = {
|
|
x: currentContainer.frame.position.x + currentContainer.frame.width,
|
|
y: currentContainer.frame.position.y + currentContainer.frame.height
|
|
}
|
|
let corner4 = {
|
|
x: currentContainer.frame.position.x,
|
|
y: currentContainer.frame.position.y + currentContainer.frame.height
|
|
}
|
|
|
|
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)
|
|
}
|
|
if (isThisPointInsideThisFrame(corner2, panel.container.frame) === true) {
|
|
pushOut(currentContainer, panel.container, panel.gravitatesTowards)
|
|
}
|
|
if (isThisPointInsideThisFrame(corner3, panel.container.frame) === true) {
|
|
pushOut(currentContainer, panel.container, panel.gravitatesTowards)
|
|
}
|
|
if (isThisPointInsideThisFrame(corner4, panel.container.frame) === true) {
|
|
pushOut(currentContainer, panel.container, panel.gravitatesTowards)
|
|
}
|
|
}
|
|
}
|
|
|
|
function pushOut(currentContainer, controlContainer, corner) {
|
|
switch (corner) {
|
|
case 'topLeft': {
|
|
currentContainer.frame.position.x = controlContainer.frame.position.x + controlContainer.frame.width
|
|
break
|
|
}
|
|
case 'topRight': {
|
|
currentContainer.frame.position.x = controlContainer.frame.position.x - currentContainer.frame.width
|
|
break
|
|
}
|
|
case 'bottomLeft': {
|
|
currentContainer.frame.position.x = controlContainer.frame.position.x + controlContainer.frame.width
|
|
break
|
|
}
|
|
case 'bottomRight': {
|
|
currentContainer.frame.position.x = controlContainer.frame.position.x - currentContainer.frame.width
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
function isThisPointInsideThisFrame(point, frame) {
|
|
let corner1 = {
|
|
x: frame.position.x,
|
|
y: frame.position.y
|
|
}
|
|
let corner2 = {
|
|
x: frame.position.x + frame.width,
|
|
y: frame.position.y
|
|
}
|
|
let corner3 = {
|
|
x: frame.position.x + frame.width,
|
|
y: frame.position.y + frame.height
|
|
}
|
|
let corner4 = {
|
|
x: frame.position.x,
|
|
y: frame.position.y + frame.height
|
|
}
|
|
if (point.x >= corner1.x && point.y >= corner1.y && point.x <= corner3.x && point.y <= corner3.y) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
}
|
|
|
|
function draw() {
|
|
if (CAN_SPACES_DRAW === false) { return }
|
|
if (thisObject.visible !== true) { return }
|
|
|
|
thisObject.container.frame.draw(false, false)
|
|
|
|
for (let i = 0; i < thisObject.panels.length; i++) {
|
|
let panel = thisObject.panels[i]
|
|
let owner = UI.projects.foundations.spaces.chartingSpace.inViewport.get(panel.owner)
|
|
if (owner !== undefined) {
|
|
if (panel.isVisible === true && panel.isHidden === false) {
|
|
panel.draw()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function getContainer(point, purpose) {
|
|
if (thisObject.visible !== true) { return }
|
|
if (purpose === GET_CONTAINER_PURPOSE.DRAGGING && point.shiftKey !== false) {return}
|
|
|
|
let container
|
|
/*
|
|
We search for the container of panels in the opposite direction than we do it for drawing them,
|
|
so panels overlapping others are picked first although they are drawn last.
|
|
*/
|
|
for (let i = thisObject.panels.length - 1; i >= 0; i--) {
|
|
let panel = thisObject.panels[i]
|
|
let owner = UI.projects.foundations.spaces.chartingSpace.inViewport.get(panel.owner)
|
|
if (owner !== undefined) {
|
|
if (panel.isVisible === true && panel.isHidden === false) {
|
|
container = panel.getContainer(point, purpose)
|
|
}
|
|
}
|
|
if (container !== undefined) {
|
|
container.space = 'Panels Space'
|
|
return container
|
|
}
|
|
}
|
|
// thisObject.container.space = 'Panels Space'
|
|
// return thisObject.container
|
|
}
|
|
}
|