summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml
diff options
context:
space:
mode:
authorAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
committerAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
commit70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 (patch)
treeab1123d4067c1b086dd6faa7ee4ea643236b565a /raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml
parent5d94c0a7d44a2255b81815a52a7056a94a39842d (diff)
downloadRaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.tar.gz
RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.zip
Replaced file structures for themes in the correct format
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml314
1 files changed, 314 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml
new file mode 100644
index 0000000..e970662
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/ClipboardButton.qml
@@ -0,0 +1,314 @@
+import QtQuick
+import Quickshell
+import Quickshell.Wayland
+import qs.Common
+import qs.Modules.Plugins
+import qs.Services
+import qs.Widgets
+
+BasePill {
+ id: root
+
+ property bool isActive: false
+ property bool isAutoHideBar: false
+
+ signal clipboardClicked
+ signal showSavedItemsRequested
+ signal clearAllRequested
+
+ readonly property real minTooltipY: {
+ if (!parentScreen || !(axis?.isVertical ?? false)) {
+ return 0;
+ }
+ if (isAutoHideBar) {
+ return 0;
+ }
+ if (parentScreen.y > 0) {
+ return barThickness + barSpacing;
+ }
+ return 0;
+ }
+
+ function clamp(value, minValue, maxValue) {
+ return Math.max(minValue, Math.min(maxValue, value));
+ }
+
+ function openContextMenu() {
+ const screen = root.parentScreen || Screen;
+ const screenX = screen.x || 0;
+ const screenY = screen.y || 0;
+ const isVertical = root.axis?.isVertical ?? false;
+ const edge = root.axis?.edge ?? "top";
+ const gap = Math.max(Theme.spacingXS, root.barSpacing ?? Theme.spacingXS);
+
+ const globalPos = root.mapToGlobal(root.width / 2, root.height / 2);
+ const relativeX = globalPos.x - screenX;
+ const relativeY = globalPos.y - screenY;
+
+ let anchorX = relativeX;
+ let anchorY = relativeY;
+
+ if (isVertical) {
+ anchorX = edge === "left" ? (root.barThickness + root.barSpacing + gap) : (screen.width - (root.barThickness + root.barSpacing + gap));
+ anchorY = relativeY + root.minTooltipY;
+ } else {
+ anchorX = relativeX;
+ anchorY = edge === "bottom" ? (screen.height - (root.barThickness + root.barSpacing + gap)) : (root.barThickness + root.barSpacing + gap);
+ }
+
+ contextMenuWindow.showAt(anchorX, anchorY, isVertical, edge, screen);
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
+ cursorShape: Qt.PointingHandCursor
+ onPressed: mouse => root.triggerRipple(this, mouse.x, mouse.y)
+ onClicked: function (mouse) {
+ switch (mouse.button) {
+ case Qt.RightButton:
+ openContextMenu();
+ break;
+ case Qt.LeftButton:
+ clipboardClicked();
+ break;
+ }
+ }
+ }
+
+ content: Component {
+ Item {
+ implicitWidth: icon.width
+ implicitHeight: root.widgetThickness - root.horizontalPadding * 2
+
+ DankIcon {
+ id: icon
+ anchors.centerIn: parent
+ name: "content_paste"
+ size: Theme.barIconSize(root.barThickness, -4, root.barConfig?.maximizeWidgetIcons, root.barConfig?.iconScale)
+ color: Theme.widgetIconColor
+ }
+ }
+ }
+
+ PanelWindow {
+ id: contextMenuWindow
+
+ WindowBlur {
+ targetWindow: contextMenuWindow
+ blurX: menuContainer.x
+ blurY: menuContainer.y
+ blurWidth: contextMenuWindow.visible ? menuContainer.width : 0
+ blurHeight: contextMenuWindow.visible ? menuContainer.height : 0
+ blurRadius: Theme.cornerRadius
+ }
+
+ WlrLayershell.namespace: "dms:clipboard-context-menu"
+
+ property bool isVertical: false
+ property string edge: "top"
+ property point anchorPos: Qt.point(0, 0)
+
+ function showAt(x, y, vertical, barEdge, targetScreen) {
+ if (targetScreen) {
+ contextMenuWindow.screen = targetScreen;
+ }
+
+ anchorPos = Qt.point(x, y);
+ isVertical = vertical ?? false;
+ edge = barEdge ?? "top";
+
+ visible = true;
+
+ if (contextMenuWindow.screen) {
+ TrayMenuManager.registerMenu(contextMenuWindow.screen.name, contextMenuWindow);
+ }
+ }
+
+ function closeMenu() {
+ visible = false;
+
+ if (contextMenuWindow.screen) {
+ TrayMenuManager.unregisterMenu(contextMenuWindow.screen.name);
+ }
+ }
+
+ screen: null
+ visible: false
+ WlrLayershell.layer: WlrLayershell.Overlay
+ WlrLayershell.exclusiveZone: -1
+ WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
+ color: "transparent"
+ anchors {
+ top: true
+ left: true
+ right: true
+ bottom: true
+ }
+
+ Component.onDestruction: {
+ if (contextMenuWindow.screen) {
+ TrayMenuManager.unregisterMenu(contextMenuWindow.screen.name);
+ }
+ }
+
+ Connections {
+ target: PopoutManager
+ function onPopoutOpening() {
+ contextMenuWindow.closeMenu();
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
+ onClicked: contextMenuWindow.closeMenu()
+ }
+
+ Rectangle {
+ id: menuContainer
+
+ x: {
+ if (contextMenuWindow.isVertical) {
+ if (contextMenuWindow.edge === "left") {
+ return Math.min(contextMenuWindow.width - width - 10, contextMenuWindow.anchorPos.x);
+ }
+ return Math.max(10, contextMenuWindow.anchorPos.x - width);
+ }
+ const left = 10;
+ const right = contextMenuWindow.width - width - 10;
+ const want = contextMenuWindow.anchorPos.x - width / 2;
+ return Math.max(left, Math.min(right, want));
+ }
+ y: {
+ if (contextMenuWindow.isVertical) {
+ const top = 10;
+ const bottom = contextMenuWindow.height - height - 10;
+ const want = contextMenuWindow.anchorPos.y - height / 2;
+ return Math.max(top, Math.min(bottom, want));
+ }
+ if (contextMenuWindow.edge === "top") {
+ return Math.min(contextMenuWindow.height - height - 10, contextMenuWindow.anchorPos.y);
+ }
+ return Math.max(10, contextMenuWindow.anchorPos.y - height);
+ }
+
+ width: Math.min(240, Math.max(170, menuColumn.implicitWidth + Theme.spacingS * 2))
+ height: Math.max(64, menuColumn.implicitHeight + Theme.spacingS * 2)
+ color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency)
+ radius: Theme.cornerRadius
+ border.color: BlurService.enabled ? BlurService.borderColor : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08)
+ border.width: BlurService.enabled ? BlurService.borderWidth : 1
+
+ opacity: contextMenuWindow.visible ? 1 : 0
+ visible: opacity > 0
+
+ Behavior on opacity {
+ NumberAnimation {
+ duration: Theme.shortDuration
+ easing.type: Theme.emphasizedEasing
+ }
+ }
+
+ Rectangle {
+ anchors.fill: parent
+ anchors.topMargin: 4
+ anchors.leftMargin: 2
+ anchors.rightMargin: -2
+ anchors.bottomMargin: -4
+ radius: parent.radius
+ color: Qt.rgba(0, 0, 0, 0.15)
+ z: -1
+ }
+
+ Column {
+ id: menuColumn
+ width: parent.width - Theme.spacingS * 2
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ anchors.topMargin: Theme.spacingS
+ spacing: 1
+
+ Rectangle {
+ id: clearAllItem
+ width: parent.width
+ height: 30
+ radius: Theme.cornerRadius
+ color: clearAllArea.containsMouse ? BlurService.hoverColor(Theme.widgetBaseHoverColor) : "transparent"
+
+ Row {
+ anchors.fill: parent
+ anchors.leftMargin: Theme.spacingS
+ anchors.rightMargin: Theme.spacingS
+ spacing: Theme.spacingS
+
+ DankIcon {
+ anchors.verticalCenter: parent.verticalCenter
+ name: "delete_sweep"
+ size: 16
+ color: Theme.surfaceText
+ }
+
+ StyledText {
+ anchors.verticalCenter: parent.verticalCenter
+ text: I18n.tr("Clear All")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceText
+ }
+ }
+
+ MouseArea {
+ id: clearAllArea
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: {
+ contextMenuWindow.closeMenu();
+ root.clearAllRequested();
+ }
+ }
+ }
+
+ Rectangle {
+ id: savedItemsItem
+ width: parent.width
+ height: 30
+ radius: Theme.cornerRadius
+ color: savedItemsArea.containsMouse ? BlurService.hoverColor(Theme.widgetBaseHoverColor) : "transparent"
+
+ Row {
+ anchors.fill: parent
+ anchors.leftMargin: Theme.spacingS
+ anchors.rightMargin: Theme.spacingS
+ spacing: Theme.spacingS
+
+ DankIcon {
+ anchors.verticalCenter: parent.verticalCenter
+ name: "push_pin"
+ size: 16
+ color: Theme.surfaceText
+ }
+
+ StyledText {
+ anchors.verticalCenter: parent.verticalCenter
+ text: I18n.tr("Show Saved Items")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceText
+ }
+ }
+
+ MouseArea {
+ id: savedItemsArea
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: {
+ contextMenuWindow.closeMenu();
+ root.showSavedItemsRequested();
+ }
+ }
+ }
+ }
+ }
+ }
+}