X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fdialogs%2Fmessages.cpp;h=11a9fef9d6059463514e19e26ea21dffaf84ef1a;hb=ad77d955a5dc051976d94d6e08ee0f717ec3a938;hp=46aa53b7aa5a89cdb7710d8813f872beb09602c7;hpb=f70a9052bd0d5613fecc77d8d3f6a01c0f8636c5;p=vlc diff --git a/modules/gui/qt4/dialogs/messages.cpp b/modules/gui/qt4/dialogs/messages.cpp index 46aa53b7aa..11a9fef9d6 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 @@ -41,13 +39,35 @@ #include #include +#include + MessagesDialog *MessagesDialog::instance = NULL; +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; - QMutex lock; /**< protects MessagesDialog::messages */ }; +static void MsgCallback( msg_cb_data_t *, msg_item_t *, unsigned ); MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) : QVLCFrame( _p_intf ) @@ -68,6 +88,7 @@ MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) messages->setReadOnly( true ); messages->setGeometry( 0, 0, 440, 600 ); messages->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff ); + messages->setTextInteractionFlags( Qt::TextSelectableByMouse ); msgLayout->addWidget( messages, 0, 0, 1, 0 ); mainTab->addTab( msgWidget, qtr( "Messages" ) ); @@ -118,16 +139,16 @@ MessagesDialog::MessagesDialog( intf_thread_t *_p_intf) /* 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); + cbData = new msg_cb_data_t; + cbData->self = this; + sub = msg_Subscribe( p_intf->p_libvlc, MsgCallback, cbData ); } -MessagesDialog::~MessagesDialog () +MessagesDialog::~MessagesDialog() { - writeSettings( "messages" ); - msg_Unsubscribe (sub); - delete cb_data; + writeSettings( "Messages" ); + msg_Unsubscribe( sub ); + delete cbData; }; void MessagesDialog::updateTab( int index ) @@ -151,22 +172,21 @@ void MessagesDialog::updateTab( int index ) } } -void MessagesDialog::sinkMessage (msg_cb_data_t *data, msg_item_t *item, - unsigned overruns) -{ - MessagesDialog *self = data->self; - QMutexLocker locker (&data->lock); - - self->sinkMessage (item, overruns); -} - -void MessagesDialog::sinkMessage (msg_item_t *item, unsigned) +void MessagesDialog::sinkMessage( msg_item_t *item ) { if ((item->i_type == VLC_MSG_WARN && verbosityBox->value() < 1) || (item->i_type == VLC_MSG_DBG && verbosityBox->value() < 2 )) return; - messages->textCursor().movePosition( QTextCursor::End ); + /* Copy selected text to the clipboard */ + if( messages->textCursor().hasSelection() ) + messages->copy(); + + /* 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 ) ); @@ -200,30 +220,12 @@ void MessagesDialog::sinkMessage (msg_item_t *item, unsigned) messages->ensureCursorVisible(); } -void MessagesDialog::buildTree( QTreeWidgetItem *parentItem, - vlc_object_t *p_obj ) +void MessagesDialog::customEvent( QEvent *event ) { - QTreeWidgetItem *item; - - if( parentItem ) - item = new QTreeWidgetItem( parentItem ); - else - item = new QTreeWidgetItem( modulesTree ); + MsgEvent *msge = static_cast(event); - if( p_obj->psz_object_name ) - item->setText( 0, qfu( p_obj->psz_object_type ) + " \"" + - qfu( p_obj->psz_object_name ) + "\" (" + - QString::number((uintptr_t)p_obj) + ")" ); - 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 ); + assert( msge ); + sinkMessage( msge->msg ); } void MessagesDialog::clearOrUpdate() @@ -234,15 +236,8 @@ void MessagesDialog::clearOrUpdate() clear(); } -void MessagesDialog::updateTree() -{ - modulesTree->clear(); - buildTree( NULL, VLC_OBJECT( p_intf->p_libvlc ) ); -} - void MessagesDialog::clear() { - QMutexLocker locker (&cb_data->lock); messages->clear(); } @@ -265,10 +260,51 @@ bool MessagesDialog::save() } QTextStream out( &file ); - QMutexLocker locker (&cb_data->lock); out << messages->toPlainText() << "\n"; return true; } 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 ); + + if( p_obj->psz_object_name ) + item->setText( 0, qfu( p_obj->psz_object_type ) + " \"" + + qfu( p_obj->psz_object_name ) + "\" (" + + QString::number((uintptr_t)p_obj) + ")" ); + 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 ); +} +