]> git.sesse.net Git - vlc/blob - modules/gui/skins2/src/dialogs.cpp
Skins strings (Refs:#438)
[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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, 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;*.xspf|"
233                        "M3U files|*.m3u|"
234                        "XSPF playlist|*.xspf"),
235                      showPlaylistLoadCB, kOPEN );
236 }
237
238
239 void Dialogs::showPlaylistSave()
240 {
241     showFileGeneric( _("Save playlist"), _("M3U file|*.m3u|XSPF playlist|*.xspf"),
242                      showPlaylistSaveCB, kSAVE );
243 }
244
245
246 void Dialogs::showFileSimple( bool play )
247 {
248     if( m_pProvider && m_pProvider->pf_show_dialog )
249     {
250         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_SIMPLE,
251                                      (int)play, 0 );
252     }
253 }
254
255
256 void Dialogs::showFile( bool play )
257 {
258     if( m_pProvider && m_pProvider->pf_show_dialog )
259     {
260         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE,
261                                      (int)play, 0 );
262     }
263 }
264
265
266 void Dialogs::showDirectory( bool play )
267 {
268     if( m_pProvider && m_pProvider->pf_show_dialog )
269     {
270         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_DIRECTORY,
271                                      (int)play, 0 );
272     }
273 }
274
275
276 void Dialogs::showDisc( bool play )
277 {
278     if( m_pProvider && m_pProvider->pf_show_dialog )
279     {
280         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_DISC,
281                                      (int)play, 0 );
282     }
283 }
284
285
286 void Dialogs::showNet( bool play )
287 {
288     if( m_pProvider && m_pProvider->pf_show_dialog )
289     {
290         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_NET,
291                                      (int)play, 0 );
292     }
293 }
294
295
296 void Dialogs::showMessages()
297 {
298     if( m_pProvider && m_pProvider->pf_show_dialog )
299     {
300         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_MESSAGES, 0, 0 );
301     }
302 }
303
304
305 void Dialogs::showPrefs()
306 {
307     if( m_pProvider && m_pProvider->pf_show_dialog )
308     {
309         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_PREFS, 0, 0 );
310     }
311 }
312
313
314 void Dialogs::showFileInfo()
315 {
316     if( m_pProvider && m_pProvider->pf_show_dialog )
317     {
318         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILEINFO, 0, 0 );
319     }
320 }
321
322
323 void Dialogs::showStreamingWizard()
324 {
325     if( m_pProvider && m_pProvider->pf_show_dialog )
326     {
327         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_WIZARD, 0, 0 );
328     }
329 }
330
331
332 void Dialogs::showPopupMenu( bool bShow )
333 {
334     if( m_pProvider && m_pProvider->pf_show_dialog )
335     {
336         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_POPUPMENU,
337                                      (int)bShow, 0 );
338     }
339 }
340
341 void Dialogs::showInteraction( interaction_dialog_t *p_dialog )
342 {
343     intf_dialog_args_t *p_arg =
344             (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
345     memset( p_arg, 0, sizeof(intf_dialog_args_t) );
346
347     p_arg->p_dialog = p_dialog;
348     p_arg->p_intf = getIntf();
349
350     if( m_pProvider && m_pProvider->pf_show_dialog )
351     {
352         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_INTERACTION,
353                                      0, p_arg );
354     }
355 }