* cmd_change_skin.cpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: cmd_change_skin.cpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ * $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulière <ipkiss@via.ecp.fr>
#include "../src/os_loop.hpp"
#include "../src/theme.hpp"
#include "../src/theme_loader.hpp"
+#include "../src/window_manager.hpp"
void CmdChangeSkin::execute()
* cmd_change_skin.hpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: cmd_change_skin.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ * $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulière <ipkiss@via.ecp.fr>
#include "cmd_generic.hpp"
-class WindowManager;
-
-
/// "Change Skin" command
class CmdChangeSkin: public CmdGeneric
{
* cmd_dialogs.hpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: cmd_dialogs.hpp,v 1.2 2004/02/01 14:44:11 asmax Exp $
+ * $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulière <ipkiss@via.ecp.fr>
typedef CmdDialogs<9> CmdDlgShowPopupMenu;
typedef CmdDialogs<10> CmdDlgHidePopupMenu;
typedef CmdDialogs<11> CmdDlgAdd;
+typedef CmdDialogs<12> CmdDlgPlaylistLoad;
+typedef CmdDialogs<13> CmdDlgPlaylistSave;
/// Generic "Open dialog" command
case 11:
pDialogs->showFile( false );
break;
+ case 12:
+ pDialogs->showPlaylistLoad();
+ break;
+ case 13:
+ pDialogs->showPlaylistSave();
+ break;
default:
msg_Warn( getIntf(), "Unknown dialog type" );
break;
}
}
+
+void CmdPlaylistLoad::execute()
+{
+ playlist_t *pPlaylist = getIntf()->p_sys->p_playlist;
+ if( pPlaylist != NULL )
+ {
+ playlist_Import( pPlaylist, m_file.c_str() );
+ }
+}
+
+
+void CmdPlaylistSave::execute()
+{
+ playlist_t *pPlaylist = getIntf()->p_sys->p_playlist;
+ if( pPlaylist != NULL )
+ {
+ // FIXME: when the PLS export will be working, we'll need to remove
+ // this hardcoding...
+ playlist_Export( pPlaylist, m_file.c_str(), "export-m3u" );
+ }
+}
+
};
+/// Command to load a playlist
+class CmdPlaylistLoad: public CmdGeneric
+{
+ public:
+ CmdPlaylistLoad( intf_thread_t *pIntf, const string& rFile ):
+ CmdGeneric( pIntf ), m_file( rFile ) {}
+ virtual ~CmdPlaylistLoad() {}
+
+ /// This method does the real job of the command
+ virtual void execute();
+
+ /// Return the type of the command
+ virtual string getType() const { return "playlist load"; }
+
+ private:
+ /// Playlist file to load
+ string m_file;
+};
+
+
+/// Command to save a playlist
+class CmdPlaylistSave: public CmdGeneric
+{
+ public:
+ CmdPlaylistSave( intf_thread_t *pIntf, const string& rFile ):
+ CmdGeneric( pIntf ), m_file( rFile ) {}
+ virtual ~CmdPlaylistSave() {}
+
+ /// This method does the real job of the command
+ virtual void execute();
+
+ /// Return the type of the command
+ virtual string getType() const { return "playlist save"; }
+
+ private:
+ /// Playlist file to save
+ string m_file;
+};
+
+
#endif
REGISTER_CMD( "dialogs.prefs()", CmdDlgPrefs )
REGISTER_CMD( "dialogs.fileInfo()", CmdDlgFileInfo )
REGISTER_CMD( "dialogs.popup()", CmdDlgShowPopupMenu )
+ REGISTER_CMD( "playlist.load()", CmdDlgPlaylistLoad )
+ REGISTER_CMD( "playlist.save()", CmdDlgPlaylistSave )
REGISTER_CMD( "playlist.add()", CmdDlgAdd )
VarList &rVar = VlcProc::instance( getIntf() )->getPlaylistVar();
m_commandMap["playlist.del()"] =
#include "../commands/async_queue.hpp"
#include "../commands/cmd_change_skin.hpp"
#include "../commands/cmd_quit.hpp"
+#include "../commands/cmd_playlist.hpp"
/// Callback called when a new skin is chosen
-static void showChangeSkinCB( intf_dialog_args_t *pArg )
+void Dialogs::showChangeSkinCB( intf_dialog_args_t *pArg )
{
intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
if( pArg->psz_results[0] )
{
// Create a change skin command
- CmdChangeSkin *pCmd = new CmdChangeSkin( pIntf,
- pArg->psz_results[0] );
+ CmdChangeSkin *pCmd =
+ new CmdChangeSkin( pIntf, pArg->psz_results[0] );
// Push the command in the asynchronous command queue
AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
}
+void Dialogs::showPlaylistLoadCB( intf_dialog_args_t *pArg )
+{
+ intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
+
+ if( pArg->i_results && pArg->psz_results[0] )
+ {
+ // Create a Playlist Load command
+ CmdPlaylistLoad *pCmd =
+ new CmdPlaylistLoad( pIntf, pArg->psz_results[0] );
+
+ // Push the command in the asynchronous command queue
+ AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
+ pQueue->remove( "load playlist" );
+ pQueue->push( CmdGenericPtr( pCmd ) );
+ }
+}
+
+
+void Dialogs::showPlaylistSaveCB( intf_dialog_args_t *pArg )
+{
+ intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
+
+ if( pArg->i_results && pArg->psz_results[0] )
+ {
+ // Create a Playlist Save command
+ CmdPlaylistSave *pCmd =
+ new CmdPlaylistSave( pIntf, pArg->psz_results[0] );
+
+ // Push the command in the asynchronous command queue
+ AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
+ pQueue->remove( "load playlist" );
+ pQueue->push( CmdGenericPtr( pCmd ) );
+ }
+}
+
+
/// Callback called when the popup menu is requested
static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
vlc_value_t old_val, vlc_value_t new_val, void *param )
}
-void Dialogs::showChangeSkin()
+void Dialogs::showFileGeneric( const string &rTitle, const string &rExtensions,
+ DlgCallback callback, int flags )
{
if( m_pProvider && m_pProvider->pf_show_dialog )
{
(intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
memset( p_arg, 0, sizeof(intf_dialog_args_t) );
- p_arg->psz_title = strdup( _("Open a skin file") );
- p_arg->psz_extensions =
- strdup( _("Skin files (*.vlt)|*.vlt|Skin files (*.xml)|*.xml|") );
+ p_arg->psz_title = strdup( rTitle.c_str() );
+ p_arg->psz_extensions = strdup( rExtensions.c_str() );
+
+ p_arg->b_save = flags & kSAVE;
+ p_arg->b_multiple = flags & kMULTIPLE;
p_arg->p_arg = getIntf();
- p_arg->pf_callback = showChangeSkinCB;
+ p_arg->pf_callback = callback;
m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_GENERIC,
0, p_arg );
}
+void Dialogs::showChangeSkin()
+{
+ showFileGeneric( _("Open a skin file"),
+ _("Skin files (*.vlt)|*.vlt|Skin files (*.xml)|*.xml|"),
+ showChangeSkinCB, kOPEN );
+}
+
+
+void Dialogs::showPlaylistLoad()
+{
+ showFileGeneric( _("Open playlist"),
+ _("All playlists|*.pls;*.m3u;*.asx;*.b4s|M3U files|*.m3u"),
+ showPlaylistLoadCB, kOPEN );
+}
+
+
+void Dialogs::showPlaylistSave()
+{
+ showFileGeneric( _("Save playlist"), _("M3U file|*.m3u"),
+ showPlaylistSaveCB, kSAVE );
+}
+
+
void Dialogs::showFileSimple( bool play )
{
if( m_pProvider && m_pProvider->pf_show_dialog )
* dialogs.hpp
*****************************************************************************
* Copyright (C) 2003 VideoLAN
- * $Id: dialogs.hpp,v 1.1 2004/01/03 23:31:33 asmax Exp $
+ * $Id$
*
* Authors: Cyril Deguet <asmax@via.ecp.fr>
* Olivier Teulière <ipkiss@via.ecp.fr>
class Dialogs: public SkinObject
{
public:
- /// Get the instance of Dialogs.
+ /// Get the instance of Dialogs
/// Returns NULL if initialization failed
static Dialogs *instance( intf_thread_t *pIntf );
/// Delete the instance of Dialogs
static void destroy( intf_thread_t *pIntf );
- /// Show the Change Skin dialog.
+ /// Show the Change Skin dialog
void showChangeSkin();
+ /// Show the Load Playlist dialog
+ void showPlaylistLoad();
+
+ /// Show the Save Playlist dialog
+ void showPlaylistSave();
+
/// Show the Quick Open File dialog.
/// If play is false, just add the item in the playlist
void showFileSimple( bool play );
- /// Show the Open File dialog.
+ /// Show the Open File dialog
/// If play is false, just add the item in the playlist
void showFile( bool play );
/// Show the popup menu
void showPopupMenu( bool bShow );
- // XXX: This is a kludge! In fact, the file name retrieved when
- // changing the skin should be returned directly to the command, but
- // the dialog provider mechanism doesn't allow it.
- /// Store temporarily a file name
- void setThemeFile( const string &themeFile ) { m_theme = themeFile; }
- /// Get a previously saved file name
- const string &getThemeFile() const { return m_theme; }
-
private:
// Private because it's a singleton
Dialogs( intf_thread_t *pIntf );
~Dialogs();
+ /// DlgCallback is the type of the callbacks of the open/save dialog
+ typedef void DlgCallback( intf_dialog_args_t *pArg );
+
+ /// Possible flags for the open/save dialog
+ typedef enum
+ {
+ kOPEN = 0x01,
+ kSAVE = 0x02,
+ kMULTIPLE = 0x04
+ } flags_t;
+
/// Initialization method
bool init();
+ /// Show a generic open/save dialog, initialized with the given
+ /// parameters
+ /// The 'flags' parameter is a logical or of the flags_t values
+ void showFileGeneric( const string &rTitle, const string &rExtensions,
+ DlgCallback callback, int flags );
+
+ /// Callback for the Change Skin dialog
+ static void showChangeSkinCB( intf_dialog_args_t *pArg );
+
+ /// Callback for the Load Playlist dialog
+ static void showPlaylistLoadCB( intf_dialog_args_t *pArg );
+
+ /// Callback for the Save Playlist dialog
+ static void showPlaylistSaveCB( intf_dialog_args_t *pArg );
+
/// Dialogs provider module
intf_thread_t *m_pProvider;
module_t *m_pModule;
-
- /// Name of a theme file, obtained via the ChangeSkin dialog
- string m_theme;
};
#include "../parser/interpreter.hpp"
#include "../commands/async_queue.hpp"
#include "../commands/cmd_quit.hpp"
+#include "../commands/cmd_dialogs.hpp"
//---------------------------------------------------------------------------
if( it == resPath.end() )
{
// Last chance: the user can select a new theme file
- Dialogs *pDialogs = Dialogs::instance( p_intf );
- if( pDialogs )
+ if( Dialogs::instance( p_intf ) )
{
- pDialogs->showChangeSkin();
+ CmdDlgChangeSkin *pCmd = new CmdDlgChangeSkin( p_intf );
+ AsyncQueue *pQueue = AsyncQueue::instance( p_intf );
+ pQueue->push( CmdGenericPtr( pCmd ) );
}
else
{
#include "os_window.hpp"
#include "os_factory.hpp"
#include "theme.hpp"
-#include "dialogs.hpp"
#include "var_manager.hpp"
#include "../commands/cmd_on_top.hpp"
+#include "../commands/cmd_dialogs.hpp"
#include "../controls/ctrl_generic.hpp"
#include "../events/evt_enter.hpp"
#include "../events/evt_focus.hpp"
// Only do the action when the key is down
if( rEvtKey.getAsString().find( "key:down") != string::npos )
{
- //XXX not to be hardcoded !
+ //XXX not to be hardcoded!
// Ctrl-S = Change skin
if( (rEvtKey.getMod() & EvtInput::kModCtrl) &&
rEvtKey.getKey() == 's' )
{
- Dialogs *pDialogs = Dialogs::instance( getIntf() );
- if( pDialogs != NULL )
- {
- pDialogs->showChangeSkin();
- }
+ CmdDlgChangeSkin cmd( getIntf() );
+ cmd.execute();
return;
}
- //XXX not to be hardcoded !
+ //XXX not to be hardcoded!
// Ctrl-T = Toggle on top
if( (rEvtKey.getMod() & EvtInput::kModCtrl) &&
rEvtKey.getKey() == 't' )