Unity 8
WindowDecoration.qml
1 /*
2  * Copyright (C) 2014-2016 Canonical, Ltd.
3  *
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.
7  *
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.
12  *
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/>.
15  */
16 
17 import QtQuick 2.4
18 import QtQuick.Layouts 1.1
19 import Ubuntu.Components 1.3
20 import Unity.Application 0.1
21 import "../Components"
22 import "../Components/PanelState"
23 import "../ApplicationMenus"
24 
25 MouseArea {
26  id: root
27 
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 
39  readonly property real buttonsWidth: buttons.width + row.spacing
40 
41  acceptedButtons: Qt.AllButtons // prevent leaking unhandled mouse events
42  hoverEnabled: true
43 
44  signal closeClicked()
45  signal minimizeClicked()
46  signal maximizeClicked()
47  signal maximizeHorizontallyClicked()
48  signal maximizeVerticallyClicked()
49 
50  signal pressedChangedEx(bool pressed, var pressedButtons, real mouseX, real mouseY)
51 
52  onDoubleClicked: {
53  if (mouse.button == Qt.LeftButton) {
54  root.maximizeClicked();
55  }
56  }
57 
58  // do not let unhandled wheel event pass thru the decoration
59  onWheel: wheel.accepted = true;
60 
61  QtObject {
62  id: priv
63  property var menuBar: menuBarLoader.item
64 
65  property bool shouldShowMenus: root.enableMenus &&
66  menuBar &&
67  menuBar.valid &&
68  (menuBar.showRequested || root.containsMouse)
69  }
70 
71  Rectangle {
72  id: background
73  anchors.fill: parent
74  radius: units.gu(.5)
75  color: theme.palette.normal.background
76  }
77 
78  Rectangle {
79  anchors {
80  bottom: background.bottom
81  left: parent.left
82  right: parent.right
83  }
84  height: background.radius
85  color: theme.palette.normal.background
86  }
87 
88  RowLayout {
89  id: row
90  anchors {
91  fill: parent
92  leftMargin: overlayShown ? units.gu(5) : units.gu(1)
93  rightMargin: units.gu(1)
94  }
95  Behavior on anchors.leftMargin {
96  UbuntuNumberAnimation {}
97  }
98 
99  spacing: units.gu(3)
100 
101  WindowControlButtons {
102  id: buttons
103  anchors {
104  top: parent.top
105  bottom: parent.bottom
106  topMargin: units.gu(0.5)
107  bottomMargin: units.gu(0.5)
108  }
109  active: root.active
110  onCloseClicked: root.closeClicked();
111  onMinimizeClicked: root.minimizeClicked();
112  onMaximizeClicked: root.maximizeClicked();
113  onMaximizeHorizontallyClicked: root.maximizeHorizontallyClicked();
114  onMaximizeVerticallyClicked: root.maximizeVerticallyClicked();
115  }
116 
117  Item {
118  Layout.preferredHeight: parent.height
119  Layout.fillWidth: true
120 
121  Label {
122  id: titleLabel
123  objectName: "windowDecorationTitle"
124  color: root.active ? "white" : UbuntuColors.slate
125  height: parent.height
126  width: parent.width
127  verticalAlignment: Text.AlignVCenter
128  fontSize: "medium"
129  font.weight: root.active ? Font.Light : Font.Medium
130  elide: Text.ElideRight
131  opacity: overlayShown || menuBarLoader.visible ? 0 : 1
132  visible: opacity != 0
133  Behavior on opacity { UbuntuNumberAnimation {} }
134  }
135 
136  Loader {
137  id: menuBarLoader
138  objectName: "menuBarLoader"
139  anchors.bottom: parent.bottom
140  height: parent.height
141  width: parent.width
142  active: root.menu !== undefined
143 
144  sourceComponent: MenuBar {
145  id: menuBar
146  height: menuBarLoader.height
147  enableKeyFilter: valid && root.active && root.enableMenus
148  unityMenuModel: root.menu
149  windowMoving: root.windowMoving
150 
151  onPressed: root.onPressed(mouse)
152  onPressedChangedEx: root.pressedChangedEx(pressed, pressedButtons, mouseX, mouseY)
153  onPositionChanged: root.onPositionChanged(mouse)
154  onReleased: root.onReleased(mouse)
155  onDoubleClicked: root.onDoubleClicked(mouse)
156  }
157 
158  opacity: (!overlayShown && priv.shouldShowMenus) || (active && priv.menuBar.valid && root.windowMoving) ? 1 : 0
159  visible: opacity == 1
160  Behavior on opacity { UbuntuNumberAnimation {} }
161  }
162  }
163  }
164 }