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