diff --git a/app/gui/AppView.qml b/app/gui/AppView.qml
index 3a4e18ae..898df369 100644
--- a/app/gui/AppView.qml
+++ b/app/gui/AppView.qml
@@ -4,25 +4,16 @@ import QtQuick.Controls 2.2
import AppModel 1.0
import ComputerManager 1.0
-GridView {
+CenteredGridView {
property int computerIndex
property AppModel appModel : createModel()
property bool activated
- // Prevent the margin from dropping below 10. By keeping a floor on the margin value
- // this prevents a binding loop caused by the ternary condition changing and decreasing
- // the margin size, thus causing it to change back.
- property real horizontalMargin: Math.max(10,
- contentHeight > cellHeight && parent.width > cellWidth ?
- (parent.width % cellWidth) / 2 : 0)
-
id: appGrid
focus: true
activeFocusOnTab: true
topMargin: 20
bottomMargin: 5
- leftMargin: horizontalMargin
- rightMargin: horizontalMargin
cellWidth: 230; cellHeight: 297;
function computerLost()
@@ -31,28 +22,11 @@ GridView {
stackView.pop()
}
- onHorizontalMarginChanged: {
- if (this.synchronousDrag === undefined) {
- anchors.leftMargin = horizontalMargin
- anchors.rightMargin = horizontalMargin
- }
- }
-
Component.onCompleted: {
// Don't show any highlighted item until interacting with them.
// We do this here instead of onActivated to avoid losing the user's
// selection when backing out of a different page of the app.
currentIndex = -1
-
- // HACK: If this is not Qt 5.12 (which has synchronousDrag),
- // set anchors on creation. This will cause an anchor conflict
- // with the parent StackView which breaks animation, but otherwise
- // the grid will not be centered in the window.
- if (this.synchronousDrag === undefined) {
- anchors.fill = parent
- anchors.topMargin = topMargin
- anchors.bottomMargin = bottomMargin
- }
}
StackView.onActivated: {
diff --git a/app/gui/CenteredGridView.qml b/app/gui/CenteredGridView.qml
new file mode 100644
index 00000000..19e02053
--- /dev/null
+++ b/app/gui/CenteredGridView.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.9
+import QtQuick.Controls 2.2
+
+GridView {
+ // Detect Qt 5.11 or earlier using presence of synchronousDrag.
+ // Prior to 5.12, the leftMargin and rightMargin values did not work.
+ property bool hasBrokenMargins: this.synchronousDrag === undefined
+
+ property int minMargin: 10
+ property real availableWidth: (parent.width - 2 * minMargin)
+ property int itemsPerRow: availableWidth / cellWidth
+ property real horizontalMargin: itemsPerRow < count && availableWidth >= cellWidth ?
+ (availableWidth % cellWidth) / 2 : minMargin
+
+ function updateMargins() {
+ leftMargin = horizontalMargin
+ rightMargin = horizontalMargin
+
+ if (hasBrokenMargins) {
+ anchors.leftMargin = leftMargin
+ anchors.rightMargin = rightMargin
+ }
+ }
+
+ onHorizontalMarginChanged: {
+ updateMargins()
+ }
+
+ Component.onCompleted: {
+ if (hasBrokenMargins) {
+ // This will cause an anchor conflict with the parent StackView
+ // which breaks animation, but otherwise the grid will not be
+ // centered in the window.
+ anchors.fill = parent
+ anchors.topMargin = topMargin
+ anchors.bottomMargin = bottomMargin
+ }
+
+ updateMargins()
+ }
+}
diff --git a/app/gui/PcView.qml b/app/gui/PcView.qml
index 04ce943e..cce6585e 100644
--- a/app/gui/PcView.qml
+++ b/app/gui/PcView.qml
@@ -6,48 +6,22 @@ import ComputerModel 1.0
import ComputerManager 1.0
import StreamingPreferences 1.0
-GridView {
+CenteredGridView {
property ComputerModel computerModel : createModel()
- // Prevent the margin from dropping below 10. By keeping a floor on the margin value
- // this prevents a binding loop caused by the ternary condition changing and decreasing
- // the margin size, thus causing it to change back.
- property real horizontalMargin: Math.max(10,
- contentHeight > cellHeight && parent.width > cellWidth ?
- (parent.width % cellWidth) / 2 : 0)
-
id: pcGrid
focus: true
activeFocusOnTab: true
topMargin: 20
bottomMargin: 5
- leftMargin: horizontalMargin
- rightMargin: horizontalMargin
cellWidth: 310; cellHeight: 350;
objectName: "Computers"
- onHorizontalMarginChanged: {
- if (this.synchronousDrag === undefined) {
- anchors.leftMargin = horizontalMargin
- anchors.rightMargin = horizontalMargin
- }
- }
-
Component.onCompleted: {
// Don't show any highlighted item until interacting with them.
// We do this here instead of onActivated to avoid losing the user's
// selection when backing out of a different page of the app.
currentIndex = -1
-
- // HACK: If this is not Qt 5.12 (which has synchronousDrag),
- // set anchors on creation. This will cause an anchor conflict
- // with the parent StackView which breaks animation, but otherwise
- // the grid will not be centered in the window.
- if (this.synchronousDrag === undefined) {
- anchors.fill = parent
- anchors.topMargin = topMargin
- anchors.bottomMargin = bottomMargin
- }
}
StackView.onActivated: {
diff --git a/app/qml.qrc b/app/qml.qrc
index e842cfd7..ba1b26b8 100644
--- a/app/qml.qrc
+++ b/app/qml.qrc
@@ -17,5 +17,6 @@
gui/ErrorMessageDialog.qml
gui/NavigableMessageDialog.qml
gui/NavigableDialog.qml
+ gui/CenteredGridView.qml