2023-07-02 15:58:02 +08:00
|
|
|
import QtQuick
|
|
|
|
import QtQuick.Controls
|
|
|
|
import QtQuick.Window
|
|
|
|
import QtQuick.Layouts
|
|
|
|
import FluentUI
|
|
|
|
|
|
|
|
Rectangle {
|
2023-07-02 19:47:51 +08:00
|
|
|
property string username: "用户名"
|
2023-07-02 15:58:02 +08:00
|
|
|
property string title: ""
|
|
|
|
property string darkText: "夜间模式"
|
|
|
|
property string minimizeText: "最小化"
|
|
|
|
property string restoreText: "向下还原"
|
|
|
|
property string maximizeText: "最大化"
|
|
|
|
property string closeText: "关闭"
|
|
|
|
property color textColor: FluTheme.dark ? "#FFFFFF" : "#000000"
|
|
|
|
property color minimizeNormalColor: Qt.rgba(0, 0, 0, 0)
|
|
|
|
property color minimizeHoverColor: FluTheme.dark ? Qt.rgba(1, 1, 1,
|
|
|
|
0.1) : Qt.rgba(
|
|
|
|
0, 0, 0, 0.06)
|
|
|
|
property color maximizeNormalColor: Qt.rgba(0, 0, 0, 0)
|
|
|
|
property color maximizeHoverColor: FluTheme.dark ? Qt.rgba(1, 1, 1,
|
|
|
|
0.1) : Qt.rgba(
|
|
|
|
0, 0, 0, 0.06)
|
|
|
|
property color closeNormalColor: Qt.rgba(0, 0, 0, 0)
|
|
|
|
property color closeHoverColor: Qt.rgba(251 / 255, 115 / 255, 115 / 255, 1)
|
|
|
|
property bool showDark: false
|
|
|
|
property bool titleVisible: true
|
|
|
|
property bool isMac: FluTools.isMacos()
|
|
|
|
property color borerlessColor: FluTheme.dark ? FluTheme.primaryColor.lighter : FluTheme.primaryColor.dark
|
|
|
|
property var maxClickListener: function () {
|
|
|
|
if (d.win.visibility === Window.Maximized)
|
|
|
|
d.win.visibility = Window.Windowed
|
|
|
|
else
|
|
|
|
d.win.visibility = Window.Maximized
|
|
|
|
}
|
|
|
|
property var minClickListener: function () {
|
|
|
|
d.win.visibility = Window.Minimized
|
|
|
|
}
|
|
|
|
property var closeClickListener: function () {
|
|
|
|
d.win.close()
|
|
|
|
}
|
|
|
|
property var darkClickListener: function () {
|
|
|
|
if (FluTheme.dark) {
|
|
|
|
FluTheme.darkMode = FluDarkMode.Light
|
|
|
|
} else {
|
|
|
|
FluTheme.darkMode = FluDarkMode.Dark
|
|
|
|
}
|
|
|
|
}
|
|
|
|
id: root
|
|
|
|
color: Qt.rgba(0, 0, 0, 0)
|
|
|
|
height: visible ? 44 : 0
|
|
|
|
opacity: visible
|
|
|
|
z: 65535
|
|
|
|
Item {
|
|
|
|
id: d
|
|
|
|
property var win: Window.window
|
|
|
|
property bool isRestore: win && Window.Maximized === win.visibility
|
|
|
|
property bool resizable: win
|
|
|
|
&& !(win.minimumHeight === win.maximumHeight
|
|
|
|
&& win.maximumWidth === win.minimumWidth)
|
|
|
|
}
|
|
|
|
TapHandler {
|
|
|
|
onTapped: if (tapCount === 2)
|
|
|
|
btn_maximize.clicked()
|
|
|
|
gesturePolicy: TapHandler.DragThreshold
|
|
|
|
}
|
|
|
|
DragHandler {
|
|
|
|
target: null
|
|
|
|
grabPermissions: TapHandler.CanTakeOverFromAnything
|
|
|
|
onActiveChanged: if (active) {
|
|
|
|
d.win.startSystemMove()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
FluText {
|
|
|
|
text: title
|
|
|
|
anchors {
|
|
|
|
verticalCenter: parent.verticalCenter
|
|
|
|
left: isMac ? undefined : parent.left
|
|
|
|
leftMargin: isMac ? undefined : 10
|
|
|
|
horizontalCenter: isMac ? parent.horizontalCenter : undefined
|
|
|
|
}
|
|
|
|
visible: root.titleVisible
|
|
|
|
color: root.textColor
|
|
|
|
}
|
|
|
|
RowLayout {
|
|
|
|
anchors.right: parent.right
|
|
|
|
height: root.height
|
|
|
|
spacing: 0
|
|
|
|
|
|
|
|
Item {
|
|
|
|
height: 32
|
|
|
|
width: 32
|
|
|
|
Layout.rightMargin: 10
|
|
|
|
FluIconButton {
|
|
|
|
id: btn_transfer
|
|
|
|
anchors.fill: parent
|
|
|
|
onClicked: {
|
|
|
|
transferList_popup.open()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Image {
|
|
|
|
height: 18
|
|
|
|
width: 18
|
|
|
|
anchors.centerIn: parent
|
|
|
|
source: "qrc:/AicsKnowledgeBase/res/transfer.svg"
|
|
|
|
}
|
|
|
|
|
|
|
|
TransferListPopup {
|
|
|
|
id: transferList_popup
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-03 17:13:47 +08:00
|
|
|
FluIconButton {
|
|
|
|
id: btn_note
|
|
|
|
height: 32
|
|
|
|
width: 32
|
|
|
|
Layout.rightMargin: 10
|
|
|
|
iconSource: FluentIcons.PenPalette
|
|
|
|
iconSize: 14
|
|
|
|
}
|
|
|
|
|
2023-07-02 15:58:02 +08:00
|
|
|
Text {
|
|
|
|
Layout.margins: {
|
|
|
|
right: 10
|
|
|
|
}
|
2023-07-02 19:47:51 +08:00
|
|
|
text: username
|
2023-07-02 15:58:02 +08:00
|
|
|
}
|
|
|
|
|
2023-07-02 19:47:51 +08:00
|
|
|
Item {
|
2023-07-02 15:58:02 +08:00
|
|
|
Layout.rightMargin: 10
|
|
|
|
width: 32
|
|
|
|
height: 32
|
2023-07-02 19:47:51 +08:00
|
|
|
Rectangle {
|
|
|
|
anchors.fill: parent
|
|
|
|
color: "#d2d2d2"
|
|
|
|
radius: 50
|
|
|
|
}
|
|
|
|
Text {
|
|
|
|
anchors.centerIn: parent
|
|
|
|
text: username[0]
|
|
|
|
color: "#8a8a8a"
|
|
|
|
}
|
2023-07-02 15:58:02 +08:00
|
|
|
}
|
2023-07-02 19:47:51 +08:00
|
|
|
|
2023-07-02 15:58:02 +08:00
|
|
|
RowLayout {
|
|
|
|
Layout.alignment: Qt.AlignVCenter
|
|
|
|
Layout.rightMargin: 5
|
|
|
|
visible: showDark
|
|
|
|
spacing: 5
|
|
|
|
FluText {
|
|
|
|
text: darkText
|
|
|
|
color: root.textColor
|
|
|
|
}
|
|
|
|
FluToggleSwitch {
|
|
|
|
id: btn_dark
|
|
|
|
checked: FluTheme.dark
|
|
|
|
clickListener: () => darkClickListener(btn_dark)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
FluIconButton {
|
|
|
|
id: btn_minimize
|
|
|
|
width: 40
|
|
|
|
height: 30
|
|
|
|
iconSource: FluentIcons.ChromeMinimize
|
|
|
|
Layout.alignment: Qt.AlignTop
|
|
|
|
iconSize: 11
|
|
|
|
text: minimizeText
|
|
|
|
radius: 0
|
|
|
|
visible: !isMac
|
|
|
|
iconColor: root.textColor
|
|
|
|
color: hovered ? minimizeHoverColor : minimizeNormalColor
|
|
|
|
onClicked: minClickListener()
|
|
|
|
}
|
|
|
|
FluIconButton {
|
|
|
|
id: btn_maximize
|
|
|
|
width: 40
|
|
|
|
height: 30
|
|
|
|
iconSource: d.isRestore ? FluentIcons.ChromeRestore : FluentIcons.ChromeMaximize
|
|
|
|
color: hovered ? maximizeHoverColor : maximizeNormalColor
|
|
|
|
Layout.alignment: Qt.AlignTop
|
|
|
|
visible: d.resizable && !isMac
|
|
|
|
radius: 0
|
|
|
|
iconColor: root.textColor
|
|
|
|
text: d.isRestore ? restoreText : maximizeText
|
|
|
|
iconSize: 11
|
|
|
|
onClicked: maxClickListener()
|
|
|
|
}
|
|
|
|
FluIconButton {
|
|
|
|
id: btn_close
|
|
|
|
iconSource: FluentIcons.ChromeClose
|
|
|
|
Layout.alignment: Qt.AlignTop
|
|
|
|
text: closeText
|
|
|
|
width: 40
|
|
|
|
height: 30
|
|
|
|
visible: !isMac
|
|
|
|
radius: 0
|
|
|
|
iconSize: 10
|
|
|
|
iconColor: hovered ? Qt.rgba(1, 1, 1, 1) : root.textColor
|
|
|
|
color: hovered ? closeHoverColor : closeNormalColor
|
|
|
|
onClicked: closeClickListener()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function minimizeButton() {
|
|
|
|
return btn_minimize
|
|
|
|
}
|
|
|
|
|
|
|
|
function maximizeButton() {
|
|
|
|
return btn_maximize
|
|
|
|
}
|
|
|
|
|
|
|
|
function closeButton() {
|
|
|
|
return btn_close
|
|
|
|
}
|
|
|
|
|
2023-07-03 17:13:47 +08:00
|
|
|
function setHitTestVisibleItems(frameless_helper) {
|
|
|
|
frameless_helper.setHitTestVisible(btn_minimize)
|
|
|
|
frameless_helper.setHitTestVisible(btn_maximize)
|
|
|
|
frameless_helper.setHitTestVisible(btn_close)
|
|
|
|
frameless_helper.setHitTestVisible(btn_transfer)
|
2023-07-02 15:58:02 +08:00
|
|
|
}
|
|
|
|
}
|