dialogs.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:9k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * dialogs.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 VideoLAN
  5.  * $Id: dialogs.cpp 8524 2004-08-25 21:32:15Z ipkiss $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teuli鑢e <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. #include "dialogs.hpp"
  25. #include "../commands/async_queue.hpp"
  26. #include "../commands/cmd_change_skin.hpp"
  27. #include "../commands/cmd_quit.hpp"
  28. #include "../commands/cmd_playlist.hpp"
  29. /// Callback called when a new skin is chosen
  30. void Dialogs::showChangeSkinCB( intf_dialog_args_t *pArg )
  31. {
  32.     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
  33.     if( pArg->i_results )
  34.     {
  35.         if( pArg->psz_results[0] )
  36.         {
  37.             // Create a change skin command
  38.             CmdChangeSkin *pCmd =
  39.                 new CmdChangeSkin( pIntf, pArg->psz_results[0] );
  40.             // Push the command in the asynchronous command queue
  41.             AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
  42.             pQueue->remove( "change skin" );
  43.             pQueue->push( CmdGenericPtr( pCmd ) );
  44.         }
  45.     }
  46.     else if( !pIntf->p_sys->p_theme )
  47.     {
  48.         // If no theme is already loaded, it's time to quit!
  49.         CmdQuit *pCmd = new CmdQuit( pIntf );
  50.         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
  51.         pQueue->push( CmdGenericPtr( pCmd ) );
  52.     }
  53. }
  54. void Dialogs::showPlaylistLoadCB( intf_dialog_args_t *pArg )
  55. {
  56.     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
  57.     if( pArg->i_results && pArg->psz_results[0] )
  58.     {
  59.         // Create a Playlist Load command
  60.         CmdPlaylistLoad *pCmd =
  61.             new CmdPlaylistLoad( pIntf, pArg->psz_results[0] );
  62.         // Push the command in the asynchronous command queue
  63.         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
  64.         pQueue->remove( "load playlist" );
  65.         pQueue->push( CmdGenericPtr( pCmd ) );
  66.     }
  67. }
  68. void Dialogs::showPlaylistSaveCB( intf_dialog_args_t *pArg )
  69. {
  70.     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
  71.     if( pArg->i_results && pArg->psz_results[0] )
  72.     {
  73.         // Create a Playlist Save command
  74.         CmdPlaylistSave *pCmd =
  75.             new CmdPlaylistSave( pIntf, pArg->psz_results[0] );
  76.         // Push the command in the asynchronous command queue
  77.         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
  78.         pQueue->remove( "load playlist" );
  79.         pQueue->push( CmdGenericPtr( pCmd ) );
  80.     }
  81. }
  82. /// Callback called when the popup menu is requested
  83. static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
  84.                         vlc_value_t old_val, vlc_value_t new_val, void *param )
  85. {
  86.     Dialogs *p_dialogs = (Dialogs *)param;
  87.     p_dialogs->showPopupMenu( new_val.b_bool );
  88.     return VLC_SUCCESS;
  89. }
  90. Dialogs::Dialogs( intf_thread_t *pIntf ):
  91.     SkinObject( pIntf ), m_pProvider( NULL ), m_pModule( NULL )
  92. {
  93. }
  94. Dialogs::~Dialogs()
  95. {
  96.     if( m_pProvider && m_pModule )
  97.     {
  98.         // Detach the dialogs provider from its parent interface
  99.         vlc_object_detach( m_pProvider );
  100.         module_Unneed( m_pProvider, m_pModule );
  101.         vlc_object_destroy( m_pProvider );
  102.     }
  103.     /* Unregister callbacks */
  104.     var_DelCallback( getIntf()->p_sys->p_playlist, "intf-popupmenu",
  105.                      PopupMenuCB, this );
  106. }
  107. Dialogs *Dialogs::instance( intf_thread_t *pIntf )
  108. {
  109.     if( ! pIntf->p_sys->p_dialogs )
  110.     {
  111.         Dialogs *pDialogs = new Dialogs( pIntf );
  112.         if( pDialogs->init() )
  113.         {
  114.             // Initialization succeeded
  115.             pIntf->p_sys->p_dialogs = pDialogs;
  116.         }
  117.         else
  118.         {
  119.             // Initialization failed
  120.             delete pDialogs;
  121.         }
  122.     }
  123.     return pIntf->p_sys->p_dialogs;
  124. }
  125. void Dialogs::destroy( intf_thread_t *pIntf )
  126. {
  127.     if( pIntf->p_sys->p_dialogs )
  128.     {
  129.         delete pIntf->p_sys->p_dialogs;
  130.         pIntf->p_sys->p_dialogs = NULL;
  131.     }
  132. }
  133. bool Dialogs::init()
  134. {
  135.     // Allocate descriptor
  136.     m_pProvider = (intf_thread_t *)vlc_object_create( getIntf(),
  137.                                                       VLC_OBJECT_DIALOGS );
  138.     if( m_pProvider == NULL )
  139.     {
  140.         msg_Err( getIntf(), "out of memory" );
  141.         return false;
  142.     }
  143.     m_pModule = module_Need( m_pProvider, "dialogs provider", NULL, 0 );
  144.     if( m_pModule == NULL )
  145.     {
  146.         msg_Err( getIntf(), "No suitable dialogs provider found" );
  147.         vlc_object_destroy( m_pProvider );
  148.         m_pProvider = NULL;
  149.         return false;
  150.     }
  151.     // Attach the dialogs provider to its parent interface
  152.     vlc_object_attach( m_pProvider, getIntf() );
  153.     // Initialize dialogs provider
  154.     // (returns as soon as initialization is done)
  155.     if( m_pProvider->pf_run )
  156.     {
  157.         m_pProvider->pf_run( m_pProvider );
  158.     }
  159.     /* Register callback for the intf-popupmenu variable */
  160.     var_AddCallback( getIntf()->p_sys->p_playlist, "intf-popupmenu",
  161.                      PopupMenuCB, this );
  162.     return true;
  163. }
  164. void Dialogs::showFileGeneric( const string &rTitle, const string &rExtensions,
  165.                                DlgCallback callback, int flags )
  166. {
  167.     if( m_pProvider && m_pProvider->pf_show_dialog )
  168.     {
  169.         intf_dialog_args_t *p_arg =
  170.             (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
  171.         memset( p_arg, 0, sizeof(intf_dialog_args_t) );
  172.         p_arg->psz_title = strdup( rTitle.c_str() );
  173.         p_arg->psz_extensions = strdup( rExtensions.c_str() );
  174.         p_arg->b_save = flags & kSAVE;
  175.         p_arg->b_multiple = flags & kMULTIPLE;
  176.         p_arg->p_arg = getIntf();
  177.         p_arg->pf_callback = callback;
  178.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_GENERIC,
  179.                                      0, p_arg );
  180.     }
  181. }
  182. void Dialogs::showChangeSkin()
  183. {
  184.     showFileGeneric( _("Open a skin file"),
  185.                      _("Skin files (*.vlt)|*.vlt|Skin files (*.xml)|*.xml|"),
  186.                      showChangeSkinCB, kOPEN );
  187. }
  188. void Dialogs::showPlaylistLoad()
  189. {
  190.     showFileGeneric( _("Open playlist"),
  191.                      _("All playlists|*.pls;*.m3u;*.asx;*.b4s|M3U files|*.m3u"),
  192.                      showPlaylistLoadCB, kOPEN );
  193. }
  194. void Dialogs::showPlaylistSave()
  195. {
  196.     showFileGeneric( _("Save playlist"), _("M3U file|*.m3u"),
  197.                      showPlaylistSaveCB, kSAVE );
  198. }
  199. void Dialogs::showFileSimple( bool play )
  200. {
  201.     if( m_pProvider && m_pProvider->pf_show_dialog )
  202.     {
  203.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_SIMPLE,
  204.                                      (int)play, 0 );
  205.     }
  206. }
  207. void Dialogs::showFile( bool play )
  208. {
  209.     if( m_pProvider && m_pProvider->pf_show_dialog )
  210.     {
  211.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE,
  212.                                      (int)play, 0 );
  213.     }
  214. }
  215. void Dialogs::showDisc( bool play )
  216. {
  217.     if( m_pProvider && m_pProvider->pf_show_dialog )
  218.     {
  219.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_DISC,
  220.                                      (int)play, 0 );
  221.     }
  222. }
  223. void Dialogs::showNet( bool play )
  224. {
  225.     if( m_pProvider && m_pProvider->pf_show_dialog )
  226.     {
  227.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_NET,
  228.                                      (int)play, 0 );
  229.     }
  230. }
  231. void Dialogs::showMessages()
  232. {
  233.     if( m_pProvider && m_pProvider->pf_show_dialog )
  234.     {
  235.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_MESSAGES, 0, 0 );
  236.     }
  237. }
  238. void Dialogs::showPrefs()
  239. {
  240.     if( m_pProvider && m_pProvider->pf_show_dialog )
  241.     {
  242.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_PREFS, 0, 0 );
  243.     }
  244. }
  245. void Dialogs::showFileInfo()
  246. {
  247.    if( m_pProvider && m_pProvider->pf_show_dialog )
  248.     {
  249.        m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILEINFO, 0, 0 );
  250.     }
  251. }
  252. void Dialogs::showPopupMenu( bool bShow )
  253. {
  254.     if( m_pProvider && m_pProvider->pf_show_dialog )
  255.     {
  256.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_POPUPMENU,
  257.                                      (int)bShow, 0 );
  258.     }
  259. }