diff --git a/outputview/outputmodel.h b/outputview/outputmodel.h --- a/outputview/outputmodel.h +++ b/outputview/outputmodel.h @@ -77,6 +77,7 @@ void appendLine( const QString& ); void appendLines( const QStringList& ); void ensureAllDone(); + void clear(); signals: /// If the current filter strategy supports it, reports progress information diff --git a/outputview/outputmodel.cpp b/outputview/outputmodel.cpp --- a/outputview/outputmodel.cpp +++ b/outputview/outputmodel.cpp @@ -452,16 +452,24 @@ Q_ARG(QStringList, lines)); } -void OutputModel::appendLine( const QString& l ) +void OutputModel::appendLine( const QString& line ) { - appendLines( QStringList() << l ); + appendLines( QStringList() << line ); } void OutputModel::ensureAllDone() { QMetaObject::invokeMethod(d->worker, "flushBuffers"); } +void OutputModel::clear() +{ + ensureAllDone(); + beginResetModel(); + d->m_filteredItems.clear(); + endResetModel(); +} + } #include "outputmodel.moc" diff --git a/plugins/standardoutputview/outputwidget.cpp b/plugins/standardoutputview/outputwidget.cpp --- a/plugins/standardoutputview/outputwidget.cpp +++ b/plugins/standardoutputview/outputwidget.cpp @@ -45,6 +45,7 @@ #include #include +#include "outputmodel.h" #include "toolviewdata.h" #include "debug.h" @@ -173,6 +174,23 @@ } } + QAction *clearAction = new QAction("Clear"); + connect(clearAction, &QAction::triggered, [=]{ + auto view = qobject_cast(currentWidget()); + if( !view || !view->isVisible()) + return; + + KDevelop::OutputModel *outputModel = nullptr; + if ( QAbstractProxyModel* proxy = qobject_cast(view->model())) { + outputModel = dynamic_cast(proxy->sourceModel()); + } else { + outputModel = dynamic_cast(view->model()); + } + outputModel->clear(); + }); + + addAction(clearAction); + addActions(data->actionList); connect( data, &ToolViewData::outputAdded,