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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * theme_repository.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 the VideoLAN team
  5.  * $Id: 04fc44e8c200e9952d9f494df8dcfb7c40c92c4f $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #include "theme_repository.hpp"
  24. #include "os_factory.hpp"
  25. #include "../commands/async_queue.hpp"
  26. #include "../commands/cmd_dialogs.hpp"
  27. #ifdef HAVE_UNISTD_H
  28. #   include <unistd.h>
  29. #elif defined( WIN32 ) && !defined( UNDER_CE )
  30. #   include <direct.h>
  31. #endif
  32. #ifdef HAVE_DIRENT_H
  33. #   include <dirent.h>
  34. #endif
  35. ThemeRepository *ThemeRepository::instance( intf_thread_t *pIntf )
  36. {
  37.     if( pIntf->p_sys->p_repository == NULL )
  38.     {
  39.         pIntf->p_sys->p_repository = new ThemeRepository( pIntf );
  40.     }
  41.     return pIntf->p_sys->p_repository;
  42. }
  43. void ThemeRepository::destroy( intf_thread_t *pIntf )
  44. {
  45.     if( pIntf->p_sys->p_repository )
  46.     {
  47.         delete pIntf->p_sys->p_repository;
  48.         pIntf->p_sys->p_repository = NULL;
  49.     }
  50. }
  51. ThemeRepository::ThemeRepository( intf_thread_t *pIntf ): SkinObject( pIntf )
  52. {
  53.     vlc_value_t val, text;
  54.     // Create a variable to add items in wxwindows popup menu
  55.     var_Create( pIntf, "intf-skins", VLC_VAR_STRING |
  56.                 VLC_VAR_HASCHOICE | VLC_VAR_ISCOMMAND );
  57.     text.psz_string = _("Select skin");
  58.     var_Change( pIntf, "intf-skins", VLC_VAR_SETTEXT, &text, NULL );
  59.     // Scan vlt files in the resource path
  60.     OSFactory *pOsFactory = OSFactory::instance( pIntf );
  61.     list<string> resPath = pOsFactory->getResourcePath();
  62.     list<string>::const_iterator it;
  63.     for( it = resPath.begin(); it != resPath.end(); it++ )
  64.     {
  65.         parseDirectory( *it );
  66.     }
  67.     // Set the callback
  68.     var_AddCallback( pIntf, "intf-skins", changeSkin, this );
  69.     // variable for opening a dialog box to change skins
  70.     var_Create( pIntf, "intf-skins-interactive", VLC_VAR_VOID |
  71.                 VLC_VAR_ISCOMMAND );
  72.     text.psz_string = _("Open skin ...");
  73.     var_Change( pIntf, "intf-skins-interactive", VLC_VAR_SETTEXT, &text, NULL );
  74.     // Set the callback
  75.     var_AddCallback( pIntf, "intf-skins-interactive", changeSkin, this );
  76. }
  77. ThemeRepository::~ThemeRepository()
  78. {
  79.     var_Destroy( getIntf(), "intf-skins" );
  80. }
  81. void ThemeRepository::parseDirectory( const string &rDir_locale )
  82. {
  83.     DIR *pDir;
  84.     char *pszDirContent;
  85.     vlc_value_t val, text;
  86.     // Path separator
  87.     const string &sep = OSFactory::instance( getIntf() )->getDirSeparator();
  88.     // Open the dir
  89.     // FIXME: parseDirectory should be invoked with UTF-8 input instead!!
  90.     string rDir = sFromLocale( rDir_locale );
  91.     pDir = utf8_opendir( rDir.c_str() );
  92.     if( pDir == NULL )
  93.     {
  94.         // An error occurred
  95.         msg_Dbg( getIntf(), "cannot open directory %s", rDir.c_str() );
  96.         return;
  97.     }
  98.     // While we still have entries in the directory
  99.     while( ( pszDirContent = utf8_readdir( pDir ) ) != NULL )
  100.     {
  101.         string name = pszDirContent;
  102.         string extension;
  103.         if( name.size() > 4 )
  104.         {
  105.             extension = name.substr( name.size() - 4, 4 );
  106.         }
  107.         if( extension == ".vlt" || extension == ".wsz" )
  108.         {
  109.             string path = rDir + sep + name;
  110.             msg_Dbg( getIntf(), "found skin %s", path.c_str() );
  111.             // Add the theme in the popup menu
  112.             string shortname = name.substr( 0, name.size() - 4 );
  113.             val.psz_string = strdup( path.c_str() );
  114.             text.psz_string = strdup( shortname.c_str() );
  115.             var_Change( getIntf(), "intf-skins", VLC_VAR_ADDCHOICE, &val,
  116.                         &text );
  117.             free( val.psz_string );
  118.             free( text.psz_string );
  119.         }
  120.         free( pszDirContent );
  121.     }
  122.     closedir( pDir );
  123. }
  124. int ThemeRepository::changeSkin( vlc_object_t *pIntf, char const *pVariable,
  125.                                  vlc_value_t oldval, vlc_value_t newval,
  126.                                  void *pData )
  127. {
  128.     ThemeRepository *pThis = (ThemeRepository*)(pData);
  129.     if( !strcmp( pVariable, "intf-skins-interactive" ) )
  130.     {
  131.         CmdDlgChangeSkin cmd( pThis->getIntf() );
  132.         cmd.execute();
  133.     }
  134.     else if( !strcmp( pVariable, "intf-skins" ) )
  135.     {
  136.         // Try to load the new skin
  137.         CmdChangeSkin *pCmd = new CmdChangeSkin( pThis->getIntf(),
  138.                                                  newval.psz_string );
  139.         AsyncQueue *pQueue = AsyncQueue::instance( pThis->getIntf() );
  140.         pQueue->push( CmdGenericPtr( pCmd ) );
  141.     }
  142.     return VLC_SUCCESS;
  143. }