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.
This commit is contained in:
Sergey Zolotarev 2014-01-13 17:28:16 +07:00 committed by Brad King
parent 9f6b633f37
commit cfec180d66
4 changed files with 62 additions and 16 deletions

View File

@ -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) AddCacheEntry::AddCacheEntry(QWidget* p, const QStringList& varNames,
: QWidget(p) 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;
}
}
}
}

View File

@ -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

View File

@ -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", settings.setValue("AddVariableNames", this->AddVariableNames);
this->AddVariableCompletions); settings.setValue("AddVariableTypes", this->AddVariableTypes);
} }
} }
} }

View File

@ -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;