]> git.sesse.net Git - vlc/blob - modules/gui/wxwidgets/dialogs/vlm/vlm_panel.cpp
FSF address change.
[vlc] / modules / gui / wxwidgets / dialogs / vlm / vlm_panel.cpp
1 /*****************************************************************************
2  * vlm_panel.cpp: VLM Panel
3  *****************************************************************************
4  * Copyright (C) 2000-2005 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/vlm/vlm_panel.hpp"
25 #include "dialogs/vlm/vlm_wrapper.hpp"
26 #include "dialogs/vlm/vlm_stream.hpp"
27 #include "dialogs/vlm/vlm_streampanel.hpp"
28 #include <wx/statline.h>
29
30 enum
31 {
32     Notebook_Event,
33     Timer_Event,
34     Close_Event,
35     Load_Event,
36     Save_Event,
37 };
38
39 BEGIN_EVENT_TABLE( VLMPanel, wxPanel)
40    EVT_TIMER( Timer_Event, VLMPanel::OnTimer )
41    EVT_BUTTON( Close_Event, VLMPanel::OnClose )
42    EVT_BUTTON( Load_Event, VLMPanel::OnLoad )
43    EVT_BUTTON( Save_Event, VLMPanel::OnSave )
44 END_EVENT_TABLE()
45
46
47 VLMPanel::VLMPanel( intf_thread_t *_p_intf, wxWindow *_p_parent ) :
48         wxPanel( _p_parent, -1, wxDefaultPosition, wxDefaultSize ),
49        timer( this, Timer_Event )
50 {
51     p_intf = _p_intf;
52     p_parent = _p_parent;
53
54     p_vlm = new VLMWrapper( p_intf );
55     p_vlm->AttachVLM();
56
57     SetAutoLayout( TRUE );
58
59     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
60
61     p_notebook = new wxNotebook( this, Notebook_Event );
62 #if (!wxCHECK_VERSION(2,5,0))
63     wxNotebookSizer *notebook_sizer = new wxNotebookSizer( p_notebook );
64 #endif
65     p_notebook->AddPage( BroadcastPanel( p_notebook ), wxU( _("Broadcasts") ) );
66     p_notebook->AddPage( VODPanel( p_notebook ), wxU( _("VOD") ) );
67 #if (!wxCHECK_VERSION(2,5,0))
68     panel_sizer->Add( notebook_sizer, 1, wxEXPAND | wxALL, 5 );
69 #else
70     panel_sizer->Add( p_notebook, 1 , wxEXPAND | wxALL, 5 );
71 #endif
72
73     wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
74     button_sizer->Add( new wxButton( this, Close_Event, wxU(_("Close") ) ) );
75     button_sizer->Add( 0, 0, 1 );
76     button_sizer->Add( new wxButton( this, Load_Event, wxU(_("Load") ) ), 0, wxRIGHT, 10 );
77     button_sizer->Add( new wxButton( this, Save_Event, wxU(_("Save") ) ) );
78     panel_sizer->Add( button_sizer, 0 , wxEXPAND | wxALL, 5 );
79
80     panel_sizer->Layout();
81     SetSizerAndFit( panel_sizer );
82
83     Update();
84
85     timer.Start( 300 );
86 }
87
88 VLMPanel::~VLMPanel()
89 {
90     delete p_vlm;
91 }
92
93 void VLMPanel::OnTimer( wxTimerEvent& event )
94 {
95     Update();
96 }
97
98 void VLMPanel::Update()
99 {
100     unsigned int i;
101     for( i = 0 ; i < broadcasts.size(); i++ )
102     {
103         ((VLMBroadcastStreamPanel *)broadcasts[i])->b_found = VLC_FALSE;
104     }
105     for( i = 0 ; i < vods.size(); i++ )
106     {
107         ((VLMVODStreamPanel *)vods[i])->b_found = VLC_FALSE;
108     }
109
110     p_vlm->LockVLM();
111     /* Iterate over the media, to find the panels to add / remove */
112     /* FIXME: This code should be better wrapped */
113     for( i = 0; i < p_vlm->NbMedia(); i++ )
114     {
115         vlm_media_t *p_media = p_vlm->GetMedia( i );
116
117         if( p_media->i_type == BROADCAST_TYPE )
118         {
119             vlc_bool_t b_foundthis = VLC_FALSE;
120             for( unsigned int j = 0 ; j < broadcasts.size(); j++ )
121             {
122                 VLMBroadcastStreamPanel *p_streamp =
123                        (VLMBroadcastStreamPanel *)(broadcasts[j]);
124                 /* FIXME: dangerous .. */
125                 if( p_streamp->GetStream()->p_media ==  p_media )
126                 {
127                     p_streamp->b_found = VLC_TRUE;
128                     b_foundthis = VLC_TRUE;
129                     break;
130                 }
131             }
132             /* Create the stream */
133             if( !b_foundthis )
134             {
135                 VLMBroadcastStream *p_broadcast =
136                         new VLMBroadcastStream( p_intf, p_media, p_vlm );
137                 AppendBroadcast( p_broadcast );
138             }
139         }
140         else if( p_media->i_type == VOD_TYPE )
141         {
142             vlc_bool_t b_foundthis = VLC_FALSE;
143             for( unsigned int j = 0 ; i < vods.size(); i++ )
144             {
145                 VLMVODStreamPanel *p_streamp = (VLMVODStreamPanel *)( vods[j] );
146                 if(  p_streamp->GetStream()->p_media ==  p_media )
147                 {
148                     p_streamp->b_found = VLC_TRUE;
149                     b_foundthis = VLC_TRUE;
150                     break;
151                 }
152             }
153             /* Create it */
154             if( !b_foundthis )
155             {
156                 VLMVODStream *p_vod = new VLMVODStream(p_intf, p_media, p_vlm );
157                 AppendVOD( p_vod );
158             }
159         }
160     }
161
162     /* Those not marked as found must be removed */
163     vector<VLMBroadcastStreamPanel *>::iterator it = broadcasts.begin();
164     while( it < broadcasts.end() )
165     {
166         if( (*it)->b_found == VLC_FALSE )
167         {
168             vector<VLMBroadcastStreamPanel *>::iterator rem = it;
169             it++;
170             VLMBroadcastStreamPanel *p_remove = *rem;
171             broadcasts.erase( rem );
172             RemoveBroadcast( p_remove );
173             delete p_remove;
174         }
175         else
176             it++;
177     }
178     vector<VLMVODStreamPanel *>::iterator it2 = vods.begin();
179     while( it2 < vods.end() )
180     {
181         if( (*it2)->b_found == VLC_FALSE )
182         {
183             vector<VLMVODStreamPanel *>::iterator rem = it2;
184             it2++;
185             VLMVODStreamPanel *p_remove = *rem;
186             vods.erase( rem );
187             RemoveVOD( p_remove );
188             delete p_remove;
189         }
190         else
191             it2++;
192     }
193
194     /* Update sliders*/
195     for( unsigned int j = 0 ; j < broadcasts.size(); j++ )
196     {
197         VLMBroadcastStreamPanel *p_streamp =
198                 (VLMBroadcastStreamPanel *)( broadcasts[j] );
199         p_streamp->Update();
200     }
201     p_vlm->UnlockVLM();
202 }
203
204 void VLMPanel::OnClose( wxCommandEvent &event )
205 {
206     ((VLMFrame*)p_parent)->OnClose( *( new wxCloseEvent() ) );
207 }
208
209 void VLMPanel::OnLoad( wxCommandEvent &event )
210 {
211     p_file_dialog = new wxFileDialog( NULL, wxT(""), wxT(""), wxT(""),
212                                       wxT("*"), wxOPEN | wxMULTIPLE );
213     if( p_file_dialog == NULL ) return;
214
215     p_file_dialog->SetTitle( wxU(_("Load configuration") ) );
216     if( p_file_dialog->ShowModal() == wxID_OK )
217     {
218         vlm_Load( p_vlm->GetVLM(), p_file_dialog->GetPath().mb_str() );
219     }
220     Update();
221 }
222
223 void VLMPanel::OnSave( wxCommandEvent &event )
224 {
225     p_file_dialog = new wxFileDialog( NULL, wxT(""), wxT(""), wxT(""),
226                                       wxT("*"), wxSAVE | wxOVERWRITE_PROMPT );
227     if( p_file_dialog == NULL ) return;
228
229     p_file_dialog->SetTitle( wxU(_("Save configuration") ) );
230     if( p_file_dialog->ShowModal() == wxID_OK )
231     {
232         vlm_Save( p_vlm->GetVLM(), p_file_dialog->GetPath().mb_str() );
233     }
234 }
235
236 /*************************
237  * Broadcasts management
238  *************************/
239 wxPanel * VLMPanel::BroadcastPanel( wxWindow *parent )
240 {
241      broadcasts_panel = new wxPanel( parent, -1, wxDefaultPosition, wxSize( 500, 350 ) );
242      broadcasts_sizer = new wxBoxSizer( wxVERTICAL );
243
244      wxStaticBox *add_box = new wxStaticBox( broadcasts_panel, -1,
245                                             wxU( _( "New broadcast") ) );
246      wxStaticBoxSizer *box_sizer = new wxStaticBoxSizer( add_box, wxHORIZONTAL );
247      box_sizer->Add( AddBroadcastPanel( broadcasts_panel), 0, wxEXPAND|wxALL, 5 );
248      box_sizer->Layout();
249
250      broadcasts_sizer->Add( box_sizer, 0, wxEXPAND|wxALL, 5 );
251
252      wxStaticLine *static_line = new wxStaticLine( broadcasts_panel, wxID_ANY );
253      broadcasts_sizer->Add( static_line, 0, wxEXPAND | wxALL, 5 );
254
255      scrolled_broadcasts = new wxScrolledWindow( broadcasts_panel, -1,
256                                 wxDefaultPosition, wxDefaultSize,
257                                 wxBORDER_NONE | wxVSCROLL );
258
259      scrolled_broadcasts_sizer = new wxBoxSizer( wxVERTICAL );
260      scrolled_broadcasts->SetAutoLayout( TRUE );
261      scrolled_broadcasts->SetScrollRate( 5,5 );
262      scrolled_broadcasts->SetSizerAndFit( scrolled_broadcasts_sizer );
263
264      broadcasts_sizer->Add( scrolled_broadcasts, 1, wxEXPAND| wxALL, 5 );
265      broadcasts_sizer->Layout();
266
267      broadcasts_panel->SetSizerAndFit( broadcasts_sizer );
268
269      return broadcasts_panel;
270 }
271
272 wxPanel * VLMPanel::AddBroadcastPanel( wxPanel *panel )
273 {
274      return new VLMAddStreamPanel( p_intf, panel, p_vlm, VLC_FALSE,
275                                    VLC_TRUE );
276 }
277
278 void VLMPanel::AppendBroadcast( VLMBroadcastStream *p_broadcast )
279 {
280     VLMBroadcastStreamPanel *p_new =
281                    new VLMBroadcastStreamPanel( p_intf, scrolled_broadcasts,
282                                                 p_broadcast );
283     p_new->b_found = VLC_TRUE;
284     scrolled_broadcasts_sizer->Add( p_new, 0, wxEXPAND | wxALL, 5 );
285     scrolled_broadcasts_sizer->Layout();
286     scrolled_broadcasts->FitInside();
287     broadcasts.push_back( p_new );
288 }
289
290 void VLMPanel::RemoveBroadcast( VLMBroadcastStreamPanel *p_streamp )
291 {
292     scrolled_broadcasts_sizer->Remove( p_streamp );
293     scrolled_broadcasts_sizer->Layout();
294     scrolled_broadcasts->FitInside();
295 }
296
297 /*************************
298  * VODS management
299  *************************/
300 wxPanel * VLMPanel::VODPanel( wxWindow *parent )
301 {
302      vods_panel = new wxPanel( parent, -1, wxDefaultPosition, wxSize( 500, 350 ) );
303      return vods_panel;
304 }
305
306 wxPanel * VLMPanel::AddVODPanel( wxPanel *panel )
307 {
308      return new VLMAddStreamPanel( p_intf, panel, p_vlm, VLC_FALSE,
309                                    VLC_FALSE );
310 }
311
312 void VLMPanel::AppendVOD( VLMVODStream *p_vod )
313 {
314     VLMVODStreamPanel *p_new =
315                    new VLMVODStreamPanel( p_intf, scrolled_vods, p_vod );
316     p_new->b_found = VLC_TRUE;
317     scrolled_vods_sizer->Add( p_new, 0, wxEXPAND | wxALL, 5 );
318     scrolled_vods_sizer->Layout();
319     scrolled_vods->FitInside();
320     vods.push_back( p_new );
321 }
322
323 void VLMPanel::RemoveVOD( VLMVODStreamPanel *p_streamp )
324 {
325     scrolled_vods_sizer->Remove( p_streamp );
326     scrolled_vods_sizer->Layout();
327     scrolled_vods->FitInside();
328 }
329
330 /****************************************************************************
331  * VLM Add Broadcast panel implementation
332  *****************************************************************************/
333 enum
334 {
335     Create_Event,
336     Clear_Event,
337     ChooseInput_Event,
338     ChooseOutput_Event,
339 };
340
341 BEGIN_EVENT_TABLE( VLMAddStreamPanel, wxPanel)
342    EVT_BUTTON( Create_Event, VLMAddStreamPanel::OnCreate )
343    EVT_BUTTON( Clear_Event, VLMAddStreamPanel::OnClear )
344    EVT_BUTTON( ChooseInput_Event, VLMAddStreamPanel::OnChooseInput )
345    EVT_BUTTON( ChooseOutput_Event, VLMAddStreamPanel::OnChooseOutput )
346 END_EVENT_TABLE()
347
348 VLMAddStreamPanel::VLMAddStreamPanel( intf_thread_t *_p_intf,
349                 wxWindow *_p_parent, VLMWrapper *_p_vlm,
350                 vlc_bool_t _b_edit, vlc_bool_t _b_broadcast ):
351                 wxPanel( _p_parent, -1, wxDefaultPosition, wxDefaultSize )
352 {
353     p_intf = _p_intf;
354     p_vlm = _p_vlm;
355     b_edit = _b_edit;
356     b_broadcast = _b_broadcast;
357
358     p_open_dialog = NULL;
359     p_sout_dialog = NULL;
360
361     SetAutoLayout( TRUE );
362
363     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
364
365     wxFlexGridSizer *upper_sizer = new wxFlexGridSizer( 5, 2 );
366     upper_sizer->AddGrowableCol( 1 );
367     upper_sizer->AddGrowableCol( 3 );
368
369     upper_sizer->Add( new wxStaticText( this, -1, wxU( _("Name") ) ), 0,
370                                         wxALIGN_CENTER_VERTICAL, 0 );
371     name_text = new wxTextCtrl( this, -1, wxU( "" ), wxDefaultPosition,
372                                           wxSize( 150, -1 ) );
373     upper_sizer->Add( name_text , 1, wxEXPAND | wxLEFT | wxRIGHT, 5 );
374
375     upper_sizer->Add( new wxStaticText( this, -1, wxU( _("Input") ) ), 0,
376                                         wxALIGN_CENTER_VERTICAL, 0 );
377     input_text = new wxTextCtrl( this, -1, wxU( "" ) ,
378                       wxDefaultPosition, wxSize( 150, -1 ) );
379     upper_sizer->Add( input_text , 1, wxEXPAND | wxLEFT | wxRIGHT, 5 );
380     upper_sizer->Add( new wxButton( this, ChooseInput_Event, wxU( _("Choose") )  ) );
381
382     upper_sizer->Add( 0,0 );
383     upper_sizer->Add( 0,0 );
384
385     upper_sizer->Add( new wxStaticText( this, -1, wxU( _("Output") ) ), 0,
386                                         wxALIGN_CENTER_VERTICAL, 0 );
387     output_text = new wxTextCtrl( this, -1, wxU( "" ) ,
388                       wxDefaultPosition, wxSize( 150, -1 ) );
389     upper_sizer->Add( output_text, 1, wxEXPAND | wxLEFT | wxRIGHT, 5 );
390     upper_sizer->Add( new wxButton( this, ChooseOutput_Event,
391                       wxU( _("Choose") )  ) );
392
393     panel_sizer->Add( upper_sizer, 0, wxEXPAND | wxALL, 5 );
394
395     wxBoxSizer *lower_sizer = new wxBoxSizer( wxHORIZONTAL );
396     lower_sizer->Add( new wxButton( this, Create_Event,
397                           wxU( _( b_edit ? "Edit" : "Create" ) ) ),
398                       0 , wxEXPAND | wxALL , 5 );
399     lower_sizer->Add( new wxButton( this, Clear_Event, wxU( _( "Clear" )  ) ),
400                       0 , wxEXPAND | wxALL , 5 );
401
402     enabled_checkbox = new wxCheckBox( this, -1, wxU( _("Enabled" ) ) );
403     enabled_checkbox->SetValue( true );
404     lower_sizer->Add( enabled_checkbox,  1 , wxEXPAND | wxALL , 5 );
405     if( b_broadcast )
406     {
407         loop_checkbox = new wxCheckBox( this, -1, wxU( _("Loop" ) ) );
408         lower_sizer->Add( loop_checkbox,  1 , wxEXPAND | wxALL , 5 );
409     }
410
411     panel_sizer->Add( lower_sizer, 0 , wxEXPAND| wxALL, 5 );
412     panel_sizer->Layout();
413     SetSizerAndFit( panel_sizer );
414 }
415
416 VLMAddStreamPanel::~VLMAddStreamPanel()
417 {
418 }
419
420 void VLMAddStreamPanel::Load( VLMStream *p_stream )
421 {
422     name_text->SetValue( wxU( p_stream->p_media->psz_name ) );
423     name_text->SetEditable( false );
424     if( p_stream->p_media->i_input > 0 )
425     {
426         input_text->SetValue( wxU( p_stream->p_media->input[0] ) );
427     }
428     output_text->SetValue( wxU( p_stream->p_media->psz_output ) );
429     enabled_checkbox->SetValue( p_stream->p_media->b_enabled );
430     if( b_broadcast)
431         loop_checkbox->SetValue( p_stream->p_media->b_loop );
432 }
433
434 void VLMAddStreamPanel::OnCreate( wxCommandEvent &event )
435 {
436     char *psz_name = FromLocale( name_text->GetValue().mb_str() );
437     char *psz_input = FromLocale(  input_text->GetValue().mb_str() );
438     char *psz_output = FromLocale( output_text->GetValue().mb_str() );
439     if( b_broadcast && ! b_edit )
440     {
441         p_vlm->AddBroadcast( psz_name, psz_input, psz_output,
442                          enabled_checkbox->IsChecked() ? VLC_TRUE: VLC_FALSE,
443                          loop_checkbox->IsChecked() ? VLC_TRUE : VLC_FALSE );
444     }
445     else if( b_broadcast && b_edit )
446     {
447         p_vlm->EditBroadcast( psz_name, psz_input, psz_output,
448                         enabled_checkbox->IsChecked() ? VLC_TRUE: VLC_FALSE,
449                         loop_checkbox->IsChecked() ? VLC_TRUE : VLC_FALSE );
450     }
451     else if( !b_broadcast && !b_edit )
452     {
453         p_vlm->AddVod( psz_name, psz_input, psz_output,
454                        enabled_checkbox->IsChecked() ? VLC_TRUE: VLC_FALSE,
455                        loop_checkbox->IsChecked() ? VLC_TRUE : VLC_FALSE );
456     }
457     else
458     {
459         p_vlm->EditVod( psz_name, psz_input, psz_output,
460                         enabled_checkbox->IsChecked() ? VLC_TRUE: VLC_FALSE,
461                         loop_checkbox->IsChecked() ? VLC_TRUE : VLC_FALSE );
462     }
463     LocaleFree( psz_name) ; LocaleFree( psz_input ) ;
464     LocaleFree( psz_output);
465     if( !b_edit )
466         OnClear( event );
467 }
468
469 void VLMAddStreamPanel::OnClear( wxCommandEvent &event )
470 {
471     name_text->SetValue( wxU("") );
472     input_text->SetValue( wxU("") );
473     output_text->SetValue( wxU("") );
474 }
475
476 void VLMAddStreamPanel::OnChooseInput( wxCommandEvent &event )
477 {
478     if( p_open_dialog == NULL )
479         p_open_dialog = new OpenDialog( p_intf, this, -1, -1, OPEN_STREAM );
480
481     if( p_open_dialog && p_open_dialog->ShowModal() == wxID_OK )
482     {
483         input_text->SetValue( p_open_dialog->mrl[0] );
484     }
485 }
486
487 void VLMAddStreamPanel::OnChooseOutput( wxCommandEvent &event )
488 {
489     if( p_sout_dialog == NULL )
490         p_sout_dialog = new SoutDialog( p_intf, this );
491
492     if( p_sout_dialog && p_sout_dialog->ShowModal() == wxID_OK )
493     {
494         output_text->SetValue( (p_sout_dialog->GetOptions())[0] );
495     }
496 }
497
498 /****************************************************************************
499  * VLM Frame implementation
500  ****************************************************************************/
501 enum
502 {
503 };
504
505 BEGIN_EVENT_TABLE( VLMFrame, wxFrame )
506     EVT_CLOSE( VLMFrame::OnClose )
507 END_EVENT_TABLE()
508
509 VLMFrame::VLMFrame( intf_thread_t *_p_intf, wxWindow *_p_parent ) :
510         wxFrame( _p_parent, -1, wxU( _("VLM configuration") ),
511         wxDefaultPosition, wxSize( 640,480 ), wxDEFAULT_FRAME_STYLE )
512 {
513     SetIcon( *_p_intf->p_sys->p_icon );
514
515     wxBoxSizer *main_sizer = new wxBoxSizer( wxHORIZONTAL );
516     vlm_panel = new VLMPanel( _p_intf, this );
517
518     main_sizer->Add( vlm_panel, 1, wxEXPAND | wxALL, 5 );
519     main_sizer->Layout();
520     SetSizerAndFit( main_sizer );
521 }
522
523 void VLMFrame::OnClose( wxCloseEvent& WXUNUSED(event) )
524 {
525     Hide();
526 }
527
528 void VLMFrame::Update()
529 {
530     vlm_panel->Update();
531 }
532
533 VLMFrame::~VLMFrame()
534 {
535     delete vlm_panel;
536 }
537
538 /****************************************************************************
539  * VLM Add stream Frame implementation
540  ****************************************************************************/
541 VLMEditStreamFrame::VLMEditStreamFrame( intf_thread_t *_p_intf,
542             wxWindow *_p_parent, VLMWrapper *_p_vlm, vlc_bool_t _b_broadcast,
543             VLMStream *p_stream ) :
544         wxFrame( _p_parent, -1, wxU( _("VLM stream") ),
545         wxDefaultPosition, wxSize( 640,480 ), wxDEFAULT_FRAME_STYLE )
546 {
547     SetIcon( *_p_intf->p_sys->p_icon );
548
549     wxBoxSizer *main_sizer = new wxBoxSizer( wxHORIZONTAL );
550     vlm_panel = new VLMAddStreamPanel( _p_intf, this, _p_vlm ,
551                                        VLC_TRUE, _b_broadcast );
552
553     vlm_panel->Load( p_stream );
554
555     main_sizer->Add( vlm_panel, 1, wxEXPAND | wxALL, 5 );
556     main_sizer->Layout();
557     SetSizerAndFit( main_sizer );
558 }
559
560 VLMEditStreamFrame::~VLMEditStreamFrame()
561 {
562 }