mirror of
https://gitgud.io/wackyideas/aerothemeplasma.git
synced 2026-06-19 03:45:50 +00:00
This is a big update which requires existing users to migrate their desktop setup (Plasmoids, their configurations, layout changes, etc.) to a new desktop session. This commit replaces the modified desktop shell (org.kde.plasma.desktop) with ATP's shell (io.gitgud.wackyideas.desktop) which requires new session options. This is similar to how plasma-bigscreen and plasma-mobile are used - logging into a separate session via the login manager (SDDM). ATP will provide sessions for both X11 and Wayland. This, along with now providing a forked panel as well, is a step forward regarding separating ATP's codebase and KDE's upstream code. Further goals are to be able to further isolate the ATP session from the regular KDE session in terms of shared configurations, etc. For existing users - Rerun install_plasmoids.sh and install_plasma_components.sh, you can delete the old shell (shells/org.kde.plasma.desktop) and panel plasmoid (plasmoids/org.kde.panel). As mentioned previously, panel and desktop layouts, plasmoids and their configurations will not be migrated to the newly available sessions, so they need to be set up manually.
159 lines
5.5 KiB
JavaScript
159 lines
5.5 KiB
JavaScript
/*
|
|
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);
|
|
// don't show applet if it chooses to be hidden but still make it
|
|
// accessible in the panelcontroller
|
|
// Due to the nature of how "visible" propagates in QML, we need to
|
|
// explicitly set it on the container (so the Layout ignores it)
|
|
// as well as the applet (so it reliably knows about), otherwise it can
|
|
// happen that an applet erroneously thinks it's visible, or suddenly
|
|
// starts thinking that way on teardown (virtual desktop pager)
|
|
// leading to crashes
|
|
var middle, new_element = {applet: appletItem}
|
|
|
|
appletItem.visible = Qt.binding(function() {
|
|
return applet.status !== PlasmaCore.Types.HiddenStatus || (!root.plasmoid.immutable && root.plasmoid.userConfiguring);
|
|
});
|
|
|
|
// Insert icons to the left of whatever is at the center (usually a Task Manager),
|
|
// if it exists.
|
|
// FIXME TODO: This is a real-world fix to produce a sensible initial position for
|
|
// launcher icons added by launcher menu applets. The basic approach has been used
|
|
// since Plasma 1. However, "add launcher to X" is a generic-enough concept and
|
|
// frequent-enough occurrence that we'd like to abstract it further in the future
|
|
// and get rid of the ugliness of parties external to the containment adding applets
|
|
// of a specific type, and the containment caring about the applet type. In a better
|
|
// system the containment would be informed of requested launchers, and determine by
|
|
// itself what it wants to do with that information.
|
|
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);
|
|
// Fall through to determining an appropriate insert position.
|
|
} 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)
|
|
|
|
//array, a cell for encoded item order
|
|
var itemsArray = configString.split(";");
|
|
|
|
//map applet id->order in panel
|
|
var idsOrder = new Object();
|
|
//map order in panel -> applet pointer
|
|
var appletsOrder = new Object();
|
|
|
|
for (var i = 0; i < itemsArray.length; i++) {
|
|
//property name: applet id
|
|
//property value: order
|
|
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];
|
|
//ones that weren't saved in AppletOrder go to the end
|
|
} else {
|
|
appletsOrder["unordered"+i] = root.plasmoid.applets[i];
|
|
}
|
|
}
|
|
|
|
//finally, restore the applets in the correct order
|
|
for (var i in appletsOrder) {
|
|
addApplet(appletsOrder[i], -1, -1)
|
|
}
|
|
//rewrite, so if in the orders there were now invalid ids or if some were missing creates a correct list instead
|
|
save();
|
|
}
|
|
|
|
function save() {
|
|
var ids = new Array();
|
|
for (var i = 0; i < layout.children.length; ++i) {
|
|
var child = layout.children[i];
|
|
if (child.hasOwnProperty("applet") && child.applet) {
|
|
ids.push(child.applet.plasmoid.id);
|
|
}
|
|
}
|
|
root.plasmoid.configuration.AppletOrder = ids.join(';');
|
|
root.plasmoid.configuration.writeConfig();
|
|
updateMargins();
|
|
}
|
|
|
|
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) {
|
|
// Only yields incorrect results for widgets smaller than the
|
|
// row/column spacing, which is luckly fairly unrealistic
|
|
x -= layout.rowSpacing
|
|
} else {
|
|
y -= 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;
|
|
// Setting oldX,oldY allows for position animations
|
|
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()
|
|
}
|