1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-28 15:32:50 -05:00

Modal/Popout layout alterations

This commit is contained in:
bbedward
2025-10-03 15:15:44 -04:00
parent 5da265bf0b
commit e95d3126b2
3 changed files with 81 additions and 68 deletions

View File

@@ -678,6 +678,10 @@ Singleton {
function withAlpha(c, a) { return Qt.rgba(c.r, c.g, c.b, a); } function withAlpha(c, a) { return Qt.rgba(c.r, c.g, c.b, a); }
function snap(value, dpr) {
return Math.round(value * dpr) / dpr
}
Process { Process {
id: matugenCheck id: matugenCheck
command: ["which", "matugen"] command: ["which", "matugen"]

View File

@@ -157,8 +157,7 @@ PanelWindow {
radius: root.cornerRadius radius: root.cornerRadius
border.color: root.borderColor border.color: root.borderColor
border.width: root.borderWidth border.width: root.borderWidth
layer.enabled: root.enableShadow layer.enabled: true
opacity: root.shouldBeVisible ? 1 : 0
transform: root.animationType === "slide" ? slideTransform : null transform: root.animationType === "slide" ? slideTransform : null
Translate { Translate {
@@ -176,13 +175,6 @@ PanelWindow {
asynchronous: false asynchronous: false
} }
Behavior on opacity {
NumberAnimation {
duration: root.animationDuration
easing.type: root.animationEasing
}
}
layer.effect: MultiEffect { layer.effect: MultiEffect {
shadowEnabled: true shadowEnabled: true
shadowHorizontalOffset: 0 shadowHorizontalOffset: 0
@@ -190,6 +182,15 @@ PanelWindow {
shadowBlur: 1 shadowBlur: 1
shadowColor: Theme.shadowStrong shadowColor: Theme.shadowStrong
shadowOpacity: 0.3 shadowOpacity: 0.3
source: contentContainer
opacity: root.shouldBeVisible ? 1 : 0
Behavior on opacity {
NumberAnimation {
duration: animationDuration
easing.type: animationEasing
}
}
} }
} }

View File

@@ -68,56 +68,69 @@ PanelWindow {
bottom: true bottom: true
} }
readonly property real screenWidth: root.screen.width
readonly property real screenHeight: root.screen.height
readonly property real dpr: root.screen.devicePixelRatio
readonly property real calculatedX: {
if (SettingsData.dankBarPosition === SettingsData.Position.Left) {
return triggerY
} else if (SettingsData.dankBarPosition === SettingsData.Position.Right) {
return screenWidth - triggerY - popupWidth
} else {
const centerX = triggerX + (triggerWidth / 2) - (popupWidth / 2)
return Math.max(Theme.popupDistance, Math.min(screenWidth - popupWidth - Theme.popupDistance, centerX))
}
}
readonly property real calculatedY: {
if (SettingsData.dankBarPosition === SettingsData.Position.Left || SettingsData.dankBarPosition === SettingsData.Position.Right) {
const centerY = triggerX + (triggerWidth / 2) - (popupHeight / 2)
return Math.max(Theme.popupDistance, Math.min(screenHeight - popupHeight - Theme.popupDistance, centerY))
} else if (SettingsData.dankBarPosition === SettingsData.Position.Bottom) {
return Math.max(Theme.popupDistance, Math.min(screenHeight - popupHeight - Theme.popupDistance, screenHeight - triggerY - popupHeight + Theme.popupDistance))
} else {
return Math.max(Theme.popupDistance, Math.min(screenHeight - popupHeight - Theme.popupDistance, triggerY + Theme.popupDistance))
}
}
readonly property real alignedWidth: Theme.snap(popupWidth, dpr)
readonly property real alignedHeight: Theme.snap(popupHeight, dpr)
readonly property real alignedX: Theme.snap(calculatedX, dpr)
readonly property real alignedY: Theme.snap(calculatedY, dpr)
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
enabled: shouldBeVisible enabled: shouldBeVisible
onClicked: mouse => { onClicked: mouse => {
var localPos = mapToItem(contentContainer, mouse.x, mouse.y) if (mouse.x < alignedX || mouse.x > alignedX + alignedWidth ||
if (localPos.x < 0 || localPos.x > contentContainer.width || localPos.y < 0 || localPos.y > contentContainer.height) { mouse.y < alignedY || mouse.y > alignedY + alignedHeight) {
backgroundClicked() backgroundClicked()
close() close()
} }
} }
} }
Item { Loader {
id: contentContainer id: contentLoader
// ! TODO - cannot figure out the proper fix for this, some texture artifacts with certain drivers screen scales x: alignedX
y: alignedY
width: alignedWidth
height: alignedHeight
active: root.visible
asynchronous: false
opacity: Quickshell.env("DMS_DISABLE_LAYER") === "true" ? (shouldBeVisible ? 1 : 0) : 1
layer.enabled: Quickshell.env("DMS_DISABLE_LAYER") !== "true" layer.enabled: Quickshell.env("DMS_DISABLE_LAYER") !== "true"
layer.effect: MultiEffect {
source: contentLoader
opacity: shouldBeVisible ? 1 : 0
readonly property real screenWidth: root.screen.width Behavior on opacity {
readonly property real screenHeight: root.screen.height NumberAnimation {
readonly property real gothOffset: SettingsData.dankBarGothCornersEnabled ? Theme.cornerRadius : 0 duration: animationDuration
readonly property real calculatedX: { easing.type: animationEasing
if (SettingsData.dankBarPosition === SettingsData.Position.Left) { }
return triggerY
} else if (SettingsData.dankBarPosition === SettingsData.Position.Right) {
return screenWidth - triggerY - popupWidth
} else {
const centerX = triggerX + (triggerWidth / 2) - (popupWidth / 2)
return Math.max(Theme.popupDistance, Math.min(screenWidth - popupWidth - Theme.popupDistance, centerX))
} }
} }
readonly property real calculatedY: {
if (SettingsData.dankBarPosition === SettingsData.Position.Left || SettingsData.dankBarPosition === SettingsData.Position.Right) {
const centerY = triggerX + (triggerWidth / 2) - (popupHeight / 2)
return Math.max(Theme.popupDistance, Math.min(screenHeight - popupHeight - Theme.popupDistance, centerY))
} else if (SettingsData.dankBarPosition === SettingsData.Position.Bottom) {
return Math.max(Theme.popupDistance, Math.min(screenHeight - popupHeight - Theme.popupDistance, screenHeight - triggerY - popupHeight + Theme.popupDistance))
} else {
return Math.max(Theme.popupDistance, Math.min(screenHeight - popupHeight - Theme.popupDistance, triggerY + Theme.popupDistance))
}
}
readonly property real dpr: root.screen.devicePixelRatio
function snap(v) { return Math.round(v * dpr) / dpr }
width: popupWidth
height: popupHeight
x: snap(calculatedX)
y: snap(calculatedY)
opacity: shouldBeVisible ? 1 : 0
scale: 1
Behavior on opacity { Behavior on opacity {
NumberAnimation { NumberAnimation {
@@ -125,26 +138,21 @@ PanelWindow {
easing.type: animationEasing easing.type: animationEasing
} }
} }
}
Loader { Item {
id: contentLoader x: alignedX
anchors.fill: parent y: alignedY
active: root.visible width: alignedWidth
asynchronous: false height: alignedHeight
} focus: true
Keys.onPressed: event => {
Item { if (event.key === Qt.Key_Escape) {
anchors.fill: parent close()
focus: true event.accepted = true
Keys.onPressed: event => { }
if (event.key === Qt.Key_Escape) {
close()
event.accepted = true
}
}
Component.onCompleted: forceActiveFocus()
onVisibleChanged: if (visible)
forceActiveFocus()
} }
Component.onCompleted: forceActiveFocus()
onVisibleChanged: if (visible) forceActiveFocus()
} }
} }