summaryrefslogtreecommitdiff
path: root/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/AboutTab.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/AboutTab.qml')
-rw-r--r--raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/AboutTab.qml900
1 files changed, 900 insertions, 0 deletions
diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/AboutTab.qml b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/AboutTab.qml
new file mode 100644
index 0000000..67c2c21
--- /dev/null
+++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/AboutTab.qml
@@ -0,0 +1,900 @@
+import QtQuick
+import QtQuick.Effects
+import qs.Common
+import qs.Services
+import qs.Widgets
+
+Item {
+ id: aboutTab
+
+ LayoutMirroring.enabled: I18n.isRtl
+ LayoutMirroring.childrenInherit: true
+
+ property bool isHyprland: CompositorService.isHyprland
+ property bool isNiri: CompositorService.isNiri
+ property bool isSway: CompositorService.isSway
+ property bool isScroll: CompositorService.isScroll
+ property bool isMiracle: CompositorService.isMiracle
+ property bool isDwl: CompositorService.isDwl
+ property bool isLabwc: CompositorService.isLabwc
+
+ property string compositorName: {
+ if (isHyprland)
+ return "hyprland";
+ if (isSway)
+ return "sway";
+ if (isScroll)
+ return "scroll";
+ if (isMiracle)
+ return "miracle";
+ if (isDwl)
+ return "mangowc";
+ if (isLabwc)
+ return "labwc";
+ return "niri";
+ }
+
+ property string compositorLogo: {
+ if (isHyprland)
+ return "/assets/hyprland.svg";
+ if (isSway)
+ return "/assets/sway.svg";
+ if (isScroll)
+ return "/assets/sway.svg";
+ if (isMiracle)
+ return "/assets/miraclewm.svg";
+ if (isDwl)
+ return "/assets/mango.png";
+ if (isLabwc)
+ return "/assets/labwc.png";
+ return "/assets/niri.svg";
+ }
+
+ property string compositorUrl: {
+ if (isHyprland)
+ return "https://hypr.land";
+ if (isSway)
+ return "https://swaywm.org";
+ if (isScroll)
+ return "https://github.com/dawsers/scroll";
+ if (isMiracle)
+ return "https://github.com/miracle-wm-org/miracle-wm";
+ if (isDwl)
+ return "https://github.com/DreamMaoMao/mangowc";
+ if (isLabwc)
+ return "https://labwc.github.io/";
+ return "https://github.com/niri-wm/niri";
+ }
+
+ property string compositorTooltip: {
+ if (isHyprland)
+ return I18n.tr("Hyprland Website");
+ if (isSway)
+ return I18n.tr("Sway Website");
+ if (isScroll)
+ return I18n.tr("Scroll GitHub");
+ if (isMiracle)
+ return I18n.tr("Scroll GitHub");
+ if (isDwl)
+ return I18n.tr("mangowc GitHub");
+ if (isLabwc)
+ return I18n.tr("LabWC Website");
+ return I18n.tr("niri GitHub");
+ }
+
+ property string dmsDiscordUrl: "https://discord.gg/ppWTpKmPgT"
+ property string dmsDiscordTooltip: I18n.tr("niri/dms Discord")
+
+ property string compositorDiscordUrl: {
+ if (isHyprland)
+ return "https://discord.com/invite/hQ9XvMUjjr";
+ if (isDwl)
+ return "https://discord.gg/CPjbDxesh5";
+ return "";
+ }
+
+ property string compositorDiscordTooltip: {
+ if (isHyprland)
+ return I18n.tr("Hyprland Discord Server");
+ if (isDwl)
+ return I18n.tr("mangowc Discord Server");
+ return "";
+ }
+
+ property string redditUrl: "https://reddit.com/r/niri"
+ property string redditTooltip: I18n.tr("r/niri Subreddit")
+
+ property string ircUrl: "https://web.libera.chat/gamja/?channels=#labwc"
+ property string ircTooltip: I18n.tr("LabWC IRC Channel")
+
+ property bool showMatrix: isNiri && !isHyprland && !isSway && !isScroll && !isMiracle && !isDwl && !isLabwc
+ property bool showCompositorDiscord: isHyprland || isDwl
+ property bool showReddit: isNiri && !isHyprland && !isSway && !isScroll && !isMiracle && !isDwl && !isLabwc
+ property bool showIrc: isLabwc
+
+ DankFlickable {
+ anchors.fill: parent
+ clip: true
+ contentHeight: mainColumn.height + Theme.spacingXL
+ contentWidth: width
+
+ Column {
+ id: mainColumn
+ topPadding: 4
+
+ width: Math.min(550, parent.width - Theme.spacingL * 2)
+ anchors.horizontalCenter: parent.horizontalCenter
+ spacing: Theme.spacingXL
+
+ // ASCII Art Header
+ StyledRect {
+ width: parent.width
+ height: asciiSection.implicitHeight + Theme.spacingL * 2
+ radius: Theme.cornerRadius
+ color: Theme.surfaceContainerHigh
+ border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
+ border.width: 0
+
+ Column {
+ id: asciiSection
+
+ anchors.fill: parent
+ anchors.margins: Theme.spacingL
+ spacing: Theme.spacingM
+
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ spacing: parent.width < 350 ? Theme.spacingM : Theme.spacingL
+
+ property bool compactLogo: parent.width < 400
+ property bool hideLogo: parent.width < 280
+
+ Image {
+ id: logoImage
+
+ visible: !parent.hideLogo
+ anchors.verticalCenter: parent.verticalCenter
+ width: parent.compactLogo ? 80 : 120
+ height: width * (569.94629 / 506.50931)
+ fillMode: Image.PreserveAspectFit
+ smooth: true
+ mipmap: true
+ asynchronous: true
+ source: "file://" + Theme.shellDir + "/assets/danklogonormal.svg"
+ layer.enabled: true
+ layer.smooth: true
+ layer.mipmap: true
+ layer.effect: MultiEffect {
+ saturation: 0
+ colorization: 1
+ colorizationColor: Theme.primary
+ }
+ }
+
+ Text {
+ anchors.verticalCenter: parent.verticalCenter
+ text: "DANK LINUX"
+ font.pixelSize: parent.compactLogo ? 32 : 48
+ font.weight: Font.Bold
+ font.family: interFont.name
+ color: Theme.surfaceText
+ antialiasing: true
+
+ FontLoader {
+ id: interFont
+ source: Qt.resolvedUrl("../../assets/fonts/inter/InterVariable.ttf")
+ }
+ }
+ }
+
+ StyledText {
+ text: {
+ if (!SystemUpdateService.shellVersion && !DMSService.cliVersion)
+ return "dms";
+
+ let version = SystemUpdateService.shellVersion || "";
+ let cliVersion = DMSService.cliVersion || "";
+
+ // Debian/Ubuntu/OpenSUSE git format: 1.0.3+git2264.c5c5ce84
+ let match = version.match(/^([\d.]+)\+git(\d+)\./);
+ if (match) {
+ return `dms (git) v${match[1]}-${match[2]}`;
+ }
+
+ // Fedora COPR git format: 0.0.git.2267.d430cae9
+ match = version.match(/^[\d.]+\.git\.(\d+)\./);
+ if (match) {
+ function extractBaseVersion(value) {
+ if (!value)
+ return "";
+ let baseMatch = value.match(/(\d+\.\d+\.\d+)/);
+ if (baseMatch)
+ return baseMatch[1];
+ baseMatch = value.match(/(\d+\.\d+)/);
+ if (baseMatch)
+ return baseMatch[1];
+ return "";
+ }
+
+ let baseVersion = extractBaseVersion(cliVersion);
+ if (!baseVersion)
+ baseVersion = extractBaseVersion(SystemUpdateService.semverVersion);
+ if (baseVersion) {
+ return `dms (git) v${baseVersion}-${match[1]}`;
+ }
+ return `dms (git) v${match[1]}`;
+ }
+
+ // Stable release format: 1.0.3
+ match = version.match(/^([\d.]+)$/);
+ if (match) {
+ return `dms v${match[1]}`;
+ }
+
+ if (!version && cliVersion) {
+ match = cliVersion.match(/^([\d.]+)\+git(\d+)\./);
+ if (match) {
+ return `dms (git) v${match[1]}-${match[2]}`;
+ }
+ match = cliVersion.match(/^([\d.]+)$/);
+ if (match) {
+ return `dms v${match[1]}`;
+ }
+ return `dms ${cliVersion}`;
+ }
+
+ return `dms ${version}`;
+ }
+ font.pixelSize: Theme.fontSizeXLarge
+ font.weight: Font.Bold
+ color: Theme.surfaceText
+ horizontalAlignment: Text.AlignHCenter
+ width: parent.width
+ }
+
+ StyledText {
+ visible: SystemUpdateService.shellCodename.length > 0
+ text: `"${SystemUpdateService.shellCodename}"`
+ font.pixelSize: Theme.fontSizeMedium
+ font.italic: true
+ color: Theme.surfaceVariantText
+ horizontalAlignment: Text.AlignHCenter
+ width: parent.width
+ }
+
+ Row {
+ id: resourceButtonsRow
+ anchors.horizontalCenter: parent.horizontalCenter
+ spacing: Theme.spacingS
+
+ property bool compactMode: parent.width < 450
+
+ DankButton {
+ id: docsButton
+ text: resourceButtonsRow.compactMode ? "" : I18n.tr("Docs")
+ iconName: "menu_book"
+ iconSize: 18
+ backgroundColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.08)
+ textColor: Theme.surfaceText
+ onClicked: Qt.openUrlExternally("https://danklinux.com/docs")
+ onHoveredChanged: {
+ if (hovered)
+ resourceTooltip.show(resourceButtonsRow.compactMode ? I18n.tr("Docs") + " - danklinux.com/docs" : "danklinux.com/docs", docsButton, 0, 0, "bottom");
+ else
+ resourceTooltip.hide();
+ }
+ }
+
+ DankButton {
+ id: pluginsButton
+ text: resourceButtonsRow.compactMode ? "" : I18n.tr("Plugins")
+ iconName: "extension"
+ iconSize: 18
+ backgroundColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.08)
+ textColor: Theme.surfaceText
+ onClicked: Qt.openUrlExternally("https://plugins.danklinux.com")
+ onHoveredChanged: {
+ if (hovered)
+ resourceTooltip.show(resourceButtonsRow.compactMode ? I18n.tr("Plugins") + " - plugins.danklinux.com" : "plugins.danklinux.com", pluginsButton, 0, 0, "bottom");
+ else
+ resourceTooltip.hide();
+ }
+ }
+
+ DankButton {
+ id: githubButton
+ text: resourceButtonsRow.compactMode ? "" : I18n.tr("GitHub")
+ iconName: "code"
+ iconSize: 18
+ backgroundColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.08)
+ textColor: Theme.surfaceText
+ onClicked: Qt.openUrlExternally("https://github.com/AvengeMedia/DankMaterialShell")
+ onHoveredChanged: {
+ if (hovered)
+ resourceTooltip.show(resourceButtonsRow.compactMode ? "GitHub - AvengeMedia/DankMaterialShell" : "github.com/AvengeMedia/DankMaterialShell", githubButton, 0, 0, "bottom");
+ else
+ resourceTooltip.hide();
+ }
+ }
+
+ DankButton {
+ id: kofiButton
+ text: resourceButtonsRow.compactMode ? "" : I18n.tr("Ko-fi")
+ iconName: "favorite"
+ iconSize: 18
+ backgroundColor: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12)
+ textColor: Theme.primary
+ onClicked: Qt.openUrlExternally("https://ko-fi.com/danklinux")
+ onHoveredChanged: {
+ if (hovered)
+ resourceTooltip.show(resourceButtonsRow.compactMode ? I18n.tr("Ko-fi") + " - ko-fi.com/danklinux" : "ko-fi.com/danklinux", kofiButton, 0, 0, "bottom");
+ else
+ resourceTooltip.hide();
+ }
+ }
+ }
+
+ DankTooltipV2 {
+ id: resourceTooltip
+ }
+
+ Item {
+ id: communityIcons
+ anchors.horizontalCenter: parent.horizontalCenter
+ height: 24
+ width: {
+ let baseWidth = compositorButton.width + dmsDiscordButton.width + Theme.spacingM;
+ if (showMatrix) {
+ baseWidth += matrixButton.width + 4;
+ }
+ if (showIrc) {
+ baseWidth += ircButton.width + Theme.spacingM;
+ }
+ if (showCompositorDiscord) {
+ baseWidth += compositorDiscordButton.width + Theme.spacingM;
+ }
+ if (showReddit) {
+ baseWidth += redditButton.width + Theme.spacingM;
+ }
+ return baseWidth;
+ }
+
+ Item {
+ id: compositorButton
+ width: 24
+ height: 24
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.verticalCenterOffset: -2
+ x: 0
+
+ property bool hovered: false
+ property string tooltipText: compositorTooltip
+
+ Image {
+ anchors.fill: parent
+ source: Qt.resolvedUrl(".").toString().replace("file://", "").replace("/Modules/Settings/", "") + compositorLogo
+ sourceSize: Qt.size(24, 24)
+ smooth: true
+ fillMode: Image.PreserveAspectFit
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ hoverEnabled: true
+ onEntered: parent.hovered = true
+ onExited: parent.hovered = false
+ onClicked: Qt.openUrlExternally(compositorUrl)
+ }
+ }
+
+ Item {
+ id: matrixButton
+ width: 30
+ height: 24
+ x: compositorButton.x + compositorButton.width + 4
+ visible: showMatrix
+
+ property bool hovered: false
+ property string tooltipText: I18n.tr("niri Matrix Chat")
+
+ Image {
+ anchors.fill: parent
+ source: Qt.resolvedUrl(".").toString().replace("file://", "").replace("/Modules/Settings/", "") + "/assets/matrix-logo-white.svg"
+ sourceSize: Qt.size(28, 18)
+ smooth: true
+ fillMode: Image.PreserveAspectFit
+ layer.enabled: true
+
+ layer.effect: MultiEffect {
+ colorization: 1
+ colorizationColor: Theme.surfaceText
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ hoverEnabled: true
+ onEntered: parent.hovered = true
+ onExited: parent.hovered = false
+ onClicked: Qt.openUrlExternally("https://matrix.to/#/#niri:matrix.org")
+ }
+ }
+
+ Item {
+ id: ircButton
+ width: 24
+ height: 24
+ x: compositorButton.x + compositorButton.width + Theme.spacingM
+ anchors.verticalCenter: parent.verticalCenter
+ visible: showIrc
+
+ property bool hovered: false
+ property string tooltipText: ircTooltip
+
+ DankIcon {
+ anchors.centerIn: parent
+ name: "forum"
+ size: 20
+ color: Theme.surfaceText
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ hoverEnabled: true
+ onEntered: parent.hovered = true
+ onExited: parent.hovered = false
+ onClicked: Qt.openUrlExternally(ircUrl)
+ }
+ }
+
+ Item {
+ id: dmsDiscordButton
+ width: 20
+ height: 20
+ x: {
+ if (showMatrix)
+ return matrixButton.x + matrixButton.width + Theme.spacingM;
+ if (showIrc)
+ return ircButton.x + ircButton.width + Theme.spacingM;
+ return compositorButton.x + compositorButton.width + Theme.spacingM;
+ }
+ anchors.verticalCenter: parent.verticalCenter
+
+ property bool hovered: false
+ property string tooltipText: dmsDiscordTooltip
+
+ Image {
+ anchors.fill: parent
+ source: Qt.resolvedUrl(".").toString().replace("file://", "").replace("/Modules/Settings/", "") + "/assets/discord.svg"
+ sourceSize: Qt.size(20, 20)
+ smooth: true
+ fillMode: Image.PreserveAspectFit
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ hoverEnabled: true
+ onEntered: parent.hovered = true
+ onExited: parent.hovered = false
+ onClicked: Qt.openUrlExternally(dmsDiscordUrl)
+ }
+ }
+
+ Item {
+ id: compositorDiscordButton
+ width: 20
+ height: 20
+ x: dmsDiscordButton.x + dmsDiscordButton.width + Theme.spacingM
+ anchors.verticalCenter: parent.verticalCenter
+ visible: showCompositorDiscord
+
+ property bool hovered: false
+ property string tooltipText: compositorDiscordTooltip
+
+ Image {
+ anchors.fill: parent
+ source: Qt.resolvedUrl(".").toString().replace("file://", "").replace("/Modules/Settings/", "") + "/assets/discord.svg"
+ sourceSize: Qt.size(20, 20)
+ smooth: true
+ fillMode: Image.PreserveAspectFit
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ hoverEnabled: true
+ onEntered: parent.hovered = true
+ onExited: parent.hovered = false
+ onClicked: Qt.openUrlExternally(compositorDiscordUrl)
+ }
+ }
+
+ Item {
+ id: redditButton
+ width: 20
+ height: 20
+ x: showCompositorDiscord ? compositorDiscordButton.x + compositorDiscordButton.width + Theme.spacingM : dmsDiscordButton.x + dmsDiscordButton.width + Theme.spacingM
+ anchors.verticalCenter: parent.verticalCenter
+ visible: showReddit
+
+ property bool hovered: false
+ property string tooltipText: redditTooltip
+
+ Image {
+ anchors.fill: parent
+ source: Qt.resolvedUrl(".").toString().replace("file://", "").replace("/Modules/Settings/", "") + "/assets/reddit.svg"
+ sourceSize: Qt.size(20, 20)
+ smooth: true
+ fillMode: Image.PreserveAspectFit
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ hoverEnabled: true
+ onEntered: parent.hovered = true
+ onExited: parent.hovered = false
+ onClicked: Qt.openUrlExternally(redditUrl)
+ }
+ }
+ }
+ }
+ }
+
+ // Project Information
+ StyledRect {
+ width: parent.width
+ height: projectSection.implicitHeight + Theme.spacingL * 2
+ radius: Theme.cornerRadius
+ color: Theme.surfaceContainerHigh
+ border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
+ border.width: 0
+
+ Column {
+ id: projectSection
+
+ anchors.fill: parent
+ anchors.margins: Theme.spacingL
+ spacing: Theme.spacingM
+
+ Row {
+ width: parent.width
+ spacing: Theme.spacingM
+
+ DankIcon {
+ name: "info"
+ size: Theme.iconSize
+ color: Theme.primary
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ StyledText {
+ text: I18n.tr("About")
+ font.pixelSize: Theme.fontSizeLarge
+ font.weight: Font.Medium
+ color: Theme.surfaceText
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+
+ StyledText {
+ text: I18n.tr('dms is a highly customizable, modern desktop shell with a <a href="https://m3.material.io/" style="text-decoration:none; color:%1;">material 3 inspired</a> design.<br /><br/>It is built with <a href="https://quickshell.org" style="text-decoration:none; color:%1;">Quickshell</a>, a QT6 framework for building desktop shells, and <a href="https://go.dev" style="text-decoration:none; color:%1;">Go</a>, a statically typed, compiled programming language.').arg(Theme.primary)
+ textFormat: Text.RichText
+ font.pixelSize: Theme.fontSizeMedium
+ linkColor: Theme.primary
+ onLinkActivated: url => Qt.openUrlExternally(url)
+ color: Theme.surfaceVariantText
+ width: parent.width
+ wrapMode: Text.WordWrap
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
+ acceptedButtons: Qt.NoButton
+ propagateComposedEvents: true
+ }
+ }
+ }
+ }
+
+ StyledRect {
+ visible: DMSService.isConnected
+ width: parent.width
+ height: backendSection.implicitHeight + Theme.spacingL * 2
+ radius: Theme.cornerRadius
+ color: Theme.surfaceContainerHigh
+ border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
+ border.width: 0
+
+ Column {
+ id: backendSection
+
+ anchors.fill: parent
+ anchors.margins: Theme.spacingL
+ spacing: Theme.spacingM
+
+ Row {
+ width: parent.width
+ spacing: Theme.spacingM
+
+ DankIcon {
+ name: "dns"
+ size: Theme.iconSize
+ color: Theme.primary
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ StyledText {
+ text: I18n.tr("Backend")
+ font.pixelSize: Theme.fontSizeLarge
+ font.weight: Font.Medium
+ color: Theme.surfaceText
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+
+ Row {
+ anchors.left: parent.left
+ spacing: Theme.spacingL
+
+ Column {
+ spacing: 2
+
+ StyledText {
+ text: I18n.tr("Version")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceVariantText
+ horizontalAlignment: Text.AlignLeft
+ }
+
+ StyledText {
+ text: DMSService.cliVersion || "—"
+ font.pixelSize: Theme.fontSizeMedium
+ font.weight: Font.Medium
+ color: Theme.surfaceText
+ horizontalAlignment: Text.AlignLeft
+ }
+ }
+
+ Rectangle {
+ width: 1
+ height: 32
+ color: Theme.outlineVariant
+ }
+
+ Column {
+ spacing: 2
+
+ StyledText {
+ text: I18n.tr("API")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceVariantText
+ horizontalAlignment: Text.AlignLeft
+ }
+
+ StyledText {
+ text: `v${DMSService.apiVersion}`
+ font.pixelSize: Theme.fontSizeMedium
+ font.weight: Font.Medium
+ color: Theme.surfaceText
+ horizontalAlignment: Text.AlignLeft
+ }
+ }
+
+ Rectangle {
+ width: 1
+ height: 32
+ color: Theme.outlineVariant
+ }
+
+ Column {
+ spacing: 2
+
+ StyledText {
+ text: I18n.tr("Status")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceVariantText
+ horizontalAlignment: Text.AlignLeft
+ }
+
+ Row {
+ spacing: 4
+
+ Rectangle {
+ width: 8
+ height: 8
+ radius: 4
+ color: Theme.success
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ StyledText {
+ text: I18n.tr("Connected")
+ font.pixelSize: Theme.fontSizeMedium
+ font.weight: Font.Medium
+ color: Theme.surfaceText
+ horizontalAlignment: Text.AlignLeft
+ }
+ }
+ }
+ }
+
+ Column {
+ width: parent.width
+ spacing: Theme.spacingS
+ visible: DMSService.capabilities.length > 0
+
+ StyledText {
+ text: I18n.tr("Capabilities")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceVariantText
+ width: parent.width
+ horizontalAlignment: Text.AlignLeft
+ }
+
+ Flow {
+ width: parent.width
+ spacing: 6
+
+ Repeater {
+ model: DMSService.capabilities
+
+ Rectangle {
+ width: capText.implicitWidth + 16
+ height: 26
+ radius: 13
+ color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12)
+
+ StyledText {
+ id: capText
+ anchors.centerIn: parent
+ text: modelData
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.primary
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ StyledRect {
+ width: parent.width
+ height: toolsSection.implicitHeight + Theme.spacingL * 2
+ radius: Theme.cornerRadius
+ color: Theme.surfaceContainerHigh
+ border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
+ border.width: 0
+
+ Column {
+ id: toolsSection
+
+ anchors.fill: parent
+ anchors.margins: Theme.spacingL
+ spacing: Theme.spacingM
+
+ Row {
+ width: parent.width
+ spacing: Theme.spacingM
+
+ DankIcon {
+ name: "build"
+ size: Theme.iconSize
+ color: Theme.primary
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ StyledText {
+ text: I18n.tr("Tools")
+ font.pixelSize: Theme.fontSizeLarge
+ font.weight: Font.Medium
+ color: Theme.surfaceText
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+
+ Row {
+ anchors.left: parent.left
+ spacing: Theme.spacingS
+
+ DankButton {
+ text: I18n.tr("Show Welcome")
+ iconName: "waving_hand"
+ backgroundColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.08)
+ textColor: Theme.surfaceText
+ onClicked: FirstLaunchService.showWelcome()
+ }
+
+ DankButton {
+ text: I18n.tr("System Check")
+ iconName: "vital_signs"
+ backgroundColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.08)
+ textColor: Theme.surfaceText
+ onClicked: FirstLaunchService.showDoctor()
+ }
+ }
+ }
+ }
+
+ StyledText {
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: I18n.tr('<a href="https://github.com/AvengeMedia/DankMaterialShell/blob/master/LICENSE" style="text-decoration:none; color:%1;">MIT License</a>').arg(Theme.surfaceVariantText)
+ font.pixelSize: Theme.fontSizeMedium
+ color: Theme.surfaceVariantText
+ textFormat: Text.RichText
+ wrapMode: Text.NoWrap
+ onLinkActivated: url => Qt.openUrlExternally(url)
+
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
+ acceptedButtons: Qt.NoButton
+ propagateComposedEvents: true
+ }
+ }
+ }
+ }
+
+ // Community tooltip - positioned absolutely above everything
+ Rectangle {
+ id: communityTooltip
+ parent: aboutTab
+ z: 1000
+
+ property var hoveredButton: {
+ if (compositorButton.hovered)
+ return compositorButton;
+ if (matrixButton.visible && matrixButton.hovered)
+ return matrixButton;
+ if (ircButton.visible && ircButton.hovered)
+ return ircButton;
+ if (dmsDiscordButton.hovered)
+ return dmsDiscordButton;
+ if (compositorDiscordButton.visible && compositorDiscordButton.hovered)
+ return compositorDiscordButton;
+ if (redditButton.visible && redditButton.hovered)
+ return redditButton;
+ return null;
+ }
+
+ property string tooltipText: hoveredButton ? hoveredButton.tooltipText : ""
+
+ visible: hoveredButton !== null && tooltipText !== ""
+ width: tooltipLabel.implicitWidth + 24
+ height: tooltipLabel.implicitHeight + 12
+
+ color: Theme.surfaceContainer
+ radius: Theme.cornerRadius
+ border.width: 0
+ border.color: Theme.outlineMedium
+
+ x: hoveredButton ? hoveredButton.mapToItem(aboutTab, hoveredButton.width / 2, 0).x - width / 2 : 0
+ y: hoveredButton ? communityIcons.mapToItem(aboutTab, 0, 0).y - height - 8 : 0
+
+ ElevationShadow {
+ anchors.fill: parent
+ z: -1
+ level: Theme.elevationLevel1
+ fallbackOffset: 1
+ targetRadius: communityTooltip.radius
+ targetColor: communityTooltip.color
+ borderColor: communityTooltip.border.color
+ borderWidth: communityTooltip.border.width
+ shadowOpacity: Theme.elevationLevel1 && Theme.elevationLevel1.alpha !== undefined ? Theme.elevationLevel1.alpha : 0.2
+ shadowEnabled: Theme.elevationEnabled
+ }
+
+ StyledText {
+ id: tooltipLabel
+ anchors.centerIn: parent
+ text: communityTooltip.tooltipText
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceText
+ }
+ }
+}