on xenial help sign in
Make it work on non fullscreen windows too
64a30d5Albert Astals Cid
qml/Stages/DecoratedWindow.qml+17−4
@@ -23,8 +23,8 @@ import Unity.Application 0.1
23FocusScope {
23FocusScope {
24 id: root
24 id: root
25
25
26− width: applicationWindow.width
26+ width: !counterRotate ? applicationWindow.width : applicationWindow.height
27− height: (decorationShown ? decoration.height : 0) + applicationWindow.height
27+ height: visibleDecorationHeight + (!counterRotate ? applicationWindow.height : applicationWindow.width)
28
28
29 property alias window: applicationWindow
29 property alias window: applicationWindow
30 property alias application: applicationWindow.application
30 property alias application: applicationWindow.application
@@ -39,6 +39,8 @@ FocusScope {
39 property real requestedWidth
39 property real requestedWidth
40 property real requestedHeight
40 property real requestedHeight
41 property alias surfaceOrientationAngle: applicationWindow.surfaceOrientationAngle
41 property alias surfaceOrientationAngle: applicationWindow.surfaceOrientationAngle
42+ readonly property real visibleDecorationHeight: root.decorationShown ? decoration.height : 0
43+ readonly property bool counterRotate: surfaceOrientationAngle != 0 && surfaceOrientationAngle != 180
42
44
43 property alias minimumWidth: applicationWindow.minimumWidth
45 property alias minimumWidth: applicationWindow.minimumWidth
44 readonly property int minimumHeight: (root.decorationShown ? decoration.height : 0) + applicationWindow.minimumHeight
46 readonly property int minimumHeight: (root.decorationShown ? decoration.height : 0) + applicationWindow.minimumHeight
@@ -99,11 +101,22 @@ FocusScope {
99 anchors.top: parent.top
101 anchors.top: parent.top
100 anchors.topMargin: decoration.height
102 anchors.topMargin: decoration.height
101 anchors.left: parent.left
103 anchors.left: parent.left
102− readonly property real requestedHeightMinusDecoration: root.requestedHeight - (root.decorationShown ? decoration.height : 0)
104+ readonly property real requestedHeightMinusDecoration: root.requestedHeight - root.visibleDecorationHeight
103− readonly property bool counterRotate: surfaceOrientationAngle != 0 && surfaceOrientationAngle != 180
104 requestedHeight: !counterRotate ? requestedHeightMinusDecoration : root.requestedWidth
105 requestedHeight: !counterRotate ? requestedHeightMinusDecoration : root.requestedWidth
105 requestedWidth: !counterRotate ? root.requestedWidth : requestedHeightMinusDecoration
106 requestedWidth: !counterRotate ? root.requestedWidth : requestedHeightMinusDecoration
106 interactive: true
107 interactive: true
107 focus: true
108 focus: true
109+
110+ transform: Rotation {
111+ readonly property int rotationAngle: applicationWindow.application &&
112+ applicationWindow.application.rotatesWindowContents
113+ ? ((360 - applicationWindow.surfaceOrientationAngle) % 360) : 0
114+ readonly property real rotationOrigin: rotationAngle == 90 ? applicationWindow.height / 2
115+ : rotationAngle == 270 ? applicationWindow.width / 2
116+ : 0
117+ origin.x: rotationOrigin
118+ origin.y: rotationOrigin
119+ angle: rotationAngle
120+ }
108 }
121 }
109}
122}
qml/Stages/DesktopStage.qml+25−3
@@ -255,9 +255,32 @@ AbstractStage {
255 focus: appId === priv.focusedAppId
255 focus: appId === priv.focusedAppId
256 width: decoratedWindow.width
256 width: decoratedWindow.width
257 height: decoratedWindow.height
257 height: decoratedWindow.height
258− rotation: decoratedWindow.application && decoratedWindow.application.rotatesWindowContents
259− ? ((360 - shellOrientationAngle) % 360) : 0
260
258
259+ Connections {
260+ target: root
261+ onShellOrientationAngleChanged: {
262+ // at this point decoratedWindow.surfaceOrientationAngle is the old shellOrientationAngle
263+ if (application && application.rotatesWindowContents) {
264+ if (state == "normal") {
265+ var angleDiff = decoratedWindow.surfaceOrientationAngle - shellOrientationAngle;
266+ angleDiff = (360 + angleDiff) % 360;
267+ if (angleDiff === 90 || angleDiff === 270) {
268+ var aux = decoratedWindow.requestedHeight;
269+ decoratedWindow.requestedHeight = decoratedWindow.requestedWidth + decoratedWindow.visibleDecorationHeight;
270+ decoratedWindow.requestedWidth = aux - decoratedWindow.visibleDecorationHeight;
271+ }
272+ }
273+ decoratedWindow.surfaceOrientationAngle = shellOrientationAngle;
274+ } else {
275+ decoratedWindow.surfaceOrientationAngle = 0;
276+ }
277+ }
278+ }
279+ Component.onCompleted: {
280+ decoratedWindow.surfaceOrientationAngle = shellOrientationAngle;
281+ }
282+
283+ readonly property alias application: decoratedWindow.application
261 property alias requestedWidth: decoratedWindow.requestedWidth
284 property alias requestedWidth: decoratedWindow.requestedWidth
262 property alias requestedHeight: decoratedWindow.requestedHeight
285 property alias requestedHeight: decoratedWindow.requestedHeight
263 property alias minimumWidth: decoratedWindow.minimumWidth
286 property alias minimumWidth: decoratedWindow.minimumWidth
@@ -470,7 +493,6 @@ AbstractStage {
470 application: ApplicationManager.get(index)
493 application: ApplicationManager.get(index)
471 active: ApplicationManager.focusedApplicationId === model.appId
494 active: ApplicationManager.focusedApplicationId === model.appId
472 focus: true
495 focus: true
473− surfaceOrientationAngle: application && application.rotatesWindowContents ? shellOrientationAngle : 0
474
496
475 onClose: ApplicationManager.stopApplication(model.appId)
497 onClose: ApplicationManager.stopApplication(model.appId)
476 onMaximize: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight
498 onMaximize: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight
tests/mocks/Unity/Application/ApplicationManager.cpp+12
@@ -344,6 +344,18 @@ void ApplicationManager::buildListOfAvailableApplications()
344 application->setRotatesWindowContents(true);
344 application->setRotatesWindowContents(true);
345 m_availableApplications.append(application);
345 m_availableApplications.append(application);
346
346
347+ application = new ApplicationInfo(this);
348+ application->setAppId("camera-app2");
349+ application->setName("Camera2");
350+ application->setScreenshotId("camera");
351+ application->setIconId("camera");
352+ application->setSupportedOrientations(Qt::PortraitOrientation
353+ | Qt::LandscapeOrientation
354+ | Qt::InvertedPortraitOrientation
355+ | Qt::InvertedLandscapeOrientation);
356+ application->setRotatesWindowContents(true);
357+ m_availableApplications.append(application);
358+
347 application = new ApplicationInfo(this);
359 application = new ApplicationInfo(this);
348 application->setAppId("gallery-app");
360 application->setAppId("gallery-app");
349 application->setName("Gallery");
361 application->setName("Gallery");
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+3
@@ -32,6 +32,9 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
32 item->setProgress(10);
32 item->setProgress(10);
33 item->setPinned(true);
33 item->setPinned(true);
34 m_list.append(item);
34 m_list.append(item);
35+ item = new MockLauncherItem("camera-app2", "/usr/share/applications/camera-app2.desktop", "Camera2", "camera", this);
36+ item->setPinned(true);
37+ m_list.append(item);
35 item = new MockLauncherItem("gallery-app", "/usr/share/applications/gallery-app.desktop", "Gallery", "gallery", this);
38 item = new MockLauncherItem("gallery-app", "/usr/share/applications/gallery-app.desktop", "Gallery", "gallery", this);
36 item->setProgress(50);
39 item->setProgress(50);
37 item->setCountVisible(true);
40 item->setCountVisible(true);