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>
static const int NumTypes = 4;
static const int DefaultTypeIndex = 0;
static const QByteArray TypeStrings[NumTypes] =
{ "BOOL", "PATH", "FILEPATH", "STRING" };
static const QCMakeProperty::PropertyType Types[NumTypes] =
{ QCMakeProperty::BOOL, QCMakeProperty::PATH,
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);
for(int i=0; i<NumTypes; i++)
@ -43,7 +45,10 @@ AddCacheEntry::AddCacheEntry(QWidget* p, const QStringList& completions)
this->setTabOrder(path, filepath);
this->setTabOrder(filepath, string);
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
@ -77,7 +82,32 @@ QCMakeProperty::PropertyType AddCacheEntry::type() const
{
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
public:
AddCacheEntry(QWidget* p, const QStringList& completions);
AddCacheEntry(QWidget* p, const QStringList& varNames,
const QStringList& varTypes);
QString name() const;
QVariant value() const;
QString description() const;
QCMakeProperty::PropertyType type() const;
QString typeString() const;
private slots:
void onCompletionActivated(const QString &text);
private:
const QStringList& VarNames;
const QStringList& VarTypes;
};
#endif

View File

@ -70,8 +70,10 @@ CMakeSetupDialog::CMakeSetupDialog()
restoreGeometry(settings.value("geometry").toByteArray());
restoreState(settings.value("windowState").toByteArray());
this->AddVariableCompletions = settings.value("AddVariableCompletionEntries",
this->AddVariableNames = settings.value("AddVariableNames",
QStringList("CMAKE_INSTALL_PREFIX")).toStringList();
this->AddVariableTypes = settings.value("AddVariableTypes",
QStringList("PATH")).toStringList();
QWidget* cont = new QWidget(this);
this->setupUi(cont);
@ -1049,7 +1051,8 @@ void CMakeSetupDialog::addCacheEntry()
dialog.resize(400, 200);
dialog.setWindowTitle(tr("Add Cache Entry"));
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::Ok | QDialogButtonBox::Cancel,
Qt::Horizontal, &dialog);
@ -1064,23 +1067,26 @@ void CMakeSetupDialog::addCacheEntry()
m->insertProperty(w->type(), w->name(), w->description(), w->value(), false);
// 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
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
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;
settings.beginGroup("Settings/StartPath");
settings.setValue("AddVariableCompletionEntries",
this->AddVariableCompletions);
settings.setValue("AddVariableNames", this->AddVariableNames);
settings.setValue("AddVariableTypes", this->AddVariableTypes);
}
}
}

View File

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