Просмотр исходного кода

cmake-gui: Remember variable type in Add Entry

Store variable types together with their names in the variable completion
list so that the type is automatically recovered when you select a variable.

Keep variable names and types in separate lists.  This removes the :TYPE
string from completion list and the Name field and makes variable search
easier.  The variable names and types are now kept in two different
settings - AddVariableNames and AddVariableTypes.  Drop the old
AddVariableCompletionEntries setting.
Sergey Zolotarev 11 лет назад
Родитель
Сommit
cfec180d66

+ 34 - 4
Source/QtDialog/AddCacheEntry.cxx

@@ -15,14 +15,16 @@
 #include <QCompleter>
 #include <QCompleter>
 
 
 static const int NumTypes = 4;
 static const int NumTypes = 4;
+static const int DefaultTypeIndex = 0;
 static const QByteArray TypeStrings[NumTypes] =
 static const QByteArray TypeStrings[NumTypes] =
   { "BOOL", "PATH", "FILEPATH", "STRING" };
   { "BOOL", "PATH", "FILEPATH", "STRING" };
 static const QCMakeProperty::PropertyType Types[NumTypes] =
 static const QCMakeProperty::PropertyType Types[NumTypes] =
   { QCMakeProperty::BOOL, QCMakeProperty::PATH,
   { QCMakeProperty::BOOL, QCMakeProperty::PATH,
     QCMakeProperty::FILEPATH, QCMakeProperty::STRING};
     QCMakeProperty::FILEPATH, QCMakeProperty::STRING};
 
 
-AddCacheEntry::AddCacheEntry(QWidget* p, const QStringList& completions)
-  : QWidget(p)
+AddCacheEntry::AddCacheEntry(QWidget* p, const QStringList& varNames,
+                                         const QStringList& varTypes)
+  : QWidget(p), VarNames(varNames), VarTypes(varTypes)
 {
 {
   this->setupUi(this);
   this->setupUi(this);
   for(int i=0; i<NumTypes; i++)
   for(int i=0; i<NumTypes; i++)
@@ -43,7 +45,10 @@ AddCacheEntry::AddCacheEntry(QWidget* p, const QStringList& completions)
   this->setTabOrder(path, filepath);
   this->setTabOrder(path, filepath);
   this->setTabOrder(filepath, string);
   this->setTabOrder(filepath, string);
   this->setTabOrder(string, this->Description);
   this->setTabOrder(string, this->Description);
-  this->Name->setCompleter(new QCompleter(completions, this));
+  QCompleter *completer = new QCompleter(this->VarNames, this);
+  this->Name->setCompleter(completer);
+  connect(completer, SIGNAL(activated(const QString&)),
+          this, SLOT(onCompletionActivated(const QString&)));
 }
 }
 
 
 QString AddCacheEntry::name() const
 QString AddCacheEntry::name() const
@@ -77,7 +82,32 @@ QCMakeProperty::PropertyType AddCacheEntry::type() const
     {
     {
     return Types[idx];
     return Types[idx];
     }
     }
-  return QCMakeProperty::BOOL;
+  return Types[DefaultTypeIndex];
 }
 }
 
 
+QString AddCacheEntry::typeString() const
+{
+  int idx = this->Type->currentIndex();
+  if(idx >= 0 && idx < NumTypes)
+    {
+    return TypeStrings[idx];
+    }
+  return TypeStrings[DefaultTypeIndex];
+}
 
 
+void AddCacheEntry::onCompletionActivated(const QString &text)
+{
+  int idx = this->VarNames.indexOf(text);
+  if (idx != -1)
+    {
+    QString vartype = this->VarTypes[idx];
+    for (int i = 0; i < NumTypes; i++)
+      {
+        if (TypeStrings[i] == vartype)
+          {
+          this->Type->setCurrentIndex(i);
+          break;
+          }
+      }
+    }
+}

+ 10 - 1
Source/QtDialog/AddCacheEntry.h

@@ -24,12 +24,21 @@ class AddCacheEntry : public QWidget, public Ui::AddCacheEntry
 {
 {
   Q_OBJECT
   Q_OBJECT
 public:
 public:
-  AddCacheEntry(QWidget* p, const QStringList& completions);
+  AddCacheEntry(QWidget* p, const QStringList& varNames,
+                            const QStringList& varTypes);
 
 
   QString name() const;
   QString name() const;
   QVariant value() const;
   QVariant value() const;
   QString description() const;
   QString description() const;
   QCMakeProperty::PropertyType type() const;
   QCMakeProperty::PropertyType type() const;
+  QString typeString() const;
+
+private slots:
+  void onCompletionActivated(const QString &text);
+
+private:
+  const QStringList& VarNames;
+  const QStringList& VarTypes;
 };
 };
 
 
 #endif
 #endif

