messages.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:9k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * Messages.cpp : Information about an item
  3.  ****************************************************************************
  4.  * Copyright (C) 2006-2007 the VideoLAN team
  5.  * $Id: 11a9fef9d6059463514e19e26ea21dffaf84ef1a $
  6.  *
  7.  * Authors: Jean-Baptiste Kempf <jb (at) videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #ifdef HAVE_CONFIG_H
  24. # include "config.h"
  25. #endif
  26. #include "dialogs/messages.hpp"
  27. #include <QSpinBox>
  28. #include <QLabel>
  29. #include <QTextEdit>
  30. #include <QTextCursor>
  31. #include <QFileDialog>
  32. #include <QTextStream>
  33. #include <QMessageBox>
  34. #include <QTabWidget>
  35. #include <QTreeWidget>
  36. #include <QTreeWidgetItem>
  37. #include <QHeaderView>
  38. #include <QMutex>
  39. #include <assert.h>
  40. MessagesDialog *MessagesDialog::instance = NULL;
  41. enum {
  42.     MsgEvent_Type = QEvent::User + MsgEventType + 1,
  43. };
  44. class MsgEvent : public QEvent
  45. {
  46. public:
  47.     MsgEvent( msg_item_t *msg )
  48.         : QEvent( (QEvent::Type)MsgEvent_Type ), msg(msg)
  49.     {
  50.         msg_Hold( msg );
  51.     }
  52.     virtual ~MsgEvent()
  53.     {
  54.         msg_Release( msg );
  55.     }
  56.     msg_item_t *msg;
  57. };
  58. struct msg_cb_data_t
  59. {
  60.     MessagesDialog *self;
  61. };
  62. static void MsgCallback( msg_cb_data_t *, msg_item_t *, unsigned );
  63. MessagesDialog::MessagesDialog( intf_thread_t *_p_intf)
  64.                : QVLCFrame( _p_intf )
  65. {
  66.     setWindowTitle( qtr( "Messages" ) );
  67.     /* General widgets */
  68.     QGridLayout *mainLayout = new QGridLayout( this );
  69.     mainTab = new QTabWidget( this );
  70.     mainTab->setTabPosition( QTabWidget::North );
  71.     /* Messages */
  72.     QWidget     *msgWidget = new QWidget;
  73.     QGridLayout *msgLayout = new QGridLayout( msgWidget );
  74.     messages = new QTextEdit();
  75.     messages->setReadOnly( true );
  76.     messages->setGeometry( 0, 0, 440, 600 );
  77.     messages->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
  78.     messages->setTextInteractionFlags( Qt::TextSelectableByMouse );
  79.     msgLayout->addWidget( messages, 0, 0, 1, 0 );
  80.     mainTab->addTab( msgWidget, qtr( "Messages" ) );
  81.     /* Modules tree */
  82.     QWidget     *treeWidget = new QWidget;
  83.     QGridLayout *treeLayout = new QGridLayout( treeWidget );
  84.     modulesTree = new QTreeWidget();
  85.     modulesTree->header()->hide();
  86.     treeLayout->addWidget( modulesTree, 0, 0, 1, 0 );
  87.     mainTab->addTab( treeWidget, qtr( "Modules tree" ) );
  88.     /* Buttons and general layout */
  89.     QPushButton *closeButton = new QPushButton( qtr( "&Close" ) );
  90.     closeButton->setDefault( true );
  91.     clearUpdateButton = new QPushButton( qtr( "C&lear" ) );
  92.     saveLogButton = new QPushButton( qtr( "&Save as..." ) );
  93.     saveLogButton->setToolTip( qtr( "Saves all the displayed logs to a file" ) );
  94.     verbosityBox = new QSpinBox();
  95.     verbosityBox->setRange( 0, 2 );
  96.     verbosityBox->setValue( config_GetInt( p_intf, "verbose" ) );
  97.     verbosityBox->setWrapping( true );
  98.     verbosityBox->setMaximumWidth( 50 );
  99.     verbosityLabel = new QLabel( qtr( "Verbosity Level" ) );
  100.     mainLayout->addWidget( mainTab, 0, 0, 1, 0 );
  101.     mainLayout->addWidget( verbosityLabel, 1, 0, 1, 1 );
  102.     mainLayout->addWidget( verbosityBox, 1, 1 );
  103.     mainLayout->setColumnStretch( 2, 10 );
  104.     mainLayout->addWidget( saveLogButton, 1, 3 );
  105.     mainLayout->addWidget( clearUpdateButton, 1, 4 );
  106.     mainLayout->addWidget( closeButton, 1, 5 );
  107.     BUTTONACT( closeButton, hide() );
  108.     BUTTONACT( clearUpdateButton, clearOrUpdate() );
  109.     BUTTONACT( saveLogButton, save() );
  110.     CONNECT( mainTab, currentChanged( int ),
  111.              this, updateTab( int ) );
  112.     /* General action */
  113.     readSettings( "Messages", QSize( 600, 450 ) );
  114.     /* Hook up to LibVLC messaging */
  115.     cbData = new msg_cb_data_t;
  116.     cbData->self = this;
  117.     sub = msg_Subscribe( p_intf->p_libvlc, MsgCallback, cbData );
  118. }
  119. MessagesDialog::~MessagesDialog()
  120. {
  121.     writeSettings( "Messages" );
  122.     msg_Unsubscribe( sub );
  123.     delete cbData;
  124. };
  125. void MessagesDialog::updateTab( int index )
  126. {
  127.     /* Second tab : modules tree */
  128.     if( index == 1 )
  129.     {
  130.         verbosityLabel->hide();
  131.         verbosityBox->hide();
  132.         clearUpdateButton->setText( qtr( "&Update" ) );
  133.         saveLogButton->hide();
  134.         updateTree();
  135.     }
  136.     /* First tab : messages */
  137.     else
  138.     {
  139.         verbosityLabel->show();
  140.         verbosityBox->show();
  141.         clearUpdateButton->setText( qtr( "&Clear" ) );
  142.         saveLogButton->show();
  143.     }
  144. }
  145. void MessagesDialog::sinkMessage( msg_item_t *item )
  146. {
  147.     if ((item->i_type == VLC_MSG_WARN && verbosityBox->value() < 1)
  148.      || (item->i_type == VLC_MSG_DBG && verbosityBox->value() < 2 ))
  149.         return;
  150.     /* Copy selected text to the clipboard */
  151.     if( messages->textCursor().hasSelection() )
  152.         messages->copy();
  153.     /* Fix selected text bug */
  154.     if( !messages->textCursor().atEnd() ||
  155.          messages->textCursor().anchor() != messages->textCursor().position() )
  156.          messages->moveCursor( QTextCursor::End );
  157.     messages->setFontItalic( true );
  158.     messages->setTextColor( "darkBlue" );
  159.     messages->insertPlainText( qfu( item->psz_module ) );
  160.     switch (item->i_type)
  161.     {
  162.         case VLC_MSG_INFO:
  163.             messages->setTextColor( "blue" );
  164.             messages->insertPlainText( " info: " );
  165.             break;
  166.         case VLC_MSG_ERR:
  167.             messages->setTextColor( "red" );
  168.             messages->insertPlainText( " error: " );
  169.             break;
  170.         case VLC_MSG_WARN:
  171.             messages->setTextColor( "green" );
  172.             messages->insertPlainText( " warning: " );
  173.             break;
  174.         case VLC_MSG_DBG:
  175.         default:
  176.             messages->setTextColor( "grey" );
  177.             messages->insertPlainText( " debug: " );
  178.             break;
  179.     }
  180.     /* Add message Regular black Font */
  181.     messages->setFontItalic( false );
  182.     messages->setTextColor( "black" );
  183.     messages->insertPlainText( qfu(item->psz_msg) );
  184.     messages->insertPlainText( "n" );
  185.     messages->ensureCursorVisible();
  186. }
  187. void MessagesDialog::customEvent( QEvent *event )
  188. {
  189.     MsgEvent *msge = static_cast<MsgEvent *>(event);
  190.     assert( msge );
  191.     sinkMessage( msge->msg );
  192. }
  193. void MessagesDialog::clearOrUpdate()
  194. {
  195.     if( mainTab->currentIndex() )
  196.         updateTree();
  197.     else
  198.         clear();
  199. }
  200. void MessagesDialog::clear()
  201. {
  202.     messages->clear();
  203. }
  204. bool MessagesDialog::save()
  205. {
  206.     QString saveLogFileName = QFileDialog::getSaveFileName(
  207.             this, qtr( "Save log file as..." ),
  208.             qfu( config_GetHomeDir() ),
  209.             qtr( "Texts / Logs (*.log *.txt);; All (*.*) ") );
  210.     if( !saveLogFileName.isNull() )
  211.     {
  212.         QFile file( saveLogFileName );
  213.         if ( !file.open( QFile::WriteOnly | QFile::Text ) ) {
  214.             QMessageBox::warning( this, qtr( "Application" ),
  215.                     qtr( "Cannot write to file %1:n%2." )
  216.                     .arg( saveLogFileName )
  217.                     .arg( file.errorString() ) );
  218.             return false;
  219.         }
  220.         QTextStream out( &file );
  221.         out << messages->toPlainText() << "n";
  222.         return true;
  223.     }
  224.     return false;
  225. }
  226. void MessagesDialog::buildTree( QTreeWidgetItem *parentItem,
  227.                                 vlc_object_t *p_obj )
  228. {
  229.     QTreeWidgetItem *item;
  230.     if( parentItem )
  231.         item = new QTreeWidgetItem( parentItem );
  232.     else
  233.         item = new QTreeWidgetItem( modulesTree );
  234.     if( p_obj->psz_object_name )
  235.         item->setText( 0, qfu( p_obj->psz_object_type ) + " "" +
  236.                        qfu( p_obj->psz_object_name ) + "" (" +
  237.                        QString::number((uintptr_t)p_obj) + ")" );
  238.     else
  239.         item->setText( 0, qfu( p_obj->psz_object_type ) + " (" +
  240.                        QString::number((uintptr_t)p_obj) + ")" );
  241.     item->setExpanded( true );
  242.     vlc_list_t *l = vlc_list_children( p_obj );
  243.     for( int i=0; i < l->i_count; i++ )
  244.         buildTree( item, l->p_values[i].p_object );
  245.     vlc_list_release( l );
  246. }
  247. void MessagesDialog::updateTree()
  248. {
  249.     modulesTree->clear();
  250.     buildTree( NULL, VLC_OBJECT( p_intf->p_libvlc ) );
  251. }
  252. static void MsgCallback( msg_cb_data_t *data, msg_item_t *item, unsigned )
  253. {
  254.     int canc = vlc_savecancel();
  255.     QApplication::postEvent( data->self, new MsgEvent( item ) );
  256.     vlc_restorecancel( canc );
  257. }