178 lines
5.2 KiB
QML
178 lines
5.2 KiB
QML
// Copyright (C) 2023 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
|
|
|
import QtQuick
|
|
import QtQuick.Layouts
|
|
import QtQuick.Controls.Basic
|
|
import FileSystemModule
|
|
|
|
// The MenuBar also serves as a controller for our window as we don't use any decorations.
|
|
MenuBar {
|
|
id: root
|
|
|
|
required property ApplicationWindow dragWindow
|
|
property alias infoText: windowInfo.text
|
|
|
|
// Customization of the top level menus inside the MenuBar
|
|
delegate: MenuBarItem {
|
|
id: menuBarItem
|
|
|
|
contentItem: Text {
|
|
horizontalAlignment: Text.AlignLeft
|
|
verticalAlignment: Text.AlignVCenter
|
|
|
|
text: menuBarItem.text
|
|
font: menuBarItem.font
|
|
elide: Text.ElideRight
|
|
color: menuBarItem.highlighted ? Colors.textFile : Colors.text
|
|
opacity: enabled ? 1.0 : 0.3
|
|
}
|
|
|
|
background: Rectangle {
|
|
id: background
|
|
|
|
color: menuBarItem.highlighted ? Colors.selection : "transparent"
|
|
Rectangle {
|
|
id: indicator
|
|
|
|
width: 0; height: 3
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.bottom: parent.bottom
|
|
|
|
color: Colors.color1
|
|
states: State {
|
|
name: "active"
|
|
when: menuBarItem.highlighted
|
|
PropertyChanges {
|
|
indicator.width: background.width - 2
|
|
}
|
|
}
|
|
transitions: Transition {
|
|
NumberAnimation {
|
|
properties: "width"
|
|
duration: 175
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// We use the contentItem property as a place to attach our window decorations. Beneath
|
|
// the usual menu entries within a MenuBar, it includes a centered information text, along
|
|
// with the minimize, maximize, and close buttons.
|
|
contentItem: RowLayout {
|
|
id: windowBar
|
|
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
|
|
spacing: root.spacing
|
|
Repeater {
|
|
id: menuBarItems
|
|
|
|
Layout.alignment: Qt.AlignLeft
|
|
model: root.contentModel
|
|
}
|
|
|
|
Item {
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
Text {
|
|
id: windowInfo
|
|
|
|
width: parent.width; height: parent.height
|
|
horizontalAlignment: Text.AlignHCenter
|
|
verticalAlignment: Text.AlignVCenter
|
|
leftPadding: windowActions.width
|
|
color: Colors.text
|
|
clip: true
|
|
}
|
|
}
|
|
|
|
RowLayout {
|
|
id: windowActions
|
|
|
|
Layout.alignment: Qt.AlignRight
|
|
Layout.fillHeight: true
|
|
|
|
spacing: 0
|
|
|
|
component InteractionButton: Rectangle {
|
|
id: interactionButton
|
|
|
|
signal action()
|
|
property alias hovered: hoverHandler.hovered
|
|
|
|
Layout.fillHeight: true
|
|
Layout.preferredWidth: height
|
|
|
|
color: hovered ? Colors.background : "transparent"
|
|
HoverHandler {
|
|
id: hoverHandler
|
|
}
|
|
TapHandler {
|
|
id: tapHandler
|
|
onTapped: interactionButton.action()
|
|
}
|
|
}
|
|
|
|
InteractionButton {
|
|
id: minimize
|
|
|
|
onAction: root.dragWindow.showMinimized()
|
|
Rectangle {
|
|
anchors.centerIn: parent
|
|
color: parent.hovered ? Colors.iconIndicator : Colors.icon
|
|
height: 2
|
|
width: parent.height - 14
|
|
}
|
|
}
|
|
|
|
InteractionButton {
|
|
id: maximize
|
|
|
|
onAction: root.dragWindow.showMaximized()
|
|
Rectangle {
|
|
anchors.fill: parent
|
|
anchors.margins: 7
|
|
border.color: parent.hovered ? Colors.iconIndicator : Colors.icon
|
|
border.width: 2
|
|
color: "transparent"
|
|
}
|
|
}
|
|
|
|
InteractionButton {
|
|
id: close
|
|
|
|
color: hovered ? "#ec4143" : "transparent"
|
|
onAction: root.dragWindow.close()
|
|
Rectangle {
|
|
anchors.centerIn: parent
|
|
width: parent.height - 8; height: 2
|
|
|
|
rotation: 45
|
|
antialiasing: true
|
|
transformOrigin: Item.Center
|
|
color: parent.hovered ? Colors.iconIndicator : Colors.icon
|
|
|
|
Rectangle {
|
|
anchors.centerIn: parent
|
|
width: parent.height
|
|
height: parent.width
|
|
|
|
antialiasing: true
|
|
color: parent.color
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
background: Rectangle {
|
|
color: Colors.surface2
|
|
// Make the empty space drag the specified root window.
|
|
WindowDragHandler {
|
|
dragWindow: root.dragWindow
|
|
}
|
|
}
|
|
}
|