X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fdialogs%2Fmessages.cpp;h=4c5954c34cc4a3289503747d4eedfd03a87ec422;hb=8ad732cd471bb22c992bb1cbe4f44bdfb6e233ca;hp=cf4294053a7dcf32ebd0c1f050d8aa3419191ddb;hpb=832be47d524d97f98957a5cadb67a6aae3ddc6da;p=vlc diff --git a/modules/gui/qt4/dialogs/messages.cpp b/modules/gui/qt4/dialogs/messages.cpp index cf4294053a..4c5954c34c 100644 --- a/modules/gui/qt4/dialogs/messages.cpp +++ b/modules/gui/qt4/dialogs/messages.cpp @@ -25,9 +25,7 @@ #endif #include "dialogs/messages.hpp" -#include "dialogs_provider.hpp" -#include #include #include #include @@ -39,182 +37,204 @@ #include #include #include +#include + +#include MessagesDialog *MessagesDialog::instance = NULL; -MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) : QVLCFrame( _p_intf ) +enum { + MsgEvent_Type = QEvent::User + MsgEventType + 1, +}; + +class MsgEvent : public QEvent +{ +public: + MsgEvent( msg_item_t *msg ) + : QEvent( (QEvent::Type)MsgEvent_Type ), msg(msg) + { + msg_Hold( msg ); + } + virtual ~MsgEvent() + { + msg_Release( msg ); + } + + msg_item_t *msg; +}; + +struct msg_cb_data_t +{ + MessagesDialog *self; +}; +static void MsgCallback( msg_cb_data_t *, msg_item_t *, unsigned ); + +MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) + : QVLCFrame( _p_intf ) { setWindowTitle( qtr( "Messages" ) ); - resize( 600, 450 ); + setWindowRole( "vlc-messages" ); /* 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 ); - BUTTONACT( closeButton, close() ); - - mainLayout->addWidget( mainTab, 0, 0, 1, 0 ); - mainLayout->addWidget( closeButton, 1, 5 ); - /* Messages */ QWidget *msgWidget = new QWidget; QGridLayout *msgLayout = new QGridLayout( msgWidget ); - QPushButton *clearButton = new QPushButton( qtr( "&Clear" ) ); - QPushButton *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 ); - - QLabel *verbosityLabel = new QLabel( qtr( "Verbosity Level" ) ); - messages = new QTextEdit(); messages->setReadOnly( true ); messages->setGeometry( 0, 0, 440, 600 ); messages->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + messages->setTextInteractionFlags( Qt::TextSelectableByMouse ); msgLayout->addWidget( messages, 0, 0, 1, 0 ); - msgLayout->addWidget( verbosityLabel, 1, 0, 1, 1 ); - msgLayout->addWidget( verbosityBox, 1, 1 ); - msgLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding ), 1, 2 ); - msgLayout->addWidget( saveLogButton, 1, 3 ); - msgLayout->addWidget( clearButton, 1, 4 ); - - BUTTONACT( clearButton, clear() ); - BUTTONACT( saveLogButton, save() ); - ON_TIMEOUT( updateLog() ); - mainTab->addTab( msgWidget, qtr( "Messages" ) ); - /* Module tree */ + + /* Modules tree */ QWidget *treeWidget = new QWidget; QGridLayout *treeLayout = new QGridLayout( treeWidget ); modulesTree = new QTreeWidget(); modulesTree->header()->hide(); - QPushButton *updateButton = new QPushButton( qtr( "&Update" ) ); - treeLayout->addWidget( modulesTree, 0, 0, 1, 0 ); - treeLayout->addWidget( updateButton, 1, 6 ); + mainTab->addTab( treeWidget, qtr( "Modules tree" ) ); - BUTTONACT( updateButton, updateTree() ); - 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", QSize( 600, 450 ) ); - readSettings( "Messages" ); + /* Hook up to LibVLC messaging */ + cbData = new msg_cb_data_t; + cbData->self = this; + sub = msg_Subscribe( p_intf->p_libvlc, MsgCallback, cbData ); } -void MessagesDialog::updateLog() +MessagesDialog::~MessagesDialog() { - msg_subscription_t *p_sub = p_intf->p_sys->p_sub; - int i_start; - - vlc_mutex_lock( p_sub->p_lock ); - int i_stop = *p_sub->pi_stop; - vlc_mutex_unlock( p_sub->p_lock ); + writeSettings( "Messages" ); + msg_Unsubscribe( sub ); + delete cbData; +}; - if( p_sub->i_start != i_stop ) +void MessagesDialog::updateTab( int index ) +{ + /* Second tab : modules tree */ + if( index == 1 ) { - 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(); - - vlc_mutex_lock( p_sub->p_lock ); - p_sub->i_start = i_start; - vlc_mutex_unlock( p_sub->p_lock ); + verbosityLabel->hide(); + verbosityBox->hide(); + clearUpdateButton->setText( qtr( "&Update" ) ); + saveLogButton->hide(); + updateTree(); + } + /* First tab : messages */ + else + { + verbosityLabel->show(); + verbosityBox->show(); + clearUpdateButton->setText( qtr( "&Clear" ) ); + saveLogButton->show(); } } -void MessagesDialog::buildTree( QTreeWidgetItem *parentItem, vlc_object_t *p_obj ) +void MessagesDialog::sinkMessage( msg_item_t *item ) { - vlc_object_yield( p_obj ); - QTreeWidgetItem *item; + if ((item->i_type == VLC_MSG_WARN && verbosityBox->value() < 1) + || (item->i_type == VLC_MSG_DBG && verbosityBox->value() < 2 )) + return; - if( parentItem ) - item = new QTreeWidgetItem( parentItem ); - else - item = new QTreeWidgetItem( modulesTree ); + /* Copy selected text to the clipboard */ + if( messages->textCursor().hasSelection() ) + messages->copy(); - 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" ); - else - item->setText( 0, qfu( p_obj->psz_object_type ) + " (" + - QString::number(p_obj->i_object_id) + ")\n" ); + /* Fix selected text bug */ + if( !messages->textCursor().atEnd() || + messages->textCursor().anchor() != messages->textCursor().position() ) + messages->moveCursor( QTextCursor::End ); + + messages->setFontItalic( true ); + messages->setTextColor( "darkBlue" ); + messages->insertPlainText( qfu( item->psz_module ) ); - for( int i=0; i < p_obj->i_children; i++ ) + switch (item->i_type) { - buildTree( item, p_obj->pp_children[i]); + 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; } - vlc_object_release( p_obj ); + /* Add message Regular black Font */ + messages->setFontItalic( false ); + messages->setTextColor( "black" ); + messages->insertPlainText( qfu(item->psz_msg) ); + messages->insertPlainText( "\n" ); + messages->ensureCursorVisible(); } -void MessagesDialog::updateTree() +void MessagesDialog::customEvent( QEvent *event ) { - modulesTree->clear(); + MsgEvent *msge = static_cast(event); - buildTree( NULL, VLC_OBJECT( p_intf->p_libvlc ) ); + assert( msge ); + sinkMessage( msge->msg ); } -void MessagesDialog::close() +void MessagesDialog::clearOrUpdate() { - hide(); + if( mainTab->currentIndex() ) + updateTree(); + else + clear(); } void MessagesDialog::clear() @@ -225,8 +245,8 @@ void MessagesDialog::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..." ), + QVLCUserDir( VLC_DOCUMENTS_DIR ), qtr( "Texts / Logs (*.log *.txt);; All (*.*) ") ); if( !saveLogFileName.isNull() ) @@ -234,7 +254,7 @@ 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; @@ -247,3 +267,49 @@ bool MessagesDialog::save() } return false; } + +void MessagesDialog::buildTree( QTreeWidgetItem *parentItem, + vlc_object_t *p_obj ) +{ + QTreeWidgetItem *item; + + if( parentItem ) + item = new QTreeWidgetItem( parentItem ); + else + item = new QTreeWidgetItem( modulesTree ); + + char *name = vlc_object_get_name( p_obj ); + if( name != NULL ) + { + item->setText( 0, qfu( p_obj->psz_object_type ) + " \"" + + qfu( name ) + "\" (" + + QString::number((uintptr_t)p_obj) + ")" ); + free( name ); + } + else + item->setText( 0, qfu( p_obj->psz_object_type ) + " (" + + QString::number((uintptr_t)p_obj) + ")" ); + + item->setExpanded( true ); + + 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() +{ + modulesTree->clear(); + buildTree( NULL, VLC_OBJECT( p_intf->p_libvlc ) ); +} + +static void MsgCallback( msg_cb_data_t *data, msg_item_t *item, unsigned ) +{ + int canc = vlc_savecancel(); + + QApplication::postEvent( data->self, new MsgEvent( item ) ); + + vlc_restorecancel( canc ); +} +