1 /*****************************************************************************
2 * infopanels.cpp : Information panels (general info, stats, ...)
3 *****************************************************************************
4 * Copyright (C) 2000-2004 the VideoLAN team
7 * Authors: Clément Stenac <zorglub@videolan.org>
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.
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.
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 *****************************************************************************/
24 #include "dialogs/infopanels.hpp"
25 #include <wx/combobox.h>
26 #include <wx/statline.h>
31 # define wxRB_SINGLE 0
34 /*****************************************************************************
35 * General info (URI, name, metadata)
36 *****************************************************************************/
37 BEGIN_EVENT_TABLE( MetaDataPanel, wxPanel )
40 MetaDataPanel::MetaDataPanel( intf_thread_t *_p_intf,
43 wxPanel( _p_parent, -1 )
45 int flags= wxTE_PROCESS_ENTER;
49 b_modifiable = _b_modifiable;
51 SetAutoLayout( TRUE );
53 wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
55 wxFlexGridSizer *sizer = new wxFlexGridSizer(2,8,20);
56 sizer->AddGrowableCol(1);
59 flags |= wxTE_READONLY;
62 wxStaticText *uri_static =
63 new wxStaticText( this, -1, wxU(_("URI")) );
64 sizer->Add( uri_static, 0 , wxALL , 0 );
66 uri_text = new wxTextCtrl( this, -1,
67 wxU(""), wxDefaultPosition, wxSize( 300, -1 ), flags );
68 sizer->Add( uri_text, 1 , wxALL|wxEXPAND , 0 );
71 wxStaticText *name_static =
72 new wxStaticText( this, -1, wxU(_("Name")) );
73 sizer->Add( name_static, 0 , wxALL , 0 );
75 name_text = new wxTextCtrl( this, -1,
76 wxU(""), wxDefaultPosition, wxSize( 300, -1 ), flags );
77 sizer->Add( name_text, 1 , wxALL|wxEXPAND , 0 );
81 wxFlexGridSizer *meta_sizer = new wxFlexGridSizer(2,11,20);
82 meta_sizer->AddGrowableCol(1);
84 #define ADD_META( string, widget ) { \
85 meta_sizer->Add( new wxStaticText( this, -1, wxU(_(string) ) ),1, \
86 wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 0 ); \
87 widget = new wxStaticText( this, -1, wxU( "" ) ); \
88 meta_sizer->Add( widget, 1, wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 0 ); }
90 ADD_META( VLC_META_ARTIST, artist_text );
91 ADD_META( VLC_META_GENRE, genre_text );
92 ADD_META( VLC_META_COPYRIGHT, copyright_text );
93 ADD_META( VLC_META_COLLECTION, collection_text );
94 ADD_META( VLC_META_SEQ_NUM, seqnum_text );
95 ADD_META( VLC_META_DESCRIPTION, description_text );
96 ADD_META( VLC_META_RATING, rating_text );
97 ADD_META( VLC_META_DATE, date_text );
98 ADD_META( VLC_META_LANGUAGE, language_text );
99 ADD_META( VLC_META_NOW_PLAYING, nowplaying_text );
100 ADD_META( VLC_META_PUBLISHER, publisher_text );
101 ADD_META( VLC_META_SETTING, setting_text );
103 meta_sizer->Layout();
105 panel_sizer->Add( sizer, 0, wxEXPAND | wxALL, 5 );
106 panel_sizer->Add( meta_sizer, 0, wxEXPAND | wxALL, 5 );
107 panel_sizer->Layout();
108 SetSizerAndFit( panel_sizer );
111 MetaDataPanel::~MetaDataPanel()
115 void MetaDataPanel::Update( input_item_t *p_item )
117 /* Rebuild the tree */
120 uri_text->SetValue( wxU( p_item->psz_uri ) );
121 name_text->SetValue( wxU( p_item->psz_name ) );
123 #define UPDATE_META( meta, widget ) { \
124 char *psz_meta = input_item_Get##meta( p_item ); \
125 if( psz_meta != NULL && *psz_meta) \
127 widget->SetLabel( wxU( psz_meta ) ); \
129 else { widget->SetLabel( wxU( "-" ) ); } \
133 UPDATE_META( Artist, artist_text );
134 UPDATE_META( Genre, genre_text );
135 UPDATE_META( Copyright, copyright_text );
136 UPDATE_META( Album, collection_text );
137 UPDATE_META( TrackNum, seqnum_text );
138 UPDATE_META( Description, description_text );
139 UPDATE_META( Rating, rating_text );
140 UPDATE_META( Date, date_text );
141 UPDATE_META( Language, language_text );
142 UPDATE_META( NowPlaying, nowplaying_text );
143 UPDATE_META( Publisher, publisher_text );
144 UPDATE_META( Setting, setting_text );
149 char* MetaDataPanel::GetURI( )
151 return strdup( uri_text->GetLineText(0).mb_str(wxConvUTF8) );
154 char* MetaDataPanel::GetName( )
156 return strdup( name_text->GetLineText(0).mb_str(wxConvUTF8) );
159 void MetaDataPanel::Clear()
163 void MetaDataPanel::OnOk( )
167 void MetaDataPanel::OnCancel( )
172 /*****************************************************************************
174 *****************************************************************************/
175 BEGIN_EVENT_TABLE( AdvancedInfoPanel, wxPanel )
178 AdvancedInfoPanel::AdvancedInfoPanel( intf_thread_t *_p_intf,
179 wxWindow* _p_parent ):
180 wxPanel( _p_parent, -1 )
182 /* Initializations */
184 p_parent = _p_parent;
186 SetAutoLayout( TRUE );
188 wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
190 wxFlexGridSizer *sizer = new wxFlexGridSizer(2,8,20);
191 sizer->AddGrowableCol(1);
194 info_tree = new wxTreeCtrl( this, -1, wxDefaultPosition,
196 wxSUNKEN_BORDER |wxTR_HAS_BUTTONS |
198 info_root = info_tree->AddRoot( wxU( "" ) );
200 panel_sizer->Add( info_tree, 1, wxEXPAND | wxALL, 5 );
201 panel_sizer->Layout();
202 SetSizerAndFit( panel_sizer );
205 AdvancedInfoPanel::~AdvancedInfoPanel()
209 void AdvancedInfoPanel::Update( input_item_t *p_item )
211 /* Rebuild the tree */
214 for( int i = 0; i< p_item->i_categories ; i++)
216 wxTreeItemId cat = info_tree->AppendItem( info_root,
217 wxU( p_item->pp_categories[i]->psz_name) );
219 for( int j = 0 ; j < p_item->pp_categories[i]->i_infos ; j++ )
221 info_tree->AppendItem( cat , (wxString)
222 wxU(p_item->pp_categories[i]->pp_infos[j]->psz_name) +
224 wxU(p_item->pp_categories[i]->pp_infos[j]->psz_value) );
227 info_tree->Expand( cat );
231 void AdvancedInfoPanel::Clear()
233 info_tree->DeleteChildren( info_root );
236 void AdvancedInfoPanel::OnOk( )
240 void AdvancedInfoPanel::OnCancel( )
244 /*****************************************************************************
245 * Statistics info panel
246 *****************************************************************************/
247 BEGIN_EVENT_TABLE( InputStatsInfoPanel, wxPanel )
250 InputStatsInfoPanel::InputStatsInfoPanel( intf_thread_t *_p_intf,
251 wxWindow* _p_parent ):
252 wxPanel( _p_parent, -1 )
254 /* Initializations */
256 p_parent = _p_parent;
258 SetAutoLayout( TRUE );
260 panel_sizer = new wxBoxSizer( wxVERTICAL );
262 sizer = new wxFlexGridSizer( 2,2,20 );
265 wxStaticBox *input_box = new wxStaticBox( this, -1,
267 input_box->SetAutoLayout( TRUE );
268 input_bsizer = new wxStaticBoxSizer( input_box, wxVERTICAL );
269 input_sizer = new wxFlexGridSizer( 4, 3, 2, 20 );
271 #define INPUT_ADD(txt,widget,dflt) \
272 { input_sizer->Add ( new wxStaticText( this, -1, wxU(_( txt ) ) ), \
273 0, wxALIGN_LEFT|wxLEFT, 5 ); \
274 input_sizer->Add( 0, 0, wxEXPAND ); \
275 widget = new wxStaticText( this, -1, wxU( dflt ), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); \
276 input_sizer->Add( widget, 0, wxALIGN_RIGHT|wxRIGHT, 5 ); \
279 INPUT_ADD( "Read at media", read_bytes_text, "0" );
280 INPUT_ADD( "Input bitrate", input_bitrate_text, " 0" );
282 INPUT_ADD( "Demuxed", demux_bytes_text ,"0");
283 INPUT_ADD( "Stream bitrate", demux_bitrate_text, "0" );
285 input_sizer->Layout();
286 input_bsizer->Add( input_sizer, 0, wxALL | wxGROW, 5 );
287 input_bsizer->Layout();
288 sizer->Add( input_bsizer, 0, wxALL|wxGROW, 5 );
291 wxStaticBox *video_box = new wxStaticBox( this, -1, wxU( _("Video" ) ) );
292 video_box->SetAutoLayout( TRUE );
293 video_bsizer = new wxStaticBoxSizer( video_box, wxVERTICAL );
294 video_sizer = new wxFlexGridSizer( 3, 3, 2, 20 );
296 #define VIDEO_ADD(txt,widget,dflt) \
297 { video_sizer->Add ( new wxStaticText( this, -1, wxU(_( txt ) ) ), \
298 0, wxALIGN_LEFT|wxLEFT , 5 ); \
299 video_sizer->Add( 0, 0, wxEXPAND ); \
300 widget = new wxStaticText( this, -1, wxU( dflt ), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); \
301 video_sizer->Add( widget, 0, wxALIGN_RIGHT|wxRIGHT, 5 ); \
303 VIDEO_ADD( "Decoded blocks", video_decoded_text, "0" );
304 VIDEO_ADD( "Displayed frames", displayed_text, " 0" );
305 VIDEO_ADD( "Lost frames", lost_frames_text, "0" );
308 video_sizer->Layout();
309 video_bsizer->Add( video_sizer, 0, wxALL | wxGROW, 5 );
310 video_bsizer->Layout();
311 sizer->Add( video_bsizer , 0, wxALL| wxGROW, 5 );
314 wxStaticBox *sout_box = new wxStaticBox( this, -1,
315 wxU( _("Streaming" ) ) );
316 sout_box->SetAutoLayout( TRUE );
317 sout_bsizer = new wxStaticBoxSizer( sout_box, wxVERTICAL );
318 sout_sizer = new wxFlexGridSizer( 3, 3, 2, 20 );
320 #define SOUT_ADD(txt,widget,dflt) \
321 { sout_sizer->Add ( new wxStaticText( this, -1, wxU(_( txt ) ) ), \
322 0, wxALIGN_LEFT|wxLEFT, 5 ); \
323 sout_sizer->Add( 0, 0, wxEXPAND ); \
324 widget = new wxStaticText( this, -1, wxU( dflt ), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); \
325 sout_sizer->Add( widget, 0,wxALIGN_RIGHT|wxRIGHT, 5 ); \
327 SOUT_ADD( "Sent packets", sout_sent_packets_text, " 0" );
328 SOUT_ADD( "Sent bytes", sout_sent_bytes_text, "0" );
329 SOUT_ADD( "Send rate", sout_send_bitrate_text, "0" );
330 sout_sizer->Layout();
331 sout_bsizer->Add( sout_sizer, 0, wxALL | wxGROW, 5 );
332 sout_bsizer->Layout();
333 sizer->Add( sout_bsizer , 0, wxALL| wxGROW, 5 );
336 wxStaticBox *audio_box = new wxStaticBox( this, -1,
337 wxU( _("Audio" ) ) );
338 audio_box->SetAutoLayout( TRUE );
339 audio_bsizer = new wxStaticBoxSizer( audio_box, wxVERTICAL );
340 audio_sizer = new wxFlexGridSizer( 3, 3, 2, 20 );
342 #define AUDIO_ADD(txt,widget,dflt) \
343 { audio_sizer->Add ( new wxStaticText( this, -1, wxU(_( txt ) ) ), \
344 0, wxALIGN_LEFT|wxLEFT, 5 ); \
345 audio_sizer->Add( 0, 0, wxEXPAND ); \
346 widget = new wxStaticText( this, -1, wxU( dflt ), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); \
347 audio_sizer->Add( widget, 0, wxALIGN_RIGHT|wxRIGHT, 5 ); \
349 AUDIO_ADD( "Decoded blocks", audio_decoded_text, " 0" );
350 AUDIO_ADD( "Played buffers", played_abuffers_text, "0" );
351 AUDIO_ADD( "Lost buffers", lost_abuffers_text, "0" );
352 audio_sizer->Layout();
353 audio_bsizer->Add( audio_sizer, 0, wxALL | wxGROW, 5 );
354 audio_bsizer->Layout();
355 sizer->Add( audio_bsizer , 0, wxALL| wxGROW, 5 );
358 panel_sizer->Add( sizer, 0, wxEXPAND, 5 );
359 panel_sizer->Layout();
360 SetSizerAndFit( panel_sizer );
363 InputStatsInfoPanel::~InputStatsInfoPanel()
367 void InputStatsInfoPanel::Update( input_item_t *p_item )
369 vlc_mutex_lock( &p_item->p_stats->lock );
372 #define UPDATE( widget,format, calc... ) \
374 wxString formatted; \
375 formatted.Printf( wxString( wxT(format) ), ## calc ); \
376 widget->SetLabel( formatted ); \
378 UPDATE( read_bytes_text, "%8.0f kB",(float)(p_item->p_stats->i_read_bytes)/1000 );
379 UPDATE( input_bitrate_text, "%6.0f kb/s", (float)(p_item->p_stats->f_input_bitrate)*8000 );
380 UPDATE( demux_bytes_text, "%8.0f kB", (float)(p_item->p_stats->i_demux_read_bytes)/1000 );
381 UPDATE( demux_bitrate_text, "%6.0f kb/s", (float)(p_item->p_stats->f_demux_bitrate)*8000 );
384 UPDATE( video_decoded_text, "%5i", p_item->p_stats->i_decoded_video );
385 UPDATE( displayed_text, "%5i", p_item->p_stats->i_displayed_pictures );
386 UPDATE( lost_frames_text, "%5i", p_item->p_stats->i_lost_pictures );
389 UPDATE( sout_sent_packets_text, "%5i", p_item->p_stats->i_sent_packets );
390 UPDATE( sout_sent_bytes_text, "%8.0f kB",
391 (float)(p_item->p_stats->i_sent_bytes)/1000 );
392 UPDATE( sout_send_bitrate_text, "%6.0f kb/s",
393 (float)(p_item->p_stats->f_send_bitrate*8)*1000 );
396 UPDATE( audio_decoded_text, "%5i", p_item->p_stats->i_decoded_audio );
397 UPDATE( played_abuffers_text, "%5i", p_item->p_stats->i_played_abuffers );
398 UPDATE( lost_abuffers_text, "%5i", p_item->p_stats->i_lost_abuffers );
400 vlc_mutex_unlock( &p_item->p_stats->lock );
402 input_sizer->Layout();
403 video_sizer->Layout();
404 sout_sizer->Layout();
405 audio_sizer->Layout();
408 panel_sizer->Layout();
409 SetSizerAndFit( panel_sizer );
412 void InputStatsInfoPanel::Clear()
415 void InputStatsInfoPanel::OnOk( )
418 void InputStatsInfoPanel::OnCancel( )