2 * Copyright (C) 2014-2016 Canonical Ltd.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18import QtQuick.Layouts 1.1
19import Lomiri.Components 1.3
20import QtMir.Application 0.1
22import "../Components/PanelState"
23import "../ApplicationMenus"
28 property alias closeButtonVisible: buttons.closeButtonShown
29 property alias title: titleLabel.text
30 property alias maximizeButtonShown: buttons.maximizeButtonShown
31 property alias minimizeButtonVisible: buttons.minimizeButtonVisible
32 property bool active: false
33 property alias overlayShown: buttons.overlayShown
34 property var menu: undefined
35 property bool enableMenus: true
36 property bool windowMoving: false
37 property alias windowControlButtonsVisible: buttons.visible
38 property PanelState panelState
39 property bool lightMode : false
41 readonly property real buttonsWidth: buttons.width + row.spacing
43 acceptedButtons: Qt.AllButtons // prevent leaking unhandled mouse events
47 signal minimizeClicked()
48 signal maximizeClicked()
49 signal maximizeHorizontallyClicked()
50 signal maximizeVerticallyClicked()
52 signal pressedChangedEx(bool pressed, var pressedButtons, real mouseX, real mouseY)
55 if (mouse.button == Qt.LeftButton) {
56 root.maximizeClicked();
60 // do not let unhandled wheel event pass thru the decoration
61 onWheel: wheel.accepted = true;
65 property var menuBar: menuBarLoader.item
67 property bool shouldShowMenus: root.enableMenus &&
70 (menuBar.showRequested || root.containsMouse)
77 color: root.lightMode ? "#FFFFFF" : "#000000"
82 bottom: background.bottom
86 height: background.radius
87 color: theme.palette.normal.background
94 leftMargin: overlayShown ? units.gu(5) : units.gu(1)
95 rightMargin: units.gu(1)
97 Behavior on anchors.leftMargin {
98 LomiriNumberAnimation {}
103 WindowControlButtons {
104 Layout.fillHeight: true
105 Layout.fillWidth: false
106 Layout.topMargin: units.gu(0.5)
107 Layout.bottomMargin: units.gu(0.5)
111 onCloseClicked: root.closeClicked();
112 onMinimizeClicked: root.minimizeClicked();
113 onMaximizeClicked: root.maximizeClicked();
114 onMaximizeHorizontallyClicked: root.maximizeHorizontallyClicked();
115 onMaximizeVerticallyClicked: root.maximizeVerticallyClicked();
119 Layout.preferredHeight: parent.height
120 Layout.fillWidth: true
124 objectName: "windowDecorationTitle"
125 color: root.active ? theme.palette.highlighted.baseText : LomiriColors.slate
126 height: parent.height
128 verticalAlignment: Text.AlignVCenter
130 font.weight: root.active ? Font.Light : Font.Medium
131 elide: Text.ElideRight
132 opacity: overlayShown || menuBarLoader.visible ? 0 : 1
133 visible: opacity != 0
134 Behavior on opacity { LomiriNumberAnimation {} }
139 objectName: "menuBarLoader"
140 anchors.bottom: parent.bottom
141 height: parent.height
143 active: root.menu !== undefined
145 sourceComponent: MenuBar {
147 height: menuBarLoader.height
148 enableKeyFilter: valid && root.active && root.enableMenus
149 lomiriMenuModel: root.menu
150 windowMoving: root.windowMoving
151 panelState: root.panelState
153 onPressed: root.onPressed(mouse)
154 onPressedChangedEx: root.pressedChangedEx(pressed, pressedButtons, mouseX, mouseY)
155 onPositionChanged: root.onPositionChanged(mouse)
156 onReleased: root.onReleased(mouse)
157 onDoubleClicked: root.onDoubleClicked(mouse)
160 opacity: (!overlayShown && priv.shouldShowMenus) || (active && priv.menuBar.valid && root.windowMoving) ? 1 : 0
161 visible: opacity == 1
162 Behavior on opacity { LomiriNumberAnimation {} }