From 9dc1c1bbcf9dad5ca66ce82d67042a39782064c1 Mon Sep 17 00:00:00 2001
From: James Turner <zakalawe@mac.com>
Date: Tue, 30 Jan 2018 17:12:57 +0000
Subject: [PATCH] Fix scrolling of aircraft details view

---
 src/GUI/qml/AircraftDetailsView.qml | 323 +++++++++++++++-------------
 src/GUI/qml/AircraftList.qml        |   4 +
 2 files changed, 179 insertions(+), 148 deletions(-)

diff --git a/src/GUI/qml/AircraftDetailsView.qml b/src/GUI/qml/AircraftDetailsView.qml
index 5e3d21870..2241ca9b8 100644
--- a/src/GUI/qml/AircraftDetailsView.qml
+++ b/src/GUI/qml/AircraftDetailsView.qml
@@ -4,9 +4,8 @@ import "."
 
 Rectangle {
     id: root
-    property alias aircraftURI: aircraft.uri
-
     color: "white"
+    property alias aircraftURI: aircraft.uri
 
     MouseArea {
         // consume all mouse-clicks on the detail view
@@ -18,166 +17,194 @@ Rectangle {
         id: aircraft
     }
 
-    Column {
-        width: root.width - (Style.margin * 2)
-        spacing: Style.margin
-        anchors.horizontalCenter: parent.horizontalCenter
+    Flickable
+    {
+        id: flickable
 
-        AircraftVariantChoice {
-            id: headingBox
-            fontPixelSize: 30
-            popupFontPixelSize: 18
+        anchors.fill: parent
+        contentWidth: parent.width
+        contentHeight: content.childrenRect.height
+        boundsBehavior: Flickable.StopAtBounds
 
-            anchors {
-                margins: Style.strutSize * 2 // space for back button
-                left: parent.left
-                right: parent.right
-            }
-
-            aircraft: aircraftURI
-            currentIndex: aircraft.variant
-
-            onSelected: {
-                aircraft.variant = index
-                _launcher.selectedAircraft = aircraft.uri;
-            }
-        }
-
-        // this element normally hides itself unless needed
-        AircraftWarningPanel {
-            id: warningBox
-            aircraftStatus: aircraft.status
-            requiredFGVersion: aircraft.minimumFGVersion
-            width: parent.width
-        }
-
-        // thumbnails + description + authors container
         Item {
-            width: parent.width
+            id: content
+            width: root.width - scrollbar.width
             height: childrenRect.height
 
-            Rectangle {
-                id: thumbnailBox
-                // thumbnail border
-
-                border.width: 1
-                border.color: "#7f7f7f"
-
-                width: thumbnail.width
-                height: thumbnail.height
-
-                ThumbnailImage {
-                    id: thumbnail
-
-                    aircraftUri: root.aircraftURI
-                    maximumSize.width: 172
-                    maximumSize.height: 128
-                }
-            }
-
             Column {
-                anchors.left: thumbnailBox.right
-                anchors.leftMargin: Style.margin
-                anchors.right: parent.right
+                width: content.width - (Style.margin * 2)
                 spacing: Style.margin
+                anchors.horizontalCenter: parent.horizontalCenter
 
-                Text {
-                    id: aircraftDescription
-                    text: aircraft.description
+                AircraftVariantChoice {
+                    id: headingBox
+                    fontPixelSize: 30
+                    popupFontPixelSize: 18
+
+                    anchors {
+                        margins: Style.strutSize * 2 // space for back button
+                        left: parent.left
+                        right: parent.right
+                    }
+
+                    aircraft: aircraftURI
+                    currentIndex: aircraft.variant
+
+                    onSelected: {
+                        aircraft.variant = index
+                        _launcher.selectedAircraft = aircraft.uri;
+                    }
+                }
+
+                // this element normally hides itself unless needed
+                AircraftWarningPanel {
+                    id: warningBox
+                    aircraftStatus: aircraft.status
+                    requiredFGVersion: aircraft.minimumFGVersion
                     width: parent.width
-                    wrapMode: Text.WordWrap
-                    visible: aircraft.description != ""
-                    font.pixelSize: 14
+                }
+
+                // thumbnails + description + authors container
+                Item {
+                    width: parent.width
+                    height: childrenRect.height
+
+                    Rectangle {
+                        id: thumbnailBox
+                        // thumbnail border
+
+                        border.width: 1
+                        border.color: "#7f7f7f"
+
+                        width: thumbnail.width
+                        height: thumbnail.height
+
+                        ThumbnailImage {
+                            id: thumbnail
+
+                            aircraftUri: root.aircraftURI
+                            maximumSize.width: 172
+                            maximumSize.height: 128
+                        }
+                    }
+
+                    Column {
+                        anchors.left: thumbnailBox.right
+                        anchors.leftMargin: Style.margin
+                        anchors.right: parent.right
+                        spacing: Style.margin
+
+                        Text {
+                            id: aircraftDescription
+                            text: aircraft.description
+                            width: parent.width
+                            wrapMode: Text.WordWrap
+                            visible: aircraft.description != ""
+                            font.pixelSize: 14
+                        }
+
+                        Text {
+                            id: aircraftAuthors
+                            text: qsTr("by %1").arg(aircraft.authors)
+                            width: parent.width
+                            anchors.horizontalCenter: parent.horizontalCenter
+                            wrapMode: Text.WordWrap
+                            visible: (aircraft.authors != undefined)
+
+                        }
+                    }
+
+                }
+
+                AircraftDownloadPanel {
+                    visible: aircraft.isPackaged
+                    width: parent.width
+                    uri: aircraft.uri
+                    installStatus: aircraft.installStatus
+                    packageSize: aircraft.packageSize
+                    downloadedBytes: aircraft.downloadedBytes
+                }
+
+                AircraftPreviewPanel {
+                    id: previews
+                    width: parent.width
+                    previews: aircraft.previews
+                    visible: aircraft.previews.length > 0
+                }
+
+                Grid {
+                    id: ratingGrid
+                    anchors.left: parent.left
+
+                    visible: aircraft.ratings != undefined
+
+                    rows: 2
+                    columns: 3
+                    rowSpacing: Style.margin
+                    columnSpacing: Style.margin
+
+                    Text {
+                        id: ratingsLabel
+                        text: qsTr("Ratings:")
+                    }
+
+
+                    AircraftRating {
+                        title: qsTr("Flight model")
+                        Binding on value {
+                            when: aircraft.ratings != undefined
+                            value: aircraft.ratings[0]
+                        }
+                    }
+
+                    AircraftRating {
+                        title: qsTr("Systems")
+                        Binding on value {
+                            when: aircraft.ratings != undefined
+                            value: aircraft.ratings[1]
+                        }
+                    }
+
+                    Item {
+                        width: ratingsLabel.width
+                        height: 1
+                    } // placeholder
+
+                    AircraftRating {
+                        title: qsTr("Cockpit")
+                        Binding on value {
+                            when: aircraft.ratings != undefined
+                            value: aircraft.ratings[2]
+                        }
+                    }
+
+                    AircraftRating {
+                        title: qsTr("Exterior")
+                        Binding on value {
+                            when: aircraft.ratings != undefined
+                            value: aircraft.ratings[3]
+                        }
+                    }
                 }
 
                 Text {
-                    id: aircraftAuthors
-                    text: qsTr("by %1").arg(aircraft.authors)
+                    text: qsTr("Local file location: %1").arg(aircraft.pathOnDisk);
                     width: parent.width
-                    anchors.horizontalCenter: parent.horizontalCenter
-                    wrapMode: Text.WordWrap
-                    visible: (aircraft.authors != undefined)
-
+                    wrapMode: Text.WrapAtWordBoundaryOrAnywhere
+                    visible: aircraft.pathOnDisk != undefined
                 }
-            }
 
-        }
+            } // main layout column
+        } // of main item
 
-        AircraftDownloadPanel {
-            visible: aircraft.isPackaged
-            width: parent.width
-            uri: aircraft.uri
-            installStatus: aircraft.installStatus
-            packageSize: aircraft.packageSize
-            downloadedBytes: aircraft.downloadedBytes
-        }
+    } // of Flickable
 
-        AircraftPreviewPanel {
-            id: previews
-            width: parent.width
-            previews: aircraft.previews
-            visible: aircraft.previews.length > 0
-        }
-
-        Grid {
-            id: ratingGrid
-            anchors.left: parent.left
-
-            visible: aircraft.ratings != undefined
-
-            rows: 2
-            columns: 3
-            rowSpacing: Style.margin
-            columnSpacing: Style.margin
-
-            Text {
-                id: ratingsLabel
-                text: qsTr("Ratings:")
-            }
-
-
-            AircraftRating {
-                title: qsTr("Flight model")
-                Binding on value {
-                    when: aircraft.ratings != undefined
-                    value: aircraft.ratings[0]
-                }
-            }
-
-            AircraftRating {
-                title: qsTr("Systems")
-                Binding on value {
-                    when: aircraft.ratings != undefined
-                    value: aircraft.ratings[1]
-                }
-            }
-
-            Item {
-                width: ratingsLabel.width
-                height: 1
-            } // placeholder
-
-            AircraftRating {
-                title: qsTr("Cockpit")
-                Binding on value {
-                    when: aircraft.ratings != undefined
-                    value: aircraft.ratings[2]
-                }
-            }
-
-            AircraftRating {
-                title: qsTr("Exterior")
-                Binding on value {
-                    when: aircraft.ratings != undefined
-                    value: aircraft.ratings[3]
-                }
-            }
-        }
-
-        Text {
-            text: qsTr("Local file location: %1").arg(aircraft.pathOnDisk);
-            visible: aircraft.pathOnDisk != undefined
-        }
-
-    } // main layout column
-}
+    Scrollbar {
+        id: scrollbar
+        anchors.right: parent.right
+        anchors.top: parent.top
+        height: parent.height
+        flickable: flickable
+        visible: flickable.visibleArea.heightRatio < 1.0
+    }
+} // of Rect
diff --git a/src/GUI/qml/AircraftList.qml b/src/GUI/qml/AircraftList.qml
index 4b91f89a7..3938a0916 100644
--- a/src/GUI/qml/AircraftList.qml
+++ b/src/GUI/qml/AircraftList.qml
@@ -121,6 +121,10 @@ Item
 
         clip: true
 
+        // prevent mouse wheel interactions when the details view is
+        // visible, since it has its own flickable
+        enabled: !detailsView.visible
+
         highlight: highlight
         highlightMoveDuration: 100