📄 skin_parser.cpp
字号:
/***************************************************************************** * skin_parser.cpp ***************************************************************************** * Copyright (C) 2004 VideoLAN * $Id: skin_parser.cpp 11009 2005-05-14 14:39:05Z 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/#include "skin_parser.hpp"#include <math.h>SkinParser::SkinParser( intf_thread_t *pIntf, const string &rFileName, const string &rPath ): XMLParser( pIntf, rFileName ), m_xOffset( 0 ), m_yOffset( 0 ), m_path( rPath ){}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 == "Anchor" ) { RequireDefault( "priority" ); CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); CheckDefault( "points", "(0,0)" ); CheckDefault( "range", "10" ); const BuilderData::Anchor anchor( atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, atoi( attr["range"] ), atoi( attr["priority"] ), attr["points"], m_curLayoutId ); m_data.m_listAnchor.push_back( anchor ); } else if( rName == "Bitmap" ) { RequireDefault( "id" ); RequireDefault( "file" ); RequireDefault( "alphacolor" ); const BuilderData::Bitmap bitmap( uniqueId( attr["id"] ), convertFileName( attr["file"] ), convertColor( attr["alphacolor"] ) ); m_data.m_listBitmap.push_back( bitmap ); } else if( rName == "BitmapFont" ) { RequireDefault( "id" ); RequireDefault( "file" ); CheckDefault( "type", "digits" ); const BuilderData::BitmapFont font( uniqueId( attr["id"] ), convertFileName( attr["file"] ), attr["type"] ); m_data.m_listBitmapFont.push_back( font ); } 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( "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"], attr["visible"], attr["up"], attr["down"], attr["over"], attr["action"], attr["tooltiptext"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; m_data.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( "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"], 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_data.m_listCheckbox.push_back( checkbox ); } else if( rName == "Font" ) { RequireDefault( "id" ); RequireDefault( "file" ); CheckDefault( "size", "12" ); const BuilderData::Font fontData( uniqueId( attr["id"] ), convertFileName( attr["file"] ), atoi( attr["size"] ) ); m_data.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( "action", "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"], attr["visible"], attr["image"], attr["action"], attr["resize"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; m_data.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_data.m_listLayout.push_back( layout ); m_curLayer = 0; } else if( rName == "Playlist" ) { RequireDefault( "id" ); RequireDefault( "font" ); CheckDefault( "visible", "true" ); CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); CheckDefault( "width", "0" ); CheckDefault( "height", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); CheckDefault( "bgimage", "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::List listData( m_curListId, atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, attr["visible"], atoi( attr["width"]), atoi( attr["height"] ), attr["lefttop"], attr["rightbottom"], attr["font"], "playlist", attr["bgimage"], convertColor( attr["fgcolor"] ), convertColor( attr["playcolor"] ), convertColor( attr["bgcolor1"] ), convertColor( attr["bgcolor2"] ), convertColor( attr["selcolor"] ), attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; m_data.m_listList.push_back( listData ); } else if( rName == "RadialSlider" ) { RequireDefault( "sequence" ); RequireDefault( "nbimages" ); CheckDefault( "id", "none" ); CheckDefault( "visible", "true" ); CheckDefault( "x", "0" ); CheckDefault( "y", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); CheckDefault( "minangle", "0" );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -