on xenial help sign in
Hide the maximize window button based on size restrictions (LP: #1541982)
commite910467c726ca57cecb1ce30095ad713d650123c authorLukáš Tinkl <lukas.tinkl@canonical.com> dateMon 27 Jun 2016, 18:43 (10 years ago) parentd81183581938ca
5 files changed+37−5
qml/Components/WindowControlButtons.qml+2 qml/Stages/DecoratedWindow.qml+5−4 qml/Stages/DesktopStage.qml+2 qml/Stages/WindowDecoration.qml+2−1 tests/qmltests/Stages/tst_DesktopStage.qml+26
qml/Components/WindowControlButtons.qml+2
@@ -29,6 +29,7 @@ Row {
2929 property bool active: false
3030 property bool windowIsMaximized: false
3131 property bool closeButtonShown: true
32+ property bool maximizeButtonShown: true
3233 property bool overlayShown
3334
3435 signal closeClicked()
@@ -88,6 +89,7 @@ Row {
8889 hoverEnabled: true
8990 height: parent.height
9091 width: height
92+ visible: root.maximizeButtonShown
9193 acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
9294 onClicked: {
9395 if (mouse.button == Qt.LeftButton) {
qml/Stages/DecoratedWindow.qml+5−4
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Zanetti <michael.zanetti@canonical.com>
1715 */
1816
1917import QtQuick 2.4
@@ -31,6 +29,7 @@ FocusScope {
3129 property alias active: decoration.active
3230 readonly property alias title: applicationWindow.title
3331 property alias fullscreen: applicationWindow.fullscreen
32+ property alias maximizeButtonShown: decoration.maximizeButtonShown
3433
3534 readonly property bool decorationShown: !fullscreen
3635 property bool highlightShown: false
@@ -38,6 +37,7 @@ FocusScope {
3837
3938 property real requestedWidth
4039 property real requestedHeight
40+
4141 property alias surfaceOrientationAngle: applicationWindow.surfaceOrientationAngle
4242 readonly property real visibleDecorationHeight: root.decorationShown ? decoration.height : 0
4343 readonly property bool counterRotate: surfaceOrientationAngle != 0 && surfaceOrientationAngle != 180
@@ -45,7 +45,8 @@ FocusScope {
4545 readonly property int minimumWidth: !counterRotate ? applicationWindow.minimumWidth : applicationWindow.minimumHeight
4646 readonly property int minimumHeight: visibleDecorationHeight + (!counterRotate ? applicationWindow.minimumHeight : applicationWindow.minimumWidth)
4747 readonly property int maximumWidth: !counterRotate ? applicationWindow.maximumWidth : applicationWindow.maximumHeight
48− readonly property int maximumHeight: visibleDecorationHeight + (!counterRotate ? applicationWindow.maximumHeight : applicationWindow.maximumWidth)
48+ readonly property int maximumHeight: (root.decorationShown && applicationWindow.maximumHeight > 0 ? decoration.height : 0)
49+ + (!counterRotate ? applicationWindow.maximumHeight : applicationWindow.maximumWidth)
4950 readonly property int widthIncrement: !counterRotate ? applicationWindow.widthIncrement : applicationWindow.heightIncrement
5051 readonly property int heightIncrement: !counterRotate ? applicationWindow.heightIncrement : applicationWindow.widthIncrement
5152
qml/Stages/DesktopStage.qml+2
@@ -654,6 +654,8 @@ AbstractStage {
654654 surface: model.surface
655655 active: appDelegate.focus
656656 focus: true
657+ maximizeButtonShown: (maximumWidth == 0 || maximumWidth >= appContainer.width) &&
658+ (maximumHeight == 0 || maximumHeight >= appContainer.height)
657659 overlayShown: touchControls.overlayShown
658660
659661 requestedWidth: appDelegate.requestedWidth
qml/Stages/WindowDecoration.qml+2−1
@@ -26,6 +26,7 @@ MouseArea {
2626
2727 property Item target
2828 property alias title: titleLabel.text
29+ property alias maximizeButtonShown: buttons.maximizeButtonShown
2930 property bool active: false
3031 acceptedButtons: Qt.AllButtons // prevent leaking unhandled mouse events
3132 property alias overlayShown: buttons.overlayShown
@@ -37,7 +38,7 @@ MouseArea {
3738 signal maximizeVerticallyClicked()
3839
3940 onDoubleClicked: {
40− if (mouse.button == Qt.LeftButton) {
41+ if (maximizeButtonShown && mouse.button == Qt.LeftButton) {
4142 root.maximizeClicked();
4243 }
4344 }
tests/qmltests/Stages/tst_DesktopStage.qml+26
@@ -691,6 +691,32 @@ Item {
691691 tryCompare(closeButton, "visible", false);
692692 }
693693
694+ function test_hideMaximizeButtonWhenSizeConstrained() {
695+ var dialerDelegate = startApplication("dialer-app");
696+
697+ var dialerMaximizeButton = findChild(dialerDelegate, "maximizeWindowButton");
698+ tryCompare(dialerMaximizeButton, "visible", true);
699+
700+ // add size restrictions, smaller than our stage
701+ dialerDelegate.surface.setMaximumWidth(40);
702+ dialerDelegate.surface.setMaximumHeight(30);
703+ tryCompare(dialerMaximizeButton, "visible", false);
704+
705+ // try double clicking the decoration, shouldn't maximize it
706+ var sizeBefore = Qt.size(dialerDelegate.width, dialerDelegate.height);
707+ var deco = findChild(dialerDelegate, "appWindowDecoration");
708+ verify(deco);
709+ tryCompare(deco, "maximizeButtonShown", false);
710+ mouseDoubleClick(deco);
711+ var sizeAfter = Qt.size(dialerDelegate.width, dialerDelegate.height);
712+ tryCompareFunction(function(){ return sizeBefore; }, sizeAfter);
713+
714+ // remove restrictions, the maximize button should again be visible
715+ dialerDelegate.surface.setMaximumWidth(0);
716+ dialerDelegate.surface.setMaximumHeight(0);
717+ tryCompare(dialerMaximizeButton, "visible", true);
718+ }
719+
694720 function test_canMoveWindowWithLeftMouseButtonOnly_data() {
695721 return [
696722 {tag: "left mouse button", button: Qt.LeftButton },