@@ -22,31 +22,32 @@ FocusScope {
2222 id: root
2323
2424 implicitWidth: !counterRotate ? applicationWindow.implicitWidth : applicationWindow.implicitHeight
25− implicitHeight: visibleDecorationHeight + (!counterRotate ? applicationWindow.implicitHeight : applicationWindow.implicitWidth)
25+ implicitHeight: decorationHeight + (!counterRotate ? applicationWindow.implicitHeight : applicationWindow.implicitWidth)
2626
2727 property alias application: applicationWindow.application
2828 property alias surface: applicationWindow.surface
2929 property alias active: decoration.active
3030 readonly property alias title: applicationWindow.title
31− property alias fullscreen: applicationWindow.fullscreen
3231 property alias maximizeButtonShown: decoration.maximizeButtonShown
3332
34− // Whether we want it to sho in general
33+ // Changing this will actually add/remove a decoration, meaning, requestedHeight will take the decoration into account.
34+ property bool hasDecoration: true
35+ // This will temporarily show/hide the decoration without actually changing the surface's dimensions
3536 property bool showDecoration: true
36− // Whether it is actually shown. Even if showDecoration is true, this might be false for other reasons (e.g. app is fullscreened)
37− readonly property bool decorationShown: showDecoration && !fullscreen
38− property bool highlightShown: false
37+ property bool showHighlight: false
3938 property real shadowOpacity: 1
4039
4140 property real requestedWidth
4241 property real requestedHeight
42+ property bool scaleToPreview
43+ property int scaleToPreviewSize: units.gu(30)
4344
4445 property alias surfaceOrientationAngle: applicationWindow.surfaceOrientationAngle
45− readonly property real visibleDecorationHeight: root.decorationShown ? decoration.height : 0
46+ readonly property real decorationHeight: Math.min(d.visibleDecorationHeight, d.requestedDecorationHeight)
4647 readonly property bool counterRotate: surfaceOrientationAngle != 0 && surfaceOrientationAngle != 180
4748
4849 readonly property int minimumWidth: !counterRotate ? applicationWindow.minimumWidth : applicationWindow.minimumHeight
49− readonly property int minimumHeight: visibleDecorationHeight + (!counterRotate ? applicationWindow.minimumHeight : applicationWindow.minimumWidth)
50+ readonly property int minimumHeight: decorationHeight + (!counterRotate ? applicationWindow.minimumHeight : applicationWindow.minimumWidth)
5051 readonly property int maximumWidth: !counterRotate ? applicationWindow.maximumWidth : applicationWindow.maximumHeight
5152 readonly property int maximumHeight: (root.decorationShown && applicationWindow.maximumHeight > 0 ? decoration.height : 0)
5253 + (!counterRotate ? applicationWindow.maximumHeight : applicationWindow.maximumWidth)
@@ -62,29 +63,28 @@ FocusScope {
6263 signal minimizeClicked()
6364 signal decorationPressed()
6465
66+ QtObject {
67+ id: d
68+ property int requestedDecorationHeight: root.hasDecoration && root.hasDecoration ? decoration.height : 0
69+ Behavior on requestedDecorationHeight { UbuntuNumberAnimation { duration: priv.animationDuration } }
70+
71+ property int visibleDecorationHeight: root.showDecoration && root.hasDecoration ? decoration.height : 0
72+ Behavior on visibleDecorationHeight { UbuntuNumberAnimation { duration: priv.animationDuration } }
73+ }
74+
6575 Rectangle {
6676 id: selectionHighlight
6777 anchors.fill: parent
6878 anchors.margins: -units.gu(1)
6979 color: "white"
70− opacity: highlightShown ? 0.15 : 0
80+ opacity: showHighlight ? 0.15 : 0
7181 }
7282
7383 Rectangle {
7484 anchors { left: selectionHighlight.left; right: selectionHighlight.right; bottom: selectionHighlight.bottom; }
7585 height: units.dp(2)
7686 color: theme.palette.normal.focus
77− visible: highlightShown
78− }
79−
80− BorderImage {
81− anchors {
82− fill: root
83− margins: active ? -units.gu(2) : -units.gu(1.5)
84− }
85− source: "graphics/dropshadow2gu.sci"
86− opacity: root.shadowOpacity * .3
87− visible: !fullscreen
87+ visible: showHighlight
8888 }
8989
9090 WindowDecoration {
@@ -95,7 +95,10 @@ FocusScope {
9595 height: units.gu(3)
9696 width: root.width
9797 title: applicationWindow.title
98− visible: root.decorationShown
98+ opacity: root.hasDecoration && root.showDecoration ? 1 : 0
99+
100+ // FIXME: priv.animationDuration reaches out of context... neads cleanup before landing
101+ Behavior on opacity { UbuntuNumberAnimation { duration: priv.animationDuration } }
99102
100103 onCloseClicked: root.closeClicked();
101104 onMaximizeClicked: { root.decorationPressed(); root.maximizeClicked(); }
@@ -109,21 +112,44 @@ FocusScope {
109112 id: applicationWindow
110113 objectName: "appWindow"
111114 anchors.top: parent.top
112− anchors.topMargin: root.decorationShown ? decoration.height : 0
115+ anchors.topMargin: root.decorationHeight
113116 anchors.left: parent.left
114117 width: root.width
115118 height: root.height - anchors.topMargin
116− readonly property real requestedHeightMinusDecoration: root.requestedHeight - root.visibleDecorationHeight
117− requestedHeight: !counterRotate ? requestedHeightMinusDecoration : root.requestedWidth
118− requestedWidth: !counterRotate ? root.requestedWidth : requestedHeightMinusDecoration
119+ requestedHeight: !counterRotate ? root.requestedHeight - d.requestedDecorationHeight : root.requestedWidth
120+ requestedWidth: !counterRotate ? root.requestedWidth : root.requestedHeight - d.requestedDecorationHeight
121+ property int oldRequestedWidth: requestedWidth
122+ property int oldRequestedHeight: requestedHeight
123+ onRequestedWidthChanged: oldRequestedWidth = requestedWidth
124+ onRequestedHeightChanged: oldRequestedHeight = requestedHeight
119125 interactive: true
120126 focus: true
121127
122− Behavior on anchors.topMargin {
123− UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
124− }
125−
126− transform: Rotation {
128+ property real itemScale: 1
129+ states: [
130+ State {
131+ name: "preview"; when: root.scaleToPreview
132+ PropertyChanges {
133+ target: applicationWindow;
134+ requestedWidth: applicationWindow.oldRequestedWidth
135+ requestedHeight: applicationWindow.oldRequestedHeight
136+ implicitWidth: root.scaleToPreviewSize
137+ implicitHeight: root.scaleToPreviewSize
138+ width: Math.min(root.scaleToPreviewSize, Math.min(applicationWindow.requestedHeight, applicationWindow.requestedWidth))
139+ height: Math.min(root.scaleToPreviewSize, Math.min(applicationWindow.requestedHeight, applicationWindow.requestedWidth))
140+ itemScale: 1.0 * root.scaleToPreviewSize / applicationWindow.width
141+ }
142+ }
143+ ]
144+ transitions: [
145+ Transition {
146+ from: "*"; to: "*"
147+ UbuntuNumberAnimation { properties: "width,height,implicitWidth,implicitHeight"; duration: priv.animationDuration }
148+ }
149+ ]
150+
151+ transform: [
152+ Rotation {
127153 readonly property int rotationAngle: applicationWindow.application &&
128154 applicationWindow.application.rotatesWindowContents
129155 ? ((360 - applicationWindow.surfaceOrientationAngle) % 360) : 0
@@ -140,6 +166,14 @@ FocusScope {
140166 else return 0;
141167 }
142168 angle: rotationAngle
143− }
169+ },
170+ Scale {
171+ xScale: applicationWindow.itemScale
172+ yScale: applicationWindow.itemScale
173+ }
174+
175+ ]
144176 }
177+
178+ Rectangle { anchors.fill: parent; color: "blue"; opacity: .3 }
145179}