+ 16 - 10
Source/QtDialog/CMakeSetupDialog.cxx

@@ -70,8 +70,10 @@ CMakeSetupDialog::CMakeSetupDialog()
   restoreGeometry(settings.value("geometry").toByteArray());
   restoreGeometry(settings.value("geometry").toByteArray());
   restoreState(settings.value("windowState").toByteArray());
   restoreState(settings.value("windowState").toByteArray());
 
 
-  this->AddVariableCompletions = settings.value("AddVariableCompletionEntries",
+  this->AddVariableNames = settings.value("AddVariableNames",
                            QStringList("CMAKE_INSTALL_PREFIX")).toStringList();
                            QStringList("CMAKE_INSTALL_PREFIX")).toStringList();
+  this->AddVariableTypes = settings.value("AddVariableTypes",
+                                           QStringList("PATH")).toStringList();
 
 
   QWidget* cont = new QWidget(this);
   QWidget* cont = new QWidget(this);
   this->setupUi(cont);
   this->setupUi(cont);
@@ -1049,7 +1051,8 @@ void CMakeSetupDialog::addCacheEntry()
   dialog.resize(400, 200);
   dialog.resize(400, 200);
   dialog.setWindowTitle(tr("Add Cache Entry"));
   dialog.setWindowTitle(tr("Add Cache Entry"));
   QVBoxLayout* l = new QVBoxLayout(&dialog);
   QVBoxLayout* l = new QVBoxLayout(&dialog);
-  AddCacheEntry* w = new AddCacheEntry(&dialog, this->AddVariableCompletions);
+  AddCacheEntry* w = new AddCacheEntry(&dialog, this->AddVariableNames,
+                                                this->AddVariableTypes);
   QDialogButtonBox* btns = new QDialogButtonBox(
   QDialogButtonBox* btns = new QDialogButtonBox(
       QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
       QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
       Qt::Horizontal, &dialog);
       Qt::Horizontal, &dialog);
@@ -1064,23 +1067,26 @@ void CMakeSetupDialog::addCacheEntry()
     m->insertProperty(w->type(), w->name(), w->description(), w->value(), false);
     m->insertProperty(w->type(), w->name(), w->description(), w->value(), false);
 
 
     // only add variable names to the completion which are new
     // only add variable names to the completion which are new
-    if (!this->AddVariableCompletions.contains(w->name()))
+    if (!this->AddVariableNames.contains(w->name()))
       {
       {
-      this->AddVariableCompletions << w->name();
+      this->AddVariableNames << w->name();
+      this->AddVariableTypes << w->typeString();
       // limit to at most 100 completion items
       // limit to at most 100 completion items
-      if (this->AddVariableCompletions.size() > 100)
+      if (this->AddVariableNames.size() > 100)
         {
         {
-        this->AddVariableCompletions.removeFirst();
+        this->AddVariableNames.removeFirst();
+        this->AddVariableTypes.removeFirst();
         }
         }
       // make sure CMAKE_INSTALL_PREFIX is always there
       // make sure CMAKE_INSTALL_PREFIX is always there
-      if (!this->AddVariableCompletions.contains("CMAKE_INSTALL_PREFIX"))
+      if (!this->AddVariableNames.contains("CMAKE_INSTALL_PREFIX"))
         {
         {
-        this->AddVariableCompletions << QString("CMAKE_INSTALL_PREFIX");
+        this->AddVariableNames << "CMAKE_INSTALL_PREFIX";
+        this->AddVariableTypes << "PATH";
         }
         }
       QSettings settings;
       QSettings settings;
       settings.beginGroup("Settings/StartPath");
       settings.beginGroup("Settings/StartPath");
-      settings.setValue("AddVariableCompletionEntries",
-                        this->AddVariableCompletions);
+      settings.setValue("AddVariableNames", this->AddVariableNames);
+      settings.setValue("AddVariableTypes", this->AddVariableTypes);
       }
       }
     }
     }
 }
 }

+ 2 - 1
Source/QtDialog/CMakeSetupDialog.h

@@ -110,7 +110,8 @@ protected:
   QTextCharFormat ErrorFormat;
   QTextCharFormat ErrorFormat;
   QTextCharFormat MessageFormat;
   QTextCharFormat MessageFormat;
 
 
-  QStringList AddVariableCompletions;
+  QStringList AddVariableNames;
+  QStringList AddVariableTypes;
   QStringList FindHistory;
   QStringList FindHistory;
 
 
   QEventLoop LocalLoop;
   QEventLoop LocalLoop;