on 8460bfc help sign in
unity8/qml/Panel/Panel.qml
245 lines 8.1 kB history raw
1/*
2 * Copyright (C) 2013-2015 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 */
17import QtQuick 2.4
18import Ubuntu.Components 1.3
19import Unity.Application 0.1
20import "../Components"
21import "../Components/PanelState"
22import ".."
24Item {
25 id: root
26 readonly property real panelHeight: indicatorArea.y + d.indicatorHeight
27 property alias indicators: __indicators
28 property alias callHint: __callHint
29 property bool fullscreenMode: false
30 property real indicatorAreaShowProgress: 1.0
31 property bool locked: false
33 Rectangle {
34 id: darkenedArea
35 property real darkenedOpacity: 0.6
36 anchors {
37 fill: parent
38 topMargin: panelHeight
39 }
40 color: "black"
41 opacity: indicators.unitProgress * darkenedOpacity
42 visible: !indicators.fullyClosed
44 MouseArea {
45 anchors.fill: parent
46 onClicked: if (indicators.fullyOpened) indicators.hide();
47 hoverEnabled: true // should also eat hover events, otherwise they will pass through
48 }
49 }
51 Binding {
52 target: PanelState
53 property: "panelHeight"
54 value: indicators.minimizedPanelHeight
55 }
57 Item {
58 id: indicatorArea
59 objectName: "indicatorArea"
61 anchors.fill: parent
63 transform: Translate {
64 y: indicators.state === "initial"
65 ? (1.0 - indicatorAreaShowProgress) * -d.indicatorHeight
66 : 0
67 }
69 BorderImage {
70 id: indicatorsDropShadow
71 anchors {
72 fill: indicators
73 leftMargin: -units.gu(1)
74 bottomMargin: -units.gu(1)
75 }
76 visible: !indicators.fullyClosed
77 source: "graphics/rectangular_dropshadow.sci"
78 }
80 BorderImage {
81 id: panelDropShadow
82 anchors {
83 fill: indicatorAreaBackground
84 bottomMargin: -units.gu(1)
85 }
86 visible: PanelState.dropShadow && !callHint.visible
87 source: "graphics/rectangular_dropshadow.sci"
88 }
90 Rectangle {
91 id: indicatorAreaBackground
92 color: callHint.visible ? UbuntuColors.green : theme.palette.normal.background
93 anchors {
94 top: parent.top
95 left: parent.left
96 right: parent.right
97 }
98 height: indicators.minimizedPanelHeight
100 Behavior on color { ColorAnimation { duration: UbuntuAnimation.FastDuration } }
101 }
103 MouseArea {
104 anchors {
105 top: parent.top
106 left: parent.left
107 right: indicators.left
108 }
109 height: indicators.minimizedPanelHeight
110 hoverEnabled: true
111 onClicked: callHint.visible ? callHint.showLiveCall() : PanelState.focusMaximizedApp()
112 onDoubleClicked: PanelState.maximize()
114 // WindowControlButtons inside the mouse area, otherwise QML doesn't grok nested hover events :/
115 // cf. https://bugreports.qt.io/browse/QTBUG-32909
116 WindowControlButtons {
117 id: windowControlButtons
118 objectName: "panelWindowControlButtons"
119 anchors {
120 left: parent.left
121 top: parent.top
122 leftMargin: units.gu(1)
123 topMargin: units.gu(0.5)
124 bottomMargin: units.gu(0.5)
125 }
126 height: indicators.minimizedPanelHeight - anchors.topMargin - anchors.bottomMargin
127 visible: PanelState.buttonsVisible && parent.containsMouse && !root.locked && !callHint.visible
128 active: PanelState.buttonsVisible
129 closeButtonShown: PanelState.closeButtonShown
130 onClose: PanelState.close()
131 onMinimize: PanelState.minimize()
132 onMaximize: PanelState.maximize()
133 }
134 }
136 IndicatorsMenu {
137 id: __indicators
138 objectName: "indicators"
140 anchors {
141 top: parent.top
142 right: parent.right
143 }
145 shown: false
146 width: root.width - (windowControlButtons.visible ? windowControlButtons.width + titleLabel.width : 0)
147 minimizedPanelHeight: units.gu(3)
148 expandedPanelHeight: units.gu(7)
149 openedHeight: root.height
151 overFlowWidth: {
152 if (callHint.visible) {
153 return Math.max(root.width - (callHint.width + units.gu(2)), 0)
154 }
155 return root.width
156 }
157 enableHint: !callHint.active && !fullscreenMode
158 showOnClick: !callHint.visible
159 panelColor: indicatorAreaBackground.color
161 onShowTapped: {
162 if (callHint.active) {
163 callHint.showLiveCall();
164 }
165 }
166 }
168 Label {
169 id: titleLabel
170 objectName: "windowDecorationTitle"
171 anchors {
172 left: parent.left
173 right: __indicators.left
174 top: parent.top
175 leftMargin: units.gu(1)
176 rightMargin: units.gu(1)
177 topMargin: units.gu(0.5)
178 bottomMargin: units.gu(0.5)
179 }
180 color: "white"
181 height: indicators.minimizedPanelHeight - anchors.topMargin - anchors.bottomMargin
182 visible: !windowControlButtons.visible && !root.locked && !callHint.visible
183 verticalAlignment: Text.AlignVCenter
184 fontSize: "medium"
185 font.weight: PanelState.buttonsVisible ? Font.Light : Font.Medium
186 text: PanelState.title
187 elide: Text.ElideRight
188 maximumLineCount: 1
189 }
191 // TODO here would the Locally integrated menus come
193 ActiveCallHint {
194 id: __callHint
195 anchors {
196 top: parent.top
197 left: parent.left
198 }
199 height: indicators.minimizedPanelHeight
200 visible: active && indicators.state == "initial"
201 }
202 }
204 QtObject {
205 id: d
206 objectName: "panelPriv"
207 readonly property real indicatorHeight: indicators.minimizedPanelHeight
208 }
210 states: [
211 State {
212 name: "onscreen" //fully opaque and visible at top edge of screen
213 when: !fullscreenMode
214 PropertyChanges {
215 target: indicatorArea;
216 anchors.topMargin: 0
217 opacity: 1;
218 }
219 },
220 State {
221 name: "offscreen" //pushed off screen
222 when: fullscreenMode
223 PropertyChanges {
224 target: indicatorArea;
225 anchors.topMargin: indicators.state === "initial" ? -d.indicatorHeight : 0
226 opacity: indicators.fullyClosed ? 0.0 : 1.0
227 }
228 PropertyChanges {
229 target: indicators.showDragHandle;
230 anchors.bottomMargin: -units.gu(1)
231 }
232 }
233 ]
235 transitions: [
236 Transition {
237 to: "onscreen"
238 UbuntuNumberAnimation { target: indicatorArea; properties: "anchors.topMargin,opacity" }
239 },
240 Transition {
241 to: "offscreen"
242 UbuntuNumberAnimation { target: indicatorArea; properties: "anchors.topMargin,opacity" }
243 }
244 ]