add crypto
This commit is contained in:
parent
90cbe489f6
commit
af6a3bce3e
120 changed files with 24616 additions and 462 deletions
35
modules/home/services/quickshell/qml/Layout/Bar.qml
Normal file
35
modules/home/services/quickshell/qml/Layout/Bar.qml
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
import QtQuick
|
||||
import QtQuick.Effects
|
||||
import "root:/Data" as Data
|
||||
import "root:/Widgets/System" as System
|
||||
import "root:/Widgets/Calendar" as Calendar
|
||||
|
||||
// Vertical sidebar layout
|
||||
Rectangle {
|
||||
id: bar
|
||||
|
||||
// Clean bar background
|
||||
color: Data.ThemeManager.bgColor
|
||||
|
||||
// Workspace indicator at top
|
||||
System.NiriWorkspaces {
|
||||
id: workspaceIndicator
|
||||
anchors {
|
||||
top: parent.top
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
horizontalCenterOffset: Data.Settings.borderWidth / 2
|
||||
topMargin: 20
|
||||
}
|
||||
}
|
||||
|
||||
// Clock at bottom
|
||||
Calendar.Clock {
|
||||
id: clockWidget
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
horizontalCenterOffset: Data.Settings.borderWidth / 2
|
||||
bottomMargin: 20
|
||||
}
|
||||
}
|
||||
}
|
||||
575
modules/home/services/quickshell/qml/Layout/Border.qml
Normal file
575
modules/home/services/quickshell/qml/Layout/Border.qml
Normal file
|
|
@ -0,0 +1,575 @@
|
|||
import QtQuick
|
||||
import QtQuick.Shapes
|
||||
import Qt5Compat.GraphicalEffects
|
||||
import QtQuick.Effects
|
||||
import "root:/Data" as Data
|
||||
|
||||
// Screen border with shadow effects
|
||||
Shape {
|
||||
id: borderShape
|
||||
|
||||
// Border dimensions
|
||||
property real borderWidth: Data.Settings.borderWidth
|
||||
property real radius: Data.Settings.cornerRadius
|
||||
property real innerX: borderWidth
|
||||
property real innerY: borderWidth
|
||||
property real innerWidth: borderShape.width - (borderWidth * 2)
|
||||
property real innerHeight: borderShape.height - (borderWidth * 2)
|
||||
|
||||
// Widget references for shadow positioning
|
||||
property var workspaceIndicator: null
|
||||
property var volumeOSD: null
|
||||
property var clockWidget: null
|
||||
|
||||
// Initialization state to prevent ShaderEffect warnings
|
||||
property bool effectsReady: false
|
||||
|
||||
// Burst effect properties - controlled by workspace indicator
|
||||
property real masterProgress: workspaceIndicator ? workspaceIndicator.masterProgress : 0.0
|
||||
property bool effectsActive: workspaceIndicator ? workspaceIndicator.effectsActive : false
|
||||
property color effectColor: workspaceIndicator ? workspaceIndicator.effectColor : Data.ThemeManager.accent
|
||||
|
||||
// Delay graphics effects until component is fully loaded
|
||||
Timer {
|
||||
id: initTimer
|
||||
interval: 100
|
||||
running: true
|
||||
onTriggered: borderShape.effectsReady = true
|
||||
}
|
||||
|
||||
// Burst effect overlays (DISABLED - using unified overlay)
|
||||
Item {
|
||||
id: burstEffects
|
||||
anchors.fill: parent
|
||||
visible: false // Disabled in favor of unified overlay
|
||||
z: 5
|
||||
}
|
||||
|
||||
// Individual widget shadows (positioned separately)
|
||||
|
||||
// Workspace indicator shadow
|
||||
Shape {
|
||||
id: workspaceDropShadow
|
||||
visible: borderShape.workspaceIndicator !== null
|
||||
x: borderShape.workspaceIndicator ? borderShape.workspaceIndicator.x : 0 // Exact match
|
||||
y: borderShape.workspaceIndicator ? borderShape.workspaceIndicator.y : 0
|
||||
width: borderShape.workspaceIndicator ? borderShape.workspaceIndicator.width : 0 // Exact match
|
||||
height: borderShape.workspaceIndicator ? borderShape.workspaceIndicator.height : 0
|
||||
z: -1
|
||||
|
||||
layer.enabled: borderShape.workspaceIndicator !== null
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: 1
|
||||
verticalOffset: 1
|
||||
radius: 12 + (effectsActive && Data.Settings.workspaceGlowEnabled ? Math.sin(masterProgress * Math.PI) * 4 : 0)
|
||||
samples: 25
|
||||
color: {
|
||||
if (!effectsActive)
|
||||
return Qt.rgba(0, 0, 0, 0.4);
|
||||
if (!Data.Settings.workspaceGlowEnabled)
|
||||
return Qt.rgba(0, 0, 0, 0.4);
|
||||
// Use accent color directly with reduced intensity
|
||||
const intensity = Math.sin(masterProgress * Math.PI) * 0.4;
|
||||
return Qt.rgba(effectColor.r * intensity + 0.08, effectColor.g * intensity + 0.08, effectColor.b * intensity + 0.08, 0.4 + intensity * 0.2);
|
||||
}
|
||||
cached: true
|
||||
spread: 0.2 + (effectsActive && Data.Settings.workspaceGlowEnabled ? Math.sin(masterProgress * Math.PI) * 0.15 : 0)
|
||||
}
|
||||
|
||||
ShapePath {
|
||||
strokeWidth: 0
|
||||
fillColor: "black"
|
||||
|
||||
startX: 12
|
||||
startY: 0
|
||||
|
||||
// Right side - standard rounded corners
|
||||
PathLine {
|
||||
x: workspaceDropShadow.width - 16
|
||||
y: 0
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: workspaceDropShadow.width
|
||||
y: 16
|
||||
radiusX: 16
|
||||
radiusY: 16
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: workspaceDropShadow.width
|
||||
y: workspaceDropShadow.height - 16
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: workspaceDropShadow.width - 16
|
||||
y: workspaceDropShadow.height
|
||||
radiusX: 16
|
||||
radiusY: 16
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: 12
|
||||
y: workspaceDropShadow.height
|
||||
}
|
||||
|
||||
// Left side - concave curves for border integration
|
||||
PathLine {
|
||||
x: 0
|
||||
y: workspaceDropShadow.height - 12
|
||||
}
|
||||
PathArc {
|
||||
x: 12
|
||||
y: workspaceDropShadow.height - 24
|
||||
radiusX: 12
|
||||
radiusY: 12
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: 12
|
||||
y: 24
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: 0
|
||||
y: 12
|
||||
radiusX: 12
|
||||
radiusY: 12
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
PathLine {
|
||||
x: 12
|
||||
y: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Volume OSD shadow
|
||||
Rectangle {
|
||||
id: volumeOsdDropShadow
|
||||
visible: borderShape.volumeOSD !== null && borderShape.volumeOSD.visible
|
||||
opacity: borderShape.volumeOSD ? borderShape.volumeOSD.opacity : 0
|
||||
x: parent.width - 45
|
||||
y: (parent.height - 250) / 2
|
||||
width: 45
|
||||
height: 250
|
||||
color: "black"
|
||||
topLeftRadius: 20
|
||||
bottomLeftRadius: 20
|
||||
topRightRadius: 0
|
||||
bottomRightRadius: 0
|
||||
z: -1
|
||||
|
||||
// Sync opacity animations with volume OSD
|
||||
Behavior on opacity {
|
||||
NumberAnimation {
|
||||
duration: 300
|
||||
easing.type: Easing.OutCubic
|
||||
}
|
||||
}
|
||||
|
||||
layer.enabled: borderShape.volumeOSD !== null
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: -1
|
||||
verticalOffset: 1
|
||||
radius: 12 // Much more subtle
|
||||
samples: 25
|
||||
color: Qt.rgba(0, 0, 0, 0.4) // Very light shadow
|
||||
cached: false
|
||||
spread: 0.2 // Minimal spread
|
||||
}
|
||||
}
|
||||
|
||||
// Clock shadow
|
||||
Rectangle {
|
||||
id: clockDropShadow
|
||||
visible: borderShape.clockWidget !== null
|
||||
x: borderShape.clockWidget ? borderShape.clockWidget.x : 0
|
||||
y: borderShape.clockWidget ? borderShape.clockWidget.y : 0
|
||||
width: borderShape.clockWidget ? borderShape.clockWidget.width : 0
|
||||
height: borderShape.clockWidget ? borderShape.clockWidget.height : 0
|
||||
color: "black"
|
||||
topLeftRadius: 0
|
||||
topRightRadius: borderShape.clockWidget ? borderShape.clockWidget.height / 2 : 16
|
||||
bottomLeftRadius: 0
|
||||
bottomRightRadius: 0
|
||||
z: -2 // Lower z-index to render behind border corners
|
||||
|
||||
layer.enabled: borderShape.clockWidget !== null
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: 1
|
||||
verticalOffset: -1
|
||||
radius: 12 // Much more subtle
|
||||
samples: 25
|
||||
color: Qt.rgba(0, 0, 0, 0.4) // Very light shadow
|
||||
cached: false
|
||||
spread: 0.2 // Minimal spread
|
||||
}
|
||||
}
|
||||
|
||||
// Shadow rendering source (hidden)
|
||||
Item {
|
||||
id: shadowSource
|
||||
anchors.fill: parent
|
||||
visible: false
|
||||
|
||||
Shape {
|
||||
id: borderShadowShape
|
||||
anchors.fill: parent
|
||||
|
||||
layer.enabled: true
|
||||
layer.samples: 4
|
||||
|
||||
ShapePath {
|
||||
fillColor: "black"
|
||||
strokeWidth: 0
|
||||
fillRule: ShapePath.OddEvenFill
|
||||
|
||||
// Outer rectangle (full screen)
|
||||
PathMove {
|
||||
x: 0
|
||||
y: 0
|
||||
}
|
||||
PathLine {
|
||||
x: shadowSource.width
|
||||
y: 0
|
||||
}
|
||||
PathLine {
|
||||
x: shadowSource.width
|
||||
y: shadowSource.height
|
||||
}
|
||||
PathLine {
|
||||
x: 0
|
||||
y: shadowSource.height
|
||||
}
|
||||
PathLine {
|
||||
x: 0
|
||||
y: 0
|
||||
}
|
||||
|
||||
// Inner rounded cutout creates border
|
||||
PathMove {
|
||||
x: borderShape.innerX + borderShape.radius
|
||||
y: borderShape.innerY
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: borderShape.innerX + borderShape.innerWidth - borderShape.radius
|
||||
y: borderShape.innerY
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: borderShape.innerX + borderShape.innerWidth
|
||||
y: borderShape.innerY + borderShape.radius
|
||||
radiusX: borderShape.radius
|
||||
radiusY: borderShape.radius
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: borderShape.innerX + borderShape.innerWidth
|
||||
y: borderShape.innerY + borderShape.innerHeight - borderShape.radius
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: borderShape.innerX + borderShape.innerWidth - borderShape.radius
|
||||
y: borderShape.innerY + borderShape.innerHeight
|
||||
radiusX: borderShape.radius
|
||||
radiusY: borderShape.radius
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: borderShape.innerX + borderShape.radius
|
||||
y: borderShape.innerY + borderShape.innerHeight
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: borderShape.innerX
|
||||
y: borderShape.innerY + borderShape.innerHeight - borderShape.radius
|
||||
radiusX: borderShape.radius
|
||||
radiusY: borderShape.radius
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: borderShape.innerX
|
||||
y: borderShape.innerY + borderShape.radius
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: borderShape.innerX + borderShape.radius
|
||||
y: borderShape.innerY
|
||||
radiusX: borderShape.radius
|
||||
radiusY: borderShape.radius
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Workspace indicator shadow with concave curves
|
||||
Shape {
|
||||
id: workspaceShadowShape
|
||||
visible: borderShape.workspaceIndicator !== null
|
||||
x: borderShape.workspaceIndicator ? borderShape.workspaceIndicator.x : 0 // Exact match
|
||||
y: borderShape.workspaceIndicator ? borderShape.workspaceIndicator.y : 0
|
||||
width: borderShape.workspaceIndicator ? borderShape.workspaceIndicator.width : 0 // Exact match
|
||||
height: borderShape.workspaceIndicator ? borderShape.workspaceIndicator.height : 0
|
||||
preferredRendererType: Shape.CurveRenderer
|
||||
|
||||
layer.enabled: borderShape.workspaceIndicator !== null
|
||||
layer.samples: 8
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: 2
|
||||
verticalOffset: 3
|
||||
radius: 25 + (effectsActive && Data.Settings.workspaceGlowEnabled ? Math.sin(masterProgress * Math.PI) * 6 : 0)
|
||||
samples: 40
|
||||
color: {
|
||||
if (!effectsActive)
|
||||
return Qt.rgba(0, 0, 0, 0.8);
|
||||
if (!Data.Settings.workspaceGlowEnabled)
|
||||
return Qt.rgba(0, 0, 0, 0.8);
|
||||
// Accent color glow with reduced intensity
|
||||
const intensity = Math.sin(masterProgress * Math.PI) * 0.3;
|
||||
return Qt.rgba(effectColor.r * intensity + 0.1, effectColor.g * intensity + 0.1, effectColor.b * intensity + 0.1, 0.6 + intensity * 0.15);
|
||||
}
|
||||
cached: false
|
||||
spread: 0.5 + (effectsActive && Data.Settings.workspaceGlowEnabled ? Math.sin(masterProgress * Math.PI) * 0.2 : 0)
|
||||
}
|
||||
|
||||
ShapePath {
|
||||
strokeWidth: 0
|
||||
fillColor: "black"
|
||||
strokeColor: "black"
|
||||
|
||||
startX: 12
|
||||
startY: 0
|
||||
|
||||
// Right side - standard rounded corners
|
||||
PathLine {
|
||||
x: workspaceShadowShape.width - 16
|
||||
y: 0
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: workspaceShadowShape.width
|
||||
y: 16
|
||||
radiusX: 16
|
||||
radiusY: 16
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: workspaceShadowShape.width
|
||||
y: workspaceShadowShape.height - 16
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: workspaceShadowShape.width - 16
|
||||
y: workspaceShadowShape.height
|
||||
radiusX: 16
|
||||
radiusY: 16
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: 12
|
||||
y: workspaceShadowShape.height
|
||||
}
|
||||
|
||||
// Left side - concave curves for border integration
|
||||
PathLine {
|
||||
x: 0
|
||||
y: workspaceShadowShape.height - 12
|
||||
}
|
||||
PathArc {
|
||||
x: 12
|
||||
y: workspaceShadowShape.height - 24
|
||||
radiusX: 12
|
||||
radiusY: 12
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: 12
|
||||
y: 24
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: 0
|
||||
y: 12
|
||||
radiusX: 12
|
||||
radiusY: 12
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
PathLine {
|
||||
x: 12
|
||||
y: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Volume OSD shadow
|
||||
Rectangle {
|
||||
id: volumeOsdShadowShape
|
||||
visible: borderShape.volumeOSD !== null && borderShape.volumeOSD.visible
|
||||
x: shadowSource.width - 45
|
||||
y: (shadowSource.height - 250) / 2
|
||||
width: 45
|
||||
height: 250
|
||||
color: "black"
|
||||
topLeftRadius: 20
|
||||
bottomLeftRadius: 20
|
||||
topRightRadius: 0
|
||||
bottomRightRadius: 0
|
||||
|
||||
layer.enabled: borderShape.volumeOSD !== null && borderShape.volumeOSD.visible
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: -2 // Shadow to the left for right-side widget
|
||||
verticalOffset: 3
|
||||
radius: 25
|
||||
samples: 40
|
||||
color: Qt.rgba(0, 0, 0, 0.8)
|
||||
cached: false
|
||||
spread: 0.5
|
||||
}
|
||||
}
|
||||
|
||||
// Clock shadow
|
||||
Rectangle {
|
||||
id: clockShadowShape
|
||||
visible: borderShape.clockWidget !== null
|
||||
x: borderShape.clockWidget ? borderShape.clockWidget.x : 0
|
||||
y: borderShape.clockWidget ? borderShape.clockWidget.y : 0
|
||||
width: borderShape.clockWidget ? borderShape.clockWidget.width : 0
|
||||
height: borderShape.clockWidget ? borderShape.clockWidget.height : 0
|
||||
color: "black"
|
||||
topLeftRadius: 0
|
||||
topRightRadius: borderShape.clockWidget ? borderShape.clockWidget.height / 2 : 16
|
||||
bottomLeftRadius: 0
|
||||
bottomRightRadius: 0
|
||||
|
||||
layer.enabled: borderShape.clockWidget !== null
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: 2
|
||||
verticalOffset: -2 // Shadow upward for bottom widget
|
||||
radius: 25
|
||||
samples: 40
|
||||
color: Qt.rgba(0, 0, 0, 0.8)
|
||||
cached: false
|
||||
spread: 0.5
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply shadow effect to entire border shape
|
||||
layer.enabled: true
|
||||
layer.samples: 8
|
||||
layer.smooth: true
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: 1
|
||||
verticalOffset: 2
|
||||
radius: 30 // Slightly less dramatic
|
||||
samples: 45
|
||||
color: Qt.rgba(0, 0, 0, 0.75) // A bit lighter
|
||||
cached: false
|
||||
spread: 0.5 // Less spread
|
||||
}
|
||||
|
||||
// Main border shape
|
||||
ShapePath {
|
||||
fillColor: Data.ThemeManager.bgColor
|
||||
strokeWidth: 0
|
||||
fillRule: ShapePath.OddEvenFill
|
||||
|
||||
// Outer rectangle
|
||||
PathMove {
|
||||
x: 0
|
||||
y: 0
|
||||
}
|
||||
PathLine {
|
||||
x: borderShape.width
|
||||
y: 0
|
||||
}
|
||||
PathLine {
|
||||
x: borderShape.width
|
||||
y: borderShape.height
|
||||
}
|
||||
PathLine {
|
||||
x: 0
|
||||
y: borderShape.height
|
||||
}
|
||||
PathLine {
|
||||
x: 0
|
||||
y: 0
|
||||
}
|
||||
|
||||
// Inner rounded cutout
|
||||
PathMove {
|
||||
x: borderShape.innerX + borderShape.radius
|
||||
y: borderShape.innerY
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: borderShape.innerX + borderShape.innerWidth - borderShape.radius
|
||||
y: borderShape.innerY
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: borderShape.innerX + borderShape.innerWidth
|
||||
y: borderShape.innerY + borderShape.radius
|
||||
radiusX: borderShape.radius
|
||||
radiusY: borderShape.radius
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: borderShape.innerX + borderShape.innerWidth
|
||||
y: borderShape.innerY + borderShape.innerHeight - borderShape.radius
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: borderShape.innerX + borderShape.innerWidth - borderShape.radius
|
||||
y: borderShape.innerY + borderShape.innerHeight
|
||||
radiusX: borderShape.radius
|
||||
radiusY: borderShape.radius
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: borderShape.innerX + borderShape.radius
|
||||
y: borderShape.innerY + borderShape.innerHeight
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: borderShape.innerX
|
||||
y: borderShape.innerY + borderShape.innerHeight - borderShape.radius
|
||||
radiusX: borderShape.radius
|
||||
radiusY: borderShape.radius
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
|
||||
PathLine {
|
||||
x: borderShape.innerX
|
||||
y: borderShape.innerY + borderShape.radius
|
||||
}
|
||||
|
||||
PathArc {
|
||||
x: borderShape.innerX + borderShape.radius
|
||||
y: borderShape.innerY
|
||||
radiusX: borderShape.radius
|
||||
radiusY: borderShape.radius
|
||||
direction: PathArc.Clockwise
|
||||
}
|
||||
}
|
||||
}
|
||||
318
modules/home/services/quickshell/qml/Layout/Desktop.qml
Normal file
318
modules/home/services/quickshell/qml/Layout/Desktop.qml
Normal file
|
|
@ -0,0 +1,318 @@
|
|||
import QtQuick
|
||||
import QtQuick.Shapes
|
||||
import Quickshell
|
||||
import Quickshell.Wayland
|
||||
import Qt5Compat.GraphicalEffects
|
||||
import "root:/Data" as Data
|
||||
import "root:/Widgets/System" as System
|
||||
import "root:/Core" as Core
|
||||
import "root:/Widgets" as Widgets
|
||||
import "root:/Widgets/Notifications" as Notifications
|
||||
import "root:/Widgets/ControlPanel" as ControlPanel
|
||||
|
||||
// Desktop with borders and UI widgets
|
||||
Scope {
|
||||
id: desktop
|
||||
|
||||
property var shell
|
||||
property var notificationService
|
||||
|
||||
// Wallpaper layer - one per screen
|
||||
Variants {
|
||||
model: Quickshell.screens
|
||||
Core.Wallpaper {
|
||||
required property var modelData
|
||||
screen: modelData
|
||||
}
|
||||
}
|
||||
|
||||
// Desktop UI layer per screen
|
||||
Variants {
|
||||
model: Quickshell.screens
|
||||
|
||||
PanelWindow {
|
||||
required property var modelData
|
||||
screen: modelData
|
||||
|
||||
implicitWidth: Screen.width
|
||||
implicitHeight: Screen.height
|
||||
color: "transparent"
|
||||
exclusiveZone: 0
|
||||
|
||||
WlrLayershell.namespace: "quickshell-desktop"
|
||||
|
||||
// Interactive mask for workspace indicator only
|
||||
mask: Region {
|
||||
item: workspaceIndicator
|
||||
}
|
||||
|
||||
anchors {
|
||||
top: true
|
||||
left: true
|
||||
bottom: true
|
||||
right: true
|
||||
}
|
||||
|
||||
// Workspace indicator at left border
|
||||
System.NiriWorkspaces {
|
||||
id: workspaceIndicator
|
||||
anchors {
|
||||
left: parent.left
|
||||
verticalCenter: parent.verticalCenter
|
||||
leftMargin: Data.Settings.borderWidth
|
||||
}
|
||||
z: 10
|
||||
width: 32
|
||||
}
|
||||
|
||||
// Volume OSD at right border (primary screen only)
|
||||
System.OSD {
|
||||
id: osd
|
||||
shell: desktop.shell
|
||||
visible: modelData === Quickshell.primaryScreen
|
||||
anchors {
|
||||
right: parent.right
|
||||
verticalCenter: parent.verticalCenter
|
||||
rightMargin: Data.Settings.borderWidth
|
||||
}
|
||||
z: 10
|
||||
}
|
||||
|
||||
// Widget shadows (positioned behind border for proper layering)
|
||||
|
||||
// Workspace indicator shadow
|
||||
Rectangle {
|
||||
id: workspaceShadow
|
||||
visible: workspaceIndicator !== null
|
||||
x: workspaceIndicator.x
|
||||
y: workspaceIndicator.y
|
||||
width: workspaceIndicator.width
|
||||
height: workspaceIndicator.height
|
||||
color: "black"
|
||||
radius: 16
|
||||
z: -10 // Behind border
|
||||
|
||||
layer.enabled: true
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: 2
|
||||
verticalOffset: 2
|
||||
radius: 8 + (workspaceIndicator.effectsActive && Data.Settings.workspaceGlowEnabled ? Math.sin(workspaceIndicator.masterProgress * Math.PI) * 3 : 0)
|
||||
samples: 17
|
||||
color: {
|
||||
if (!workspaceIndicator.effectsActive) return Qt.rgba(0, 0, 0, 0.3)
|
||||
if (!Data.Settings.workspaceGlowEnabled) return Qt.rgba(0, 0, 0, 0.3)
|
||||
// Use accent color glow with reduced intensity
|
||||
const intensity = Math.sin(workspaceIndicator.masterProgress * Math.PI) * 0.3
|
||||
return Qt.rgba(
|
||||
workspaceIndicator.effectColor.r * intensity + 0.05,
|
||||
workspaceIndicator.effectColor.g * intensity + 0.05,
|
||||
workspaceIndicator.effectColor.b * intensity + 0.05,
|
||||
0.3 + intensity * 0.15
|
||||
)
|
||||
}
|
||||
cached: true
|
||||
spread: 0.1 + (workspaceIndicator.effectsActive && Data.Settings.workspaceGlowEnabled ? Math.sin(workspaceIndicator.masterProgress * Math.PI) * 0.1 : 0)
|
||||
}
|
||||
}
|
||||
|
||||
// Clock widget shadow
|
||||
Rectangle {
|
||||
id: clockShadow
|
||||
visible: clockWidget !== null
|
||||
x: clockWidget.x
|
||||
y: clockWidget.y
|
||||
width: clockWidget.width
|
||||
height: clockWidget.height
|
||||
color: "black"
|
||||
topLeftRadius: 0
|
||||
topRightRadius: clockWidget.height / 2
|
||||
bottomLeftRadius: 0
|
||||
bottomRightRadius: 0
|
||||
z: -10 // Behind border
|
||||
|
||||
layer.enabled: true
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
horizontalOffset: 1
|
||||
verticalOffset: -1
|
||||
radius: 8
|
||||
samples: 17
|
||||
color: Qt.rgba(0, 0, 0, 0.3)
|
||||
cached: true
|
||||
spread: 0.1
|
||||
}
|
||||
}
|
||||
|
||||
// Border background with shadow
|
||||
Border {
|
||||
id: screenBorder
|
||||
anchors.fill: parent
|
||||
workspaceIndicator: workspaceIndicator
|
||||
volumeOSD: volumeOsd
|
||||
clockWidget: clockWidget
|
||||
z: -5 // Behind UI elements to prevent shadow from covering control panel
|
||||
}
|
||||
|
||||
// Unified Wave Overlay - simple burst effect
|
||||
Item {
|
||||
id: waveOverlay
|
||||
anchors.fill: parent
|
||||
visible: workspaceIndicator.effectsActive && Data.Settings.workspaceBurstEnabled
|
||||
z: 15
|
||||
|
||||
property real progress: workspaceIndicator.masterProgress
|
||||
property color waveColor: workspaceIndicator.effectColor
|
||||
|
||||
// Workspace indicator burst effects
|
||||
Item {
|
||||
x: workspaceIndicator.x
|
||||
y: workspaceIndicator.y
|
||||
width: workspaceIndicator.width
|
||||
height: workspaceIndicator.height
|
||||
|
||||
// Expanding pill burst - positioned at current workspace index (mimics pill shape)
|
||||
Rectangle {
|
||||
x: parent.width / 2 - width / 2
|
||||
y: {
|
||||
// Find current workspace index directly from currentWorkspace
|
||||
let focusedIndex = 0
|
||||
for (let i = 0; i < workspaceIndicator.workspaces.count; i++) {
|
||||
const workspace = workspaceIndicator.workspaces.get(i)
|
||||
if (workspace && workspace.id === workspaceIndicator.currentWorkspace) {
|
||||
focusedIndex = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate position accounting for Column centering and pill sizes
|
||||
let cumulativeHeight = 0
|
||||
for (let i = 0; i < focusedIndex; i++) {
|
||||
const ws = workspaceIndicator.workspaces.get(i)
|
||||
cumulativeHeight += (ws && ws.isFocused ? 36 : 22) + 6 // pill height + spacing
|
||||
}
|
||||
|
||||
// Current pill height
|
||||
const currentWs = workspaceIndicator.workspaces.get(focusedIndex)
|
||||
const currentPillHeight = (currentWs && currentWs.isFocused ? 36 : 22)
|
||||
|
||||
// Column is centered, so start from center and calculate offset
|
||||
const columnHeight = parent.height - 24 // Total available height minus padding
|
||||
const columnTop = 12 // Top padding
|
||||
|
||||
return columnTop + cumulativeHeight + currentPillHeight / 2 - height / 2
|
||||
}
|
||||
width: 20 + waveOverlay.progress * 30
|
||||
height: 36 + waveOverlay.progress * 20 // Pill-like height
|
||||
radius: width / 2 // Pill-like rounded shape
|
||||
color: "transparent"
|
||||
border.width: 2
|
||||
border.color: Qt.rgba(waveOverlay.waveColor.r, waveOverlay.waveColor.g, waveOverlay.waveColor.b, 1.0 - waveOverlay.progress)
|
||||
opacity: Math.max(0, 1.0 - waveOverlay.progress)
|
||||
}
|
||||
|
||||
// Secondary expanding pill burst - positioned at current workspace index
|
||||
Rectangle {
|
||||
x: parent.width / 2 - width / 2
|
||||
y: {
|
||||
// Find current workspace index directly from currentWorkspace
|
||||
let focusedIndex = 0
|
||||
for (let i = 0; i < workspaceIndicator.workspaces.count; i++) {
|
||||
const workspace = workspaceIndicator.workspaces.get(i)
|
||||
if (workspace && workspace.id === workspaceIndicator.currentWorkspace) {
|
||||
focusedIndex = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate position accounting for Column centering and pill sizes
|
||||
let cumulativeHeight = 0
|
||||
for (let i = 0; i < focusedIndex; i++) {
|
||||
const ws = workspaceIndicator.workspaces.get(i)
|
||||
cumulativeHeight += (ws && ws.isFocused ? 36 : 22) + 6 // pill height + spacing
|
||||
}
|
||||
|
||||
// Current pill height
|
||||
const currentWs = workspaceIndicator.workspaces.get(focusedIndex)
|
||||
const currentPillHeight = (currentWs && currentWs.isFocused ? 36 : 22)
|
||||
|
||||
// Column is centered, so start from center and calculate offset
|
||||
const columnHeight = parent.height - 24 // Total available height minus padding
|
||||
const columnTop = 12 // Top padding
|
||||
|
||||
return columnTop + cumulativeHeight + currentPillHeight / 2 - height / 2
|
||||
}
|
||||
width: 18 + waveOverlay.progress * 45
|
||||
height: 30 + waveOverlay.progress * 35 // Pill-like height
|
||||
radius: width / 2 // Pill-like rounded shape
|
||||
color: "transparent"
|
||||
border.width: 1.5
|
||||
border.color: Qt.rgba(waveOverlay.waveColor.r, waveOverlay.waveColor.g, waveOverlay.waveColor.b, 0.6)
|
||||
opacity: Math.max(0, 0.8 - waveOverlay.progress * 1.2)
|
||||
visible: waveOverlay.progress > 0.2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Clock at bottom-left corner
|
||||
Widgets.Clock {
|
||||
id: clockWidget
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
left: parent.left
|
||||
bottomMargin: Data.Settings.borderWidth
|
||||
leftMargin: Data.Settings.borderWidth
|
||||
}
|
||||
z: 10
|
||||
}
|
||||
|
||||
// Notification popups (primary screen only)
|
||||
Notifications.Notification {
|
||||
id: notificationPopup
|
||||
visible: (modelData === (Quickshell.primaryScreen || Quickshell.screens[0])) && calculatedHeight > 20
|
||||
anchors {
|
||||
top: parent.top
|
||||
right: parent.right
|
||||
rightMargin: Data.Settings.borderWidth + 20
|
||||
topMargin: 0
|
||||
}
|
||||
width: 420
|
||||
height: calculatedHeight
|
||||
shell: desktop.shell
|
||||
notificationServer: desktop.notificationService ? desktop.notificationService.notificationServer : null
|
||||
z: 15
|
||||
|
||||
Component.onCompleted: {
|
||||
let targetScreen = Quickshell.primaryScreen || Quickshell.screens[0]
|
||||
if (modelData === targetScreen) {
|
||||
desktop.shell.notificationWindow = notificationPopup
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// UI overlay layer for modal components
|
||||
Item {
|
||||
id: uiLayer
|
||||
anchors.fill: parent
|
||||
z: 20
|
||||
|
||||
Core.Version {
|
||||
visible: modelData === Quickshell.primaryScreen
|
||||
}
|
||||
|
||||
ControlPanel.ControlPanel {
|
||||
id: controlPanelComponent
|
||||
shell: desktop.shell
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle dynamic screen configuration changes
|
||||
Connections {
|
||||
target: Quickshell
|
||||
function onScreensChanged() {
|
||||
// Screen changes handled by Variants automatically
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue