mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-30 17:42:06 -04:00
320 lines
11 KiB
QML
320 lines
11 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Wayland
|
|
import qs.Common
|
|
import qs.Widgets
|
|
|
|
Row {
|
|
id: root
|
|
|
|
LayoutMirroring.enabled: I18n.isRtl
|
|
LayoutMirroring.childrenInherit: true
|
|
|
|
property var availableWidgets: []
|
|
property var popupScreen: null
|
|
property real popoutX: 0
|
|
property real popoutY: 0
|
|
property real popoutWidth: 0
|
|
property real popoutHeight: 0
|
|
|
|
signal addWidget(string widgetId)
|
|
signal resetToDefault
|
|
signal clearAll
|
|
|
|
height: 48
|
|
spacing: Theme.spacingS
|
|
|
|
function openWidgetLibrary() {
|
|
if (popupScreen)
|
|
addWidgetWindow.screen = popupScreen;
|
|
addWidgetWindow.visible = true;
|
|
}
|
|
|
|
function closeWidgetLibrary() {
|
|
addWidgetWindow.visible = false;
|
|
}
|
|
|
|
onAddWidget: closeWidgetLibrary()
|
|
onVisibleChanged: {
|
|
if (!visible)
|
|
closeWidgetLibrary();
|
|
}
|
|
|
|
PanelWindow {
|
|
id: addWidgetWindow
|
|
|
|
screen: root.popupScreen
|
|
visible: false
|
|
color: "transparent"
|
|
|
|
WlrLayershell.namespace: "dms:control-center-widget-library"
|
|
WlrLayershell.layer: WlrLayershell.Overlay
|
|
WlrLayershell.exclusiveZone: -1
|
|
WlrLayershell.keyboardFocus: visible ? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None
|
|
|
|
anchors {
|
|
top: true
|
|
left: true
|
|
right: true
|
|
bottom: true
|
|
}
|
|
|
|
readonly property bool blurActive: Theme.blurForegroundLayers || Theme.transparentBlurLayers
|
|
readonly property real surfaceAlpha: blurActive ? Math.min(Theme.popupTransparency, Theme.transparentBlurLayers ? 0.24 : 0.72) : Theme.popupTransparency
|
|
readonly property real rowAlpha: blurActive ? Math.min(Theme.popupTransparency, Theme.transparentBlurLayers ? 0.10 : 0.52) : Theme.popupTransparency
|
|
readonly property int panelWidth: 400
|
|
readonly property int panelHeight: 300
|
|
|
|
WindowBlur {
|
|
targetWindow: addWidgetWindow
|
|
blurX: widgetLibraryPanel.x
|
|
blurY: widgetLibraryPanel.y
|
|
blurWidth: addWidgetWindow.visible ? widgetLibraryPanel.width : 0
|
|
blurHeight: addWidgetWindow.visible ? widgetLibraryPanel.height : 0
|
|
blurRadius: Theme.cornerRadius
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
|
|
onClicked: root.closeWidgetLibrary()
|
|
}
|
|
|
|
FocusScope {
|
|
anchors.fill: parent
|
|
focus: addWidgetWindow.visible
|
|
|
|
Keys.onEscapePressed: event => {
|
|
root.closeWidgetLibrary();
|
|
event.accepted = true;
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: widgetLibraryPanel
|
|
|
|
width: addWidgetWindow.panelWidth
|
|
height: addWidgetWindow.panelHeight
|
|
x: Math.round((root.popoutWidth > 0 ? root.popoutX + (root.popoutWidth - width) / 2 : (addWidgetWindow.width - width) / 2))
|
|
y: Math.round((root.popoutHeight > 0 ? root.popoutY + (root.popoutHeight - height) / 2 : (addWidgetWindow.height - height) / 2))
|
|
radius: Theme.cornerRadius
|
|
color: Theme.withAlpha(Theme.surfaceContainer, addWidgetWindow.surfaceAlpha)
|
|
border.color: addWidgetWindow.blurActive ? Theme.outlineMedium : Theme.primarySelected
|
|
border.width: addWidgetWindow.blurActive ? Theme.layerOutlineWidth : 0
|
|
antialiasing: true
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
|
|
onClicked: mouse => mouse.accepted = true
|
|
}
|
|
|
|
Item {
|
|
anchors.fill: parent
|
|
anchors.margins: Theme.spacingL
|
|
|
|
Row {
|
|
id: headerRow
|
|
anchors.top: parent.top
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
spacing: Theme.spacingM
|
|
|
|
DankIcon {
|
|
name: "add_circle"
|
|
size: Theme.iconSize
|
|
color: Theme.primary
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
Typography {
|
|
text: I18n.tr("Add Widget")
|
|
style: Typography.Style.Subtitle
|
|
color: Theme.surfaceText
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
|
|
DankListView {
|
|
id: widgetList
|
|
|
|
anchors.top: headerRow.bottom
|
|
anchors.topMargin: Theme.spacingM
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.bottom: parent.bottom
|
|
spacing: Theme.spacingS
|
|
clip: true
|
|
model: root.availableWidgets
|
|
|
|
delegate: Rectangle {
|
|
width: widgetList.width
|
|
height: 50
|
|
radius: Theme.cornerRadius
|
|
color: widgetMouseArea.containsMouse ? Theme.withAlpha(Theme.primary, addWidgetWindow.blurActive ? 0.12 : 0.08) : Theme.withAlpha(Theme.surfaceContainerHigh, addWidgetWindow.rowAlpha)
|
|
border.color: Theme.outlineMedium
|
|
border.width: Theme.layerOutlineWidth
|
|
antialiasing: true
|
|
|
|
Row {
|
|
anchors.fill: parent
|
|
anchors.margins: Theme.spacingM
|
|
spacing: Theme.spacingM
|
|
|
|
DankIcon {
|
|
name: modelData.icon
|
|
size: Theme.iconSize
|
|
color: Theme.primary
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
Column {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
spacing: 2
|
|
width: parent.width - Theme.iconSize * 2 - Theme.spacingM * 3
|
|
|
|
Typography {
|
|
text: modelData.text
|
|
style: Typography.Style.Body
|
|
color: Theme.surfaceText
|
|
elide: Text.ElideRight
|
|
width: parent.width
|
|
horizontalAlignment: Text.AlignLeft
|
|
}
|
|
|
|
Typography {
|
|
text: modelData.description
|
|
style: Typography.Style.Caption
|
|
color: Theme.outline
|
|
elide: Text.ElideRight
|
|
width: parent.width
|
|
horizontalAlignment: Text.AlignLeft
|
|
}
|
|
}
|
|
|
|
DankIcon {
|
|
name: "add"
|
|
size: Theme.iconSize - 4
|
|
color: Theme.primary
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
id: widgetMouseArea
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: {
|
|
root.addWidget(modelData.id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
width: (parent.width - Theme.spacingS * 2) / 3
|
|
height: 48
|
|
radius: Theme.cornerRadius
|
|
color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12)
|
|
border.color: Theme.primary
|
|
border.width: 0
|
|
|
|
Row {
|
|
anchors.centerIn: parent
|
|
spacing: Theme.spacingS
|
|
|
|
DankIcon {
|
|
name: "add"
|
|
size: Theme.iconSize - 2
|
|
color: Theme.primary
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
Typography {
|
|
text: I18n.tr("Add Widget")
|
|
style: Typography.Style.Button
|
|
color: Theme.primary
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: root.openWidgetLibrary()
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
width: (parent.width - Theme.spacingS * 2) / 3
|
|
height: 48
|
|
radius: Theme.cornerRadius
|
|
color: Qt.rgba(Theme.warning.r, Theme.warning.g, Theme.warning.b, 0.12)
|
|
border.color: Theme.warning
|
|
border.width: 0
|
|
|
|
Row {
|
|
anchors.centerIn: parent
|
|
spacing: Theme.spacingS
|
|
|
|
DankIcon {
|
|
name: "settings_backup_restore"
|
|
size: Theme.iconSize - 2
|
|
color: Theme.warning
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
Typography {
|
|
text: I18n.tr("Defaults")
|
|
style: Typography.Style.Button
|
|
color: Theme.warning
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: root.resetToDefault()
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
width: (parent.width - Theme.spacingS * 2) / 3
|
|
height: 48
|
|
radius: Theme.cornerRadius
|
|
color: Qt.rgba(Theme.error.r, Theme.error.g, Theme.error.b, 0.12)
|
|
border.color: Theme.error
|
|
border.width: 0
|
|
|
|
Row {
|
|
anchors.centerIn: parent
|
|
spacing: Theme.spacingS
|
|
|
|
DankIcon {
|
|
name: "clear_all"
|
|
size: Theme.iconSize - 2
|
|
color: Theme.error
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
|
|
Typography {
|
|
text: I18n.tr("Reset")
|
|
style: Typography.Style.Button
|
|
color: Theme.error
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
cursorShape: Qt.PointingHandCursor
|
|
onClicked: root.clearAll()
|
|
}
|
|
}
|
|
}
|