📄 skin_parser.cpp
字号:
/***************************************************************************** * skin_parser.cpp ***************************************************************************** * Copyright (C) 2004 the VideoLAN team * $Id: skin_parser.cpp 17550 2006-11-08 19:21:58Z ipkiss $ * * Authors: Cyril Deguet <asmax@via.ecp.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#include "skin_parser.hpp"#include "../src/os_factory.hpp"#include "interpreter.hpp"#include <math.h>SkinParser::SkinParser( intf_thread_t *pIntf, const string &rFileName, const string &rPath, bool useDTD, BuilderData *pData ): XMLParser( pIntf, rFileName, useDTD ), m_path( rPath), m_pData(pData), m_ownData(pData == NULL), m_xOffset( 0 ), m_yOffset( 0 ){ // Make sure the data is allocated if( m_pData == NULL ) { m_pData = new BuilderData(); }}SkinParser::~SkinParser(){ if( m_ownData ) { delete m_pData; }}void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ){#define CheckDefault( a, b ) \ if( attr.find(a) == attr.end() ) attr[strdup(a)] = strdup(b);#define RequireDefault( a ) \ if( attr.find(a) == attr.end() ) \ { \ msg_Err( getIntf(), "bad theme (element: %s, missing attribute: %s)", \ rName.c_str(), a ); \ m_errors = true; return; \ } if( rName == "Include" ) { RequireDefault( "file" ); OSFactory *pFactory = OSFactory::instance( getIntf() ); string fullPath = m_path + pFactory->getDirSeparator() + attr["file"]; msg_Dbg( getIntf(), "opening included XML file: %s", fullPath.c_str() ); // FIXME: We do not use the DTD to validate the included XML file, // as the parser seems to dislike it otherwise... SkinParser subParser( getIntf(), fullPath.c_str(), false, m_pData ); subParser.parse(); } else if( rName == "IniFile" ) { RequireDefault( "id" ); RequireDefault( "file" ); const BuilderData::IniFile iniFile( uniqueId( attr["id"] ), attr["file"] ); m_pData->m_listIniFile.push_back( iniFile ); } else if( rName == "Anchor" ) { RequireDefault( "priority" ); CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "points", "(0,0)" ); CheckDefault( "range", "10" ); const BuilderData::Anchor anchor( atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, attr["lefttop"], atoi( attr["range"] ), atoi( attr["priority"] ), attr["points"], m_curLayoutId ); m_pData->m_listAnchor.push_back( anchor ); } else if( rName == "Bitmap" ) { RequireDefault( "id" ); RequireDefault( "file" ); RequireDefault( "alphacolor" ); CheckDefault( "nbframes", "1" ); CheckDefault( "fps", "4" ); m_curBitmapId = uniqueId( attr["id"] ); const BuilderData::Bitmap bitmap( m_curBitmapId, attr["file"], convertColor( attr["alphacolor"] ), atoi( attr["nbframes"] ), atoi( attr["fps"] ) ); m_pData->m_listBitmap.push_back( bitmap ); } else if( rName == "SubBitmap" ) { RequireDefault( "id" ); RequireDefault( "x" ); RequireDefault( "y" ); RequireDefault( "width" ); RequireDefault( "height" ); CheckDefault( "nbframes", "1" ); CheckDefault( "fps", "4" ); const BuilderData::SubBitmap bitmap( uniqueId( attr["id"] ), m_curBitmapId, atoi( attr["x"] ), atoi( attr["y"] ), atoi( attr["width"] ), atoi( attr["height"] ), atoi( attr["nbframes"] ), atoi( attr["fps"] ) ); m_pData->m_listSubBitmap.push_back( bitmap ); } else if( rName == "BitmapFont" ) { RequireDefault( "id" ); RequireDefault( "file" ); CheckDefault( "type", "digits" ); const BuilderData::BitmapFont font( uniqueId( attr["id"] ), attr["file"], attr["type"] ); m_pData->m_listBitmapFont.push_back( font ); } else if( rName == "PopupMenu" ) { RequireDefault( "id" ); m_popupPosList.push_back(0); m_curPopupId = uniqueId( attr["id"] ); const BuilderData::PopupMenu popup( m_curPopupId ); m_pData->m_listPopupMenu.push_back( popup ); } else if( rName == "MenuItem" ) { RequireDefault( "label" ); CheckDefault( "action", "none" ); const BuilderData::MenuItem item( attr["label"], attr["action"], m_popupPosList.back(), m_curPopupId ); m_pData->m_listMenuItem.push_back( item ); m_popupPosList.back()++; } else if( rName == "MenuSeparator" ) { const BuilderData::MenuSeparator sep( m_popupPosList.back(), m_curPopupId ); m_pData->m_listMenuSeparator.push_back( sep ); m_popupPosList.back()++; } else if( rName == "Button" ) { RequireDefault( "up" ); CheckDefault( "id", "none" ); CheckDefault( "visible", "true" ); CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); CheckDefault( "xkeepratio", "false" ); CheckDefault( "ykeepratio", "false" ); CheckDefault( "down", "none" ); CheckDefault( "over", "none" ); CheckDefault( "action", "none" ); CheckDefault( "tooltiptext", "" ); CheckDefault( "help", "" ); const BuilderData::Button button( uniqueId( attr["id"] ), atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, attr["lefttop"], attr["rightbottom"], convertBoolean( attr["xkeepratio"] ), convertBoolean( attr["ykeepratio"] ), attr["visible"], attr["up"], attr["down"], attr["over"], attr["action"], attr["tooltiptext"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; m_pData->m_listButton.push_back( button ); } else if( rName == "Checkbox" ) { RequireDefault( "up1" ); RequireDefault( "up2" ); RequireDefault( "state" ); CheckDefault( "id", "none" ); CheckDefault( "visible", "true" ); CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); CheckDefault( "xkeepratio", "false" ); CheckDefault( "ykeepratio", "false" ); CheckDefault( "down1", "none" ); CheckDefault( "over1", "none" ); CheckDefault( "down2", "none" ); CheckDefault( "over2", "none" ); CheckDefault( "action1", "none" ); CheckDefault( "action2", "none" ); CheckDefault( "tooltiptext1", "" ); CheckDefault( "tooltiptext2", "" ); CheckDefault( "help", "" ); const BuilderData::Checkbox checkbox( uniqueId( attr["id"] ), atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, attr["lefttop"], attr["rightbottom"], convertBoolean( attr["xkeepratio"] ), convertBoolean( attr["ykeepratio"] ), attr["visible"], attr["up1"], attr["down1"], attr["over1"], attr["up2"], attr["down2"], attr["over2"], attr["state"], attr["action1"], attr["action2"], attr["tooltiptext1"], attr["tooltiptext2"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; m_pData->m_listCheckbox.push_back( checkbox ); } else if( rName == "Font" ) { RequireDefault( "id" ); RequireDefault( "file" ); CheckDefault( "size", "12" ); const BuilderData::Font fontData( uniqueId( attr["id"] ), attr["file"], atoi( attr["size"] ) ); m_pData->m_listFont.push_back( fontData ); } else if( rName == "Group" ) { CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); m_xOffset += atoi( attr["x"] ); m_yOffset += atoi( attr["y"] ); m_xOffsetList.push_back( atoi( attr["x"] ) ); m_yOffsetList.push_back( atoi( attr["y"] ) ); } else if( rName == "Image" ) { RequireDefault( "image" ); CheckDefault( "id", "none" ); CheckDefault( "visible", "true" ); CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); CheckDefault( "xkeepratio", "false" ); CheckDefault( "ykeepratio", "false" ); CheckDefault( "action", "none" ); CheckDefault( "action2", "none" ); CheckDefault( "resize", "mosaic" ); CheckDefault( "help", "" ); const BuilderData::Image imageData( uniqueId( attr["id"] ), atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, attr["lefttop"], attr["rightbottom"], convertBoolean( attr["xkeepratio"] ), convertBoolean( attr["ykeepratio"] ), attr["visible"], attr["image"], attr["action"], attr["action2"], attr["resize"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; m_pData->m_listImage.push_back( imageData ); } else if( rName == "Layout" ) { RequireDefault( "width" ); RequireDefault( "height" ); CheckDefault( "id", "none" ); CheckDefault( "minwidth", "-1" ); CheckDefault( "maxwidth", "-1" ); CheckDefault( "minheight", "-1" ); CheckDefault( "maxheight", "-1" ); m_curLayoutId = uniqueId( attr["id"] ); const BuilderData::Layout layout( m_curLayoutId, atoi( attr["width"] ), atoi( attr["height"] ), atoi( attr["minwidth"] ), atoi( attr["maxwidth"] ), atoi( attr["minheight"] ), atoi( attr["maxheight"] ), m_curWindowId ); m_pData->m_listLayout.push_back( layout ); m_curLayer = 0; } else if( rName == "Playlist" ) { RequireDefault( "id" ); RequireDefault( "font" ); CheckDefault( "visible", "true" ); CheckDefault( "flat", "true" ); // only difference here CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); CheckDefault( "width", "0" ); CheckDefault( "height", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); CheckDefault( "xkeepratio", "false" ); CheckDefault( "ykeepratio", "false" ); CheckDefault( "bgimage", "none" ); CheckDefault( "itemimage", "none" ); CheckDefault( "openimage", "none" ); CheckDefault( "closedimage", "none" ); CheckDefault( "fgcolor", "#000000" ); CheckDefault( "playcolor", "#FF0000" ); CheckDefault( "bgcolor1", "#FFFFFF" ); CheckDefault( "bgcolor2", "#FFFFFF" ); CheckDefault( "selcolor", "#0000FF" ); CheckDefault( "help", "" ); m_curListId = uniqueId( attr["id"] ); const BuilderData::Tree treeData( m_curListId, atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, attr["visible"], attr["flat"], atoi( attr["width"]), atoi( attr["height"] ), attr["lefttop"], attr["rightbottom"], convertBoolean( attr["xkeepratio"] ), convertBoolean( attr["ykeepratio"] ), attr["font"], "playtree", attr["bgimage"], attr["itemimage"], attr["openimage"], attr["closedimage"], attr["fgcolor"], attr["playcolor"], attr["bgcolor1"], attr["bgcolor2"], attr["selcolor"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; m_pData->m_listTree.push_back( treeData ); } else if( rName == "Playtree" )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -