]> git.sesse.net Git - vlc/blob - modules/gui/skins2/src/dialogs.cpp
823fa937c57b453504c25d4020818e149ef3755b
[vlc] / modules / gui / skins2 / src / dialogs.cpp
1 /*****************************************************************************
2  * dialogs.cpp
3  *****************************************************************************
4  * Copyright (C) 2003 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
8  *          Olivier Teulière <ipkiss@via.ecp.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 #include "dialogs.hpp"
26 #include "../commands/async_queue.hpp"
27 #include "../commands/cmd_change_skin.hpp"
28 #include "../commands/cmd_quit.hpp"
29 #include "../commands/cmd_playlist.hpp"
30 #include "../commands/cmd_playtree.hpp"
31
32
33 /// Callback called when a new skin is chosen
34 void Dialogs::showChangeSkinCB( intf_dialog_args_t *pArg )
35 {
36     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
37
38     if( pArg->i_results )
39     {
40         if( pArg->psz_results[0] )
41         {
42             // Create a change skin command
43             CmdChangeSkin *pCmd =
44                 new CmdChangeSkin( pIntf, pArg->psz_results[0] );
45
46             // Push the command in the asynchronous command queue
47             AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
48             pQueue->push( CmdGenericPtr( pCmd ) );
49         }
50     }
51     else if( !pIntf->p_sys->p_theme )
52     {
53         // If no theme is already loaded, it's time to quit!
54         CmdQuit *pCmd = new CmdQuit( pIntf );
55         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
56         pQueue->push( CmdGenericPtr( pCmd ) );
57     }
58 }
59
60
61 void Dialogs::showPlaylistLoadCB( intf_dialog_args_t *pArg )
62 {
63     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
64
65     if( pArg->i_results && pArg->psz_results[0] )
66     {
67         // Create a Playlist Load command
68         CmdPlaylistLoad *pCmd =
69             new CmdPlaylistLoad( pIntf, pArg->psz_results[0] );
70
71         // Push the command in the asynchronous command queue
72         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
73         pQueue->push( CmdGenericPtr( pCmd ) );
74     }
75 }
76
77
78 void Dialogs::showPlaylistSaveCB( intf_dialog_args_t *pArg )
79 {
80     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
81
82     if( pArg->i_results && pArg->psz_results[0] )
83     {
84         // Create a Playlist Save command
85         CmdPlaylistSave *pCmd =
86             new CmdPlaylistSave( pIntf, pArg->psz_results[0] );
87
88         // Push the command in the asynchronous command queue
89         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
90         pQueue->push( CmdGenericPtr( pCmd ) );
91     }
92 }
93
94
95 /// Callback called when the popup menu is requested
96 static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
97                         vlc_value_t old_val, vlc_value_t new_val, void *param )
98 {
99     Dialogs *p_dialogs = (Dialogs *)param;
100     p_dialogs->showPopupMenu( new_val.b_bool != 0 );
101
102     return VLC_SUCCESS;
103 }
104
105
106 Dialogs::Dialogs( intf_thread_t *pIntf ):
107     SkinObject( pIntf ), m_pProvider( NULL ), m_pModule( NULL )
108 {
109 }
110
111
112 Dialogs::~Dialogs()
113 {
114     if( m_pProvider && m_pModule )
115     {
116         // Detach the dialogs provider from its parent interface
117         vlc_object_detach( m_pProvider );
118
119         module_Unneed( m_pProvider, m_pModule );
120         vlc_object_destroy( m_pProvider );
121     }
122
123     /* Unregister callbacks */
124     var_DelCallback( getIntf()->p_sys->p_playlist, "intf-popupmenu",
125                      PopupMenuCB, this );
126 }
127
128
129 Dialogs *Dialogs::instance( intf_thread_t *pIntf )
130 {
131     if( ! pIntf->p_sys->p_dialogs )
132     {
133         Dialogs *pDialogs = new Dialogs( pIntf );
134         if( pDialogs->init() )
135         {
136             // Initialization succeeded
137             pIntf->p_sys->p_dialogs = pDialogs;
138         }
139         else
140         {
141             // Initialization failed
142             delete pDialogs;
143         }
144     }
145     return pIntf->p_sys->p_dialogs;
146 }
147
148
149 void Dialogs::destroy( intf_thread_t *pIntf )
150 {
151     if( pIntf->p_sys->p_dialogs )
152     {
153         delete pIntf->p_sys->p_dialogs;
154         pIntf->p_sys->p_dialogs = NULL;
155     }
156 }
157
158
159 bool Dialogs::init()
160 {
161     // Allocate descriptor
162     m_pProvider = (intf_thread_t *)vlc_object_create( getIntf(),
163                                                       VLC_OBJECT_DIALOGS );
164     if( m_pProvider == NULL )
165     {
166         msg_Err( getIntf(), "out of memory" );
167         return false;
168     }
169
170     m_pModule = module_Need( m_pProvider, "dialogs provider", NULL, 0 );
171     if( m_pModule == NULL )
172     {
173         msg_Err( getIntf(), "No suitable dialogs provider found (hint: compile the wxWidgets plugin, and make sure it is loaded properly)" );
174         vlc_object_destroy( m_pProvider );
175         m_pProvider = NULL;
176         return false;
177     }
178
179     // Attach the dialogs provider to its parent interface
180     vlc_object_attach( m_pProvider, getIntf() );
181
182     // Initialize dialogs provider
183     // (returns as soon as initialization is done)
184     if( m_pProvider->pf_run )
185     {
186         m_pProvider->pf_run( m_pProvider );
187     }
188
189     /* Register callback for the intf-popupmenu variable */
190     var_AddCallback( getIntf()->p_sys->p_playlist, "intf-popupmenu",
191                      PopupMenuCB, this );
192
193     return true;
194 }
195
196
197 void Dialogs::showFileGeneric( const string &rTitle, const string &rExtensions,
198                                DlgCallback callback, int flags )
199 {
200     if( m_pProvider && m_pProvider->pf_show_dialog )
201     {
202         intf_dialog_args_t *p_arg =
203             (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
204         memset( p_arg, 0, sizeof(intf_dialog_args_t) );
205
206         p_arg->psz_title = strdup( rTitle.c_str() );
207         p_arg->psz_extensions = strdup( rExtensions.c_str() );
208
209         p_arg->b_save = flags & kSAVE;
210         p_arg->b_multiple = flags & kMULTIPLE;
211
212         p_arg->p_arg = getIntf();
213         p_arg->pf_callback = callback;
214
215         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_GENERIC,
216                                      0, p_arg );
217     }
218 }
219
220
221 void Dialogs::showChangeSkin()
222 {
223     showFileGeneric( _("Open a skin file"),
224                      _("Skin files (*.vlt;*.wsz)|*.vlt;*.wsz|Skin files (*.xml)|*.xml"),
225                      showChangeSkinCB, kOPEN );
226 }
227
228
229 void Dialogs::showPlaylistLoad()
230 {
231     showFileGeneric( _("Open playlist"),
232                      _("All playlists|*.pls;*.m3u;*.asx;*.b4s|M3U files|*.m3u"),
233                      showPlaylistLoadCB, kOPEN );
234 }
235
236
237 void Dialogs::showPlaylistSave()
238 {
239     showFileGeneric( _("Save playlist"), _("M3U file|*.m3u"),
240                      showPlaylistSaveCB, kSAVE );
241 }
242
243
244 void Dialogs::showFileSimple( bool play )
245 {
246     if( m_pProvider && m_pProvider->pf_show_dialog )
247     {
248         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_SIMPLE,
249                                      (int)play, 0 );
250     }
251 }
252
253
254 void Dialogs::showFile( bool play )
255 {
256     if( m_pProvider && m_pProvider->pf_show_dialog )
257     {
258         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE,
259                                      (int)play, 0 );
260     }
261 }
262
263
264 void Dialogs::showDirectory( bool play )
265 {
266     if( m_pProvider && m_pProvider->pf_show_dialog )
267     {
268         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_DIRECTORY,
269                                      (int)play, 0 );
270     }
271 }
272
273
274 void Dialogs::showDisc( bool play )
275 {
276     if( m_pProvider && m_pProvider->pf_show_dialog )
277     {
278         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_DISC,
279                                      (int)play, 0 );
280     }
281 }
282
283
284 void Dialogs::showNet( bool play )
285 {
286     if( m_pProvider && m_pProvider->pf_show_dialog )
287     {
288         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_NET,
289                                      (int)play, 0 );
290     }
291 }
292
293
294 void Dialogs::showMessages()
295 {
296     if( m_pProvider && m_pProvider->pf_show_dialog )
297     {
298         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_MESSAGES, 0, 0 );
299     }
300 }
301
302
303 void Dialogs::showPrefs()
304 {
305     if( m_pProvider && m_pProvider->pf_show_dialog )
306     {
307         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_PREFS, 0, 0 );
308     }
309 }
310
311
312 void Dialogs::showFileInfo()
313 {
314     if( m_pProvider && m_pProvider->pf_show_dialog )
315     {
316         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILEINFO, 0, 0 );
317     }
318 }
319
320
321 void Dialogs::showStreamingWizard()
322 {
323     if( m_pProvider && m_pProvider->pf_show_dialog )
324     {
325         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_WIZARD, 0, 0 );
326     }
327 }
328
329
330 void Dialogs::showPopupMenu( bool bShow )
331 {
332     if( m_pProvider && m_pProvider->pf_show_dialog )
333     {
334         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_POPUPMENU,
335                                      (int)bShow, 0 );
336     }
337 }
338
339 void Dialogs::showInteraction( interaction_dialog_t *p_dialog )
340 {
341     intf_dialog_args_t *p_arg =
342             (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
343     memset( p_arg, 0, sizeof(intf_dialog_args_t) );
344
345     p_arg->p_dialog = p_dialog;
346     p_arg->p_intf = getIntf();
347
348     if( m_pProvider && m_pProvider->pf_show_dialog )
349     {
350         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_INTERACTION,
351                                      0, p_arg );
352     }
353 }