// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdpch.h"
#include "dbview_bar.h"
#include "interface_manager.h"
using namespace NL3D;
CDBViewBar::CDBViewBar : CViewBitmap()
{
}
/**
* parse an xml node and initialize the base view mambers. Must call CViewBase::parse
* \param cur : pointer to the xml node to be parsed
* \param parentGroup : the parent group of the view
* \partam id : a refence to the string that will receive the view ID
* \return true if success
*/
bool CDBViewBar::parse(xmlNodePtr cur,CInterfaceGroup * parentGroup)
{
if (!CViewBitmap::parse(cur,parentGroup))
{
string tmp = "cannot parse view:"+getId()+", parent:"+parentGroup->getId();
nlinfo(tmp.c_str());
return false;
}
//try to get the NEEDED specific props
CXMLAutoPtr prop= (char*) xmlGetProp( cur, (xmlChar*)"range" );
if (prop)
{
_Range.readSInt32(prop,_Id+":range");
}
else
{
string tmp = "cannot getprop:range, view:"+getId()+", parent:"+parentGroup->getId();
nlinfo(tmp.c_str());
return false;
}
prop = (char*) xmlGetProp( cur, (xmlChar*)"rangemax" );
if (prop)
{
_RangeMax.readSInt32(prop,_Id+":rangemax");
}
else
{
string tmp = "cannot getprop:rangemax, view:"+getId()+", parent:"+parentGroup->getId();
nlinfo(tmp.c_str());
return false;
}
prop = (char*) xmlGetProp( cur, (xmlChar*)"vertical" );
if (prop)
_Vertical.readBool (prop, _Id+":vertical");
else
_Vertical.readBool ("false", _Id+":vertical");
return true;
}
/**
* draw the view
*/
void CDBViewBar::draw ()
{
float wBar = (float)_WReal, hBar = (float)_HReal;
if (_Vertical.getBool())
{
if (_RangeMax.getSInt32())
hBar = _HReal * ( (float)_Range.getSInt32() / (float)_RangeMax.getSInt32() );
else
hBar = 0.0f;
}
else
{
if (_RangeMax.getSInt32())
wBar = _WReal * ( (float)_Range.getSInt32() / (float)_RangeMax.getSInt32() );
else
wBar = 0.0f;
}
// Backup scissor and create the new scissor to clip the bar correctly.
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CViewRenderer &rVR = pIM->getViewRenderer();
sint32 oldScissorX, oldScissorY, oldScissorW, oldScissorH;
rVR.getClipWindow (oldScissorX, oldScissorY, oldScissorW, oldScissorH);
sint32 scisX, scisY, scisWidth, scisHeight;
scisX = oldScissorX;
scisY = oldScissorY;
scisWidth = oldScissorW;
scisHeight = oldScissorH;
//the previous scissor must be taken in account.
sint32 xabs = _XReal;
sint32 yabs = _YReal;
if( xabs > scisX )
scisX = xabs;
if( yabs > scisY )
scisY = yabs;
scisWidth = std::min(scisWidth + oldScissorX , (sint32)(xabs + wBar)) - scisX;
scisHeight = std::min(scisHeight + oldScissorY , (sint32)(yabs + hBar)) - scisY;
rVR.setClipWindow (scisX, scisY, scisWidth, scisHeight);
// display progress bitmap
//if (_TextureId == -2)
// _TextureId = rVR.getTextureIdFromName (_TextureName);
rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal,
_WReal, _HReal, (uint8)_Rot, _Flip,
_TextureId, _Color );
// restore old scissor
rVR.setClipWindow (oldScissorX, oldScissorY, oldScissorW, oldScissorH);
}