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 &current, 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