]> git.sesse.net Git - vlc/blob - modules/gui/wxwidgets/dialogs/infopanels.cpp
20d6f6c94e27c4f504c6a9026ab724f55c542bac
[vlc] / modules / gui / wxwidgets / dialogs / infopanels.cpp
1 /*****************************************************************************
2  * infopanels.cpp : Information panels (general info, stats, ...)
3  *****************************************************************************
4  * Copyright (C) 2000-2004 the VideoLAN team
5  * $Id$
6  *
7  * Authors: ClĂ©ment Stenac <zorglub@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
24 #include "dialogs/infopanels.hpp"
25 #include <wx/combobox.h>
26 #include <wx/statline.h>
27
28 #include <vlc_meta.h>
29
30 #ifndef wxRB_SINGLE
31 #   define wxRB_SINGLE 0
32 #endif
33
34 /*****************************************************************************
35  * General info (URI, name, metadata)
36  *****************************************************************************/
37 BEGIN_EVENT_TABLE( MetaDataPanel, wxPanel )
38 END_EVENT_TABLE()
39
40 MetaDataPanel::MetaDataPanel( intf_thread_t *_p_intf,
41                               wxWindow* _p_parent,
42                               bool _b_modifiable ):
43     wxPanel( _p_parent, -1 )
44 {
45     int flags= wxTE_PROCESS_ENTER;
46     /* Initializations */
47     p_intf = _p_intf;
48     p_parent = _p_parent;
49     b_modifiable = _b_modifiable;
50
51     SetAutoLayout( TRUE );
52
53     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
54
55     wxFlexGridSizer *sizer = new wxFlexGridSizer(2,8,20);
56     sizer->AddGrowableCol(1);
57
58     if( !b_modifiable )
59         flags |= wxTE_READONLY;
60
61     /* URI Textbox */
62     wxStaticText *uri_static =
63            new wxStaticText( this, -1, wxU(_("URI")) );
64     sizer->Add( uri_static, 0 , wxALL , 0 );
65
66     uri_text = new wxTextCtrl( this, -1,
67             wxU(""), wxDefaultPosition, wxSize( 300, -1 ), flags );
68     sizer->Add( uri_text, 1 ,  wxALL|wxEXPAND , 0 );
69
70     /* Name Textbox */
71     wxStaticText *name_static =
72            new wxStaticText(  this, -1, wxU(_("Name")) );
73     sizer->Add( name_static, 0 , wxALL , 0  );
74
75     name_text = new wxTextCtrl( this, -1,
76             wxU(""), wxDefaultPosition, wxSize( 300, -1 ), flags );
77     sizer->Add( name_text, 1 , wxALL|wxEXPAND , 0 );
78     sizer->Layout();
79
80     /* Metadata */
81     wxFlexGridSizer *meta_sizer = new wxFlexGridSizer(2,11,20);
82     meta_sizer->AddGrowableCol(1);
83
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 ); }
89
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 );
102
103     meta_sizer->Layout();
104
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 );
109 }
110
111 MetaDataPanel::~MetaDataPanel()
112 {
113 }
114
115 void MetaDataPanel::Update( input_item_t *p_item )
116 {
117     /* Rebuild the tree */
118     Clear();
119
120     uri_text->SetValue( wxU( p_item->psz_uri ) );
121     name_text->SetValue( wxU( p_item->psz_name ) );
122
123 #define UPDATE_META( meta, widget ) {                                       \
124     const char *psz_meta = input_item_Get##meta( p_item );                  \
125     if( psz_meta != NULL && *psz_meta)                                      \
126     {                                                                       \
127         widget->SetLabel( wxU( psz_meta ) );                                \
128     }                                                                       \
129     else { widget->SetLabel( wxU( "-" ) ); }                                \
130     }
131
132     UPDATE_META( Artist, artist_text );
133     UPDATE_META( Genre, genre_text );
134     UPDATE_META( Copyright, copyright_text );
135     UPDATE_META( Album, collection_text );
136     UPDATE_META( TrackNum, seqnum_text );
137     UPDATE_META( Description, description_text );
138     UPDATE_META( Rating, rating_text );
139     UPDATE_META( Date, date_text );
140     UPDATE_META( Language, language_text );
141     UPDATE_META( NowPlaying, nowplaying_text );
142     UPDATE_META( Publisher, publisher_text );
143     UPDATE_META( Setting, setting_text );
144
145 #undef UPDATE_META
146 }
147
148 char* MetaDataPanel::GetURI( )
149 {
150     return  strdup( uri_text->GetLineText(0).mb_str(wxConvUTF8) );
151 }
152
153 char* MetaDataPanel::GetName( )
154 {
155     return  strdup( name_text->GetLineText(0).mb_str(wxConvUTF8) );
156 }
157
158 void MetaDataPanel::Clear()
159 {
160 }
161
162 void MetaDataPanel::OnOk( )
163 {
164 }
165
166 void MetaDataPanel::OnCancel( )
167 {
168 }
169
170
171 /*****************************************************************************
172  * General info panel
173  *****************************************************************************/
174 BEGIN_EVENT_TABLE( AdvancedInfoPanel, wxPanel )
175 END_EVENT_TABLE()
176
177 AdvancedInfoPanel::AdvancedInfoPanel( intf_thread_t *_p_intf,
178                                       wxWindow* _p_parent ):
179     wxPanel( _p_parent, -1 )
180 {
181     /* Initializations */
182     p_intf = _p_intf;
183     p_parent = _p_parent;
184
185     SetAutoLayout( TRUE );
186
187     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
188
189     wxFlexGridSizer *sizer = new wxFlexGridSizer(2,8,20);
190     sizer->AddGrowableCol(1);
191
192     /* Treeview */
193     info_tree = new wxTreeCtrl( this, -1, wxDefaultPosition,
194                                 wxSize(220,200),
195                                 wxSUNKEN_BORDER |wxTR_HAS_BUTTONS |
196                                 wxTR_HIDE_ROOT );
197     info_root = info_tree->AddRoot( wxU( "" ) );
198
199     panel_sizer->Add( info_tree, 1, wxEXPAND | wxALL, 5 );
200     panel_sizer->Layout();
201     SetSizerAndFit( panel_sizer );
202 }
203
204 AdvancedInfoPanel::~AdvancedInfoPanel()
205 {
206 }
207
208 void AdvancedInfoPanel::Update( input_item_t *p_item )
209 {
210     /* Rebuild the tree */
211     Clear();
212
213     for( int i = 0; i< p_item->i_categories ; i++)
214     {
215         wxTreeItemId cat = info_tree->AppendItem( info_root,
216                             wxU( p_item->pp_categories[i]->psz_name) );
217
218         for( int j = 0 ; j < p_item->pp_categories[i]->i_infos ; j++ )
219         {
220            info_tree->AppendItem( cat , (wxString)
221                wxU(p_item->pp_categories[i]->pp_infos[j]->psz_name) +
222                wxT(": ") +
223                wxU(p_item->pp_categories[i]->pp_infos[j]->psz_value) );
224         }
225
226         info_tree->Expand( cat );
227     }
228 }
229
230 void AdvancedInfoPanel::Clear()
231 {
232     info_tree->DeleteChildren( info_root );
233 }
234
235 void AdvancedInfoPanel::OnOk( )
236 {
237 }
238
239 void AdvancedInfoPanel::OnCancel( )
240 {
241 }
242
243 /*****************************************************************************
244  * Statistics info panel
245  *****************************************************************************/
246 BEGIN_EVENT_TABLE( InputStatsInfoPanel, wxPanel )
247 END_EVENT_TABLE()
248
249 InputStatsInfoPanel::InputStatsInfoPanel( intf_thread_t *_p_intf,
250                                           wxWindow* _p_parent ):
251     wxPanel( _p_parent, -1 )
252 {
253     /* Initializations */
254     p_intf = _p_intf;
255     p_parent = _p_parent;
256
257     SetAutoLayout( TRUE );
258
259     panel_sizer = new wxBoxSizer( wxVERTICAL );
260
261     sizer = new wxFlexGridSizer( 2,2,20 );
262
263     /* Input */
264     wxStaticBox *input_box = new wxStaticBox( this, -1,
265                                               wxU( _("Input") ) );
266     input_box->SetAutoLayout( TRUE );
267     input_bsizer = new wxStaticBoxSizer( input_box, wxVERTICAL );
268     input_sizer = new wxFlexGridSizer( 4, 3, 2, 20 );
269
270 #define INPUT_ADD(txt,widget,dflt) \
271     { input_sizer->Add ( new wxStaticText( this, -1, wxU(_( txt ) ) ),   \
272                          0, wxALIGN_LEFT|wxLEFT, 5 );           \
273       input_sizer->Add( 0, 0, wxEXPAND );                                \
274       widget = new wxStaticText( this, -1, wxU( dflt ), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT );                \
275       input_sizer->Add( widget, 0, wxALIGN_RIGHT|wxRIGHT, 5  ); \
276     }
277
278     INPUT_ADD( "Read at media", read_bytes_text, "0" );
279     INPUT_ADD( "Input bitrate", input_bitrate_text, "           0" );
280
281     INPUT_ADD( "Demuxed", demux_bytes_text ,"0");
282     INPUT_ADD( "Stream bitrate", demux_bitrate_text, "0" );
283
284     input_sizer->Layout();
285     input_bsizer->Add( input_sizer, 0, wxALL | wxGROW, 5 );
286     input_bsizer->Layout();
287     sizer->Add( input_bsizer, 0, wxALL|wxGROW, 5 );
288
289    /* Vout */
290     wxStaticBox *video_box = new wxStaticBox( this, -1, wxU( _("Video" ) ) );
291     video_box->SetAutoLayout( TRUE );
292     video_bsizer = new wxStaticBoxSizer( video_box, wxVERTICAL );
293     video_sizer = new wxFlexGridSizer( 3, 3, 2, 20 );
294
295 #define VIDEO_ADD(txt,widget,dflt) \
296     { video_sizer->Add ( new wxStaticText( this, -1, wxU(_( txt ) ) ),  \
297                          0, wxALIGN_LEFT|wxLEFT , 5  );        \
298       video_sizer->Add( 0, 0, wxEXPAND );                                \
299       widget = new wxStaticText( this, -1, wxU( dflt ), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT );               \
300       video_sizer->Add( widget, 0, wxALIGN_RIGHT|wxRIGHT, 5 ); \
301     }
302     VIDEO_ADD( "Decoded blocks", video_decoded_text, "0" );
303     VIDEO_ADD( "Displayed frames", displayed_text, "           0" );
304     VIDEO_ADD( "Lost frames", lost_frames_text, "0" );
305
306
307     video_sizer->Layout();
308     video_bsizer->Add( video_sizer, 0, wxALL | wxGROW, 5 );
309     video_bsizer->Layout();
310     sizer->Add( video_bsizer , 0, wxALL| wxGROW, 5 );
311
312     /* Sout */
313     wxStaticBox *sout_box = new wxStaticBox( this, -1,
314                                               wxU( _("Streaming" ) ) );
315     sout_box->SetAutoLayout( TRUE );
316     sout_bsizer = new wxStaticBoxSizer( sout_box, wxVERTICAL );
317     sout_sizer = new wxFlexGridSizer( 3, 3, 2, 20 );
318
319 #define SOUT_ADD(txt,widget,dflt) \
320     { sout_sizer->Add ( new wxStaticText( this, -1, wxU(_( txt ) ) ),  \
321                          0, wxALIGN_LEFT|wxLEFT, 5  );        \
322       sout_sizer->Add( 0, 0, wxEXPAND );                                \
323       widget = new wxStaticText( this, -1, wxU( dflt ), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT );              \
324       sout_sizer->Add( widget, 0,wxALIGN_RIGHT|wxRIGHT, 5 ); \
325     }
326     SOUT_ADD( "Sent packets", sout_sent_packets_text, "          0" );
327     SOUT_ADD( "Sent bytes", sout_sent_bytes_text, "0" );
328     SOUT_ADD( "Send rate", sout_send_bitrate_text, "0" );
329     sout_sizer->Layout();
330     sout_bsizer->Add( sout_sizer, 0, wxALL | wxGROW, 5 );
331     sout_bsizer->Layout();
332     sizer->Add( sout_bsizer , 0, wxALL| wxGROW, 5 );
333
334    /* Aout */
335     wxStaticBox *audio_box = new wxStaticBox( this, -1,
336                                               wxU( _("Audio" ) ) );
337     audio_box->SetAutoLayout( TRUE );
338     audio_bsizer = new wxStaticBoxSizer( audio_box, wxVERTICAL );
339     audio_sizer = new wxFlexGridSizer( 3, 3, 2, 20 );
340
341 #define AUDIO_ADD(txt,widget,dflt) \
342     { audio_sizer->Add ( new wxStaticText( this, -1, wxU(_( txt ) ) ),   \
343                          0, wxALIGN_LEFT|wxLEFT, 5  );          \
344       audio_sizer->Add( 0, 0, wxEXPAND );                                \
345       widget = new wxStaticText( this, -1, wxU( dflt ), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT );                \
346       audio_sizer->Add( widget, 0, wxALIGN_RIGHT|wxRIGHT, 5 );  \
347     }
348     AUDIO_ADD( "Decoded blocks", audio_decoded_text, "         0" );
349     AUDIO_ADD( "Played buffers", played_abuffers_text, "0" );
350     AUDIO_ADD( "Lost buffers", lost_abuffers_text, "0" );
351     audio_sizer->Layout();
352     audio_bsizer->Add( audio_sizer, 0, wxALL | wxGROW, 5 );
353     audio_bsizer->Layout();
354     sizer->Add( audio_bsizer , 0, wxALL| wxGROW, 5 );
355
356     sizer->Layout();
357     panel_sizer->Add( sizer, 0, wxEXPAND, 5 );
358     panel_sizer->Layout();
359     SetSizerAndFit( panel_sizer );
360 }
361
362 InputStatsInfoPanel::~InputStatsInfoPanel()
363 {
364 }
365
366 void InputStatsInfoPanel::Update( input_item_t *p_item )
367 {
368     vlc_mutex_lock( &p_item->p_stats->lock );
369
370     /* Input */
371 #define UPDATE( widget,format, calc... )   \
372 {                                       \
373     wxString formatted;                 \
374     formatted.Printf(  wxString( wxT(format) ), ## calc ); \
375     widget->SetLabel( formatted );                      \
376 }
377     UPDATE( read_bytes_text, "%8.0f kB",(float)(p_item->p_stats->i_read_bytes)/1000 );
378     UPDATE( input_bitrate_text, "%6.0f kb/s", (float)(p_item->p_stats->f_input_bitrate)*8000 );
379     UPDATE( demux_bytes_text, "%8.0f kB", (float)(p_item->p_stats->i_demux_read_bytes)/1000 );
380     UPDATE( demux_bitrate_text, "%6.0f kb/s",  (float)(p_item->p_stats->f_demux_bitrate)*8000 );
381
382     /* Video */
383     UPDATE( video_decoded_text, "%5i", p_item->p_stats->i_decoded_video );
384     UPDATE( displayed_text, "%5i", p_item->p_stats->i_displayed_pictures );
385     UPDATE( lost_frames_text, "%5i", p_item->p_stats->i_lost_pictures );
386
387     /* Sout */
388     UPDATE( sout_sent_packets_text, "%5i", p_item->p_stats->i_sent_packets );
389     UPDATE( sout_sent_bytes_text, "%8.0f kB",
390             (float)(p_item->p_stats->i_sent_bytes)/1000 );
391     UPDATE( sout_send_bitrate_text, "%6.0f kb/s",
392             (float)(p_item->p_stats->f_send_bitrate*8)*1000 );
393
394     /* Audio*/
395     UPDATE( audio_decoded_text, "%5i", p_item->p_stats->i_decoded_audio );
396     UPDATE( played_abuffers_text, "%5i", p_item->p_stats->i_played_abuffers );
397     UPDATE( lost_abuffers_text, "%5i", p_item->p_stats->i_lost_abuffers );
398
399     vlc_mutex_unlock( &p_item->p_stats->lock );
400
401     input_sizer->Layout();
402     video_sizer->Layout();
403     sout_sizer->Layout();
404     audio_sizer->Layout();
405
406     sizer->Layout();
407     panel_sizer->Layout();
408     SetSizerAndFit( panel_sizer );
409 }
410
411 void InputStatsInfoPanel::Clear()
412 {}
413
414 void InputStatsInfoPanel::OnOk( )
415 {}
416
417 void InputStatsInfoPanel::OnCancel( )
418 {}
419