status-desktop/ui/shared/PopupMenu.qml
Alexandra Betouni 4ee21ada05 feat(desktop) Added image function in Style
Introduced Style.svg() Style.png() Style.emoji() and
Style.icon() in Style.qml. Those should be used to
set the source in Images instead of using relative
paths. Usage:
Image {
   source: Style.svg("check)
   ....

Also moved all Singletons inside a new "utils"
folder and made it a QML module, to use
import utils 1.0 instead of relative paths

Closes #3678
2021-09-28 15:28:00 -04:00

163 lines
5.6 KiB
QML

import QtQuick 2.13
import QtQuick.Controls 2.13
import QtGraphicalEffects 1.13
import utils 1.0
import "../shared"
Menu {
// This is to add icons to submenu items. QML doesn't have a way to add icons to those sadly so this is a workaround
property var subMenuIcons: []
property int paddingSize: 8
property bool hasArrow: true
closePolicy: Popup.CloseOnPressOutside | Popup.CloseOnReleaseOutside | Popup.CloseOnEscape
id: popupMenu
topPadding: paddingSize
bottomPadding: paddingSize
property string overrideTextColor: ""
delegate: MenuItem {
property color textColor: popupMenu.overrideTextColor !== "" ? popupMenu.overrideTextColor : (this.action.icon.color.toString() !== "#00000000" ? this.action.icon.color : Style.current.textColor)
property color hoverColor: popupMenuItem.action.icon.color === Style.current.danger ? Style.current.buttonWarnBackgroundColor : Style.current.backgroundHover
property int subMenuIndex: {
if (!this.subMenu) {
return -1
}
let child;
let index = 0;
for (let i = 0; i < popupMenu.count; i++) {
child = popupMenu.itemAt(i)
if (child.subMenu) {
if (child === this) {
return index
} else {
index++;
}
}
}
return index
}
enabled: {
if (this.subMenu) {
return this.subMenu.enabled
}
return this.action.enabled
}
action: Action{} // Meant to be overwritten
id: popupMenuItem
implicitWidth: 200
implicitHeight: 34
font.pixelSize: 13
font.weight: checked ? Font.Medium : Font.Normal
icon.color: popupMenuItem.action.icon.color != "#00000000" ? popupMenuItem.action.icon.color : Style.current.blue
icon.source: this.subMenu ? subMenuIcons[subMenuIndex].source : popupMenuItem.action.icon.source
icon.width: this.subMenu ? subMenuIcons[subMenuIndex].width : popupMenuItem.action.icon.width
icon.height: this.subMenu ? subMenuIcons[subMenuIndex].height : popupMenuItem.action.icon.height
visible: enabled
height: visible ? popupMenuItem.implicitHeight : 0
arrow: SVGImage {
source: Style.svg("caret")
rotation: -90
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 12
width: 9
fillMode: Image.PreserveAspectFit
visible: popupMenuItem.subMenu && popupMenuItem.subMenu.enabled
ColorOverlay {
anchors.fill: parent
source: parent
color: popupMenuItem.textColor
}
}
// FIXME the icons looks very pixelated on Linux for some reason. Using smooth, mipmap, etc doesn't fix it
indicator: Item {
visible: !!popupMenuItem.icon.source.toString()
width: !isNaN(popupMenuItem.icon.width) ? popupMenuItem.icon.width : 25
height: !isNaN(popupMenuItem.icon.height) ? popupMenuItem.icon.height : 25
anchors.left: parent.left
anchors.leftMargin: Style.current.padding
anchors.verticalCenter: parent.verticalCenter
Image {
id: menuIcon
source: popupMenuItem.icon.source
visible: false
width: parent.width
height: parent.width
sourceSize.width: width
sourceSize.height: height
}
ColorOverlay {
anchors.fill: menuIcon
source: menuIcon
smooth: true
color: (popupMenuItem.action.icon.color != "#00000000" ? popupMenuItem.action.icon.color : Style.current.primaryMenuItemHover)
}
}
contentItem: StyledText {
anchors.left: popupMenuItem.indicator.right
anchors.leftMargin: popupMenu.paddingSize
text: popupMenuItem.text
font: popupMenuItem.font
color: popupMenuItem.textColor
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
opacity: enabled ? 1.0 : 0.3
elide: Text.ElideRight
}
background: Rectangle {
implicitWidth: 220
implicitHeight: enabled ? 24 : 0
color: popupMenuItem.hovered ? popupMenuItem.hoverColor : "transparent"
}
MouseArea {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onPressed: mouse.accepted = false
}
}
background: Item {
id: bgPopupMenu
implicitWidth: 220
Rectangle {
id: bgPopupMenuContent
implicitWidth: bgPopupMenu.width
implicitHeight: bgPopupMenu.height
color: Style.current.modalBackground
radius: 8
layer.enabled: true
layer.effect: DropShadow{
width: bgPopupMenuContent.width
height: bgPopupMenuContent.height
x: bgPopupMenuContent.x
visible: bgPopupMenuContent.visible
source: bgPopupMenuContent
horizontalOffset: 0
verticalOffset: 4
radius: 12
samples: 25
spread: 0.2
color: "#22000000"
}
}
}
}
/*##^##
Designer {
D{i:0;autoSize:true;height:480;width:640}
}
##^##*/