mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-05 13:08:29 -04:00
frame: merge bars with frame window and get things on Top layer by
default
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
pragma ComponentBehavior: Bound
|
||||
|
||||
import QtQuick
|
||||
import qs.Common
|
||||
import qs.Modules.DankBar
|
||||
import qs.Services
|
||||
|
||||
// Renders the bar(s) inside the frame surface in connected mode: one DankBarBody per
|
||||
// active bar edge, positioned in the frame's cutout band. Reuses the existing DankBar
|
||||
// item (per bar config) as rootWindow so colour-picker, overview loader and widget
|
||||
// models are shared with the standalone path.
|
||||
Item {
|
||||
id: host
|
||||
|
||||
required property var frameWindow
|
||||
required property var targetScreen
|
||||
|
||||
readonly property string screenName: targetScreen ? targetScreen.name : ""
|
||||
|
||||
readonly property var barSlots: {
|
||||
SettingsData.barConfigs;
|
||||
const out = [];
|
||||
const configs = SettingsData.barConfigs || [];
|
||||
for (let i = 0; i < configs.length; i++) {
|
||||
const bc = configs[i];
|
||||
if (!bc.enabled || (bc.useOverlayLayer ?? false))
|
||||
continue;
|
||||
const prefs = bc.screenPreferences || ["all"];
|
||||
if (!prefs.includes("all") && !SettingsData.isScreenInPreferences(host.targetScreen, prefs))
|
||||
continue;
|
||||
let edge = "top";
|
||||
switch (bc.position ?? 0) {
|
||||
case SettingsData.Position.Bottom:
|
||||
edge = "bottom";
|
||||
break;
|
||||
case SettingsData.Position.Left:
|
||||
edge = "left";
|
||||
break;
|
||||
case SettingsData.Position.Right:
|
||||
edge = "right";
|
||||
break;
|
||||
}
|
||||
out.push({
|
||||
"barId": bc.id,
|
||||
"edge": edge
|
||||
});
|
||||
}
|
||||
// Horizontal bars own the corners, so render them last (on top) — their edge widget
|
||||
// must receive the corner click over the vertical bar's hover area beneath it.
|
||||
out.sort((a, b) => {
|
||||
const rank = e => (e === "left" || e === "right") ? 0 : 1;
|
||||
return rank(a.edge) - rank(b.edge);
|
||||
});
|
||||
return out;
|
||||
}
|
||||
|
||||
Repeater {
|
||||
model: host.barSlots
|
||||
|
||||
delegate: Item {
|
||||
id: slot
|
||||
|
||||
required property var modelData
|
||||
|
||||
readonly property string edge: modelData.edge
|
||||
readonly property var dankBarItem: BarWidgetService.dankBarItems[modelData.barId] ?? null
|
||||
readonly property var slotBarConfig: dankBarItem?.barConfig ?? SettingsData.getBarConfig(modelData.barId)
|
||||
|
||||
// Each bar spans its full edge (matching the standalone window extent) so
|
||||
// DankBarContent's own adjacency margins inset it, rather than double-insetting
|
||||
// against a pre-carved strip.
|
||||
x: edge === "right" ? host.frameWindow._windowRegionWidth - host.frameWindow.cutoutRightInset : 0
|
||||
y: edge === "bottom" ? host.frameWindow._windowRegionHeight - host.frameWindow.cutoutBottomInset : 0
|
||||
width: {
|
||||
switch (edge) {
|
||||
case "left":
|
||||
return host.frameWindow.cutoutLeftInset;
|
||||
case "right":
|
||||
return host.frameWindow.cutoutRightInset;
|
||||
default:
|
||||
return host.frameWindow._windowRegionWidth;
|
||||
}
|
||||
}
|
||||
height: {
|
||||
switch (edge) {
|
||||
case "top":
|
||||
return host.frameWindow.cutoutTopInset;
|
||||
case "bottom":
|
||||
return host.frameWindow.cutoutBottomInset;
|
||||
default:
|
||||
return host.frameWindow._windowRegionHeight;
|
||||
}
|
||||
}
|
||||
|
||||
Loader {
|
||||
anchors.fill: parent
|
||||
active: slot.dankBarItem !== null && slot.slotBarConfig !== null
|
||||
|
||||
sourceComponent: DankBarBody {
|
||||
hostWindow: host.frameWindow
|
||||
modelData: host.targetScreen
|
||||
rootWindow: slot.dankBarItem
|
||||
barConfig: slot.slotBarConfig
|
||||
leftWidgetsModel: slot.dankBarItem?.leftWidgetsModel ?? null
|
||||
centerWidgetsModel: slot.dankBarItem?.centerWidgetsModel ?? null
|
||||
rightWidgetsModel: slot.dankBarItem?.rightWidgetsModel ?? null
|
||||
|
||||
Component.onCompleted: BarWidgetService.registerFrameBar(host.screenName, this)
|
||||
Component.onDestruction: BarWidgetService.unregisterFrameBar(host.screenName, this)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user