RibbonUI/lib_source/qml/RibbonMenuItem.qml

126 lines
5.3 KiB
QML

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import RibbonUI
MenuItem {
id: control
property bool dark_mode: RibbonTheme.dark_mode
property var icon_source
property var icon_source_filled
property bool show_tooltip: label.contentWidth < label.implicitWidth
property alias image_icon: pic_icon
property alias ribbon_icon: rib_icon
property string bg_color: !dark_mode ? "#E8E9E9" : "#303131"
property string hover_color: !dark_mode ? "#506BBD" : "#2A4299"
property string text_color: dark_mode ? "white" : hovered ? "white" : "black"
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
implicitContentWidth + leftPadding + rightPadding)
implicitHeight: visible ? Math.max(implicitBackgroundHeight + topInset + bottomInset,
implicitContentHeight + topPadding + bottomPadding,
implicitIndicatorHeight + topPadding + bottomPadding) : 0
opacity: enabled ? 1.0 : 0.3
padding: 0
leftPadding: 12
rightPadding: 0
verticalPadding: 0
focusPolicy:Qt.TabFocus
spacing: 5
indicator: RibbonIcon {
x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
y: control.topPadding + (control.availableHeight - height) / 2
visible: control.checkable || control.checked
filled: control.hovered || control.pressed
icon_source: control.checked ? RibbonIcons.CheckmarkCircle : RibbonIcons.Circle
icon_source_filled: control.checked ? RibbonIcons_Filled.CheckmarkCircle : RibbonIcons_Filled.Circle
color: text_color
icon_size: label.contentHeight
}
arrow: RibbonIcon {
x: control.mirrored ? control.padding : control.width - width - control.padding
y: control.topPadding + (control.availableHeight - height) / 2
color: text_color
visible: control.subMenu
icon_source: RibbonIcons.ChevronCircleRight
icon_source_filled: RibbonIcons_Filled.ChevronCircleRight
icon_size: label.contentHeight
}
contentItem: Item{
RowLayout{
readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0
readonly property real indicatorPadding: control.checkable && control.indicator ? control.indicator.width + control.spacing : 0
anchors.leftMargin: !control.mirrored ? indicatorPadding : arrowPadding
anchors.rightMargin: control.mirrored ? indicatorPadding : arrowPadding
anchors.fill: parent
spacing: control.spacing
height: Math.max(rib_icon.visible ? rib_icon.contentHeight : 0, pic_icon.visible ? pic_icon.height : 0, label.contentHeight)
layoutDirection: control.mirrored ? Qt.RightToLeft : Qt.LeftToRight
width: {
let w = control.width
w = w - arrowPadding - indicatorPadding - 25
return w
}
RibbonIcon{
id :rib_icon
icon_source: typeof(control.icon_source) === "number" ? control.icon_source : 0
icon_source_filled: typeof(control.icon_source_filled) === "number" ? control.icon_source_filled : icon_source
icon_size: label.contentHeight
visible: typeof(control.icon_source) === "number"
Layout.alignment: Qt.AlignVCenter
filled: pressed || checked
color: text_color
}
Image {
id: pic_icon
source: typeof(control.icon_source) === "string" ? control.icon_source : ""
visible: typeof(control.icon_source) === "string"
fillMode:Image.PreserveAspectFit
height: label.contentHeight
width: height
Layout.alignment: Qt.AlignVCenter
}
Text {
id: label
text: control.text
Layout.alignment: Qt.AlignVCenter
verticalAlignment: Text.AlignVCenter
font.pixelSize: 13
elide: Text.ElideRight
font.family: Qt.platform.os === "osx" ? "PingFang SC" : "Microsoft YaHei UI"
color: text_color
Layout.preferredWidth:{
let w = 0
w += rib_icon.visible ? rib_icon.contentWidth : 0
w += pic_icon.visible ? pic_icon.width : 0
w += (rib_icon.visible || pic_icon.visible) && label.text ? spacing : 0
return parent.width - w
}
}
RibbonToolTip{
id: tooltip
visible: hovered && show_tooltip && control.text
text: control.text
}
}
}
background: Item {
implicitWidth: 230
implicitHeight: label.contentHeight + 14
Rectangle {
anchors.centerIn: parent
anchors.margins: 6
width: parent.width
height: parent.height - anchors.margins / 2
clip: visible
radius: 4
color: control.hovered ?hover_color : bg_color
}
}
}