From 0a1c7802413fc6bc27ef423af5fa452b1ce0487b Mon Sep 17 00:00:00 2001 From: dt <qtc-committer@nokia.com> Date: Thu, 10 Dec 2009 17:58:24 +0100 Subject: [PATCH] Fixes EnvironmentEditWidget editing variable names Don't loose focus, don't loose the current index. Implemented in a not really good way. The model emits a signal after renaming, which the view respsonds to by setting focus/currentIndex correctly. --- .../projectexplorer/environmenteditmodel.cpp | 19 +++++++++++++++++++ .../projectexplorer/environmenteditmodel.h | 14 ++++++++++++-- .../qt4projectmanager/qtversionmanager.h | 11 ++++++++--- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/plugins/projectexplorer/environmenteditmodel.cpp b/src/plugins/projectexplorer/environmenteditmodel.cpp index e1e52ab2e77..e59012669fd 100644 --- a/src/plugins/projectexplorer/environmenteditmodel.cpp +++ b/src/plugins/projectexplorer/environmenteditmodel.cpp @@ -178,6 +178,14 @@ int EnvironmentModel::findInChangesInsertPosition(const QString &name) const return m_items.size(); } +QModelIndex EnvironmentModel::index(const QString &name) +{ + int row = findInResult(name); + if (row == -1) + return QModelIndex(); + return index(row, 0); +} + int EnvironmentModel::findInResult(const QString &name) const { Environment::const_iterator it; @@ -230,6 +238,7 @@ bool EnvironmentModel::setData(const QModelIndex &index, const QVariant &value, removeVariable(old.name); old.name = newName; addVariable(old); + emit renamedVariable(newName); return true; } else if (index.column() == 1) { const QString &name = indexToVariable(index); @@ -364,6 +373,9 @@ EnvironmentWidget::EnvironmentWidget(QWidget *parent, QWidget *additionalDetails connect(m_model, SIGNAL(userChangesChanged()), this, SIGNAL(userChangesChanged())); + connect(m_model, SIGNAL(renamedVariable(QString)), + this, SLOT(renamedVariable(QString))); + QVBoxLayout *vbox = new QVBoxLayout(this); vbox->setContentsMargins(0, 0, 0, 0); @@ -439,6 +451,13 @@ EnvironmentWidget::~EnvironmentWidget() m_model = 0; } +void EnvironmentWidget::renamedVariable(const QString& name) +{ + QModelIndex idx = m_model->index(name); + m_environmentTreeView->setCurrentIndex(idx); + m_environmentTreeView->setFocus(); +} + void EnvironmentWidget::setBaseEnvironment(const ProjectExplorer::Environment &env) { m_model->setBaseEnvironment(env); diff --git a/src/plugins/projectexplorer/environmenteditmodel.h b/src/plugins/projectexplorer/environmenteditmodel.h index a8415768b3f..38b487c1667 100644 --- a/src/plugins/projectexplorer/environmenteditmodel.h +++ b/src/plugins/projectexplorer/environmenteditmodel.h @@ -75,18 +75,27 @@ public: bool isInBaseEnvironment(const QString &name); QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QString indexToVariable(const QModelIndex &index) const; + QModelIndex index(const QString &name); bool changes(const QString &key) const; - QList<EnvironmentItem> userChanges() const; void setUserChanges(QList<EnvironmentItem> list); + signals: void userChangesChanged(); + /// Strictly speaking this is a hack to work around + /// the problem that we don't emit the right signals + /// on editing a variable + /// Don't try to fix that with out consulting me + /// In short it's impossible to emit the right signals + /// and to ensure that the model is in a consistent + /// state at each signal emission + void renamedVariable(const QString &newName); private: void updateResultEnvironment(); int findInChanges(const QString &name) const; - int findInResult(const QString &name) const; int findInChangesInsertPosition(const QString &name) const; int findInResultInsertPosition(const QString &name) const; + int findInResult(const QString &name) const; ProjectExplorer::Environment m_baseEnvironment; ProjectExplorer::Environment m_resultEnvironment; @@ -119,6 +128,7 @@ private slots: void unsetEnvironmentButtonClicked(); void environmentCurrentIndexChanged(const QModelIndex ¤t, const QModelIndex &previous); void updateSummaryText(); + void renamedVariable(const QString &name); private: EnvironmentModel *m_model; diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 5300ad9e0ac..ec49b3d7929 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -210,7 +210,8 @@ public: void removeVersion(QtVersion *version); // Static Methods - static QPair<QtVersion::QmakeBuildConfigs, QStringList> scanMakeFile(const QString &directory, QtVersion::QmakeBuildConfigs defaultBuildConfig); + static QPair<QtVersion::QmakeBuildConfigs, QStringList> scanMakeFile(const QString &directory, + QtVersion::QmakeBuildConfigs defaultBuildConfig); static QString findQMakeBinaryFromMakefile(const QString &directory); signals: void defaultQtVersionChanged(); @@ -225,8 +226,12 @@ private: static QString findQMakeLine(const QString &directory); static QString trimLine(const QString line); static QStringList splitLine(const QString &line); - static void parseParts(const QStringList &parts, QList<QMakeAssignment> *assignments, QList<QMakeAssignment> *afterAssignments, QStringList *additionalArguments); - static QtVersion::QmakeBuildConfigs qmakeBuildConfigFromCmdArgs(QList<QMakeAssignment> *assignments, QtVersion::QmakeBuildConfigs defaultBuildConfig); + static void parseParts(const QStringList &parts, + QList<QMakeAssignment> *assignments, + QList<QMakeAssignment> *afterAssignments, + QStringList *additionalArguments); + static QtVersion::QmakeBuildConfigs qmakeBuildConfigFromCmdArgs(QList<QMakeAssignment> *assignments, + QtVersion::QmakeBuildConfigs defaultBuildConfig); // Used by QtOptionsPage void setNewQtVersions(QList<QtVersion *> newVersions, int newDefaultVersion); // Used by QtVersion -- GitLab