136 lines
4.1 KiB
QML
136 lines
4.1 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 rootWindow
|
||
|
property alias infoText: windowInfo.text
|
||
|
|
||
|
implicitHeight: 25
|
||
|
|
||
|
// The top level menus on the left side
|
||
|
delegate: MenuBarItem {
|
||
|
id: menuBarItem
|
||
|
implicitHeight: 25
|
||
|
|
||
|
contentItem: Text {
|
||
|
horizontalAlignment: Text.AlignLeft
|
||
|
verticalAlignment: Text.AlignVCenter
|
||
|
color: menuBarItem.highlighted ? Colors.textFile : Colors.text
|
||
|
opacity: enabled ? 1.0 : 0.3
|
||
|
text: menuBarItem.text
|
||
|
elide: Text.ElideRight
|
||
|
font: menuBarItem.font
|
||
|
}
|
||
|
|
||
|
background: Rectangle {
|
||
|
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 { target: indicator; width: parent.width }
|
||
|
}
|
||
|
|
||
|
transitions: Transition {
|
||
|
NumberAnimation {
|
||
|
properties: "width"
|
||
|
duration: 300
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// The background property contains an information text in the middle as well as the
|
||
|
// Minimize, Maximize and Close Buttons.
|
||
|
background: Rectangle {
|
||
|
color: Colors.surface2
|
||
|
// Make the empty space drag the specified root window.
|
||
|
WindowDragHandler { dragWindow: rootWindow }
|
||
|
|
||
|
Text {
|
||
|
id: windowInfo
|
||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||
|
anchors.verticalCenter: parent.verticalCenter
|
||
|
color: Colors.text
|
||
|
}
|
||
|
|
||
|
component InteractionButton: Rectangle {
|
||
|
signal action;
|
||
|
property alias hovered: hoverHandler.hovered
|
||
|
|
||
|
width: root.height
|
||
|
anchors.top: parent.top
|
||
|
anchors.bottom: parent.bottom
|
||
|
color: hovered ? Colors.background : "transparent"
|
||
|
|
||
|
HoverHandler { id: hoverHandler }
|
||
|
TapHandler { onTapped: action() }
|
||
|
}
|
||
|
|
||
|
InteractionButton {
|
||
|
id: minimize
|
||
|
|
||
|
anchors.right: maximize.left
|
||
|
onAction: rootWindow.showMinimized()
|
||
|
Rectangle {
|
||
|
width: parent.height - 10; height: 2
|
||
|
anchors.centerIn: parent
|
||
|
color: parent.hovered ? Colors.iconIndicator : Colors.icon
|
||
|
}
|
||
|
}
|
||
|
|
||
|
InteractionButton {
|
||
|
id: maximize
|
||
|
|
||
|
anchors.right: close.left
|
||
|
onAction: rootWindow.showMaximized()
|
||
|
Rectangle {
|
||
|
anchors.fill: parent
|
||
|
anchors.margins: 5
|
||
|
border.width: 2
|
||
|
color: "transparent"
|
||
|
border.color: parent.hovered ? Colors.iconIndicator : Colors.icon
|
||
|
}
|
||
|
}
|
||
|
|
||
|
InteractionButton {
|
||
|
id: close
|
||
|
|
||
|
color: hovered ? "#ec4143" : "transparent"
|
||
|
anchors.right: parent.right
|
||
|
onAction: rootWindow.close()
|
||
|
Rectangle {
|
||
|
width: parent.height - 8; height: 2
|
||
|
anchors.centerIn: parent
|
||
|
color: parent.hovered ? Colors.iconIndicator : Colors.icon
|
||
|
rotation: 45
|
||
|
transformOrigin: Item.Center
|
||
|
antialiasing: true
|
||
|
Rectangle {
|
||
|
width: parent.height
|
||
|
height: parent.width
|
||
|
anchors.centerIn: parent
|
||
|
color: parent.color
|
||
|
antialiasing: true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|