X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Finfopanels.cpp;h=57a738a5e68fdb5642ff2d96bd6bbe0a1a3580ae;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=27e74e74386542967e1521a5352561d8e993e51f;hpb=d2382e54532fa078b366a3d3df51d4e3f7356420;p=vlc diff --git a/modules/gui/qt4/components/infopanels.cpp b/modules/gui/qt4/components/infopanels.cpp index 27e74e7438..57a738a5e6 100644 --- a/modules/gui/qt4/components/infopanels.cpp +++ b/modules/gui/qt4/components/infopanels.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -40,130 +41,296 @@ * Single panels ************************************************************************/ -/* First Panel - Meta Info */ - -MetaPanel::MetaPanel( QWidget *parent, intf_thread_t *_p_intf ) : - QWidget( parent ), p_intf( _p_intf ) +/** + * First Panel - Meta Info + * All the usual MetaData are displayed and can be changed. + **/ +MetaPanel::MetaPanel( QWidget *parent, + intf_thread_t *_p_intf ) + : QWidget( parent ), p_intf( _p_intf ) { - int line = 0; - QGridLayout *l = new QGridLayout( this ); - l->setColumnStretch( 2, 5 ); - l->setColumnStretch( 5, 3 ); + QGridLayout *metaLayout = new QGridLayout( this ); + + int line = 0; /* Counter for GridLayout */ + p_input = NULL; #define ADD_META( string, widget ) { \ - l->addWidget( new QLabel( qtr( string ) + " :" ), line, 0 ); \ + metaLayout->addWidget( new QLabel( qtr( string ) + " :" ), line, 0 ); \ widget = new QLineEdit; \ - l->addWidget( widget, line, 1, 1, 7 ); \ + metaLayout->addWidget( widget, line, 1, 1, 9 ); \ line++; } - + + /* Title, artist and album*/ ADD_META( VLC_META_TITLE, title_text ); /* OK */ ADD_META( VLC_META_ARTIST, artist_text ); /* OK */ - ADD_META( VLC_META_GENRE, genre_text ); /* FIXME List id3genres.h is not - includable yet ? */ - - /* Album Name */ - l->addWidget( new QLabel( qfu( VLC_META_COLLECTION ) + " :" ), line, 0 ); - collection_text = new QLineEdit; - l->addWidget( collection_text, line, 1, 1, 5 ); - l->addWidget( new QLabel( qfu( VLC_META_DATE ) + " :" ), line, 6 ); - /* Date (Should be in years) */ - date_text = new QSpinBox; setSpinBounds( date_text ); - l->addWidget( date_text, line, 7 ); - line++; - - /* Number and Rating */ - l->addWidget( new QLabel( qfu( _("Track number/Position" ) ) + " :" ), - line, 0 ); - seqnum_text = new QSpinBox; setSpinBounds( seqnum_text ); - l->addWidget( seqnum_text, line, 1, 1, 3 ); - - l->addWidget( new QLabel( qfu( VLC_META_RATING ) + " :" ), line, 4 ); - rating_text = new QSpinBox; setSpinBounds( rating_text) ; - l->addWidget( rating_text, line, 5, 1, 3 ); + ADD_META( VLC_META_COLLECTION, collection_text ); /* OK */ + + /* Genre Name */ + /* FIXME List id3genres.h is not includable yet ? */ + genre_text = new QLineEdit; + metaLayout->addWidget( new QLabel( qtr( VLC_META_GENRE ) + " :" ), line, 0 ); + metaLayout->addWidget( genre_text, line, 1, 1, 4 ); + + /* Number - on the same line */ + metaLayout->addWidget( new QLabel( qtr( "Track Number" ) + " :" ), + line, 5, 1, 2 ); + seqnum_text = new QLineEdit; + seqnum_text->setInputMask("0000"); + seqnum_text->setAlignment( Qt::AlignRight ); + metaLayout->addWidget( seqnum_text, line, 7, 1, 3 ); line++; - ADD_META( VLC_META_NOW_PLAYING, nowplaying_text ); - - /* Language and settings */ - l->addWidget( new QLabel( qfu( VLC_META_LANGUAGE ) + " :" ), line, 0 ); + /* Date (Should be in years) */ + date_text = new QLineEdit; + date_text->setInputMask("0000"); + date_text->setAlignment( Qt::AlignRight ); + metaLayout->addWidget( new QLabel( qtr( VLC_META_DATE ) + " :" ), line, 0 ); + metaLayout->addWidget( date_text, line, 1, 1, 3 ); + + /* Rating - on the same line */ + metaLayout->addWidget( new QLabel( qtr( VLC_META_RATING ) + " :" ), line, 4, 1, 2 ); + rating_text = new QSpinBox; setSpinBounds( rating_text ); + metaLayout->addWidget( rating_text, line, 6, 1, 1 ); + + /* Language on the same line */ + metaLayout->addWidget( new QLabel( qfu( VLC_META_LANGUAGE ) + " :" ), line, 7, 1, 2 ); language_text = new QLineEdit; - l->addWidget( language_text, line, 1, 1, 3 ); - l->addWidget( new QLabel( qfu( VLC_META_SETTING ) + " :" ), line, 4 ); - setting_text = new QLineEdit; - l->addWidget( setting_text, line, 5, 1, 3 ); + language_text->setReadOnly( true ); + metaLayout->addWidget( language_text, line, 9, 1, 1 ); line++; - ADD_META( VLC_META_COPYRIGHT, copyright_text ); - ADD_META( VLC_META_PUBLISHER, publisher_text ); - - ADD_META( VLC_META_ENCODED_BY, publisher_text ); - ADD_META( VLC_META_DESCRIPTION, description_text ); // Comment Two lines? + /* ART_URL */ + art_cover = new QLabel( "" ); + art_cover->setMinimumHeight( 128 ); + art_cover->setMinimumWidth( 128 ); + art_cover->setMaximumHeight( 128 ); + art_cover->setMaximumWidth( 128 ); + art_cover->setScaledContents( true ); + art_cover->setPixmap( QPixmap( ":/noart.png" ) ); + metaLayout->addWidget( art_cover, line, 8, 4, 2 ); + +/* Settings is unused */ +/* l->addWidget( new QLabel( qtr( VLC_META_SETTING ) + " :" ), line, 5 ); + setting_text = new QLineEdit; + l->addWidget( setting_text, line, 6, 1, 4 ); */ - /* ADD_META( TRACKID) DO NOT SHOW it */ +/* Less used metadata */ +#define ADD_META_2( string, widget ) { \ + metaLayout->addWidget( new QLabel( qtr( string ) + " :" ), line, 0 ); \ + widget = new QLineEdit; \ + metaLayout->addWidget( widget, line, 1, 1, 7 ); \ + line++; } + + /* Now Playing - Useful for live feeds (HTTP, DVB, ETC...) */ + ADD_META_2( VLC_META_NOW_PLAYING, nowplaying_text ); + nowplaying_text->setReadOnly( true ); + ADD_META_2( VLC_META_PUBLISHER, publisher_text ); + ADD_META_2( VLC_META_COPYRIGHT, copyright_text ); + ADD_META_2( "Comments", description_text ); + +/* useless metadata */ + + //ADD_META_2( VLC_META_ENCODED_BY, encodedby_text ); + /* ADD_META( TRACKID ) Useless ? */ /* ADD_URI - DO not show it, done outside */ - /* ART_URL */ - // ADD_META( VLC_META_URL, setting_text ); +#undef ADD_META +#undef ADD_META_2 + + CONNECT( title_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( artist_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( collection_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( genre_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( seqnum_text, textEdited( QString ), this, enterEditMode() ); + + CONNECT( date_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( description_text, textEdited( QString ), this, enterEditMode() ); +/* CONNECT( rating_text, valueChanged( QString ), this, enterEditMode( QString ) );*/ + + /* We are not yet in Edit Mode */ + b_inEditMode = false; } -MetaPanel::~MetaPanel() -{ -} +MetaPanel::~MetaPanel(){} +/** + * Update all the MetaData and art on an "item-changed" event + **/ void MetaPanel::update( input_item_t *p_item ) { + /* Don't update if you are in edit mode */ + if( b_inEditMode ) return; + char *psz_meta; #define UPDATE_META( meta, widget ) { \ - psz_meta = p_item->p_meta->psz_##meta; \ + psz_meta = input_item_Get##meta( p_item ); \ if( !EMPTY_STR( psz_meta ) ) \ widget->setText( qfu( psz_meta ) ); \ else \ - widget->setText( "" ); } + widget->setText( "" ); } \ + free( psz_meta ); #define UPDATE_META_INT( meta, widget ) { \ - psz_meta = p_item->p_meta->psz_##meta; \ + psz_meta = input_item_Get##meta( p_item ); \ if( !EMPTY_STR( psz_meta ) ) \ - widget->setValue( atoi( psz_meta ) ); } + widget->setValue( atoi( psz_meta ) ); } \ + free( psz_meta ); /* Name / Title */ - psz_meta = p_item->p_meta->psz_title; + psz_meta = input_item_GetTitle( p_item ); + char *psz_name = input_item_GetName( p_item ); if( !EMPTY_STR( psz_meta ) ) title_text->setText( qfu( psz_meta ) ); - else if( !EMPTY_STR( p_item->psz_name ) ) - title_text->setText( qfu( p_item->psz_name ) ); + else if( !EMPTY_STR( psz_name ) ) + title_text->setText( qfu( psz_name ) ); else title_text->setText( "" ); + free( psz_meta ); + free( psz_name ); /* URL / URI */ - psz_meta = p_item->p_meta->psz_url; + psz_meta = input_item_GetURL( p_item ); if( !EMPTY_STR( psz_meta ) ) + { emit uriSet( QString( psz_meta ) ); - else if( !EMPTY_STR( p_item->psz_uri ) ) - emit uriSet( QString( p_item->psz_uri ) ); + free( psz_meta ); + } + else + { + free( psz_meta ); + psz_meta = input_item_GetURI( p_item ); + if( !EMPTY_STR( psz_meta ) ) + emit uriSet( QString( psz_meta ) ); + } /* Other classic though */ - UPDATE_META( artist, artist_text ); - UPDATE_META( genre, genre_text ); - UPDATE_META( copyright, copyright_text ); - UPDATE_META( album, collection_text ); - UPDATE_META( description, description_text ); - UPDATE_META( language, language_text ); - UPDATE_META( nowplaying, nowplaying_text ); - UPDATE_META( publisher, publisher_text ); - UPDATE_META( setting, setting_text ); - - UPDATE_META_INT( date, date_text ); - UPDATE_META_INT( tracknum, seqnum_text ); - UPDATE_META_INT( rating, rating_text ); - + UPDATE_META( Artist, artist_text ); + UPDATE_META( Genre, genre_text ); + UPDATE_META( Copyright, copyright_text ); + UPDATE_META( Album, collection_text ); + UPDATE_META( Description, description_text ); + UPDATE_META( Language, language_text ); + UPDATE_META( NowPlaying, nowplaying_text ); + UPDATE_META( Publisher, publisher_text ); +// UPDATE_META( Setting, setting_text ); +// UPDATE_META( EncodedBy, encodedby_text ); + + UPDATE_META( Date, date_text ); + UPDATE_META( TrackNum, seqnum_text ); + UPDATE_META_INT( Rating, rating_text ); + +#undef UPDATE_META_INT #undef UPDATE_META + + /* Art Urls */ + psz_meta = input_item_GetArtURL( p_item ); + if( psz_meta && !strncmp( psz_meta, "file://", 7 ) ) + { + QString artUrl = qfu( psz_meta ).replace( "file://",QString("" ) ); + art_cover->setPixmap( QPixmap( artUrl ) ); + } + else + art_cover->setPixmap( QPixmap( ":/noart.png" ) ); + free( psz_meta ); +} + +/** + * Save the MetaData, triggered by parent->save Button + **/ +void MetaPanel::saveMeta() +{ + playlist_t *p_playlist; + char psz[5]; + + meta_export_t p_export; + p_export.p_item = p_input; + + if( p_input == NULL ) + return; + + /* we can write meta data only in a file */ + vlc_mutex_lock( &p_input->lock ); + int i_type = p_input->i_type; + vlc_mutex_unlock( &p_input->lock ); + if( i_type == ITEM_TYPE_FILE ) + { + char *psz_uri_orig = input_item_GetURI( p_input ); + char *psz_uri = psz_uri_orig; + if( !strncmp( psz_uri, "file://", 7 ) ) + psz_uri += 7; /* strlen("file://") = 7 */ + + p_export.psz_file = strndup( psz_uri, PATH_MAX ); + free( psz_uri_orig ); + } + else + return; + + /* now we read the modified meta data */ + input_item_SetTitle( p_input, qtu( title_text->text() ) ); + input_item_SetArtist( p_input, qtu( artist_text->text() ) ); + input_item_SetAlbum( p_input, qtu( collection_text->text() ) ); + input_item_SetGenre( p_input, qtu( genre_text->text() ) ); + input_item_SetTrackNum( p_input, qtu( seqnum_text->text() ) ); + input_item_SetDate( p_input, qtu( date_text->text() ) ); + + input_item_SetCopyright( p_input, qtu( copyright_text->text() ) ); + input_item_SetPublisher( p_input, qtu( publisher_text->text() ) ); + input_item_SetDescription( p_input, qtu( description_text->text() ) ); + + p_playlist = pl_Yield( p_intf ); + PL_LOCK; + p_playlist->p_private = &p_export; + + module_t *p_mod = module_Need( p_playlist, "meta writer", NULL, 0 ); + if( p_mod ) + module_Unneed( p_playlist, p_mod ); + PL_UNLOCK; + pl_Release( p_playlist ); + + /* Reset the status of the mode. No need to emit any signal */ + b_inEditMode = false; +} + + +bool MetaPanel::isInEditMode() +{ + return b_inEditMode; +} + +void MetaPanel::enterEditMode() +{ + setEditMode( true ); } -void MetaPanel::clear(){} +void MetaPanel::setEditMode( bool b_editing ) +{ + b_inEditMode = b_editing; + if( b_editing )emit editing(); +} -ExtraMetaPanel::ExtraMetaPanel( QWidget *parent, intf_thread_t *_p_intf ) : - QWidget( parent ), p_intf( _p_intf ) +void MetaPanel::setInput( input_item_t *input ) +{ + if( b_inEditMode ) return; + + p_input = input; +} + +/* + * Clear all the metadata widgets + * Unused yet FIXME + */ +void MetaPanel::clear(){ + setEditMode( false ); +} + +/** + * Second Panel - Shows the extra metadata in a tree, non editable. + **/ +ExtraMetaPanel::ExtraMetaPanel( QWidget *parent, + intf_thread_t *_p_intf ) + : QWidget( parent ), p_intf( _p_intf ) { QGridLayout *layout = new QGridLayout(this); + QLabel *topLabel = new QLabel( qtr( "Extra metadata and other information" " are shown in this list.\n" ) ); topLabel->setWordWrap( true ); @@ -172,44 +339,143 @@ ExtraMetaPanel::ExtraMetaPanel( QWidget *parent, intf_thread_t *_p_intf ) : extraMetaTree = new QTreeWidget( this ); extraMetaTree->setAlternatingRowColors( true ); extraMetaTree->setColumnCount( 2 ); - extraMetaTree->header()->hide(); -/* QStringList *treeHeaders; - treeHeaders << qtr( "Test1" ) << qtr( "Test2" ); */ +/* QStringList headerList = ( QStringList() << qtr( "Type" ) + * << qtr( "Value" ) ); + * Useless, add this header if you think it would help the user ** + */ layout->addWidget( extraMetaTree, 1, 0 ); } +/** + * Update the Extra Metadata from p_meta->i_extras + **/ void ExtraMetaPanel::update( input_item_t *p_item ) { + vlc_mutex_lock( &p_item->lock ); vlc_meta_t *p_meta = p_item->p_meta; + if( !p_meta ) + return; QStringList tempItem; QList items; - for (int i = 0; i < p_meta->i_extra; i++ ) + vlc_dictionary_t * p_dict = &p_meta->extra_tags; + char ** ppsz_allkey = vlc_dictionary_all_keys( p_dict ); + for (int i = 0; ppsz_allkey[i] ; i++ ) { - tempItem.append( qfu( p_meta->ppsz_extra_name[i] ) + " : "); - tempItem.append( qfu( p_meta->ppsz_extra_value[i] ) ); + const char * psz_value = (const char *)vlc_dictionary_value_for_key( + p_dict, ppsz_allkey[i] ); + tempItem.append( qfu( ppsz_allkey[i] ) + " : "); + tempItem.append( qfu( psz_value ) ); items.append( new QTreeWidgetItem ( extraMetaTree, tempItem ) ); + free( ppsz_allkey[i] ); } + vlc_mutex_unlock( &p_item->lock ); + free( ppsz_allkey ); extraMetaTree->addTopLevelItems( items ); } -void ExtraMetaPanel::clear(){} +/** + * Clear the ExtraMetaData Tree + **/ +void ExtraMetaPanel::clear() +{ + extraMetaTree->clear(); +} + +/** + * Third panel - Stream info + * Display all codecs and muxers info that we could gather. + **/ +InfoPanel::InfoPanel( QWidget *parent, + intf_thread_t *_p_intf ) + : QWidget( parent ), p_intf( _p_intf ) +{ + QGridLayout *layout = new QGridLayout(this); + + QList items; + + QLabel *topLabel = new QLabel( qtr( "Information about what your media or" + " stream is made of.\n Muxer, Audio and Video Codecs, Subtitles " + "are shown." ) ); + topLabel->setWordWrap( true ); + layout->addWidget( topLabel, 0, 0 ); + + InfoTree = new QTreeWidget(this); + InfoTree->setColumnCount( 1 ); + InfoTree->header()->hide(); + layout->addWidget(InfoTree, 1, 0 ); +} + +InfoPanel::~InfoPanel() +{ +} + +/** + * Update the Codecs information on parent->update() + **/ +void InfoPanel::update( input_item_t *p_item) +{ + InfoTree->clear(); + QTreeWidgetItem *current_item = NULL; + QTreeWidgetItem *child_item = NULL; + + for( int i = 0; i< p_item->i_categories ; i++) + { + current_item = new QTreeWidgetItem(); + current_item->setText( 0, qfu(p_item->pp_categories[i]->psz_name) ); + InfoTree->addTopLevelItem( current_item ); + + for( int j = 0 ; j < p_item->pp_categories[i]->i_infos ; j++ ) + { + child_item = new QTreeWidgetItem (); + child_item->setText( 0, + qfu(p_item->pp_categories[i]->pp_infos[j]->psz_name) + + ": " + + qfu(p_item->pp_categories[i]->pp_infos[j]->psz_value)); -/* Second Panel - Stats */ + current_item->addChild(child_item); + } + InfoTree->setItemExpanded( current_item, true); + } +} -InputStatsPanel::InputStatsPanel( QWidget *parent, intf_thread_t *_p_intf ) : - QWidget( parent ), p_intf( _p_intf ) +/** + * Clear the tree + **/ +void InfoPanel::clear() +{ + InfoTree->clear(); +} + +/** + * Save all the information to a file + * Not yet implemented. + **/ +/* +void InfoPanel::saveCodecsInfo() +{} +*/ + +/** + * Fourth Panel - Stats + * Displays the Statistics for reading/streaming/encoding/displaying in a tree + */ +InputStatsPanel::InputStatsPanel( QWidget *parent, + intf_thread_t *_p_intf ) + : QWidget( parent ), p_intf( _p_intf ) { QGridLayout *layout = new QGridLayout(this); - StatsTree = new QTreeWidget(this); + QList items; + QLabel *topLabel = new QLabel( qtr( "Various statistics about the current" " media or stream.\n Played and streamed info are shown." ) ); topLabel->setWordWrap( true ); layout->addWidget( topLabel, 0, 0 ); + StatsTree = new QTreeWidget(this); StatsTree->setColumnCount( 3 ); StatsTree->header()->hide(); @@ -228,10 +494,10 @@ InputStatsPanel::InputStatsPanel( QWidget *parent, intf_thread_t *_p_intf ) : catName->addChild( itemName ); } /* Create the main categories */ - CREATE_CATEGORY( input, qtr("Input") ); + CREATE_CATEGORY( audio, qtr("Audio") ); CREATE_CATEGORY( video, qtr("Video") ); + CREATE_CATEGORY( input, qtr("Input") ); CREATE_CATEGORY( streaming, qtr("Streaming") ); - CREATE_CATEGORY( audio, qtr("Audio") ); CREATE_AND_ADD_TO_CAT( read_media_stat, qtr("Read at media"), "0", input , "kB" ); @@ -275,6 +541,9 @@ InputStatsPanel::~InputStatsPanel() { } +/** + * Update the Statistics + **/ void InputStatsPanel::update( input_item_t *p_item ) { vlc_mutex_lock( &p_item->p_stats->lock ); @@ -314,58 +583,3 @@ void InputStatsPanel::update( input_item_t *p_item ) void InputStatsPanel::clear() { } - -/* Third panel - Stream info */ - -InfoPanel::InfoPanel( QWidget *parent, intf_thread_t *_p_intf ) : - QWidget( parent ), p_intf( _p_intf ) -{ - QGridLayout *layout = new QGridLayout(this); - InfoTree = new QTreeWidget(this); - QList items; - - QLabel *topLabel = new QLabel( qtr( "Information about what your media or" - " stream is made of.\n Muxer, Audio and Video Codecs, Subtitles " - "are shown." ) ); - topLabel->setWordWrap( true ); - layout->addWidget( topLabel, 0, 0 ); - - InfoTree->setColumnCount( 1 ); - InfoTree->header()->hide(); - layout->addWidget(InfoTree, 1, 0 ); -} - -InfoPanel::~InfoPanel() -{ -} - -void InfoPanel::update( input_item_t *p_item) -{ - InfoTree->clear(); - QTreeWidgetItem *current_item = NULL; - QTreeWidgetItem *child_item = NULL; - - for( int i = 0; i< p_item->i_categories ; i++) - { - current_item = new QTreeWidgetItem(); - current_item->setText( 0, qfu(p_item->pp_categories[i]->psz_name) ); - InfoTree->addTopLevelItem( current_item ); - - for( int j = 0 ; j < p_item->pp_categories[i]->i_infos ; j++ ) - { - child_item = new QTreeWidgetItem (); - child_item->setText( 0, - qfu(p_item->pp_categories[i]->pp_infos[j]->psz_name) - + ": " - + qfu(p_item->pp_categories[i]->pp_infos[j]->psz_value)); - - current_item->addChild(child_item); - } - InfoTree->setItemExpanded( current_item, true); - } -} - -void InfoPanel::clear() -{ - InfoTree->clear(); -}