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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * theme_repository.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: theme_repository.cpp 8513 2004-08-24 19:01:32Z asmax $
  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., 59 Temple Place - Suite 330, Boston, MA  02111, 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 )
  30. #   include <direct.h>
  31. #endif
  32. #if (!defined( WIN32 ) || defined(__MINGW32__))
  33. /* Mingw has its own version of dirent */
  34. #   include <dirent.h>
  35. #endif
  36. const char *ThemeRepository::kOpenDialog = "{openSkin}";
  37. ThemeRepository *ThemeRepository::instance( intf_thread_t *pIntf )
  38. {
  39.     if( pIntf->p_sys->p_repository == NULL )
  40.     {
  41.         pIntf->p_sys->p_repository = new ThemeRepository( pIntf );
  42.     }
  43.     return pIntf->p_sys->p_repository;
  44. }
  45. void ThemeRepository::destroy( intf_thread_t *pIntf )
  46. {
  47.     if( pIntf->p_sys->p_repository )
  48.     {
  49.         delete pIntf->p_sys->p_repository;
  50.         pIntf->p_sys->p_repository = NULL;
  51.     }
  52. }
  53. ThemeRepository::ThemeRepository( intf_thread_t *pIntf ): SkinObject( pIntf )
  54. {
  55.     vlc_value_t val, text;
  56.     // Create a variable to add items in wxwindows popup menu
  57.     var_Create( pIntf, "intf-skins", VLC_VAR_STRING |
  58.                 VLC_VAR_HASCHOICE | VLC_VAR_ISCOMMAND );
  59.     text.psz_string = _("Select skin");
  60.     var_Change( pIntf, "intf-skins", VLC_VAR_SETTEXT, &text, NULL );
  61.     // Scan vlt files in the resource path
  62.     OSFactory *pOsFactory = OSFactory::instance( pIntf );
  63.     list<string> resPath = pOsFactory->getResourcePath();
  64.     list<string>::const_iterator it;
  65.     for( it = resPath.begin(); it != resPath.end(); it++ )
  66.     {
  67.         parseDirectory( *it );
  68.     }
  69.     // Add an entry for the "open skin" dialog
  70.     val.psz_string = (char*)kOpenDialog;
  71.     text.psz_string = _("Open skin...");
  72.     var_Change( getIntf(), "intf-skins", VLC_VAR_ADDCHOICE, &val,
  73.                 &text );
  74.     // Set the callback
  75.     var_AddCallback( pIntf, "intf-skins", changeSkin, this );
  76. }
  77. ThemeRepository::~ThemeRepository()
  78. {
  79.     var_Destroy( getIntf(), "intf-skins" );
  80. }
  81. void ThemeRepository::parseDirectory( const string &rDir )
  82. {
  83.     DIR *pDir;
  84.     struct dirent *pDirContent;
  85.     vlc_value_t val, text;
  86.     // Path separator
  87.     const string &sep = OSFactory::instance( getIntf() )->getDirSeparator();
  88.     // Open the dir
  89.     pDir = opendir( rDir.c_str() );
  90.     if( pDir == NULL )
  91.     {
  92.         // An error occurred
  93.         msg_Dbg( getIntf(), "Cannot open directory %s", rDir.c_str() );
  94.         return;
  95.     }
  96.     // Get the first directory entry
  97.     pDirContent = readdir( pDir );
  98.     // While we still have entries in the directory
  99.     while( pDirContent != NULL )
  100.     {
  101.         string name = pDirContent->d_name;
  102.         if( name.size() > 4 && name.substr( name.size() - 4, 4 ) == ".vlt" )
  103.         {
  104.             string path = rDir + sep + name;
  105.             msg_Dbg( getIntf(), "found skin %s", path.c_str() );
  106.             // Add the theme in the popup menu
  107.             val.psz_string = (char*)path.c_str();
  108.             text.psz_string = (char*)name.substr(0, name.size() - 4).c_str();
  109.             var_Change( getIntf(), "intf-skins", VLC_VAR_ADDCHOICE, &val,
  110.                         &text );
  111.         }
  112.         pDirContent = readdir( pDir );
  113.     }
  114. }
  115. int ThemeRepository::changeSkin( vlc_object_t *pIntf, char const *pCmd,
  116.                                  vlc_value_t oldval, vlc_value_t newval,
  117.                                  void *pData )
  118. {
  119.     ThemeRepository *pThis = (ThemeRepository*)(pData);
  120.     // Special menu entry for the open skin dialog
  121.     if( !strcmp( newval.psz_string, kOpenDialog ) )
  122.     {
  123.         CmdDlgChangeSkin cmd( pThis->getIntf() );
  124.         cmd.execute();
  125.     }
  126.     else
  127.     {
  128.         // Try to load the new skin
  129.         CmdChangeSkin *pCmd = new CmdChangeSkin( pThis->getIntf(),
  130.                                                  newval.psz_string );
  131.         AsyncQueue *pQueue = AsyncQueue::instance( pThis->getIntf() );
  132.         pQueue->remove( "change skin" );
  133.         pQueue->push( CmdGenericPtr( pCmd ) );
  134.     }
  135.     return VLC_SUCCESS;
  136. }