X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fgui%2Fqt4%2Fdialogs%2Fmessages.cpp;h=dd8d9fe69b3f44988f2d3654419c0accca5e872f;hb=7c8f1b05e8d2b4aa1717e623eb683337e6f1dced;hp=9be3a7abb6946b8f1bd2f4e49778a927f14f5869;hpb=5daa9d294991621f86cf3b501f4fb04c70bb182b;p=vlc diff --git a/modules/gui/qt4/dialogs/messages.cpp b/modules/gui/qt4/dialogs/messages.cpp index 9be3a7abb6..dd8d9fe69b 100644 --- a/modules/gui/qt4/dialogs/messages.cpp +++ b/modules/gui/qt4/dialogs/messages.cpp @@ -39,45 +39,26 @@ #include #include #include +#include MessagesDialog *MessagesDialog::instance = NULL; -MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) : QVLCFrame( _p_intf ) +struct msg_cb_data_t +{ + MessagesDialog *self; + QMutex lock; /**< protects MessagesDialog::messages */ +}; + +MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) + : QVLCFrame( _p_intf ) { setWindowTitle( qtr( "Messages" ) ); - resize( 600, 450 ); /* General widgets */ QGridLayout *mainLayout = new QGridLayout( this ); - QTabWidget *mainTab = new QTabWidget( this ); + mainTab = new QTabWidget( this ); mainTab->setTabPosition( QTabWidget::North ); - QPushButton *closeButton = new QPushButton( qtr( "&Close" ) ); - closeButton->setDefault( true ); - clearButton = new QPushButton( qtr( "&Clear" ) ); - saveLogButton = new QPushButton( qtr( "&Save as..." ) ); - - verbosityBox = new QSpinBox(); - verbosityBox->setRange( 0, 2 ); - verbosityBox->setValue( config_GetInt( p_intf, "verbose" ) ); - verbosityBox->setWrapping( true ); - verbosityBox->setMaximumWidth( 50 ); - - verbosityLabel = new QLabel( qtr( "Verbosity Level" ) ); - - - mainLayout->addWidget( mainTab, 0, 0, 1, 0 ); - mainLayout->addWidget( verbosityLabel, 1, 0, 1, 1 ); - mainLayout->addWidget( verbosityBox, 1, 1 ); - mainLayout->addWidget( saveLogButton, 1, 3 ); - mainLayout->addWidget( clearButton, 1, 4 ); - mainLayout->addWidget( closeButton, 1, 5 ); - - BUTTONACT( closeButton, close() ); - BUTTONACT( clearButton, clear() ); - BUTTONACT( saveLogButton, save() ); - CONNECT( mainTab, currentChanged( int ), this, updateTab( int ) ); - /* Messages */ QWidget *msgWidget = new QWidget; @@ -90,7 +71,6 @@ MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) : QVLCFrame( _p_intf ) msgLayout->addWidget( messages, 0, 0, 1, 0 ); mainTab->addTab( msgWidget, qtr( "Messages" ) ); - ON_TIMEOUT( updateLog() ); /* Modules tree */ @@ -104,98 +84,136 @@ MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) : QVLCFrame( _p_intf ) mainTab->addTab( treeWidget, qtr( "Modules tree" ) ); + /* Buttons and general layout */ + QPushButton *closeButton = new QPushButton( qtr( "&Close" ) ); + closeButton->setDefault( true ); + clearUpdateButton = new QPushButton( qtr( "C&lear" ) ); + saveLogButton = new QPushButton( qtr( "&Save as..." ) ); + saveLogButton->setToolTip( qtr( "Saves all the displayed logs to a file" ) ); + + verbosityBox = new QSpinBox(); + verbosityBox->setRange( 0, 2 ); + verbosityBox->setValue( config_GetInt( p_intf, "verbose" ) ); + verbosityBox->setWrapping( true ); + verbosityBox->setMaximumWidth( 50 ); + + verbosityLabel = new QLabel( qtr( "Verbosity Level" ) ); + + mainLayout->addWidget( mainTab, 0, 0, 1, 0 ); + mainLayout->addWidget( verbosityLabel, 1, 0, 1, 1 ); + mainLayout->addWidget( verbosityBox, 1, 1 ); + mainLayout->setColumnStretch( 2, 10 ); + mainLayout->addWidget( saveLogButton, 1, 3 ); + mainLayout->addWidget( clearUpdateButton, 1, 4 ); + mainLayout->addWidget( closeButton, 1, 5 ); + + BUTTONACT( closeButton, hide() ); + BUTTONACT( clearUpdateButton, clearOrUpdate() ); + BUTTONACT( saveLogButton, save() ); + CONNECT( mainTab, currentChanged( int ), + this, updateTab( int ) ); + /* General action */ - readSettings( "Messages" ); + readSettings( "Messages", QSize( 600, 450 ) ); + + + /* Hook up to LibVLC messaging */ + cb_data = new msg_cb_data_t; + cb_data->self = this; + sub = msg_Subscribe (_p_intf->p_libvlc, sinkMessage, cb_data); } +MessagesDialog::~MessagesDialog () +{ + writeSettings( "messages" ); + msg_Unsubscribe (sub); + delete cb_data; +}; + void MessagesDialog::updateTab( int index ) { + /* Second tab : modules tree */ if( index == 1 ) { verbosityLabel->hide(); verbosityBox->hide(); - clearButton->hide(); + clearUpdateButton->setText( qtr( "&Update" ) ); saveLogButton->hide(); updateTree(); } + /* First tab : messages */ else { verbosityLabel->show(); verbosityBox->show(); - clearButton->show(); + clearUpdateButton->setText( qtr( "&Clear" ) ); saveLogButton->show(); } } -void MessagesDialog::updateLog() +void MessagesDialog::sinkMessage (msg_cb_data_t *data, msg_item_t *item, + unsigned overruns) { - msg_subscription_t *p_sub = p_intf->p_sys->p_sub; - int i_start; + MessagesDialog *self = data->self; + QMutexLocker locker (&data->lock); - vlc_mutex_lock( p_sub->p_lock ); - int i_stop = *p_sub->pi_stop; - vlc_mutex_unlock( p_sub->p_lock ); + self->sinkMessage (item, overruns); +} - if( p_sub->i_start != i_stop ) - { - messages->textCursor().movePosition( QTextCursor::End ); - - for( i_start = p_sub->i_start; - i_start != i_stop; - i_start = (i_start+1) % VLC_MSG_QSIZE ) - { - if( p_sub->p_msg[i_start].i_type == VLC_MSG_INFO || - p_sub->p_msg[i_start].i_type == VLC_MSG_ERR || - p_sub->p_msg[i_start].i_type == VLC_MSG_WARN && - verbosityBox->value() >= 1 || - p_sub->p_msg[i_start].i_type == VLC_MSG_DBG && - verbosityBox->value() >= 2 ) - { - messages->setFontItalic( true ); - messages->setTextColor( "darkBlue" ); - messages->insertPlainText( qfu( p_sub->p_msg[i_start].psz_module ) ); - } - else - continue; - - switch( p_sub->p_msg[i_start].i_type ) - { - case VLC_MSG_INFO: - messages->setTextColor( "blue" ); - messages->insertPlainText( " info: " ); - break; - case VLC_MSG_ERR: - messages->setTextColor( "red" ); - messages->insertPlainText( " error: " ); - break; - case VLC_MSG_WARN: - messages->setTextColor( "green" ); - messages->insertPlainText( " warning: " ); - break; - case VLC_MSG_DBG: - default: - messages->setTextColor( "grey" ); - messages->insertPlainText( " debug: " ); - break; - } - - /* Add message Regular black Font */ - messages->setFontItalic( false ); - messages->setTextColor( "black" ); - messages->insertPlainText( qfu(p_sub->p_msg[i_start].psz_msg) ); - messages->insertPlainText( "\n" ); - } - messages->ensureCursorVisible(); +void MessagesDialog::sinkMessage (msg_item_t *item, unsigned) +{ + if ((item->i_type == VLC_MSG_WARN && verbosityBox->value() < 1) + || (item->i_type == VLC_MSG_DBG && verbosityBox->value() < 2 )) + return; + + // Saving cursor selection + int startPos = messages->textCursor().selectionStart(); + int endPos = messages->textCursor().selectionEnd(); - vlc_mutex_lock( p_sub->p_lock ); - p_sub->i_start = i_start; - vlc_mutex_unlock( p_sub->p_lock ); + messages->moveCursor( QTextCursor::End ); + messages->setFontItalic( true ); + messages->setTextColor( "darkBlue" ); + messages->insertPlainText( qfu( item->psz_module ) ); + + switch (item->i_type) + { + case VLC_MSG_INFO: + messages->setTextColor( "blue" ); + messages->insertPlainText( " info: " ); + break; + case VLC_MSG_ERR: + messages->setTextColor( "red" ); + messages->insertPlainText( " error: " ); + break; + case VLC_MSG_WARN: + messages->setTextColor( "green" ); + messages->insertPlainText( " warning: " ); + break; + case VLC_MSG_DBG: + default: + messages->setTextColor( "grey" ); + messages->insertPlainText( " debug: " ); + break; } + + /* Add message Regular black Font */ + messages->setFontItalic( false ); + messages->setTextColor( "black" ); + messages->insertPlainText( qfu(item->psz_msg) ); + messages->insertPlainText( "\n" ); + messages->ensureCursorVisible(); + + // Restoring saved cursor selection + QTextCursor cur = messages->textCursor(); + cur.movePosition( QTextCursor::Start ); + cur.movePosition( QTextCursor::NextCharacter, QTextCursor::MoveAnchor, startPos ); + cur.movePosition( QTextCursor::NextCharacter, QTextCursor::KeepAnchor, endPos - startPos ); + messages->setTextCursor( cur ); } -void MessagesDialog::buildTree( QTreeWidgetItem *parentItem, vlc_object_t *p_obj ) +void MessagesDialog::buildTree( QTreeWidgetItem *parentItem, + vlc_object_t *p_obj ) { - vlc_object_yield( p_obj ); QTreeWidgetItem *item; if( parentItem ) @@ -206,41 +224,44 @@ void MessagesDialog::buildTree( QTreeWidgetItem *parentItem, vlc_object_t *p_obj if( p_obj->psz_object_name ) item->setText( 0, qfu( p_obj->psz_object_type ) + " \"" + qfu( p_obj->psz_object_name ) + "\" (" + - QString::number(p_obj->i_object_id) + ")\n" ); + QString::number((uintptr_t)p_obj) + ")" ); else item->setText( 0, qfu( p_obj->psz_object_type ) + " (" + - QString::number(p_obj->i_object_id) + ")\n" ); + QString::number((uintptr_t)p_obj) + ")" ); - for( int i=0; i < p_obj->i_children; i++ ) - { - buildTree( item, p_obj->pp_children[i]); - } + item->setExpanded( true ); - vlc_object_release( p_obj ); + vlc_list_t *l = vlc_list_children( p_obj ); + for( int i=0; i < l->i_count; i++ ) + buildTree( item, l->p_values[i].p_object ); + vlc_list_release( l ); } -void MessagesDialog::updateTree() +void MessagesDialog::clearOrUpdate() { - modulesTree->clear(); - - buildTree( NULL, VLC_OBJECT( p_intf->p_libvlc ) ); + if( mainTab->currentIndex() ) + updateTree(); + else + clear(); } -void MessagesDialog::close() +void MessagesDialog::updateTree() { - hide(); + modulesTree->clear(); + buildTree( NULL, VLC_OBJECT( p_intf->p_libvlc ) ); } void MessagesDialog::clear() { + QMutexLocker locker (&cb_data->lock); messages->clear(); } bool MessagesDialog::save() { QString saveLogFileName = QFileDialog::getSaveFileName( - this, qtr( "Choose a filename to save the logs under..." ), - qfu( p_intf->p_libvlc->psz_homedir ), + this, qtr( "Save log file as..." ), + qfu( config_GetHomeDir() ), qtr( "Texts / Logs (*.log *.txt);; All (*.*) ") ); if( !saveLogFileName.isNull() ) @@ -248,13 +269,14 @@ bool MessagesDialog::save() QFile file( saveLogFileName ); if ( !file.open( QFile::WriteOnly | QFile::Text ) ) { QMessageBox::warning( this, qtr( "Application" ), - qtr( "Cannot write file %1:\n%2." ) + qtr( "Cannot write to file %1:\n%2." ) .arg( saveLogFileName ) .arg( file.errorString() ) ); return false; } QTextStream out( &file ); + QMutexLocker locker (&cb_data->lock); out << messages->toPlainText() << "\n"; return true;