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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * theme.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: af7c2f9a2f497b47fde01dff67bd23d855c0e94f $
  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 "theme.hpp"
  25. #include "top_window.hpp"
  26. #include <sstream>
  27. Theme::~Theme()
  28. {
  29.     // Be sure things are destroyed in the right order (XXX check)
  30.     m_layouts.clear();
  31.     m_controls.clear();
  32.     m_windows.clear();
  33.     m_bitmaps.clear();
  34.     m_fonts.clear();
  35.     m_commands.clear();
  36.     m_vars.clear();
  37.     m_curves.clear();
  38. }
  39. void Theme::loadConfig()
  40. {
  41.     msg_Dbg( getIntf(), "loading theme configuration");
  42.     // Get config from vlcrc file
  43.     char *save = config_GetPsz( getIntf(), "skins2-config" );
  44.     if( !save ) return;
  45.     // Is there an existing config?
  46.     if( !strcmp( save, "" ) )
  47.     {
  48.         // Show the windows as indicated by the XML file
  49.         m_windowManager.showAll( true );
  50.         return;
  51.     }
  52.     istringstream inStream(save);
  53.     free( save );
  54.     char sep;
  55.     string winId, layId;
  56.     int x, y, width, height, visible;
  57.     bool somethingVisible = false;
  58.     while( !inStream.eof() )
  59.     {
  60.         inStream >> sep;
  61.         if( sep != '[' ) goto invalid;
  62.         inStream >> winId >> layId >> x >> y >> width >> height >> visible >> sep >> ws;
  63.         if( sep != ']' ) goto invalid;
  64.         // Try to find the window and the layout
  65.         map<string, TopWindowPtr>::const_iterator itWin;
  66.         map<string, GenericLayoutPtr>::const_iterator itLay;
  67.         itWin = m_windows.find( winId );
  68.         itLay = m_layouts.find( layId );
  69.         if( itWin == m_windows.end() || itLay == m_layouts.end() )
  70.         {
  71.             goto invalid;
  72.         }
  73.         TopWindow *pWin = itWin->second.get();
  74.         GenericLayout *pLayout = itLay->second.get();
  75.         // Restore the layout
  76.         m_windowManager.setActiveLayout( *pWin, *pLayout );
  77.         if( pLayout->getWidth() != width ||
  78.             pLayout->getHeight() != height )
  79.         {
  80.             // XXX FIXME XXX: big kludge
  81.             // As resizing a hidden window causes some trouble (at least on
  82.             // Windows), first show the window off screen, resize it, and
  83.             // hide it again.
  84.             // This has to be investigated more deeply!
  85.             m_windowManager.startMove( *pWin );
  86.             m_windowManager.move( *pWin, -width - pLayout->getWidth(), 0);
  87.             m_windowManager.stopMove();
  88.             m_windowManager.show( *pWin );
  89.             m_windowManager.startResize( *pLayout, WindowManager::kResizeSE );
  90.             m_windowManager.resize( *pLayout, width, height );
  91.             m_windowManager.stopResize();
  92.             m_windowManager.hide( *pWin );
  93.         }
  94.         // Move the window (which incidentally takes care of the anchoring)
  95.         m_windowManager.startMove( *pWin );
  96.         m_windowManager.move( *pWin, x, y );
  97.         m_windowManager.stopMove();
  98.         if( visible )
  99.         {
  100.             somethingVisible = true;
  101.             m_windowManager.show( *pWin );
  102.         }
  103.     }
  104.     if( !somethingVisible )
  105.     {
  106.         goto invalid;
  107.     }
  108.     return;
  109. invalid:
  110.     msg_Warn( getIntf(), "invalid config: %s", inStream.str().c_str() );
  111.     // Restore the visibility defined in the theme
  112.     m_windowManager.showAll( true );
  113. }
  114. void Theme::saveConfig()
  115. {
  116.     msg_Dbg( getIntf(), "saving theme configuration");
  117.     map<string, TopWindowPtr>::const_iterator itWin;
  118.     map<string, GenericLayoutPtr>::const_iterator itLay;
  119.     ostringstream outStream;
  120.     for( itWin = m_windows.begin(); itWin != m_windows.end(); itWin++ )
  121.     {
  122.         TopWindow *pWin = itWin->second.get();
  123.         // Find the layout id for this window
  124.         string layoutId;
  125.         const GenericLayout *pLayout = &pWin->getActiveLayout();
  126.         for( itLay = m_layouts.begin(); itLay != m_layouts.end(); itLay++ )
  127.         {
  128.             if( itLay->second.get() == pLayout )
  129.             {
  130.                 layoutId = itLay->first;
  131.             }
  132.         }
  133.         outStream << '[' << itWin->first << ' ' << layoutId << ' '
  134.             << pWin->getLeft() << ' ' << pWin->getTop() << ' '
  135.             << pLayout->getWidth() << ' ' << pLayout->getHeight() << ' '
  136.             << (pWin->getVisibleVar().get() ? 1 : 0) << ']';
  137.     }
  138.     // Save config to file
  139.     config_PutPsz( getIntf(), "skins2-config", outStream.str().c_str() );
  140. }
  141. // Useful macro
  142. #define FIND_OBJECT( mapData, mapName ) 
  143.     map<string, mapData>::const_iterator it; 
  144.     it = mapName.find( id ); 
  145.     if( it == mapName.end() ) 
  146.     { 
  147.         return NULL; 
  148.     } 
  149.     return (*it).second.get();
  150. // This macro takes an ID of the form "id1;id2;id3", and returns the object
  151. // corresponding to the first valid ID. If no ID is valid, it returns NULL.
  152. // XXX: should we use a template method instead?
  153. #define FIND_FIRST_OBJECT( mapDataPtr, mapName ) 
  154.     string rightPart = id; 
  155.     string::size_type pos; 
  156.     do 
  157.     { 
  158.         pos = rightPart.find( ";" ); 
  159.         string leftPart = rightPart.substr( 0, pos ); 
  160.         map<string, mapDataPtr>::const_iterator it = mapName.find( leftPart ); 
  161.         if( it != mapName.end() ) 
  162.         { 
  163.             return (*it).second.get(); 
  164.             break; 
  165.         } 
  166.  
  167.         if( pos != string::npos ) 
  168.         { 
  169.             rightPart = rightPart.substr( pos, rightPart.size() ); 
  170.             rightPart = 
  171.                 rightPart.substr( rightPart.find_first_not_of( " t;" ), 
  172.                                   rightPart.size() ); 
  173.         } 
  174.     } 
  175.     while( pos != string::npos ); 
  176.     return NULL;
  177. GenericBitmap *Theme::getBitmapById( const string &id ) const
  178. {
  179.     FIND_FIRST_OBJECT( GenericBitmapPtr, m_bitmaps );
  180. }
  181. GenericFont *Theme::getFontById( const string &id ) const
  182. {
  183.     FIND_FIRST_OBJECT( GenericFontPtr, m_fonts );
  184. }
  185. Popup *Theme::getPopupById( const string &id ) const
  186. {
  187.     FIND_OBJECT( PopupPtr, m_popups );
  188. }
  189. TopWindow *Theme::getWindowById( const string &id ) const
  190. {
  191.     FIND_OBJECT( TopWindowPtr, m_windows );
  192. }
  193. GenericLayout *Theme::getLayoutById( const string &id ) const
  194. {
  195.     FIND_OBJECT( GenericLayoutPtr, m_layouts );
  196. }
  197. CtrlGeneric *Theme::getControlById( const string &id ) const
  198. {
  199.     FIND_OBJECT( CtrlGenericPtr, m_controls );
  200. }
  201. Position *Theme::getPositionById( const string &id ) const
  202. {
  203.     FIND_OBJECT( PositionPtr, m_positions );
  204. }