tge/engine/gui/controls/guiBitmapButtonCtrl.cc
2017-04-17 06:17:10 -06:00

245 lines
6.5 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
//
// Copyright (c) 2001 GarageGames.Com
//-----------------------------------------------------------------------------
//-------------------------------------
//
// Bitmap Button Contrl
// Set 'bitmap' comsole field to base name of bitmaps to use. This control will
// append '_n' for normal
// append '_h' for hilighted
// append '_d' for depressed
//
// if bitmap cannot be found it will use the default bitmap to render.
//
// if the extent is set to (0,0) in the gui editor and appy hit, this control will
// set it's extent to be exactly the size of the normal bitmap (if present)
//
#include "console/console.h"
#include "dgl/dgl.h"
#include "console/consoleTypes.h"
#include "platform/platformAudio.h"
#include "gui/core/guiCanvas.h"
#include "gui/core/guiDefaultControlRender.h"
#include "gui/controls/guiBitmapButtonCtrl.h"
IMPLEMENT_CONOBJECT(GuiBitmapButtonCtrl);
//-------------------------------------
GuiBitmapButtonCtrl::GuiBitmapButtonCtrl()
{
mBitmapName = StringTable->insert("");
mBounds.extent.set(140, 30);
}
//-------------------------------------
void GuiBitmapButtonCtrl::initPersistFields()
{
Parent::initPersistFields();
addField("bitmap", TypeFilename, Offset(mBitmapName, GuiBitmapButtonCtrl));
}
//-------------------------------------
bool GuiBitmapButtonCtrl::onWake()
{
if (! Parent::onWake())
return false;
setActive(true);
setBitmap(mBitmapName);
return true;
}
//-------------------------------------
void GuiBitmapButtonCtrl::onSleep()
{
mTextureNormal = NULL;
mTextureHilight = NULL;
mTextureDepressed = NULL;
Parent::onSleep();
}
//-------------------------------------
ConsoleMethod( GuiBitmapButtonCtrl, setBitmap, void, 3, 3, "(filepath name)")
{
object->setBitmap(argv[2]);
}
//-------------------------------------
void GuiBitmapButtonCtrl::inspectPostApply()
{
// if the extent is set to (0,0) in the gui editor and appy hit, this control will
// set it's extent to be exactly the size of the normal bitmap (if present)
Parent::inspectPostApply();
if ((mBounds.extent.x == 0) && (mBounds.extent.y == 0) && mTextureNormal)
{
TextureObject *texture = (TextureObject *) mTextureNormal;
mBounds.extent.x = texture->bitmapWidth;
mBounds.extent.y = texture->bitmapHeight;
}
}
//-------------------------------------
void GuiBitmapButtonCtrl::setBitmap(const char *name)
{
mBitmapName = StringTable->insert(name);
if(!isAwake())
return;
if (*mBitmapName)
{
char buffer[1024];
char *p;
dStrcpy(buffer, name);
p = buffer + dStrlen(buffer);
mTextureNormal = TextureHandle(buffer, BitmapTexture, true);
if (!mTextureNormal)
{
dStrcpy(p, "_n");
mTextureNormal = TextureHandle(buffer, BitmapTexture, true);
}
dStrcpy(p, "_h");
mTextureHilight = TextureHandle(buffer, BitmapTexture, true);
if (!mTextureHilight)
mTextureHilight = mTextureNormal;
dStrcpy(p, "_d");
mTextureDepressed = TextureHandle(buffer, BitmapTexture, true);
if (!mTextureDepressed)
mTextureDepressed = mTextureHilight;
dStrcpy(p, "_i");
mTextureInactive = TextureHandle(buffer, BitmapTexture, true);
if (!mTextureInactive)
mTextureInactive = mTextureNormal;
}
else
{
mTextureNormal = NULL;
mTextureHilight = NULL;
mTextureDepressed = NULL;
mTextureInactive = NULL;
}
setUpdate();
}
//-------------------------------------
void GuiBitmapButtonCtrl::onRender(Point2I offset, const RectI& updateRect)
{
enum {
NORMAL,
HILIGHT,
DEPRESSED,
INACTIVE
} state = NORMAL;
if (mActive)
{
if (mMouseOver) state = HILIGHT;
if (mDepressed || mStateOn) state = DEPRESSED;
}
else
state = INACTIVE;
switch (state)
{
case NORMAL: renderButton(mTextureNormal, offset, updateRect); break;
case HILIGHT: renderButton(mTextureHilight ? mTextureHilight : mTextureNormal, offset, updateRect); break;
case DEPRESSED: renderButton(mTextureDepressed, offset, updateRect); break;
case INACTIVE: renderButton(mTextureInactive ? mTextureInactive : mTextureNormal, offset, updateRect); break;
}
}
//------------------------------------------------------------------------------
void GuiBitmapButtonCtrl::renderButton(TextureHandle &texture, Point2I &offset, const RectI& updateRect)
{
if (texture)
{
RectI rect(offset, mBounds.extent);
dglClearBitmapModulation();
dglDrawBitmapStretch(texture, rect);
renderChildControls( offset, updateRect);
}
else
Parent::onRender(offset, updateRect);
}
//------------------------------------------------------------------------------
IMPLEMENT_CONOBJECT(GuiBitmapButtonTextCtrl);
void GuiBitmapButtonTextCtrl::onRender(Point2I offset, const RectI& updateRect)
{
enum {
NORMAL,
HILIGHT,
DEPRESSED,
INACTIVE
} state = NORMAL;
if (mActive)
{
if (mMouseOver) state = HILIGHT;
if (mDepressed || mStateOn) state = DEPRESSED;
}
else
state = INACTIVE;
ColorI fontColor = mProfile->mFontColor;
TextureHandle texture;
switch (state)
{
case NORMAL:
texture = mTextureNormal;
fontColor = mProfile->mFontColor;
break;
case HILIGHT:
texture = mTextureHilight;
fontColor = mProfile->mFontColorHL;
break;
case DEPRESSED:
texture = mTextureDepressed;
fontColor = mProfile->mFontColorSEL;
break;
case INACTIVE:
texture = mTextureInactive;
fontColor = mProfile->mFontColorNA;
if(!texture)
texture = mTextureNormal;
break;
}
if (texture)
{
RectI rect(offset, mBounds.extent);
dglClearBitmapModulation();
dglDrawBitmapStretch(texture, rect);
Point2I textPos = offset;
if(mDepressed)
textPos += Point2I(1,1);
// Make sure we take the profile's textOffset into account.
textPos += mProfile->mTextOffset;
dglSetBitmapModulation( fontColor );
renderJustifiedText(textPos, mBounds.extent, mButtonText);
renderChildControls( offset, updateRect);
}
else
Parent::onRender(offset, updateRect);
}