]> git.sesse.net Git - vlc/blob - modules/gui/skins2/src/dialogs.cpp
* wxwidgets/menus.cpp: Added "Open Directory" in the wx popup menu
[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
31
32 /// Callback called when a new skin is chosen
33 void Dialogs::showChangeSkinCB( intf_dialog_args_t *pArg )
34 {
35     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
36
37     if( pArg->i_results )
38     {
39         if( pArg->psz_results[0] )
40         {
41             // Create a change skin command
42             CmdChangeSkin *pCmd =
43                 new CmdChangeSkin( pIntf, pArg->psz_results[0] );
44
45             // Push the command in the asynchronous command queue
46             AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
47             pQueue->remove( "change skin" );
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->remove( "load playlist" );
74         pQueue->push( CmdGenericPtr( pCmd ) );
75     }
76 }
77
78
79 void Dialogs::showPlaylistSaveCB( intf_dialog_args_t *pArg )
80 {
81     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
82
83     if( pArg->i_results && pArg->psz_results[0] )
84     {
85         // Create a Playlist Save command
86         CmdPlaylistSave *pCmd =
87             new CmdPlaylistSave( pIntf, pArg->psz_results[0] );
88
89         // Push the command in the asynchronous command queue
90         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
91         pQueue->remove( "load playlist" );
92         pQueue->push( CmdGenericPtr( pCmd ) );
93     }
94 }
95
96
97 /// Callback called when the popup menu is requested
98 static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
99                         vlc_value_t old_val, vlc_value_t new_val, void *param )
100 {
101     Dialogs *p_dialogs = (Dialogs *)param;
102     p_dialogs->showPopupMenu( new_val.b_bool != 0 );
103
104     return VLC_SUCCESS;
105 }
106
107
108 Dialogs::Dialogs( intf_thread_t *pIntf ):
109     SkinObject( pIntf ), m_pProvider( NULL ), m_pModule( NULL )
110 {
111 }
112
113
114 Dialogs::~Dialogs()
115 {
116     if( m_pProvider && m_pModule )
117     {
118         // Detach the dialogs provider from its parent interface
119         vlc_object_detach( m_pProvider );
120
121         module_Unneed( m_pProvider, m_pModule );
122         vlc_object_destroy( m_pProvider );
123     }
124
125     /* Unregister callbacks */
126     var_DelCallback( getIntf()->p_sys->p_playlist, "intf-popupmenu",
127                      PopupMenuCB, this );
128 }
129
130
131 Dialogs *Dialogs::instance( intf_thread_t *pIntf )
132 {
133     if( ! pIntf->p_sys->p_dialogs )
134     {
135         Dialogs *pDialogs = new Dialogs( pIntf );
136         if( pDialogs->init() )
137         {
138             // Initialization succeeded
139             pIntf->p_sys->p_dialogs = pDialogs;
140         }
141         else
142         {
143             // Initialization failed
144             delete pDialogs;
145         }
146     }
147     return pIntf->p_sys->p_dialogs;
148 }
149
150
151 void Dialogs::destroy( intf_thread_t *pIntf )
152 {
153     if( pIntf->p_sys->p_dialogs )
154     {
155         delete pIntf->p_sys->p_dialogs;
156         pIntf->p_sys->p_dialogs = NULL;
157     }
158 }
159
160
161 bool Dialogs::init()
162 {
163     // Allocate descriptor
164     m_pProvider = (intf_thread_t *)vlc_object_create( getIntf(),
165                                                       VLC_OBJECT_DIALOGS );
166     if( m_pProvider == NULL )
167     {
168         msg_Err( getIntf(), "out of memory" );
169         return false;
170     }
171
172     m_pModule = module_Need( m_pProvider, "dialogs provider", NULL, 0 );
173     if( m_pModule == NULL )
174     {
175         msg_Err( getIntf(), "No suitable dialogs provider found" );
176         vlc_object_destroy( m_pProvider );
177         m_pProvider = NULL;
178         return false;
179     }
180
181     // Attach the dialogs provider to its parent interface
182     vlc_object_attach( m_pProvider, getIntf() );
183
184     // Initialize dialogs provider
185     // (returns as soon as initialization is done)
186     if( m_pProvider->pf_run )
187     {
188         m_pProvider->pf_run( m_pProvider );
189     }
190
191     /* Register callback for the intf-popupmenu variable */
192     var_AddCallback( getIntf()->p_sys->p_playlist, "intf-popupmenu",
193                      PopupMenuCB, this );
194
195     return true;
196 }
197
198
199 void Dialogs::showFileGeneric( const string &rTitle, const string &rExtensions,
200                                DlgCallback callback, int flags )
201 {
202     if( m_pProvider && m_pProvider->pf_show_dialog )
203     {
204         intf_dialog_args_t *p_arg =
205             (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
206         memset( p_arg, 0, sizeof(intf_dialog_args_t) );
207
208         p_arg->psz_title = strdup( rTitle.c_str() );
209         p_arg->psz_extensions = strdup( rExtensions.c_str() );
210
211         p_arg->b_save = flags & kSAVE;
212         p_arg->b_multiple = flags & kMULTIPLE;
213
214         p_arg->p_arg = getIntf();
215         p_arg->pf_callback = callback;
216
217         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_GENERIC,
218                                      0, p_arg );
219     }
220 }
221
222
223 void Dialogs::showChangeSkin()
224 {
225     showFileGeneric( _("Open a skin file"),
226                      _("Skin files (*.vlt)|*.vlt|Skin files (*.xml)|*.xml"),
227                      showChangeSkinCB, kOPEN );
228 }
229
230
231 void Dialogs::showPlaylistLoad()
232 {
233     showFileGeneric( _("Open playlist"),
234                      _("All playlists|*.pls;*.m3u;*.asx;*.b4s|M3U files|*.m3u"),
235                      showPlaylistLoadCB, kOPEN );
236 }
237
238
239 void Dialogs::showPlaylistSave()
240 {
241     showFileGeneric( _("Save playlist"), _("M3U file|*.m3u"),
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