diff --git a/plugins/standardoutputview/outputwidget.h b/plugins/standardoutputview/outputwidget.h --- a/plugins/standardoutputview/outputwidget.h +++ b/plugins/standardoutputview/outputwidget.h @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -101,9 +102,14 @@ void eventuallyDoFocus(); int currentOutputIndex(); - QMap m_views; - QMap m_proxyModels; - QMap m_filters; + struct FilteredView { + QSharedPointer view; + QSharedPointer proxyModel; + QString filter; + }; + QHash::iterator findFilteredView(QAbstractItemView *view); + + QHash m_views; QTabWidget* m_tabwidget; QStackedWidget* m_stackwidget; const ToolViewData* data; diff --git a/plugins/standardoutputview/outputwidget.cpp b/plugins/standardoutputview/outputwidget.cpp --- a/plugins/standardoutputview/outputwidget.cpp +++ b/plugins/standardoutputview/outputwidget.cpp @@ -234,7 +234,7 @@ void OutputWidget::changeDelegate( int id ) { if( data->outputdata.contains( id ) && m_views.contains( id ) ) { - m_views.value(id)->setItemDelegate(data->outputdata.value(id)->delegate); + m_views.value(id).view->setItemDelegate(data->outputdata.value(id)->delegate); } else { addOutput(id); } @@ -245,7 +245,7 @@ if( data->outputdata.contains( id ) && m_views.contains( id ) ) { OutputData* od = data->outputdata.value(id); - m_views.value( id )->setModel(od->model); + m_views.value(id).view->setModel(od->model); } else { @@ -257,42 +257,37 @@ { if( data->outputdata.contains( id ) && m_views.contains( id ) ) { - QTreeView* view = m_views.value(id); + QTreeView *view = m_views.value(id).view.data(); if( data->type & KDevelop::IOutputView::MultipleView || data->type & KDevelop::IOutputView::HistoryView ) { if( data->type & KDevelop::IOutputView::MultipleView ) { int idx = m_tabwidget->indexOf( view ); - if( idx != -1 ) + if (idx != -1) { m_tabwidget->removeTab( idx ); - if( m_proxyModels.contains( id ) ) - { - delete m_proxyModels.take( id ); - m_filters.remove( id ); - } } } else { int idx = m_stackwidget->indexOf( view ); - if( idx != -1 && m_proxyModels.contains( id ) ) + if (idx != -1) { - delete m_proxyModels.take( id ); - m_filters.remove( id ); + m_stackwidget->removeWidget(view); } - m_stackwidget->removeWidget( view ); } - delete view; - } else - { - m_views.value( id )->setModel( nullptr ); - m_views.value( id )->setItemDelegate( nullptr ); - if( m_proxyModels.contains( 0 ) ) { - delete m_proxyModels.take( 0 ); - m_filters.remove( 0 ); + } else { // KDevelop::IOutputView::OneView + /* TODO: this branch of execution has no result because of the "m_views.remove( id );" + * after the if-else block. Need to find out which behavior has sense. + */ + FilteredView& fview = m_views[id]; + fview.view->setModel(nullptr); + fview.view->setItemDelegate(nullptr); + if (fview.proxyModel) { + fview.proxyModel = QSharedPointer(); + fview.filter = QString(); } } - m_views.remove( id ); + m_views.remove(id); emit outputRemoved( data->toolViewId, id ); } enableActions(); @@ -305,7 +300,7 @@ return; foreach( int id, m_views.keys() ) { - if( m_views.value(id) == widget ) + if (m_views.value(id).view == widget) { OutputData* od = data->outputdata.value(id); if( od->behaviour & KDevelop::IOutputView::AllowUserClose ) @@ -324,7 +319,7 @@ return; foreach (int id, m_views.keys()) { - if (m_views.value(id) == widget) { + if (m_views.value(id).view == widget) { continue; // leave the active view open } @@ -347,7 +342,7 @@ widget = m_stackwidget->currentWidget(); } else { - widget = m_views.begin().value(); + widget = m_views.begin().value().view.data(); } return widget; } @@ -390,8 +385,9 @@ return; QModelIndex sourceIndex = index; QModelIndex viewIndex = index; - int id = m_views.key(qobject_cast(view)); - if( QAbstractProxyModel* proxy = m_proxyModels.value(id) ) { + auto fvIt = findFilteredView(view); + if (fvIt != m_views.end() && fvIt->proxyModel) { + auto proxy = fvIt->proxyModel; if ( index.model() == proxy ) { // index is from the proxy, map it to the source sourceIndex = proxy->mapToSource(index); @@ -438,8 +434,9 @@ eventuallyDoFocus(); auto index = view->currentIndex(); - int id = m_views.key(qobject_cast(view)); - if (QAbstractProxyModel* proxy = m_proxyModels.value(id)) { + auto fvIt = findFilteredView(view); + if (fvIt != m_views.end() && fvIt->proxyModel) { + auto proxy = fvIt->proxyModel; if ( index.model() == proxy ) { // index is from the proxy, map it to the source index = proxy->mapToSource(index); @@ -523,20 +520,20 @@ layout()->addWidget( listview ); } else { - listview = m_views.begin().value(); + listview = m_views.begin().value().view.data(); newView = false; } } - m_views[id] = listview; + m_views[id].view = QSharedPointer(listview); changeModel( id ); changeDelegate( id ); if (newView) listview->scrollToBottom(); } else { - listview = m_views.value(id); + listview = m_views.value(id).view.data(); } enableActions(); return listview; @@ -546,16 +543,17 @@ { if( m_views.contains(id) ) { + auto view = m_views.value(id).view.data(); if( data->type & KDevelop::IOutputView::MultipleView ) { - int idx = m_tabwidget->indexOf( m_views.value(id) ); + int idx = m_tabwidget->indexOf(view); if( idx >= 0 ) { m_tabwidget->setCurrentIndex( idx ); } } else if( data->type & KDevelop::IOutputView::HistoryView ) { - int idx = m_stackwidget->indexOf( m_views.value(id) ); + int idx = m_stackwidget->indexOf(view); if( idx >= 0 ) { m_stackwidget->setCurrentIndex( idx ); @@ -648,43 +646,53 @@ if( !view ) return; - int id = m_views.key(qobject_cast(view)); + auto fvIt = findFilteredView(view); auto proxyModel = qobject_cast(view->model()); if( !proxyModel ) { proxyModel = new QSortFilterProxyModel(view->model()); proxyModel->setDynamicSortFilter(true); proxyModel->setSourceModel(view->model()); - m_proxyModels.insert(id, proxyModel); + fvIt->proxyModel = QSharedPointer(proxyModel); view->setModel(proxyModel); } QRegExp regExp(filter, Qt::CaseInsensitive); proxyModel->setFilterRegExp(regExp); - m_filters[id] = filter; + fvIt->filter = filter; } void OutputWidget::updateFilter(int index) { QWidget *view = (data->type & KDevelop::IOutputView::MultipleView) ? m_tabwidget->widget(index) : m_stackwidget->widget(index); - int id = m_views.key(qobject_cast(view)); + auto fvIt = findFilteredView(qobject_cast(view)); - if(m_filters.contains(id)) + if (fvIt != m_views.end() && !fvIt->filter.isEmpty()) { - m_filterInput->setText(m_filters[id]); + m_filterInput->setText(fvIt->filter); } else { m_filterInput->clear(); } } void OutputWidget::setTitle(int outputId, const QString& title) { - QTreeView* view = m_views.value(outputId, nullptr); - if(view && (data->type & KDevelop::IOutputView::MultipleView)) { - int idx = m_tabwidget->indexOf(view); + auto fview = m_views.value(outputId, FilteredView{}); + if (fview.view && (data->type & KDevelop::IOutputView::MultipleView)) { + int idx = m_tabwidget->indexOf(fview.view.data()); if (idx >= 0) { m_tabwidget->setTabText(idx, title); } } } + +QHash::iterator OutputWidget::findFilteredView(QAbstractItemView *view) +{ + for (auto it = m_views.begin(); it != m_views.end(); ++it) { + if (it->view == view) { + return it; + } + } + return m_views.end(); +} diff --git a/plugins/standardoutputview/tests/test_standardoutputview.cpp b/plugins/standardoutputview/tests/test_standardoutputview.cpp --- a/plugins/standardoutputview/tests/test_standardoutputview.cpp +++ b/plugins/standardoutputview/tests/test_standardoutputview.cpp @@ -194,8 +194,8 @@ m_stdOutputView->setModel(outputId[0], model); m_stdOutputView->setDelegate(outputId[0], delegate); - QCOMPARE(outputWidget->m_views.value(outputId[0])->model(), model); - QCOMPARE(outputWidget->m_views.value(outputId[0])->itemDelegate(), delegate); + QCOMPARE(outputWidget->m_views.value(outputId[0]).view->model(), model); + QCOMPARE(outputWidget->m_views.value(outputId[0]).view->itemDelegate(), delegate); QVERIFY(model->parent()); // they have a parent (the outputdata), so parent() != 0x0 QVERIFY(delegate->parent());