You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
2.9 KiB
JavaScript
141 lines
2.9 KiB
JavaScript
"use strict";
|
|
|
|
const xtend = require("xtend");
|
|
const nanoid = require("nanoid");
|
|
const immutable = require("immutable");
|
|
|
|
module.exports = function createWindowStore({onUpdated}) {
|
|
let windows = immutable.OrderedMap([]);
|
|
let floatingWindows = [];
|
|
let leftSidebarWindows = [];
|
|
let rightSidebarWindows = [];
|
|
let activeWindow;
|
|
let lastZIndex = 0;
|
|
|
|
function updateWindowIndexes() {
|
|
floatingWindows = windows.filter((window_) => window_.sidebar == null).toArray();
|
|
leftSidebarWindows = windows.filter((window_) => window_.sidebar === "left").toArray();
|
|
rightSidebarWindows = windows.filter((window_) => window_.sidebar === "right").toArray();
|
|
}
|
|
|
|
function setSide(id, side) {
|
|
setValues(id, {
|
|
sidebar: side
|
|
}, () => {
|
|
updateWindowIndexes();
|
|
});
|
|
}
|
|
|
|
function setValues(id, values, postProcessing) {
|
|
let targetWindow = windows.get(id);
|
|
|
|
Object.assign(targetWindow, values);
|
|
|
|
if (postProcessing != null) {
|
|
postProcessing(targetWindow);
|
|
}
|
|
|
|
onUpdated();
|
|
}
|
|
|
|
function setValuesWithoutUpdate(id, values) {
|
|
Object.assign( windows.get(id), values);
|
|
}
|
|
|
|
return {
|
|
add: function (window_) {
|
|
let id = nanoid();
|
|
|
|
windows = windows.set(id, xtend(window_, {
|
|
id: id,
|
|
x: window_.initialX,
|
|
y: window_.initialY,
|
|
userX: 0,
|
|
userY: 0,
|
|
width: window_.initialWidth,
|
|
height: window_.initialHeight,
|
|
sidebar: window_.sidebar
|
|
}));
|
|
|
|
updateWindowIndexes();
|
|
|
|
this.focus(id);
|
|
/* NOTE: We let .focus call onUpdated. QUESTION: Is this not deduplicated by React? */
|
|
|
|
return id;
|
|
},
|
|
focus: function (id) {
|
|
let targetWindow = windows.get(id);
|
|
|
|
windows.forEach((window_) => {
|
|
window_.isActive = false;
|
|
});
|
|
|
|
targetWindow.zIndex = lastZIndex++;
|
|
targetWindow.isActive = true;
|
|
activeWindow = targetWindow;
|
|
|
|
onUpdated();
|
|
},
|
|
setUserPosition: function (id, x, y) {
|
|
setValues(id, {
|
|
userX: x,
|
|
userY: y,
|
|
x: x,
|
|
y: y
|
|
});
|
|
},
|
|
setCurrentPosition: function (id, x, y) {
|
|
setValuesWithoutUpdate(id, {
|
|
x: x,
|
|
y: y
|
|
});
|
|
},
|
|
setDimensions: function (id, width, height) {
|
|
setValues(id, {
|
|
width: width,
|
|
height: height
|
|
});
|
|
},
|
|
markMoving: function (id, isMoving) {
|
|
setValues(id, {
|
|
isMoving: isMoving
|
|
});
|
|
},
|
|
markResizing: function (id, isResizing) {
|
|
setValues(id, {
|
|
isResizing: isResizing
|
|
});
|
|
},
|
|
moveToSidebar: function (id, side) {
|
|
setSide(id, side);
|
|
},
|
|
makeFloating: function (id) {
|
|
setSide(id, null);
|
|
},
|
|
close: function (id) {
|
|
windows = windows.delete(id);
|
|
updateWindowIndexes();
|
|
onUpdated();
|
|
},
|
|
get: function (id) {
|
|
return windows.get(id);
|
|
},
|
|
getAll: function () {
|
|
return windows;
|
|
},
|
|
getFloating: function () {
|
|
return floatingWindows;
|
|
},
|
|
getLeftSidebar: function () {
|
|
return leftSidebarWindows;
|
|
},
|
|
getRightSidebar: function () {
|
|
return rightSidebarWindows;
|
|
},
|
|
getActiveWindow: function () {
|
|
return activeWindow;
|
|
}
|
|
};
|
|
};
|