SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
SPDX-FileCopyrightText: 2022 NiccolΓ² Venerandi <niccolo@venerandi.com>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
var layout;
var root;
var plasmoid;
var marginHighlights;
var appletsModel;
function addApplet(applet, x, y) {
let appletItem = root.itemFor(applet);
var middle, new_element = {applet: appletItem}
appletItem.visible = Qt.binding(function() {
return applet.status !== PlasmaCore.Types.HiddenStatus || (!root.plasmoid.immutable && root.plasmoid.userConfiguring) || root.plasmoid.corona.editMode;
});
if (applet.pluginName === "org.kde.plasma.icon" && x === 0 && y === 0 &&
(middle = currentLayout.childAt(root.width / 2, root.height / 2))) {
appletsModel.insert(middle.index, new_element);
} else if (x >= 0 && y >= 0) {
appletsModel.insert(indexAtCoordinates(x, y), new_element)
} else {
appletsModel.append(new_element);
}
updateMargins();
}
function restore() {
var configString = String(root.plasmoid.configuration.AppletOrder)
var itemsArray = configString.split(";");
var idsOrder = new Object();
var appletsOrder = new Object();
for (var i = 0; i < itemsArray.length; i++) {
idsOrder[itemsArray[i]] = i;
}
for (var i = 0; i < root.plasmoid.applets.length; ++i) {
if (idsOrder[root.plasmoid.applets[i].id] !== undefined) {
appletsOrder[idsOrder[root.plasmoid.applets[i].id]] = root.plasmoid.applets[i];
} else {
appletsOrder["unordered"+i] = root.plasmoid.applets[i];
}
}
for (var i in appletsOrder) {
addApplet(appletsOrder[i], -1, -1)
}
save();
}
function save() {
const ids = layout.children
.map(child => child?.applet?.plasmoid?.id)
.filter(id => id !== undefined)
root.plasmoid.configuration.AppletOrder = ids.join(';');
root.plasmoid.configuration.writeConfig();
updateMargins();
}
function reorderApplets(order) {
let containerById = {};
for (let i = 0; i < appletsModel.count; ++i) {
let container = appletsModel.get(i).applet.parent;
containerById[container.applet.Plasmoid.id] = container
}
let i = 0;
order.forEach((appletId) => {
if (appletId in containerById) {
move(containerById[appletId], i);
}
++i;
});
}
function childAtCoordinates(x, y) {
if (root.isHorizontal) {
y = layout.height / 2;
} else {
x = layout.width / 2;
}
* When adding a new panel, childAt will return lastSpacer, and that's where
* `index` property works.
*/
var child = layout.childAt(x, y);
while (!child) {
if (root.isHorizontal) {
x -= Math.max(1, layout.rowSpacing)
} else {
y -= Math.max(1, layout.columnSpacing)
}
if (x < 0 || y < 0) {
return 0;
}
child = layout.childAt(x, y);
}
return child
}
function indexAtCoordinates(x, y) {
let child = childAtCoordinates(x, y)
if ((root.plasmoid.formFactor === 3 && y < child.y + child.height/2) ||
(root.plasmoid.formFactor !== 3 && x < child.x + child.width/2)) {
return child.index;
} else {
return child.index+1;
}
}
function updateMargins() {
var inThickArea = false;
for (var i = 0; i < appletsModel.count; ++i) {
var child = appletsModel.get(i).applet.parent
if (child.dragging) {child = child.dragging}
child.inThickArea = inThickArea
if (child.isMarginSeparator) {
inThickArea = !inThickArea
}
}
}
function move(applet, end) {
var start = applet.index
var target = end - (start < end)
if (start == target) return;
for (let i = Math.min(start, end); i <= Math.max(start, end-1); i++) {
let el = layout.children[i]
el.oldX = el.x, el.oldY = el.y
}
appletsModel.move(start, target, 1)
save()
}