1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-05 21:15:38 -05:00

controlcenter: fix trigger position via IPC

This commit is contained in:
bbedward
2025-10-16 22:03:02 -04:00
parent b9d5deb2ae
commit c0d110cde0
4 changed files with 1415 additions and 1352 deletions

View File

@@ -25,7 +25,6 @@ import qs.Modules.DankBar.Popouts
import qs.Modules.Plugins
import qs.Services
Item {
id: root
@@ -80,7 +79,8 @@ Item {
}
onCurrentPositionChanged: {
if (!initialized) return
if (!initialized)
return
const component = sourceComponent
sourceComponent = null
@@ -111,7 +111,8 @@ Item {
}
onCurrentPositionChanged: {
if (!initialized) return
if (!initialized)
return
console.log("DEBUG: Dock position changed to:", currentPosition, "- recreating dock")
const comp = sourceComponent
@@ -494,6 +495,7 @@ Item {
dankDashPopoutLoader: dankDashPopoutLoader
notepadSlideoutVariants: notepadSlideoutVariants
hyprKeybindsModalLoader: hyprKeybindsModalLoader
dankBarLoader: dankBarLoader
}
Variants {

View File

@@ -14,6 +14,7 @@ Item {
required property var dankDashPopoutLoader
required property var notepadSlideoutVariants
required property var hyprKeybindsModalLoader
required property var dankBarLoader
IpcHandler {
function open() {
@@ -76,9 +77,8 @@ Item {
IpcHandler {
function open(): string {
root.controlCenterLoader.active = true
if (root.controlCenterLoader.item) {
root.controlCenterLoader.item.open()
if (root.dankBarLoader.item) {
root.dankBarLoader.item.triggerControlCenterOnFocusedScreen()
return "CONTROL_CENTER_OPEN_SUCCESS"
}
return "CONTROL_CENTER_OPEN_FAILED"
@@ -93,9 +93,8 @@ Item {
}
function toggle(): string {
root.controlCenterLoader.active = true
if (root.controlCenterLoader.item) {
root.controlCenterLoader.item.toggle()
if (root.dankBarLoader.item) {
root.dankBarLoader.item.triggerControlCenterOnFocusedScreen()
return "CONTROL_CENTER_TOGGLE_SUCCESS"
}
return "CONTROL_CENTER_TOGGLE_FAILED"

View File

@@ -108,8 +108,7 @@ DankPopout {
return Qt.rgba(surface.r, surface.g, surface.b, transparency)
}
radius: Theme.cornerRadius
border.color: Qt.rgba(Theme.outline.r, Theme.outline.g,
Theme.outline.b, 0.08)
border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08)
border.width: 0
antialiasing: true
smooth: true
@@ -166,9 +165,9 @@ DankPopout {
root.toggleSection(widgetData.id)
}
}
onRemoveWidget: (index) => widgetModel.removeWidget(index)
onRemoveWidget: index => widgetModel.removeWidget(index)
onMoveWidget: (fromIndex, toIndex) => widgetModel.moveWidget(fromIndex, toIndex)
onToggleWidgetSize: (index) => widgetModel.toggleWidgetSize(index)
onToggleWidgetSize: index => widgetModel.toggleWidgetSize(index)
onCollapseRequested: root.collapseAll()
}
@@ -177,12 +176,13 @@ DankPopout {
visible: editMode
popoutContent: controlContent
availableWidgets: {
if (!editMode) return []
if (!editMode)
return []
const existingIds = (SettingsData.controlCenterWidgets || []).map(w => w.id)
const allWidgets = widgetModel.baseWidgetDefinitions.concat(widgetModel.getPluginWidgets())
return allWidgets.filter(w => w.allowMultiple || !existingIds.includes(w.id))
}
onAddWidget: (widgetId) => widgetModel.addWidget(widgetId)
onAddWidget: widgetId => widgetModel.addWidget(widgetId)
onResetToDefault: () => widgetModel.resetToDefault()
onClearAll: () => widgetModel.clearAll()
}

View File

@@ -20,14 +20,64 @@ import qs.Widgets
Item {
id: root
signal colorPickerRequested()
signal colorPickerRequested
property alias barVariants: barVariants
function triggerControlCenterOnFocusedScreen() {
let focusedScreenName = ""
if (CompositorService.isHyprland && Hyprland.focusedWorkspace && Hyprland.focusedWorkspace.monitor) {
focusedScreenName = Hyprland.focusedWorkspace.monitor.name
} else if (CompositorService.isNiri && NiriService.currentOutput) {
focusedScreenName = NiriService.currentOutput
}
if (!focusedScreenName && barVariants.instances.length > 0) {
const firstBar = barVariants.instances[0]
firstBar.triggerControlCenter()
return true
}
for (var i = 0; i < barVariants.instances.length; i++) {
const barInstance = barVariants.instances[i]
if (barInstance.modelData && barInstance.modelData.name === focusedScreenName) {
barInstance.triggerControlCenter()
return true
}
}
return false
}
Variants {
id: barVariants
model: SettingsData.getFilteredScreens("dankBar")
delegate: PanelWindow {
id: barWindow
property var controlCenterButtonRef: null
function triggerControlCenter() {
controlCenterLoader.active = true
if (!controlCenterLoader.item) {
return
}
if (controlCenterButtonRef && controlCenterLoader.item.setTriggerPosition) {
const globalPos = controlCenterButtonRef.mapToGlobal(0, 0)
const pos = SettingsData.getPopupTriggerPosition(globalPos, barWindow.screen, barWindow.effectiveBarThickness, controlCenterButtonRef.width)
const section = controlCenterButtonRef.section || "right"
controlCenterLoader.item.setTriggerPosition(pos.x, pos.y, pos.width, section, barWindow.screen)
} else {
controlCenterLoader.item.triggerScreen = barWindow.screen
}
controlCenterLoader.item.toggle()
if (controlCenterLoader.item.shouldBeVisible && NetworkService.wifiEnabled) {
NetworkService.scanWifi()
}
}
readonly property var dBarLayer: {
switch (Quickshell.env("DMS_DANKBAR_LAYER")) {
case "bottom":
@@ -46,32 +96,30 @@ Item {
property var modelData: item
signal colorPickerRequested()
signal colorPickerRequested
onColorPickerRequested: root.colorPickerRequested()
AxisContext {
id: axis
edge: {
switch (SettingsData.dankBarPosition) {
case SettingsData.Position.Top:
return "top";
return "top"
case SettingsData.Position.Bottom:
return "bottom";
return "bottom"
case SettingsData.Position.Left:
return "left";
return "left"
case SettingsData.Position.Right:
return "right";
return "right"
default:
return "top";
return "top"
}
}
}
readonly property bool isVertical: axis.isVertical
property bool gothCornersEnabled: SettingsData.dankBarGothCornersEnabled
property real wingtipsRadius: Theme.cornerRadius
readonly property real _wingR: Math.max(0, wingtipsRadius)
@@ -81,11 +129,13 @@ Item {
readonly property real _dpr: {
if (CompositorService.isNiri && barWindow.screen) {
const niriScale = NiriService.displayScales[barWindow.screen.name]
if (niriScale !== undefined) return niriScale
if (niriScale !== undefined)
return niriScale
}
if (CompositorService.isHyprland && barWindow.screen) {
const hyprlandMonitor = Hyprland.monitors.values.find(m => m.name === barWindow.screen.name)
if (hyprlandMonitor?.scale !== undefined) return hyprlandMonitor.scale
if (hyprlandMonitor?.scale !== undefined)
return hyprlandMonitor.scale
}
return (barWindow.screen?.devicePixelRatio) || 1
}
@@ -260,9 +310,7 @@ Item {
readonly property bool inOverviewWithShow: CompositorService.isNiri && NiriService.inOverview && SettingsData.dankBarOpenOnOverview
readonly property bool effectiveVisible: SettingsData.dankBarVisible || inOverviewWithShow
readonly property bool showing: effectiveVisible && (topBarCore.reveal
|| inOverviewWithShow
|| !topBarCore.autoHide)
readonly property bool showing: effectiveVisible && (topBarCore.reveal || inOverviewWithShow || !topBarCore.autoHide)
readonly property int maskThickness: showing ? barThickness : 1
@@ -271,9 +319,12 @@ Item {
return 0
} else {
switch (SettingsData.dankBarPosition) {
case SettingsData.Position.Left: return 0
case SettingsData.Position.Right: return parent.width - maskThickness
default: return 0
case SettingsData.Position.Left:
return 0
case SettingsData.Position.Right:
return parent.width - maskThickness
default:
return 0
}
}
}
@@ -282,9 +333,12 @@ Item {
return 0
} else {
switch (SettingsData.dankBarPosition) {
case SettingsData.Position.Top: return 0
case SettingsData.Position.Bottom: return parent.height - maskThickness
default: return 0
case SettingsData.Position.Top:
return 0
case SettingsData.Position.Bottom:
return parent.height - maskThickness
default:
return 0
}
}
}
@@ -349,8 +403,8 @@ Item {
"prop": "shouldBeVisible"
}]
return loaders.some(item => {
if (item.loader) {
return item.loader?.item?.[item.prop]
if (item.loader && item.loader.item) {
return item.loader.item[item.prop]
}
return false
})
@@ -512,7 +566,7 @@ Item {
readonly property var componentMap: {
// This property depends on componentMapRevision to ensure it updates when plugins change
componentMapRevision;
componentMapRevision
let baseMap = {
"launcherButton": launcherButtonComponent,
@@ -554,33 +608,33 @@ Item {
}
readonly property var allComponents: ({
launcherButtonComponent: launcherButtonComponent,
workspaceSwitcherComponent: workspaceSwitcherComponent,
focusedWindowComponent: focusedWindowComponent,
runningAppsComponent: runningAppsComponent,
clockComponent: clockComponent,
mediaComponent: mediaComponent,
weatherComponent: weatherComponent,
systemTrayComponent: systemTrayComponent,
privacyIndicatorComponent: privacyIndicatorComponent,
clipboardComponent: clipboardComponent,
cpuUsageComponent: cpuUsageComponent,
memUsageComponent: memUsageComponent,
diskUsageComponent: diskUsageComponent,
cpuTempComponent: cpuTempComponent,
gpuTempComponent: gpuTempComponent,
notificationButtonComponent: notificationButtonComponent,
batteryComponent: batteryComponent,
controlCenterButtonComponent: controlCenterButtonComponent,
idleInhibitorComponent: idleInhibitorComponent,
spacerComponent: spacerComponent,
separatorComponent: separatorComponent,
networkComponent: networkComponent,
keyboardLayoutNameComponent: keyboardLayoutNameComponent,
vpnComponent: vpnComponent,
notepadButtonComponent: notepadButtonComponent,
colorPickerComponent: colorPickerComponent,
systemUpdateComponent: systemUpdateComponent
"launcherButtonComponent": launcherButtonComponent,
"workspaceSwitcherComponent": workspaceSwitcherComponent,
"focusedWindowComponent": focusedWindowComponent,
"runningAppsComponent": runningAppsComponent,
"clockComponent": clockComponent,
"mediaComponent": mediaComponent,
"weatherComponent": weatherComponent,
"systemTrayComponent": systemTrayComponent,
"privacyIndicatorComponent": privacyIndicatorComponent,
"clipboardComponent": clipboardComponent,
"cpuUsageComponent": cpuUsageComponent,
"memUsageComponent": memUsageComponent,
"diskUsageComponent": diskUsageComponent,
"cpuTempComponent": cpuTempComponent,
"gpuTempComponent": gpuTempComponent,
"notificationButtonComponent": notificationButtonComponent,
"batteryComponent": batteryComponent,
"controlCenterButtonComponent": controlCenterButtonComponent,
"idleInhibitorComponent": idleInhibitorComponent,
"spacerComponent": spacerComponent,
"separatorComponent": separatorComponent,
"networkComponent": networkComponent,
"keyboardLayoutNameComponent": keyboardLayoutNameComponent,
"vpnComponent": vpnComponent,
"notepadButtonComponent": notepadButtonComponent,
"colorPickerComponent": colorPickerComponent,
"systemUpdateComponent": systemUpdateComponent
})
Item {
@@ -694,8 +748,6 @@ Item {
}
}
Component {
id: clipboardComponent
@@ -1017,6 +1069,17 @@ Item {
}
parentScreen: barWindow.screen
widgetData: parent.widgetData
Component.onCompleted: {
barWindow.controlCenterButtonRef = this
}
Component.onDestruction: {
if (barWindow.controlCenterButtonRef === this) {
barWindow.controlCenterButtonRef = null
}
}
onClicked: {
controlCenterLoader.active = true
if (!controlCenterLoader.item) {
@@ -1135,7 +1198,6 @@ Item {
}
}
}
}
}
}