From 43236ab28e41ebacf30bd4dc2c9657ecb963ef25 Mon Sep 17 00:00:00 2001
From: DonLakeFlyer <don@thegagnes.com>
Date: Fri, 10 Apr 2020 19:46:27 -0700
Subject: [PATCH] Icon picker support

---
 src/FlightMap/Widgets/ValuePageWidget.qml     | 125 +++++++++++++++---
 .../Widgets/ValuesWidgetController.cc         |  11 +-
 .../Widgets/ValuesWidgetController.h          |   2 -
 3 files changed, 106 insertions(+), 32 deletions(-)

diff --git a/src/FlightMap/Widgets/ValuePageWidget.qml b/src/FlightMap/Widgets/ValuePageWidget.qml
index 5ec003707f..3fc0b95336 100644
--- a/src/FlightMap/Widgets/ValuePageWidget.qml
+++ b/src/FlightMap/Widgets/ValuePageWidget.qml
@@ -7,7 +7,7 @@
  *
  ****************************************************************************/
 
-import QtQuick          2.3
+import QtQuick          2.12
 import QtQuick.Dialogs  1.2
 import QtQuick.Layouts  1.2
 import QtQuick.Controls 2.5
@@ -304,6 +304,12 @@ Column {
                     anchors.right:  parent.right
                     spacing:        _margins
 
+                    QGCButton {
+                        Layout.fillWidth:   true
+                        text:               qsTr("Blank Entry")
+                        onClicked:          { _valuePickerInstrumentValue.clearFact(); hideDialog() }
+                    }
+
                     RowLayout {
                         Layout.fillWidth:   true
                         spacing:            ScreenTools.defaultFontPixelWidth
@@ -319,7 +325,7 @@ Column {
                     RowLayout {
                         spacing: ScreenTools.defaultFontPixelWidth
 
-                        QGCLabel { text: qsTr("Font Size (for whole row)") }
+                        QGCLabel { text: qsTr("Font Size") }
                         QGCComboBox {
                             id:             fontSizeCombo
                             model:          _valuePickerInstrumentValue.fontSizeNames
@@ -327,31 +333,46 @@ Column {
                             sizeToContents: true
                             onActivated:    _valuePickerInstrumentValue.fontSize = index
                         }
+                        QGCCheckBox {
+                            text:       qsTr("Show Units")
+                            checked:    _valuePickerInstrumentValue.showUnits
+                            onClicked:  _valuePickerInstrumentValue.showUnits = checked
+                        }
                     }
 
                     RowLayout {
                         spacing: ScreenTools.defaultFontPixelWidth
 
                         QGCLabel { text: qsTr("Icon") }
-                        QGCComboBox {
-                            model:          _valuePickerInstrumentValue.iconNames
-                            sizeToContents: true
-                            onActivated:    _valuePickerInstrumentValue.icon = currentText
 
-                            Component.onCompleted: {
-                                currentIndex = find(_valuePickerInstrumentValue.icon)
-                                if (currentIndex == -1) {
-                                    currentIndex = 0
-                                }
+                        Rectangle {
+                            height:         iconPositionCombo.height
+                            width:          noIconLabel.width + ScreenTools.defaultFontPixelWidth * 2
+                            color:          qgcPal.window
+                            border.color:   qgcPal.text
+                            visible:        !_valuePickerInstrumentValue.icon
+
+                            QGCLabel {
+                                id:                 noIconLabel
+                                anchors.centerIn:   parent
+                                text:               qsTr("No Icon")
                             }
                         }
-                    }
 
-                    RowLayout {
-                        spacing: ScreenTools.defaultFontPixelWidth
+                        QGCColoredImage {
+                            height:             iconPositionCombo.height
+                            width:              height
+                            source:             _valuePickerInstrumentValue.icon ? "/InstrumentValueIcons/" + _valuePickerInstrumentValue.icon : ""
+                            sourceSize.height:  height
+                            fillMode:           Image.PreserveAspectFit
+                            mipmap:             true
+                            smooth:             true
+                            color:              qgcPal.text
+                            visible:            _valuePickerInstrumentValue.icon
+                        }
 
-                        QGCLabel { text: qsTr("Icon Position") }
                         QGCComboBox {
+                            id:             iconPositionCombo
                             model:          _valuePickerInstrumentValue.iconPositionNames
                             currentIndex:   _valuePickerInstrumentValue.iconPosition
                             sizeToContents: true
@@ -359,15 +380,19 @@ Column {
                         }
                     }
 
-                    QGCCheckBox {
-                        text:       qsTr("Show Units")
-                        checked:    _valuePickerInstrumentValue.showUnits
-                        onClicked:  _valuePickerInstrumentValue.showUnits = checked
+                    SectionHeader {
+                        id:                 iconListHeader
+                        Layout.fillWidth:   true
+                        text:               qsTr("Icons")
+                        checked:            false
                     }
 
-                    QGCButton {
-                        text:       qsTr("Blank Entry")
-                        onClicked:  { _valuePickerInstrumentValue.clearFact(); hideDialog() }
+                    Item { width: 1; height: 1 }
+
+                    Loader {
+                        Layout.fillWidth:   true
+                        sourceComponent:    iconListHeader.checked ? iconList : undefined
+                        visible:            iconListHeader.checked
                     }
 
                     Loader {
@@ -394,6 +419,62 @@ Column {
         }
     }
 
+    Component {
+        id: iconList
+
+        Flow {
+            Rectangle {
+                height:         ScreenTools.minTouchPixels
+                width:          noIconLabel.width + ScreenTools.defaultFontPixelWidth * 2
+                color:          isNoIcon ? qgcPal.text : qgcPal.window
+                border.color:   isNoIcon ? qgcPal.window : qgcPal.text
+
+                property bool isNoIcon: _valuePickerInstrumentValue.icon === ""
+
+                QGCLabel {
+                    id:                 noIconLabel
+                    anchors.centerIn:   parent
+                    color:              parent.isNoIcon ? qgcPal.window : qgcPal.text
+                    text:               qsTr("No Icon")
+                }
+
+                MouseArea {
+                    anchors.fill:   parent
+                    onClicked:      _valuePickerInstrumentValue.icon = ""
+                }
+            }
+
+            Repeater {
+                model: _valuePickerInstrumentValue.iconNames
+
+                Rectangle {
+                    height: ScreenTools.minTouchPixels
+                    width:  height
+                    color:  currentSelection ? qgcPal.text  : qgcPal.window
+
+                    property bool currentSelection: _valuePickerInstrumentValue.icon == modelData
+
+                    QGCColoredImage {
+                        anchors.centerIn:   parent
+                        height:             parent.height * 0.75
+                        width:              height
+                        source:             "/InstrumentValueIcons/" + modelData
+                        sourceSize.height:  height
+                        fillMode:           Image.PreserveAspectFit
+                        mipmap:             true
+                        smooth:             true
+                        color:              currentSelection ? qgcPal.window : qgcPal.text
+
+                        MouseArea {
+                            anchors.fill:   parent
+                            onClicked:      _valuePickerInstrumentValue.icon = modelData
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     Component {
         id: factGroupList
 
diff --git a/src/FlightMap/Widgets/ValuesWidgetController.cc b/src/FlightMap/Widgets/ValuesWidgetController.cc
index 8d0a68220c..bf5242721e 100644
--- a/src/FlightMap/Widgets/ValuesWidgetController.cc
+++ b/src/FlightMap/Widgets/ValuesWidgetController.cc
@@ -32,8 +32,6 @@ const char*  InstrumentValue::_iconPositionKey =        "iconPosition";
 
 QStringList InstrumentValue::_iconNames;
 
-const QString InstrumentValue::_noIconName = QT_TRANSLATE_NOOP("InstrumentValue", "No Icon");
-
 // Important: The indices of these strings must match the InstrumentValue::IconPosition enumconst QStringList InstrumentValue::_iconPositionNames = {
 const QStringList InstrumentValue::_iconPositionNames = {
     QT_TRANSLATE_NOOP("InstrumentValue", "Above"),
@@ -343,7 +341,6 @@ InstrumentValue::InstrumentValue(Vehicle* activeVehicle, FontSize fontSize, QmlO
     if (_iconNames.isEmpty()) {
         QDir iconDir(":/InstrumentValueIcons/");
         _iconNames = iconDir.entryList();
-        _iconNames.prepend(_noIconName);
     }
 }
 
@@ -482,22 +479,20 @@ void InstrumentValue::clearFact(void)
     _fact = nullptr;
     _factGroupName.clear();
     _label.clear();
+    _icon.clear();
     _showUnits = true;
 
     emit factChanged            (_fact);
     emit factGroupNameChanged   (_factGroupName);
     emit labelChanged           (_label);
+    emit iconChanged            (_icon);
     emit showUnitsChanged       (_showUnits);
 }
 
 void InstrumentValue::setIcon(const QString& icon)
 {
     if (icon != _icon) {
-        if (icon == _noIconName) {
-            _icon.clear();
-        } else {
-            _icon = icon;
-        }
+        _icon = icon;
         emit iconChanged(_icon);
     }
 }
diff --git a/src/FlightMap/Widgets/ValuesWidgetController.h b/src/FlightMap/Widgets/ValuesWidgetController.h
index c2fd4a39df..15f86e79f8 100644
--- a/src/FlightMap/Widgets/ValuesWidgetController.h
+++ b/src/FlightMap/Widgets/ValuesWidgetController.h
@@ -102,8 +102,6 @@ private:
     static const char*  _showUnitsKey;
     static const char*  _iconKey;
     static const char*  _iconPositionKey;
-
-    static const QString _noIconName;
 };
 
 Q_DECLARE_METATYPE(InstrumentValue::FontSize)
-- 
GitLab