From f3509481dca1e5b2e9a11d31f6f5b42ff9f6b4b8 Mon Sep 17 00:00:00 2001
From: Don Gagne <don@thegagnes.com>
Date: Tue, 15 Dec 2015 20:25:25 -0800
Subject: [PATCH] If enum value unknown, add to list

---
 src/FactSystem/Fact.cc | 11 +++++++++--
 src/FactSystem/Fact.h  | 11 +++++++----
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/FactSystem/Fact.cc b/src/FactSystem/Fact.cc
index f3a6176..abbd3d0 100644
--- a/src/FactSystem/Fact.cc
+++ b/src/FactSystem/Fact.cc
@@ -165,7 +165,7 @@ QVariant Fact::cookedValue(void) const
     }
 }
 
-QString Fact::enumStringValue(void) const
+QString Fact::enumStringValue(void)
 {
     if (_metaData) {
         int enumIndex = this->enumIndex();
@@ -179,16 +179,23 @@ QString Fact::enumStringValue(void) const
     return QString();
 }
 
-int Fact::enumIndex(void) const
+int Fact::enumIndex(void)
 {
     if (_metaData) {
         int index = 0;
+
         foreach (QVariant enumValue, _metaData->enumValues()) {
             if (enumValue == rawValue()) {
                 return index;
             }
             index ++;
         }
+
+        // Current value is not in list, add it manually
+        _metaData->addEnumInfo(QString("Unknown: %1").arg(rawValue().toString()), rawValue());
+        emit enumStringsChanged();
+        emit enumValuesChanged();
+        return index;
     } else {
         qWarning() << "Meta data pointer missing";
     }
diff --git a/src/FactSystem/Fact.h b/src/FactSystem/Fact.h
index 4acd5f7..f2e311c 100644
--- a/src/FactSystem/Fact.h
+++ b/src/FactSystem/Fact.h
@@ -52,9 +52,9 @@ public:
     Q_PROPERTY(QString      defaultValueString      READ defaultValueString                                 CONSTANT)
     Q_PROPERTY(bool         defaultValueAvailable   READ defaultValueAvailable                              CONSTANT)
     Q_PROPERTY(int          enumIndex               READ enumIndex              WRITE setEnumIndex          NOTIFY valueChanged)
-    Q_PROPERTY(QStringList  enumStrings             READ enumStrings                                        CONSTANT)
+    Q_PROPERTY(QStringList  enumStrings             READ enumStrings                                        NOTIFY enumStringsChanged)
     Q_PROPERTY(QString      enumStringValue         READ enumStringValue        WRITE setEnumStringValue    NOTIFY valueChanged)
-    Q_PROPERTY(QVariantList enumValues              READ enumValues                                         CONSTANT)
+    Q_PROPERTY(QVariantList enumValues              READ enumValues                                         NOTIFY enumValuesChanged)
     Q_PROPERTY(QString      group                   READ group                                              CONSTANT)
     Q_PROPERTY(QString      longDescription         READ longDescription                                    CONSTANT)
     Q_PROPERTY(QVariant     max                     READ max                                                CONSTANT)
@@ -81,9 +81,9 @@ public:
     QVariant        defaultValue            (void) const;
     bool            defaultValueAvailable   (void) const;
     QString         defaultValueString      (void) const;
-    int             enumIndex               (void) const;
+    int             enumIndex               (void);         // This is not const, since an unknown value can modify the enum lists
     QStringList     enumStrings             (void) const;
-    QString         enumStringValue         (void) const;
+    QString         enumStringValue         (void);         // This is not const, since an unknown value can modify the enum lists
     QVariantList    enumValues              (void) const;
     QString         group                   (void) const;
     QString         longDescription         (void) const;
@@ -120,6 +120,9 @@ public:
     void _setName(const QString& name) { _name = name; }
     
 signals:
+    void enumStringsChanged(void);
+    void enumValuesChanged(void);
+
     /// QObject Property System signal for value property changes
     ///
     /// This signal is only meant for use by the QT property system. It should not be connected to by client code.