diff --git a/plugins/projectmanagerview/projecttreeview.h b/plugins/projectmanagerview/projecttreeview.h --- a/plugins/projectmanagerview/projecttreeview.h +++ b/plugins/projectmanagerview/projecttreeview.h @@ -60,15 +60,20 @@ void slotActivated( const QModelIndex &index ); void popupContextMenu( const QPoint &pos ); void openProjectConfig(); - void saveState(); + void saveState(KDevelop::IProject* project = nullptr); void restoreState(KDevelop::IProject* project = nullptr); void aboutToShutdown(); + void rowsInserted( const QModelIndex& parent, int start, int end ) override; + void rowsAboutToBeRemoved( const QModelIndex& parent, int start, int end ) override; protected: void keyPressEvent(QKeyEvent *event) override; void dropEvent(QDropEvent* event) override; void drawBranches(QPainter* painter, const QRect& rect, const QModelIndex& index) const override; + private Q_SLOTS: + void resetProjectPointer(); + private: QModelIndex mapFromItem(const KDevelop::ProjectBaseItem* item); KDevelop::ProjectBaseItem* itemAtPos(QPoint pos); diff --git a/plugins/projectmanagerview/projecttreeview.cpp b/plugins/projectmanagerview/projecttreeview.cpp --- a/plugins/projectmanagerview/projecttreeview.cpp +++ b/plugins/projectmanagerview/projecttreeview.cpp @@ -137,16 +137,19 @@ this, &ProjectTreeView::aboutToShutdown); connect( ICore::self()->projectController(), &IProjectController::projectOpened, this, &ProjectTreeView::restoreState ); - connect( ICore::self()->projectController(), &IProjectController::projectClosing, - this, &ProjectTreeView::saveState ); - - restoreState(); + connect( ICore::self()->projectController(), &IProjectController::projectClosed, + this, &ProjectTreeView::resetProjectPointer ); } ProjectTreeView::~ProjectTreeView() { } +void ProjectTreeView::resetProjectPointer() +{ + m_ctxProject = nullptr; +} + ProjectBaseItem* ProjectTreeView::itemAtPos(QPoint pos) { return indexAt(pos).data(ProjectModel::ProjectItemRole).value(); @@ -374,6 +377,7 @@ } } + void ProjectTreeView::openProjectConfig() { if( m_ctxProject ) @@ -383,31 +387,61 @@ } } -void ProjectTreeView::saveState() +void ProjectTreeView::saveState( IProject* project ) { - KConfigGroup configGroup( ICore::self()->activeSession()->config(), settingsConfigGroup ); + // nullptr won't create a usable saved state, so spare the effort + if ( nullptr == project ) { + return; + } + + KConfigGroup configGroup( ICore::self()->activeSession()->config(), + QString( settingsConfigGroup ).append( project->name() ) ); ProjectModelSaver saver; + saver.setProject( project ); saver.setView( this ); saver.saveState( configGroup ); } -void ProjectTreeView::restoreState(IProject* project) +void ProjectTreeView::restoreState( IProject* project ) { - KConfigGroup configGroup( ICore::self()->activeSession()->config(), settingsConfigGroup ); + if ( nullptr == project ) { + return; + } + KConfigGroup configGroup( ICore::self()->activeSession()->config(), + QString( settingsConfigGroup ).append ( project->name() ) ); ProjectModelSaver saver; saver.setProject( project ); saver.setView( this ); saver.restoreState( configGroup ); } +void ProjectTreeView::rowsInserted( const QModelIndex& parent, int start, int end ) +{ + QTreeView::rowsInserted( parent, start, end ); + if ( nullptr == parent.model() ) { + restoreState( m_ctxProject ); + } +} + +void ProjectTreeView::rowsAboutToBeRemoved( const QModelIndex& parent, int start, int end ) { + QTreeView::rowsAboutToBeRemoved( parent, start, end ); + if ( nullptr == parent.model() ) { + saveState( m_ctxProject ); + } +} + void ProjectTreeView::aboutToShutdown() { - // save all projects, not just the last one that is closed disconnect( ICore::self()->projectController(), &IProjectController::projectClosing, this, &ProjectTreeView::saveState ); - saveState(); + + // save all projects, not just the last one that is closed + auto const projects = ICore::self()->projectController()->projects(); + for ( auto const& p: projects ) { + saveState( p ); + } } bool ProjectTreeView::event(QEvent* event)