dialogs.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:10k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * dialogs.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: 98f34b8d9fcc8448dde480f77c3780547949037b $
  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. #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. #include "../commands/cmd_playtree.hpp"
  30. #include <vlc_playlist.h>
  31. /// Callback called when a new skin is chosen
  32. void Dialogs::showChangeSkinCB( intf_dialog_args_t *pArg )
  33. {
  34.     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
  35.     if( pArg->i_results )
  36.     {
  37.         if( pArg->psz_results[0] )
  38.         {
  39.             // Create a change skin command
  40.             CmdChangeSkin *pCmd =
  41.                 new CmdChangeSkin( pIntf, sFromLocale( pArg->psz_results[0] ) );
  42.             // Push the command in the asynchronous command queue
  43.             AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
  44.             pQueue->push( CmdGenericPtr( pCmd ) );
  45.         }
  46.     }
  47.     else if( !pIntf->p_sys->p_theme )
  48.     {
  49.         // If no theme is already loaded, it's time to quit!
  50.         CmdQuit *pCmd = new CmdQuit( pIntf );
  51.         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
  52.         pQueue->push( CmdGenericPtr( pCmd ) );
  53.     }
  54. }
  55. void Dialogs::showPlaylistLoadCB( intf_dialog_args_t *pArg )
  56. {
  57.     intf_thread_t *pIntf = (intf_thread_t *)pArg->p_arg;
  58.     if( pArg->i_results && pArg->psz_results[0] )
  59.     {
  60.         // Create a Playlist Load command
  61.         CmdPlaylistLoad *pCmd =
  62.             new CmdPlaylistLoad( pIntf, sFromLocale( pArg->psz_results[0] ) );
  63.         // Push the command in the asynchronous command queue
  64.         AsyncQueue *pQueue = AsyncQueue::instance( pIntf );
  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->push( CmdGenericPtr( pCmd ) );
  79.     }
  80. }
  81. /// Callback called when the popup menu is requested
  82. static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable,
  83.                         vlc_value_t old_val, vlc_value_t new_val, void *param )
  84. {
  85.     Dialogs *p_dialogs = (Dialogs *)param;
  86.     p_dialogs->showPopupMenu( new_val.b_bool != 0, INTF_DIALOG_POPUPMENU );
  87.     return VLC_SUCCESS;
  88. }
  89. Dialogs::Dialogs( intf_thread_t *pIntf ):
  90.     SkinObject( pIntf ), m_pProvider( NULL ), m_pModule( NULL )
  91. {
  92. }
  93. Dialogs::~Dialogs()
  94. {
  95.     if( m_pProvider && m_pModule )
  96.     {
  97.         // Detach the dialogs provider from its parent interface
  98.         vlc_object_detach( m_pProvider );
  99.         module_unneed( m_pProvider, m_pModule );
  100.         vlc_object_release( m_pProvider );
  101.     }
  102.     /* Unregister callbacks */
  103.     var_DelCallback( getIntf()->p_libvlc, "intf-popupmenu",
  104.                      PopupMenuCB, this );
  105. }
  106. Dialogs *Dialogs::instance( intf_thread_t *pIntf )
  107. {
  108.     if( ! pIntf->p_sys->p_dialogs )
  109.     {
  110.         Dialogs *pDialogs = new Dialogs( pIntf );
  111.         if( pDialogs->init() )
  112.         {
  113.             // Initialization succeeded
  114.             pIntf->p_sys->p_dialogs = pDialogs;
  115.         }
  116.         else
  117.         {
  118.             // Initialization failed
  119.             delete pDialogs;
  120.         }
  121.     }
  122.     return pIntf->p_sys->p_dialogs;
  123. }
  124. void Dialogs::destroy( intf_thread_t *pIntf )
  125. {
  126.     if( pIntf->p_sys->p_dialogs )
  127.     {
  128.         delete pIntf->p_sys->p_dialogs;
  129.         pIntf->p_sys->p_dialogs = NULL;
  130.     }
  131. }
  132. bool Dialogs::init()
  133. {
  134.     // Allocate descriptor
  135.     m_pProvider = (intf_thread_t *)vlc_object_create( getIntf(),
  136.                                                     sizeof( intf_thread_t ) );
  137.     if( m_pProvider == NULL )
  138.         return false;
  139.     m_pModule = module_need( m_pProvider, "dialogs provider", NULL, false );
  140.     if( m_pModule == NULL )
  141.     {
  142.         msg_Err( getIntf(), "no suitable dialogs provider found (hint: compile the qt4 plugin, and make sure it is loaded properly)" );
  143.         vlc_object_release( m_pProvider );
  144.         m_pProvider = NULL;
  145.         return false;
  146.     }
  147.     // Attach the dialogs provider to its parent interface
  148.     vlc_object_attach( m_pProvider, getIntf() );
  149.     // Initialize dialogs provider
  150.     // (returns as soon as initialization is done)
  151.     if( m_pProvider->pf_run )
  152.     {
  153.         m_pProvider->pf_run( m_pProvider );
  154.     }
  155.     /* Register callback for the intf-popupmenu variable */
  156.     var_AddCallback( getIntf()->p_libvlc, "intf-popupmenu",
  157.                      PopupMenuCB, this );
  158.     return true;
  159. }
  160. void Dialogs::showFileGeneric( const string &rTitle, const string &rExtensions,
  161.                                DlgCallback callback, int flags )
  162. {
  163.     if( m_pProvider && m_pProvider->pf_show_dialog )
  164.     {
  165.         intf_dialog_args_t *p_arg = (intf_dialog_args_t*)
  166.                                     calloc( 1, sizeof( intf_dialog_args_t ) );
  167.         p_arg->psz_title = strdup( rTitle.c_str() );
  168.         p_arg->psz_extensions = strdup( rExtensions.c_str() );
  169.         p_arg->b_save = flags & kSAVE;
  170.         p_arg->b_multiple = flags & kMULTIPLE;
  171.         p_arg->p_arg = getIntf();
  172.         p_arg->pf_callback = callback;
  173.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_GENERIC,
  174.                                      0, p_arg );
  175.     }
  176. }
  177. void Dialogs::showChangeSkin()
  178. {
  179.     showFileGeneric( _("Open a skin file"),
  180.                      _("Skin files |*.vlt;*.wsz;*.xml"),
  181.                      showChangeSkinCB, kOPEN );
  182. }
  183. void Dialogs::showPlaylistLoad()
  184. {
  185.     showFileGeneric( _("Open playlist"),
  186.                      _("Playlist Files|"EXTENSIONS_PLAYLIST"|"
  187.                        "All Files|*"),
  188.                      showPlaylistLoadCB, kOPEN );
  189. }
  190. void Dialogs::showPlaylistSave()
  191. {
  192.     showFileGeneric( _("Save playlist"), _("XSPF playlist|*.xspf|"
  193.                                            "M3U file|*.m3u|"
  194.                                            "HTML playlist|*.html"),
  195.                      showPlaylistSaveCB, kSAVE );
  196. }
  197. void Dialogs::showPlaylist()
  198. {
  199.     if( m_pProvider && m_pProvider->pf_show_dialog )
  200.     {
  201.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_PLAYLIST,
  202.                                      0, NULL );
  203.     }
  204. }
  205. void Dialogs::showFileSimple( bool play )
  206. {
  207.     if( m_pProvider && m_pProvider->pf_show_dialog )
  208.     {
  209.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE_SIMPLE,
  210.                                      (int)play, NULL );
  211.     }
  212. }
  213. void Dialogs::showFile( bool play )
  214. {
  215.     if( m_pProvider && m_pProvider->pf_show_dialog )
  216.     {
  217.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILE,
  218.                                      (int)play, NULL );
  219.     }
  220. }
  221. void Dialogs::showDirectory( bool play )
  222. {
  223.     if( m_pProvider && m_pProvider->pf_show_dialog )
  224.     {
  225.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_DIRECTORY,
  226.                                      (int)play, NULL );
  227.     }
  228. }
  229. void Dialogs::showDisc( bool play )
  230. {
  231.     if( m_pProvider && m_pProvider->pf_show_dialog )
  232.     {
  233.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_DISC,
  234.                                      (int)play, NULL );
  235.     }
  236. }
  237. void Dialogs::showNet( bool play )
  238. {
  239.     if( m_pProvider && m_pProvider->pf_show_dialog )
  240.     {
  241.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_NET,
  242.                                      (int)play, NULL );
  243.     }
  244. }
  245. void Dialogs::showMessages()
  246. {
  247.     if( m_pProvider && m_pProvider->pf_show_dialog )
  248.     {
  249.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_MESSAGES, 0, NULL );
  250.     }
  251. }
  252. void Dialogs::showPrefs()
  253. {
  254.     if( m_pProvider && m_pProvider->pf_show_dialog )
  255.     {
  256.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_PREFS, 0, NULL );
  257.     }
  258. }
  259. void Dialogs::showFileInfo()
  260. {
  261.     if( m_pProvider && m_pProvider->pf_show_dialog )
  262.     {
  263.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_FILEINFO, 0, NULL );
  264.     }
  265. }
  266. void Dialogs::showStreamingWizard()
  267. {
  268.     if( m_pProvider && m_pProvider->pf_show_dialog )
  269.     {
  270.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_WIZARD, 0, NULL );
  271.     }
  272. }
  273. void Dialogs::showPopupMenu( bool bShow, int popupType = INTF_DIALOG_POPUPMENU )
  274. {
  275.     if( m_pProvider && m_pProvider->pf_show_dialog )
  276.     {
  277.         m_pProvider->pf_show_dialog( m_pProvider, popupType,
  278.                                      (int)bShow, NULL );
  279.     }
  280. }
  281. void Dialogs::showInteraction( interaction_dialog_t *p_dialog )
  282. {
  283.     intf_dialog_args_t *p_arg = (intf_dialog_args_t *)
  284.                                 calloc( 1, sizeof(intf_dialog_args_t) );
  285.     p_arg->p_dialog = p_dialog;
  286.     p_arg->p_intf = getIntf();
  287.     if( m_pProvider && m_pProvider->pf_show_dialog )
  288.     {
  289.         m_pProvider->pf_show_dialog( m_pProvider, INTF_DIALOG_INTERACTION,
  290.                                      0, p_arg );
  291.     }
  292. }