From kde-commits Mon Apr 30 23:43:10 2007 From: Andreas Pakulat Date: Mon, 30 Apr 2007 23:43:10 +0000 To: kde-commits Subject: KDE/kdevelop Message-Id: <1177976590.770434.6702.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=117797660004569 SVN commit 659880 by apaku: - Use a tabwidget instead of a plain listview, now each queued command's output is displayed in its own tabwidget - Add API to allow simple logging facility, any plugin can now open a new tab and add lines to the listview in the tab The main use for this is currently the SVN/CVS plugins, they shouldn't need to have their own toolview just for logging output from executing vcs actions. dukju and Robert would you please have a look and port the plugins to use the outputview. CCMAIL:kdevelop-devel@kdevelop.org M +9 -9 buildtools/builders/makebuilder/makebuilder.cpp M +2 -2 buildtools/builders/makebuilder/makebuilder.h M +9 -9 buildtools/builders/qmakebuilder/qmakebuilder.cpp M +2 -2 buildtools/builders/qmakebuilder/qmakebuilder.h M +2 -0 lib/plugins/outputviews/CMakeLists.txt M +28 -13 lib/plugins/outputviews/interfaces/ioutputview.h A lib/plugins/outputviews/outputviewcommand.cpp [License: GPL (v2+)] A lib/plugins/outputviews/outputviewcommand.h [License: GPL (v2+)] A lib/plugins/outputviews/outputwidget.cpp [License: GPL (v2+)] A lib/plugins/outputviews/outputwidget.h [License: GPL (v2+)] M +48 -88 lib/plugins/outputviews/simpleoutputview.cpp M +8 -9 lib/plugins/outputviews/simpleoutputview.h --- trunk/KDE/kdevelop/buildtools/builders/makebuilder/makebuilder.cpp #659879:659880 @@ -52,10 +52,10 @@ KDevelop::IOutputView* view = i->extension(); if( view ) { - connect(i, SIGNAL(commandFinished(const QStringList &)), - this, SLOT(commandFinished(const QStringList &))); - connect(i, SIGNAL(commandFailed(const QStringList &)), - this, SLOT(commandFailed(const QStringList &))); + connect(i, SIGNAL(commandFinished(const QString &)), + this, SLOT(commandFinished(const QString &))); + connect(i, SIGNAL(commandFailed(const QString &)), + this, SLOT(commandFailed(const QString &))); } } } @@ -79,7 +79,7 @@ QStringList cmd = buildCommand(item); m_queue << QPair( cmd, dom ); kDebug(9038) << "Starting build: " << cmd << endl; - view->queueCommand( item->url(), cmd, QStringList() ); + view->queueCommand( item->url(), cmd, QMap() ); return true; } } @@ -93,13 +93,13 @@ return false; } -void MakeBuilder::commandFinished(const QStringList &command) +void MakeBuilder::commandFinished(const QString &command) { if( !m_queue.isEmpty() ) { QPair< QStringList, KDevelop::ProjectBaseItem* > pair = m_queue.front(); - if( pair.first == command ) + if( pair.first.join(" ") == command ) { m_queue.pop_front(); emit built( pair.second ); @@ -107,12 +107,12 @@ } } -void MakeBuilder::commandFailed(const QStringList &command) +void MakeBuilder::commandFailed(const QString &command) { if( !m_queue.isEmpty() ) { QPair pair = m_queue.front(); - if( pair.first == command ) + if( pair.first.join(" ") == command ) { m_queue.pop_front(); emit failed(pair.second); --- trunk/KDE/kdevelop/buildtools/builders/makebuilder/makebuilder.h #659879:659880 @@ -54,8 +54,8 @@ void failed( KDevelop::ProjectBaseItem* ); private Q_SLOTS: - void commandFinished(const QStringList &command); - void commandFailed(const QStringList &command); + void commandFinished(const QString &command); + void commandFailed(const QString &command); private: QStringList buildCommand(KDevelop::ProjectBaseItem *dom, const QString &target = QString::null); --- trunk/KDE/kdevelop/buildtools/builders/qmakebuilder/qmakebuilder.cpp #659879:659880 @@ -59,10 +59,10 @@ KDevelop::IOutputView* view = i->extension(); if( view ) { - connect(i, SIGNAL(commandFinished(const QStringList &)), - this, SLOT(commandFinished(const QStringList &))); - connect(i, SIGNAL(commandFailed(const QStringList &)), - this, SLOT(commandFailed(const QStringList &))); + connect(i, SIGNAL(commandFinished(const QString &)), + this, SLOT(commandFinished(const QString &))); + connect(i, SIGNAL(commandFailed(const QString &)), + this, SLOT(commandFailed(const QString &))); } } i = core()->pluginController()->pluginForExtension("org.kdevelop.IMakeBuilder"); @@ -103,7 +103,7 @@ // kDebug(9024) << v << v.type() << v.userType() << endl; cmd << v.path(); m_queue << QPair( cmd, dom ); - view->queueCommand( item->url(), cmd, QStringList() ); + view->queueCommand( item->url(), cmd, QMap() ); return true; } } @@ -116,7 +116,7 @@ return false; } -void QMakeBuilder::commandFinished(const QStringList &command) +void QMakeBuilder::commandFinished(const QString &command) { kDebug(9024) << "command finished " << command << endl; if( !m_queue.isEmpty() ) @@ -124,7 +124,7 @@ kDebug(9024) << "queue not empty" << endl; QPair< QStringList, KDevelop::ProjectBaseItem* > pair = m_queue.front(); - if( pair.first == command ) + if( pair.first.join(" ") == command ) { kDebug(9024) << "found command" << endl; m_queue.pop_front(); @@ -143,12 +143,12 @@ } } -void QMakeBuilder::commandFailed(const QStringList &command) +void QMakeBuilder::commandFailed(const QString &command) { if( !m_queue.isEmpty() ) { QPair pair = m_queue.front(); - if( pair.first == command ) + if( pair.first.join(" ") == command ) { m_queue.pop_front(); emit failed(pair.second); --- trunk/KDE/kdevelop/buildtools/builders/qmakebuilder/qmakebuilder.h #659879:659880 @@ -50,8 +50,8 @@ void built(KDevelop::ProjectBaseItem*); void failed(KDevelop::ProjectBaseItem*); private Q_SLOTS: - void commandFinished(const QStringList &command); - void commandFailed(const QStringList &command); + void commandFinished(const QString &command); + void commandFailed(const QString &command); private: QList< QPair< QStringList, KDevelop::ProjectBaseItem*> > m_queue; --- trunk/KDE/kdevelop/lib/plugins/outputviews/CMakeLists.txt #659879:659880 @@ -9,6 +9,8 @@ set(simpleoutputview_LIB_SRCS simpleoutputview.cpp + outputviewcommand.cpp + outputwidget.cpp ) kde4_automoc(${simpleoutputview_LIB_SRCS}) --- trunk/KDE/kdevelop/lib/plugins/outputviews/interfaces/ioutputview.h #659879:659880 @@ -25,6 +25,7 @@ class KUrl; class QString; +template class QMap; /** @author Andreas Pakulat @@ -33,18 +34,16 @@ { // Idea for later: Let the output view work on executable commands -// class ExecutableCommand +// class IExecutableCommand // { // public: -// ExecutableCommand(); -// void setWorkingDir(const KUrl&); -// void setCommandList(const QStringList&); -// void setEnvironment(const QStringList&); -// QStringList environment() const; -// QStringList commandlist() const; -// KUrl workingDirectory() const; -// private: -// struct ExecutableCommandPrivate* const d; +// virtual ~IExecutableCommand(){} +// virtual void setWorkingDir(const KUrl&) = 0; +// virtual void setCommandList(const QStringList&) = 0; +// virtual void setEnvironment(const QMap&) = 0; +// virtual QMap environment() const = 0; +// virtual QStringList commandlist() const = 0; +// virtual KUrl workingDirectory() const = 0; // }; class IOutputView @@ -54,11 +53,27 @@ virtual ~IOutputView() {} public: - virtual void queueCommand( const KUrl&, const QStringList&, const QStringList& ) = 0; + /** + * Execute the Command in a K3Process and capture the output in + * a new tab with the command as title + */ + virtual void queueCommand( const KUrl& workingdir, const QStringList&, const QMap& ) = 0; + /** + * Register a new Tab for Outputting logging information, this can be used + * for example to log things that the VCS plugin does + */ + virtual void registerLogView( const QString& title ) = 0; + + /** + * Add the line or lines to the registered tab identified via title + */ + virtual void appendLine( const QString& title, const QString& line ) = 0; + virtual void appendLines( const QString& title, const QStringList& lines ) = 0; + Q_SIGNALS: - virtual void commandFinished( const QStringList& ) = 0; - virtual void commandFailed( const QStringList& ) = 0; + virtual void commandFinished( const QString& ) = 0; + virtual void commandFailed( const QString& ) = 0; }; } KDEV_DECLARE_EXTENSION_INTERFACE_NS( KDevelop, IOutputView, "org.kdevelop.IOutputView" ) --- trunk/KDE/kdevelop/lib/plugins/outputviews/simpleoutputview.cpp #659879:659880 @@ -19,9 +19,9 @@ */ #include "simpleoutputview.h" +#include "outputwidget.h" +#include "outputviewcommand.h" -#include - #include #include @@ -49,8 +49,7 @@ virtual QWidget* create(QWidget *parent = 0) { Q_UNUSED(parent) - QListView* l = new QListView(parent); - l->setModel( m_part->model() ); + OutputWidget* l = new OutputWidget( parent, m_part); return l; } virtual Qt::DockWidgetArea defaultPosition(const QString &/*areaName*/) @@ -63,117 +62,78 @@ class SimpleOutputViewPrivate { - Q_DECLARE_PUBLIC( SimpleOutputView ) - SimpleOutputView* q_ptr; public: SimpleOutputViewViewFactory* m_factory; - QStandardItemModel* m_model; - QList > m_jobs; - K3Process* m_childProc; - QStringList m_currentCmd; - bool isRunning() - { - return (m_childProc->isRunning()); - } - void startNextJob() - { - if( m_jobs.isEmpty() ) - return; - m_model->clear(); - m_childProc->clearArguments(); -// m_childProc->setUseShell( true ); - QPair job = m_jobs.takeFirst(); - m_childProc->setWorkingDirectory( job.first.path() ); - QStringList l = job.second; - m_currentCmd = job.second; -// QString cmd = l.takeFirst(); - QStandardItem* i = new QStandardItem( m_currentCmd.join(" ") ); - m_model->appendRow( i ); - foreach(QString s, l) - if( !s.isEmpty() ) - *m_childProc << s; - m_childProc->start( K3Process::OwnGroup, K3Process::AllOutput ); - if( !isRunning() ) - kDebug(9000) << "Couldn't start process" << endl; - } - void procReadStdout(K3Process* proc, char* buf, int len) - { - QString txt = QString::fromLocal8Bit( buf, len ); - QStringList l = txt.split("\n"); - foreach( QString s, l ) - { - m_model->appendRow( new QStandardItem( s ) ); - } - } + QMap m_models; + QMap m_jobs; - void procReadStderr(K3Process* proc, char* buf, int len) - { - QString txt = QString::fromLocal8Bit( buf, len ); - QStringList l = txt.split("\n"); - foreach( QString s, l ) - { - m_model->appendRow( new QStandardItem( s ) ); - } - } - - void procFinished( K3Process* proc ) - { - Q_Q(SimpleOutputView); - if( !proc->exitStatus() ) - { - QStandardItem* endItem = new QStandardItem(QString("Finished (%1)").arg(proc->exitStatus()) ); - m_model->appendRow( endItem ); - kDebug(9004) << "Finished Sucessfully" << endl; - emit q->commandFinished( m_currentCmd ); - } - else - { - QStandardItem* endItem = new QStandardItem(QString("Failed (%1)").arg(proc->exitStatus())); - m_model->appendRow( endItem ); - kDebug(9004) << "Failed" << endl; - emit q->commandFailed( m_currentCmd ); - } - QTimer::singleShot(0, q, SLOT( startNextJob() ) ); - } }; SimpleOutputView::SimpleOutputView(QObject *parent, const QStringList &) : KDevelop::IPlugin(SimpleOutputViewFactory::componentData(), parent), d(new SimpleOutputViewPrivate) { - d->q_ptr = this; KDEV_USE_EXTENSION_INTERFACE( KDevelop::IOutputView ) - d->m_model = new QStandardItemModel( this ); - d->m_childProc = new K3Process( this ); d->m_factory = new SimpleOutputViewViewFactory( this ); core()->uiController()->addToolView( "Output View", d->m_factory ); - connect( d->m_childProc, SIGNAL(receivedStdout(K3Process* , char*, int) ), this, SLOT( procReadStdout(K3Process* , char*, int) ) ); - connect( d->m_childProc, SIGNAL(receivedStderr(K3Process* , char*, int) ), this, SLOT( procReadStderr(K3Process* , char*, int) ) ); - connect( d->m_childProc, SIGNAL(processExited( K3Process* ) ), - this, SLOT( procFinished( K3Process* ) ) ); + } SimpleOutputView::~SimpleOutputView() { + foreach( QStandardItemModel* m, d->m_models ) + delete m; + foreach( OutputViewCommand* o, d->m_jobs ) + delete o; delete d; } -QStandardItemModel* SimpleOutputView::model() +void SimpleOutputView::queueCommand(const KUrl& dir, const QStringList& command, const QMap& env ) { - return d->m_model; + if( command.isEmpty() ) + return; + kDebug(9004) << "Queueing Command: " << dir << "|" << command << endl; + QString title = command.first(); + if( !d->m_jobs.contains(title) ) + { + QStandardItemModel* model = new QStandardItemModel(); + OutputViewCommand* cmd = new OutputViewCommand( dir, command, env, model ); + connect( cmd, SIGNAL( commandFinished( const QString& ) ), + this, SIGNAL( commandFinished( const QString& ) ) ); + connect( cmd, SIGNAL( commandFailed( const QString& ) ), + this, SIGNAL( commandFailed( const QString& ) ) ); + + d->m_jobs[title] = cmd; + emit modelAdded( title, model ); + d->m_jobs[title]->start(); + } } -void SimpleOutputView::queueCommand(const KUrl& dir, const QStringList& command, const QStringList& env ) +void SimpleOutputView::registerLogView( const QString& title ) { - Q_UNUSED(env) - kDebug(9004) << "Queueing Command: " << dir << "|" << command << endl; - d->m_jobs.append(QPair(dir,command)); - if( !d->isRunning() ) + if( !d->m_models.contains( title ) ) { - d->startNextJob(); + d->m_models[title] = new QStandardItemModel(this); + emit modelAdded( title, d->m_models[title] ); } } +void SimpleOutputView::appendLine( const QString& title, const QString& line ) +{ + if( d->m_models.contains( title ) ) + { + d->m_models[title]->appendRow( new QStandardItem( line ) ); + } +} +void SimpleOutputView::appendLines( const QString& title, const QStringList& lines ) +{ + if( d->m_models.contains( title ) ) + { + foreach( QString line, lines ) + d->m_models[title]->appendRow( new QStandardItem( line ) ); + } +} + #include "simpleoutputview.moc" // kate: space-indent on; indent-width 4; tab-width: 4; replace-tabs on; auto-insert-doxygen on --- trunk/KDE/kdevelop/lib/plugins/outputviews/simpleoutputview.h #659879:659880 @@ -23,7 +23,6 @@ #include "ioutputview.h" #include "iplugin.h" -#include class QStringList; class QStandardItemModel; @@ -34,6 +33,7 @@ /** @author Andreas Pakulat */ + class SimpleOutputView : public KDevelop::IPlugin, public KDevelop::IOutputView { Q_OBJECT @@ -42,19 +42,18 @@ public: SimpleOutputView(QObject *parent = 0, const QStringList &args = QStringList()); virtual ~SimpleOutputView(); - void queueCommand(const KUrl& dir, const QStringList& command, const QStringList& env ); + void queueCommand(const KUrl& dir, const QStringList& command, const QMap& env ); - QStandardItemModel* model(); + void registerLogView( const QString& title ); + void appendLine( const QString& title, const QString& line ); + void appendLines( const QString& title, const QStringList& line ); Q_SIGNALS: - void commandFinished( const QStringList& command ); - void commandFailed( const QStringList& command ); + void commandFinished( const QString& command ); + void commandFailed( const QString& command ); + void modelAdded( const QString&, QStandardItemModel* ); private: - Q_PRIVATE_SLOT( d, void procReadStdout(K3Process* proc, char*, int) ) - Q_PRIVATE_SLOT( d, void procReadStderr(K3Process* proc, char*, int) ) - Q_PRIVATE_SLOT( d, void startNextJob() ) - Q_PRIVATE_SLOT( d, void procFinished( K3Process* ) ) class SimpleOutputViewPrivate* const d; friend class SimpleOutputViewPrivate; };