diff --git a/plugins/standardoutputview/outputwidget.h b/plugins/standardoutputview/outputwidget.h --- a/plugins/standardoutputview/outputwidget.h +++ b/plugins/standardoutputview/outputwidget.h @@ -55,6 +55,8 @@ public: OutputWidget(QWidget* parent, const ToolViewData* data); + ~OutputWidget() override; + void removeOutput( int id ); void raiseOutput( int id ); public Q_SLOTS: @@ -103,15 +105,15 @@ int currentOutputIndex(); struct FilteredView { - QSharedPointer view; - QSharedPointer proxyModel; + QTreeView* view = nullptr; + QSortFilterProxyModel* proxyModel = nullptr; QString filter; }; QHash::iterator findFilteredView(QAbstractItemView *view); QHash m_views; - QTabWidget* m_tabwidget; - QStackedWidget* m_stackwidget; + QScopedPointer m_tabwidget; + QScopedPointer m_stackwidget; const ToolViewData* data; QToolButton* m_closeButton; QAction* m_closeOthersAction; diff --git a/plugins/standardoutputview/outputwidget.cpp b/plugins/standardoutputview/outputwidget.cpp --- a/plugins/standardoutputview/outputwidget.cpp +++ b/plugins/standardoutputview/outputwidget.cpp @@ -72,8 +72,8 @@ layout->setMargin(0); if( data->type & KDevelop::IOutputView::MultipleView ) { - m_tabwidget = new QTabWidget(this); - layout->addWidget( m_tabwidget ); + m_tabwidget.reset(new QTabWidget); + layout->addWidget(m_tabwidget.data()); m_closeButton = new QToolButton( this ); connect( m_closeButton, &QToolButton::clicked, this, &OutputWidget::closeActiveView ); m_closeButton->setIcon( QIcon::fromTheme( QStringLiteral( "tab-close") ) ); @@ -91,8 +91,8 @@ m_tabwidget->setDocumentMode(true); } else if ( data->type == KDevelop::IOutputView::HistoryView ) { - m_stackwidget = new QStackedWidget( this ); - layout->addWidget( m_stackwidget ); + m_stackwidget.reset(new QStackedWidget); + layout->addWidget(m_stackwidget.data()); m_previousAction = new QAction( QIcon::fromTheme( QStringLiteral( "arrow-left" ) ), i18n("Previous Output"), this ); connect(m_previousAction, &QAction::triggered, this, &OutputWidget::previousOutput); @@ -170,11 +170,11 @@ this, &OutputWidget::outputFilter ); if( data->type & KDevelop::IOutputView::MultipleView ) { - connect(m_tabwidget, &QTabWidget::currentChanged, + connect(m_tabwidget.data(), &QTabWidget::currentChanged, this, &OutputWidget::updateFilter); } else if ( data->type == KDevelop::IOutputView::HistoryView ) { - connect(m_stackwidget, &QStackedWidget::currentChanged, + connect(m_stackwidget.data(), &QStackedWidget::currentChanged, this, &OutputWidget::updateFilter); } } @@ -195,6 +195,8 @@ enableActions(); } +OutputWidget::~OutputWidget() = default; + void OutputWidget::clearModel() { auto view = qobject_cast(currentWidget()); @@ -257,7 +259,7 @@ { if( data->outputdata.contains( id ) && m_views.contains( id ) ) { - QTreeView *view = m_views.value(id).view.data(); + auto view = m_views.value(id).view; if( data->type & KDevelop::IOutputView::MultipleView || data->type & KDevelop::IOutputView::HistoryView ) { if( data->type & KDevelop::IOutputView::MultipleView ) @@ -275,17 +277,10 @@ m_stackwidget->removeWidget(view); } } - } 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(); - } + } else { + // KDevelop::IOutputView::OneView case + // Do nothig here - our single view was added to the layout so we doesn't need + // to delete it manually. } m_views.remove(id); emit outputRemoved( data->toolViewId, id ); @@ -342,7 +337,7 @@ widget = m_stackwidget->currentWidget(); } else { - widget = m_views.begin().value().view.data(); + widget = m_views.begin().value().view; } return widget; } @@ -474,7 +469,7 @@ QTreeView* OutputWidget::createListView(int id) { - auto createHelper = [&]() -> QSharedPointer { + auto createHelper = [&]() -> QTreeView* { KDevelop::FocusedTreeView* listview = new KDevelop::FocusedTreeView(this); listview->setEditTriggers( QAbstractItemView::NoEditTriggers ); listview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); //Always enable the scrollbar, so it doesn't flash around @@ -490,10 +485,10 @@ connect(listview, &QTreeView::activated, this, &OutputWidget::activate); connect(listview, &QTreeView::clicked, this, &OutputWidget::activate); - return QSharedPointer(listview); + return listview; }; - QSharedPointer listview; + QTreeView* listview = nullptr; if( !m_views.contains(id) ) { bool newView = true; @@ -505,21 +500,21 @@ if( data->type & KDevelop::IOutputView::MultipleView ) { - m_tabwidget->addTab(listview.data(), data->outputdata.value(id)->title); + m_tabwidget->addTab(listview, data->outputdata.value(id)->title); } else { - m_stackwidget->addWidget(listview.data()); - m_stackwidget->setCurrentWidget(listview.data()); + const int index = m_stackwidget->addWidget(listview); + m_stackwidget->setCurrentIndex(index); } } else { if( m_views.isEmpty() ) { listview = createHelper(); - layout()->addWidget(listview.data()); + layout()->addWidget(listview); } else { - listview = m_views.begin().value().view; + listview = m_views.begin()->view; newView = false; } } @@ -535,14 +530,14 @@ listview = m_views.value(id).view; } enableActions(); - return listview.data(); + return listview; } void OutputWidget::raiseOutput(int id) { if( m_views.contains(id) ) { - auto view = m_views.value(id).view.data(); + auto view = m_views.value(id).view; if( data->type & KDevelop::IOutputView::MultipleView ) { int idx = m_tabwidget->indexOf(view); @@ -641,45 +636,50 @@ void OutputWidget::outputFilter(const QString& filter) { - QAbstractItemView *view = qobject_cast(currentWidget()); - if( !view ) + auto view = qobject_cast(currentWidget()); + if(!view) { return; + } auto fvIt = findFilteredView(view); auto proxyModel = qobject_cast(view->model()); - if( !proxyModel ) + if(!proxyModel) { - proxyModel = new QSortFilterProxyModel(view->model()); + fvIt->proxyModel = proxyModel = new QSortFilterProxyModel(view); proxyModel->setDynamicSortFilter(true); proxyModel->setSourceModel(view->model()); - fvIt->proxyModel = QSharedPointer(proxyModel); view->setModel(proxyModel); } - QRegExp regExp(filter, Qt::CaseInsensitive); - proxyModel->setFilterRegExp(regExp); + + proxyModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive)); fvIt->filter = filter; } void OutputWidget::updateFilter(int index) { - QWidget *view = (data->type & KDevelop::IOutputView::MultipleView) - ? m_tabwidget->widget(index) : m_stackwidget->widget(index); - auto fvIt = findFilteredView(qobject_cast(view)); + if (index < 0) { + return; + } - if (fvIt != m_views.end() && !fvIt->filter.isEmpty()) - { + QWidget* view = + (data->type & KDevelop::IOutputView::MultipleView) ? + m_tabwidget->widget(index) : + m_stackwidget->widget(index); + + auto fvIt = findFilteredView(qobject_cast(view)); + if (fvIt != m_views.end() && !fvIt->filter.isEmpty()) { m_filterInput->setText(fvIt->filter); - } else - { + } + else { m_filterInput->clear(); } } void OutputWidget::setTitle(int outputId, const QString& title) { auto fview = m_views.value(outputId, FilteredView{}); if (fview.view && (data->type & KDevelop::IOutputView::MultipleView)) { - int idx = m_tabwidget->indexOf(fview.view.data()); + const int idx = m_tabwidget->indexOf(fview.view); if (idx >= 0) { m_tabwidget->setTabText(idx, title); }