X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fskins2%2Fparser%2Fskin_parser.cpp;h=575735f4ef66b3d1a4c0e14ad44de1f8fced2f20;hb=5c4ccbb149a7a0652ebfcb419047ac3a7e4f4ec3;hp=00f91dd69abf7ee0f9219d10b525eae306da79ab;hpb=fe087a38282e93addb25fa9598393e40ea233b09;p=vlc diff --git a/modules/gui/skins2/parser/skin_parser.cpp b/modules/gui/skins2/parser/skin_parser.cpp index 00f91dd69a..575735f4ef 100644 --- a/modules/gui/skins2/parser/skin_parser.cpp +++ b/modules/gui/skins2/parser/skin_parser.cpp @@ -22,13 +22,28 @@ *****************************************************************************/ #include "skin_parser.hpp" +#include "../src/os_factory.hpp" #include SkinParser::SkinParser( intf_thread_t *pIntf, const string &rFileName, - const string &rPath ): - XMLParser( pIntf, rFileName ), m_xOffset( 0 ), m_yOffset( 0 ), - m_path( rPath ) + 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; + } } @@ -44,7 +59,20 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) m_errors = true; return; \ } - if( rName == "Anchor" ) + 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 == "Anchor" ) { RequireDefault( "priority" ); CheckDefault( "x", "0" ); @@ -55,7 +83,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) 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 ); + m_pData->m_listAnchor.push_back( anchor ); } else if( rName == "Bitmap" ) @@ -64,10 +92,24 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) RequireDefault( "file" ); RequireDefault( "alphacolor" ); - const BuilderData::Bitmap bitmap( uniqueId( attr["id"] ), - convertFileName( attr["file"] ), - convertColor( attr["alphacolor"] ) ); - m_data.m_listBitmap.push_back( bitmap ); + m_curBitmapId = uniqueId( attr["id"] ); + const BuilderData::Bitmap bitmap( m_curBitmapId, + attr["file"], convertColor( attr["alphacolor"] ) ); + m_pData->m_listBitmap.push_back( bitmap ); + } + + else if( rName == "SubBitmap" ) + { + RequireDefault( "id" ); + RequireDefault( "x" ); + RequireDefault( "y" ); + RequireDefault( "width" ); + RequireDefault( "height" ); + + const BuilderData::SubBitmap bitmap( attr["id"], + m_curBitmapId, atoi( attr["x"] ), atoi( attr["y"] ), + atoi( attr["width"] ), atoi( attr["height"] ) ); + m_pData->m_listSubBitmap.push_back( bitmap ); } else if( rName == "BitmapFont" ) @@ -76,10 +118,9 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) RequireDefault( "file" ); CheckDefault( "type", "digits" ); - const BuilderData::BitmapFont font( uniqueId( attr["id"] ), - convertFileName( attr["file"] ), - attr["type"] ); - m_data.m_listBitmapFont.push_back( font ); + const BuilderData::BitmapFont font( attr["id"], + attr["file"], attr["type"] ); + m_pData->m_listBitmapFont.push_back( font ); } else if( rName == "Button" ) @@ -104,7 +145,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) attr["tooltiptext"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; - m_data.m_listButton.push_back( button ); + m_pData->m_listButton.push_back( button ); } else if( rName == "Checkbox" ) @@ -137,7 +178,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) attr["tooltiptext2"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; - m_data.m_listCheckbox.push_back( checkbox ); + m_pData->m_listCheckbox.push_back( checkbox ); } else if( rName == "Font" ) @@ -147,9 +188,8 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) CheckDefault( "size", "12" ); const BuilderData::Font fontData( uniqueId( attr["id"] ), - convertFileName( attr["file"] ), - atoi( attr["size"] ) ); - m_data.m_listFont.push_back( fontData ); + attr["file"], atoi( attr["size"] ) ); + m_pData->m_listFont.push_back( fontData ); } else if( rName == "Group" ) @@ -173,16 +213,17 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); 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"], attr["visible"], - attr["image"], attr["action"], attr["resize"], attr["help"], - m_curLayer, m_curWindowId, m_curLayoutId ); + attr["image"], attr["action"], attr["action2"], attr["resize"], + attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; - m_data.m_listImage.push_back( imageData ); + m_pData->m_listImage.push_back( imageData ); } else if( rName == "Layout" ) @@ -200,7 +241,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) 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_pData->m_listLayout.push_back( layout ); m_curLayer = 0; } @@ -236,7 +277,47 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) convertColor( attr["selcolor"] ), attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; - m_data.m_listList.push_back( listData ); + m_pData->m_listList.push_back( listData ); + } + + else if( rName == "Playtree" ) + { + 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( "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_curTreeId = uniqueId( attr["id"] ); + const BuilderData::Tree treeData( m_curTreeId, atoi( attr["x"] ) + + m_xOffset, atoi( attr["y"] ) + m_yOffset, attr["visible"], + atoi( attr["width"]), atoi( attr["height"] ), + attr["lefttop"], attr["rightbottom"], + attr["font"], "playtree", + attr["bgimage"], attr["itemimage"], + attr["openimage"], attr["closedimage"], + 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_pData->m_listTree.push_back( treeData ); } else if( rName == "RadialSlider" ) @@ -264,7 +345,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) attr["tooltiptext"], attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; - m_data.m_listRadialSlider.push_back( radial ); + m_pData->m_listRadialSlider.push_back( radial ); } else if( rName == "Slider" ) @@ -292,15 +373,38 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) // Slider associated to a list newValue = "playlist.slider"; } + else if( m_curTreeId != "" ) + { + // Slider associated to a tree + newValue = "playtree.slider"; + } const BuilderData::Slider slider( uniqueId( attr["id"] ), - attr["visible"], - atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, - attr["lefttop"], attr["rightbottom"], attr["up"], attr["down"], + attr["visible"], atoi( attr["x"] ) + m_xOffset, + atoi( attr["y"] ) + m_yOffset, attr["lefttop"], + attr["rightbottom"], attr["up"], attr["down"], attr["over"], attr["points"], atoi( attr["thickness"] ), - newValue, attr["tooltiptext"], attr["help"], m_curLayer, - m_curWindowId, m_curLayoutId ); + newValue, "none", 0, 0, 0, 0, attr["tooltiptext"], + attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; - m_data.m_listSlider.push_back( slider ); + m_pData->m_listSlider.push_back( slider ); + } + + else if( rName == "SliderBackground" ) + { + RequireDefault( "image" ); + CheckDefault( "nbhoriz", "1" ); + CheckDefault( "nbvert", "1" ); + CheckDefault( "padhoriz", "0" ); + CheckDefault( "padvert", "0" ); + + // Retrieve the current slider data + BuilderData::Slider &slider = m_pData->m_listSlider.back(); + + slider.m_imageId = attr["image"]; + slider.m_nbHoriz = atoi( attr["nbhoriz"] ); + slider.m_nbVert = atoi( attr["nbvert"] ); + slider.m_padHoriz = atoi( attr["padhoriz"] ); + slider.m_padVert = atoi( attr["padvert"] ); } else if( rName == "Text" ) @@ -312,6 +416,8 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) CheckDefault( "y", "0" ); CheckDefault( "text", "" ); CheckDefault( "color", "#000000" ); + CheckDefault( "scrolling", "auto" ); + CheckDefault( "alignment", "left" ); CheckDefault( "width", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); @@ -322,10 +428,11 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) attr["visible"], attr["font"], attr["text"], atoi( attr["width"] ), attr["lefttop"], attr["rightbottom"], - convertColor( attr["color"] ), attr["help"], m_curLayer, - m_curWindowId, m_curLayoutId ); + convertColor( attr["color"] ), + attr["scrolling"], attr["alignment"], + attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; - m_data.m_listText.push_back( textData ); + m_pData->m_listText.push_back( textData ); } else if( rName == "Theme" ) @@ -348,7 +455,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) atoi( attr["magnet"] ), convertInRange( attr["alpha"], 1, 255, "alpha" ), convertInRange( attr["movealpha"], 1, 255, "movealpha" ) ); - m_data.m_listTheme.push_back( theme ); + m_pData->m_listTheme.push_back( theme ); } else if( rName == "ThemeInfo" ) @@ -367,16 +474,17 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) CheckDefault( "height", "0" ); CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); + CheckDefault( "autoresize", "false" ); CheckDefault( "help", "" ); const BuilderData::Video videoData( uniqueId( attr["id"] ), atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, atoi( attr["width"] ), atoi( attr["height" ]), attr["lefttop"], attr["rightbottom"], - attr["visible"], attr["help"], m_curLayer, - m_curWindowId, m_curLayoutId ); + attr["visible"], convertBoolean( attr["autoresize"] ), + attr["help"], m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; - m_data.m_listVideo.push_back( videoData ); + m_pData->m_listVideo.push_back( videoData ); } else if( rName == "Window" ) @@ -394,7 +502,7 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) convertBoolean( attr["visible"] ), convertBoolean( attr["dragdrop"] ), convertBoolean( attr["playondrop"] ) ); - m_data.m_listWindow.push_back( window ); + m_pData->m_listWindow.push_back( window ); } } @@ -408,11 +516,14 @@ void SkinParser::handleEndElement( const string &rName ) m_xOffsetList.pop_back(); m_yOffsetList.pop_back(); } - else if( rName == "Playlist" ) { m_curListId = ""; } + else if( rName == "Playtree" ) + { + m_curTreeId = ""; + } } @@ -431,12 +542,6 @@ int SkinParser::convertColor( const char *transcolor ) const } -string SkinParser::convertFileName( const char *fileName ) const -{ - return m_path + string( fileName ); -} - - int SkinParser::convertInRange( const char *value, int minValue, int maxValue, const string &rAttribute ) const {