on xenial help sign in
Make it work on non fullscreen windows too
commit64a30d5e262a430696d1d76d152e9805b809e7c9 authorAlbert Astals Cid <albert.astals@canonical.com> dateThu 10 Mar 2016, 14:34 (11 years ago) parent4eb4f74
4 files changed+57−7
qml/Stages/DecoratedWindow.qml+17−4 qml/Stages/DesktopStage.qml+25−3 tests/mocks/Unity/Application/ApplicationManager.cpp+12 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+3
qml/Stages/DecoratedWindow.qml+17−4
@@ -23,8 +23,8 @@ import Unity.Application 0.1
2323FocusScope {
2424 id: root
2525
26− width: applicationWindow.width
27− height: (decorationShown ? decoration.height : 0) + applicationWindow.height
26+ width: !counterRotate ? applicationWindow.width : applicationWindow.height
27+ height: visibleDecorationHeight + (!counterRotate ? applicationWindow.height : applicationWindow.width)
2828
2929 property alias window: applicationWindow
3030 property alias application: applicationWindow.application
@@ -39,6 +39,8 @@ FocusScope {
3939 property real requestedWidth
4040 property real requestedHeight
4141 property alias surfaceOrientationAngle: applicationWindow.surfaceOrientationAngle
42+ readonly property real visibleDecorationHeight: root.decorationShown ? decoration.height : 0
43+ readonly property bool counterRotate: surfaceOrientationAngle != 0 && surfaceOrientationAngle != 180
4244
4345 property alias minimumWidth: applicationWindow.minimumWidth
4446 readonly property int minimumHeight: (root.decorationShown ? decoration.height : 0) + applicationWindow.minimumHeight
@@ -99,11 +101,22 @@ FocusScope {
99101 anchors.top: parent.top
100102 anchors.topMargin: decoration.height
101103 anchors.left: parent.left
102− readonly property real requestedHeightMinusDecoration: root.requestedHeight - (root.decorationShown ? decoration.height : 0)
103− readonly property bool counterRotate: surfaceOrientationAngle != 0 && surfaceOrientationAngle != 180
104+ readonly property real requestedHeightMinusDecoration: root.requestedHeight - root.visibleDecorationHeight
104105 requestedHeight: !counterRotate ? requestedHeightMinusDecoration : root.requestedWidth
105106 requestedWidth: !counterRotate ? root.requestedWidth : requestedHeightMinusDecoration
106107 interactive: true
107108 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+ }
108121 }
109122}
qml/Stages/DesktopStage.qml+25−3
@@ -255,9 +255,32 @@ AbstractStage {
255255 focus: appId === priv.focusedAppId
256256 width: decoratedWindow.width
257257 height: decoratedWindow.height
258− rotation: decoratedWindow.application && decoratedWindow.application.rotatesWindowContents
259− ? ((360 - shellOrientationAngle) % 360) : 0
260258
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
261284 property alias requestedWidth: decoratedWindow.requestedWidth
262285 property alias requestedHeight: decoratedWindow.requestedHeight
263286 property alias minimumWidth: decoratedWindow.minimumWidth
@@ -470,7 +493,6 @@ AbstractStage {
470493 application: ApplicationManager.get(index)
471494 active: ApplicationManager.focusedApplicationId === model.appId
472495 focus: true
473− surfaceOrientationAngle: application && application.rotatesWindowContents ? shellOrientationAngle : 0
474496
475497 onClose: ApplicationManager.stopApplication(model.appId)
476498 onMaximize: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight
tests/mocks/Unity/Application/ApplicationManager.cpp+12
@@ -344,6 +344,18 @@ void ApplicationManager::buildListOfAvailableApplications()
344344 application->setRotatesWindowContents(true);
345345 m_availableApplications.append(application);
346346
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+
347359 application = new ApplicationInfo(this);
348360 application->setAppId("gallery-app");
349361 application->setName("Gallery");
tests/mocks/Unity/Launcher/MockLauncherModel.cpp+3
@@ -32,6 +32,9 @@ MockLauncherModel::MockLauncherModel(QObject* parent): LauncherModelInterface(pa
3232 item->setProgress(10);
3333 item->setPinned(true);
3434 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);
3538 item = new MockLauncherItem("gallery-app", "/usr/share/applications/gallery-app.desktop", "Gallery", "gallery", this);
3639 item->setProgress(50);
3740 item->setCountVisible(true);