[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdevplatform/veritas
From:       Manuel Breugelmans <mbr.nxi () gmail ! com>
Date:       2008-11-13 9:59:24
Message-ID: 1226570364.794334.11618.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 883572 by mbreugel:

Do not store a 'selected-project' pointer in the testrunner, instead let the \
runnerwindow-widget handle this in a safe way. This fixes a dangling pointer crash. \
It also increases encapsulation a little.


 M  +30 -12    internal/runnerwindow.cpp  
 M  +7 -2      internal/runnerwindow.h  
 M  +1 -14     itestrunner.cpp  
 M  +0 -1      itestrunner.h  


--- trunk/KDE/kdevplatform/veritas/internal/runnerwindow.cpp #883571:883572
@@ -55,6 +55,7 @@
 #include <QBrush>
 #include <QColor>
 #include <QHeaderView>
+#include <interfaces/iprojectcontroller.h>
 
 using KDevelop::IProject;
 Q_DECLARE_METATYPE(KDevelop::IProject*)
@@ -164,32 +165,54 @@
     KSelectAction *m = new KSelectAction(i18n("Project"), this);
     m->setToolTip(i18n("Select project"));
     m->setToolBarMode(KSelectAction::MenuMode);
-    m->setEditable(true);
     m_ui->runnerToolBar->addSeparator();
     m_ui->runnerToolBar->addAction(m);
     m_projectPopup = m;
+    connect(m_projectPopup, SIGNAL(triggered(QAction*)),
+            SLOT(setSelectedProject(QAction*)));
 }
 
+void RunnerWindow::setSelectedProject(QAction* action)
+{
+    if (!action) return;
+    KUrl projectRoot = action->data().value<KUrl>();
+    Q_ASSERT(m_project2action.contains(projectRoot));
+    m_currentProject = projectRoot;
+}
+
 void RunnerWindow::addProjectToPopup(IProject* proj)
 {
-    kDebug() << "Adding project to popup " << proj->name();
     QAction* p = new QAction(proj->name(), this);
     QVariant v;
-    v.setValue(proj);
+    v.setValue(proj->folder());
     p->setData(v);
     m_projectPopup->addAction(p);
-    m_project2action[proj] = p;
+    m_project2action[proj->folder()] = p;
 }
 
 void RunnerWindow::rmProjectFromPopup(IProject* proj)
 {
-    if (m_project2action.contains(proj)) {
-        QAction* p = m_project2action[proj];
+    KUrl projectRoot = proj->folder();
+    if (m_project2action.contains(projectRoot)) {
+        QAction* p = m_project2action[projectRoot];
         m_projectPopup->removeAction(p);
-        m_project2action.remove(proj);
+        m_project2action.remove(projectRoot);
     }
 }
 
+IProject* RunnerWindow::selectedProject() const
+{
+    if (!m_currentProject.isValid()) return 0;
+    IProject* selected = 0;
+    foreach(IProject* proj, ICore::self()->projectController()->projects()) {
+        if (m_currentProject == proj->folder()) {
+            selected = proj;
+            break;
+        }
+    }
+    return selected;
+}
+
 namespace
 {
 /*! functor that counts the selected leaf tests */
@@ -240,11 +263,6 @@
             SLOT(scrollToHighlightedRows()));
 }
 
-KSelectAction* RunnerWindow::projectPopup() const
-{
-    return m_projectPopup;
-}
-
 // helper for RunnerWindow(...) ctor
 void RunnerWindow::connectActions()
 {
--- trunk/KDE/kdevplatform/veritas/internal/runnerwindow.h #883571:883572
@@ -26,6 +26,7 @@
 #include <QTreeView>
 #include <QList>
 #include <QTime>
+#include <KUrl>
 #include "../veritasexport.h"
 
 namespace KDevelop { class IProject; }
@@ -90,11 +91,11 @@
     ResultsProxyModel* resultsProxyModel() const;
 
     const Ui::RunnerWindow* ui() const;
-    KSelectAction* projectPopup() const;
 
     QWidget* resultsWidget() const;
 
     void resetProgressBar() const;
+    KDevelop::IProject* selectedProject() const;
 
 Q_SIGNALS:
     void runCompleted() const;
@@ -144,6 +145,9 @@
         Vice versa if it is currently collapsed. */
     void expandOrCollapse(const QModelIndex& i) const;
 
+    void setSelectedProject(QAction*);
+
+
 private: // Operations
 
     // helpers for RunnerWindow(...) ctor
@@ -201,11 +205,12 @@
     SelectionManager* m_selection;     // is responsable for the fade-in out \
selection thingy  OverlayManager* m_verbose;
     KSelectAction* m_projectPopup;     // a dropdown box to select the 'current' \
                project
-    QMap<KDevelop::IProject*, QAction*> m_project2action;
+    QMap<KUrl, QAction*> m_project2action;
     QTime m_stopWatch;                 // times test-runs, shown in the gui
     TestExecutor* m_executor;
     mutable bool m_isRunning;
     VerboseToggle* m_verboseToggle;
+    KUrl m_currentProject;
 };
 
 } // namespace
--- trunk/KDE/kdevplatform/veritas/itestrunner.cpp #883571:883572
@@ -73,7 +73,6 @@
 public:
     Private() :
         window(0),
-        selectedProject(0),
         resultsView(0),
         resultsArea(0),
         previousRoot(0)
@@ -84,7 +83,6 @@
     }
 
     RunnerWindow* window;
-    IProject* selectedProject;
     Sublime::View *resultsView;
     Sublime::Area *resultsArea;
     ResultsModel *resultsModel;
@@ -167,14 +165,9 @@
     connect(ipc, SIGNAL(projectClosed(KDevelop::IProject*)),
             d->window, SLOT(rmProjectFromPopup(KDevelop::IProject*)));
 
-    connect(d->window->projectPopup(), SIGNAL(triggered(QAction*)),
-            this, SLOT(setSelected(QAction*)));
-
     connect(d->window->ui()->actionReload, SIGNAL(triggered(bool)),
             this, SLOT(reload()));
 
-    connect(d->window, SIGNAL(openVerbose(Veritas::Test*)),
-            this, SLOT(openVerbose(Veritas::Test*)));
     reload();
     return d->window;
 
@@ -188,15 +181,9 @@
 
 IProject* ITestRunner::project() const
 {
-    return d->selectedProject;
+    return d->window->selectedProject();
 }
 
-void ITestRunner::setSelected(QAction* action)
-{
-    kDebug() << action->data().value<IProject*>();
-    d->selectedProject = action->data().value<IProject*>();
-}
-
 namespace {
 class Filter : public QObject
 {
--- trunk/KDE/kdevplatform/veritas/itestrunner.h #883571:883572
@@ -69,7 +69,6 @@
 
 private Q_SLOTS:
     void reload();
-    void setSelected(QAction*);
     void removeResultsView();
     void setupToolView(Veritas::Test*);
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic