SleepIsDeath/gameSource/buttons.cpp

1660 lines
43 KiB
C++

#include "buttons.h"
#include "ToolTipManager.h"
#include "minorGems/util/stringUtils.h"
#include "minorGems/util/TranslationManager.h"
#include "minorGems/util/log/AppLog.h"
#include <GL/gl.h>
ToolTipButtonGL::ToolTipButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: ButtonGL( inAnchorX, inAnchorY, inWidth, inHeight ),
mTip( NULL ) {
}
ToolTipButtonGL::~ToolTipButtonGL() {
if( mTip != NULL ) {
delete [] mTip;
}
}
void ToolTipButtonGL::setToolTip( const char *inTipTranslationKey,
char inUseTranslationManager ) {
if( mTip != NULL ) {
delete [] mTip;
mTip = NULL;
}
if( inTipTranslationKey != NULL ) {
char *string = (char *)inTipTranslationKey;
if( inUseTranslationManager ) {
string = (char *)TranslationManager::translate(
(char*)inTipTranslationKey );
}
mTip = stringDuplicate( string );
}
}
void ToolTipButtonGL::mouseMoved( double inX, double inY ) {
char oldHover = mHover;
ButtonGL::mouseMoved( inX, inY );
if( mHover && ( ! oldHover || ToolTipManager::getTip() == NULL ) ) {
// mouse newly hovering or tip not set
ToolTipManager::setTip( mTip );
}
else if( !mHover && oldHover ) {
// mouse newly left
ToolTipManager::setTip( NULL );
}
}
void ToolTipButtonGL::mouseDragged( double inX, double inY ) {
char oldHover = mHover;
ButtonGL::mouseDragged( inX, inY );
if( mHover && ( ! oldHover || ToolTipManager::getTip() == NULL ) ) {
// mouse newly hovering, or tip not set
ToolTipManager::setTip( mTip );
}
else if( !mHover && oldHover ) {
// mouse newly left
ToolTipManager::setTip( NULL );
}
}
void ToolTipButtonGL::mouseReleased( double inX, double inY ) {
ButtonGL::mouseReleased( inX, inY );
// always turn tip off after release inside button
// this ensures that tip disappears even if button is completely removed
// (not just disabled) as a result of the button push
// if user moves mouse around in button again, tip will reappear anyway,
// so it's okay.
if( isInside( inX, inY ) ) {
// hide tip
ToolTipManager::setTip( NULL );
}
}
//static rgbaColor white = {{255,255,255,255}};
//static rgbaColor gray = {{128,128,128,255}};
static rgbaColor gray = {{89,89,89,255}};
static rgbaColor black = {{0,0,0,255}};
BorderButtonGL::BorderButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: ToolTipButtonGL( inAnchorX, inAnchorY, inWidth, inHeight ),
mBorderColor( gray ), mFillColor( black ) {
}
void BorderButtonGL::setFillColor( rgbaColor inColor ) {
mFillColor = inColor;
}
void BorderButtonGL::setBorderColor( rgbaColor inColor ) {
mBorderColor = inColor;
}
void BorderButtonGL::drawBorder() {
// 1 pixel wide
glColor4f( mBorderColor.comp.r / 255.0f,
mBorderColor.comp.g / 255.0f, mBorderColor.comp.b / 255.0f, 1);
glBegin( GL_QUADS ); {
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY + mHeight );
glVertex2d( mAnchorX, mAnchorY + mHeight );
}
glEnd();
// fill
glColor4f( mFillColor.comp.r / 255.0f,
mFillColor.comp.g / 255.0f, mFillColor.comp.b / 255.0f, 1 );
glBegin( GL_QUADS ); {
glVertex2d( mAnchorX + 1, mAnchorY + 1 );
glVertex2d( mAnchorX + mWidth - 1, mAnchorY + 1 );
glVertex2d( mAnchorX + mWidth - 1, mAnchorY + mHeight - 1 );
glVertex2d( mAnchorX + 1 , mAnchorY + mHeight - 1 );
}
glEnd();
}
IconButtonGL::IconButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: BorderButtonGL( inAnchorX, inAnchorY, inWidth, inHeight ) {
}
void IconButtonGL::drawPressed() {
drawBorder();
glColor4f( 1, 1, 1, 1 );
drawIcon();
}
void IconButtonGL::drawUnpressed() {
drawBorder();
glColor4f( 1, 1, 1, 1 );
drawIcon();
}
AddButtonGL::AddButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: IconButtonGL( inAnchorX, inAnchorY, inWidth, inHeight ) {
}
void AddButtonGL::drawIcon() {
// a plus
double edgeOffset = mWidth;
if( mHeight > mWidth ) {
edgeOffset = mHeight;
}
edgeOffset *= 0.25;
// round to a whole number of pixels
edgeOffset = (int)( edgeOffset );
glBegin( GL_QUADS ); {
// 1 pixel wide
glVertex2d( mAnchorX + mWidth/2 - 0.5, mAnchorY + edgeOffset );
glVertex2d( mAnchorX + mWidth/2 + 0.5, mAnchorY + edgeOffset );
glVertex2d( mAnchorX + mWidth/2 + 0.5,
mAnchorY + mHeight - edgeOffset );
glVertex2d( mAnchorX + mWidth/2 - 0.5,
mAnchorY + mHeight - edgeOffset );
glVertex2d( mAnchorX + edgeOffset, mAnchorY + mHeight/2 - 0.5 );
glVertex2d( mAnchorX + edgeOffset, mAnchorY + mHeight/2 + 0.5 );
glVertex2d( mAnchorX + mWidth - edgeOffset,
mAnchorY + mHeight/2 + 0.5 );
glVertex2d( mAnchorX + mWidth - edgeOffset,
mAnchorY + mHeight/2 - 0.5 );
}
glEnd();
}
SpriteButtonGL::SpriteButtonGL( Sprite *inSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: BorderButtonGL( inAnchorX, inAnchorY, inWidth, inHeight ),
mSprite( inSprite ),
mSpriteDrawScale( inSpriteDrawScale ),
mColor( NULL ) {
}
SpriteButtonGL::~SpriteButtonGL() {
setSprite( NULL );
if( mColor != NULL ) {
delete mColor;
}
}
void SpriteButtonGL::setColor( Color *inColor ) {
if( mColor != NULL ) {
delete mColor;
}
mColor = inColor;
}
void SpriteButtonGL::setSprite( Sprite *inSprite ) {
if( mSprite != NULL ) {
delete mSprite;
}
mSprite = inSprite;
}
void SpriteButtonGL::drawPressed() {
if( mEnabled ) {
drawBorder();
if( mSprite != NULL ) {
Vector3D pos( mAnchorX + mWidth / 2, mAnchorY + mHeight/2, 0 );
// a bit darker when pressed
Color c( .75, .75, .75, 1 );
if( mColor != NULL ) {
c.r *= mColor->r;
c.g *= mColor->g;
c.b *= mColor->b;
}
mSprite->draw( 0, 0, &pos, mSpriteDrawScale, 1, &c );
}
}
}
void SpriteButtonGL::drawUnpressed() {
if( mEnabled ) {
drawBorder();
if( mSprite != NULL ) {
Vector3D pos( mAnchorX + mWidth / 2, mAnchorY + mHeight/2, 0 );
mSprite->draw( 0, 0, &pos, mSpriteDrawScale, 1, mColor );
}
}
}
ColorButtonGL::ColorButtonGL( rgbaColor inColor,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: BorderButtonGL( inAnchorX, inAnchorY, inWidth, inHeight ),
mLastActionHover( false ) {
setColor( inColor );
}
void ColorButtonGL::setColor( rgbaColor inColor, char inForceDarkBorder ) {
setFillColor( inColor );
// border now identical to fill
setBorderColor( inColor );
/*
// pick a border color that is guaranteed to be seen
int maxComponent = 0;
int i;
for( i=0; i<3; i++ ) {
if( maxComponent < inColor.bytes[i] ) {
maxComponent = inColor.bytes[i];
}
}
int borderAddition = -50;
if( maxComponent < 128 && ! inForceDarkBorder) {
borderAddition = 50;
}
for( i=0; i<3; i++ ) {
int v = (int)( inColor.bytes[i] + borderAddition );
if( v > 255 ) {
v = 255;
}
if( v < 0 ) {
v = 0;
}
inColor.bytes[i] = (unsigned char)v;
}
setBorderColor( inColor );
*/
}
void ColorButtonGL::drawPressed() {
drawBorder();
}
void ColorButtonGL::drawUnpressed() {
drawBorder();
}
char ColorButtonGL::wasLastActionHover() {
return mLastActionHover;
}
void ColorButtonGL::mousePressed( double inX, double inY ) {
BorderButtonGL::mousePressed( inX, inY );
if( isEnabled() ) {
// event
mLastActionHover = false;
fireActionPerformed( this );
}
}
void ColorButtonGL::mouseDragged( double inX, double inY ) {
BorderButtonGL::mouseDragged( inX, inY );
if( isEnabled() && isInside( inX, inY ) ) {
// override pressed behavior, even if press didn't start on us
mPressed = true;
// fire an event
mLastActionHover = false;
fireActionPerformed( this );
}
}
void ColorButtonGL::mouseReleased( double inX, double inY ) {
mLastActionHover = false;
//BorderButtonGL::mouseReleased( inX, inY );
// always unpress on a release
mPressed = false;
if( isEnabled() && isInside( inX, inY ) ) {
// fire an event, even if press didn't start on us
fireActionPerformed( this );
}
// reset for next time
mPressStartedOnUs = false;
}
void ColorButtonGL::mouseMoved( double inX, double inY ) {
BorderButtonGL::mouseMoved( inX, inY );
if( isEnabled() && isInside( inX, inY ) ) {
// fire an event
mLastActionHover = true;
fireActionPerformed( this );
}
}
LeftButtonGL::LeftButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "left.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setBorderColor( black );
setToolTip( "tip_prev" );
}
RightButtonGL::RightButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "right.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setBorderColor( black );
setToolTip( "tip_next" );
}
EditButtonGL::EditButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "edit.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY, inWidth, inHeight ) {
}
CloseButtonGL::CloseButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: KeyEquivButtonGL( new Sprite( "close.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY, inWidth, inHeight,
'w', 'W') {
}
char CloseButtonGL::isInside( double inX, double inY ) {
// slightly bigger to left and above
if( inX >= mAnchorX - 1 && inX < mAnchorX + mWidth
&& inY >= mAnchorY && inY < mAnchorY + mHeight + 1 ) {
return true;
}
else {
return false;
}
}
NoKeyCloseButtonGL::NoKeyCloseButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "close.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY, inWidth, inHeight ) {
}
char NoKeyCloseButtonGL::isInside( double inX, double inY ) {
// slightly bigger to left and above
if( inX >= mAnchorX - 1 && inX < mAnchorX + mWidth
&& inY >= mAnchorY && inY < mAnchorY + mHeight + 1 ) {
return true;
}
else {
return false;
}
}
SmallAddButtonGL::SmallAddButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "smallAdd.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY, inWidth, inHeight ) {
}
QuickDeleteButtonGL::QuickDeleteButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "delete.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY, inWidth, inHeight ) {
}
KeyEquivButtonGL::KeyEquivButtonGL( Sprite *inSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight,
char inKeyA, char inKeyB )
: SpriteButtonGL( inSprite,
inSpriteDrawScale,
inAnchorX, inAnchorY, inWidth, inHeight ),
mKeyA( inKeyA ), mKeyB( inKeyB ) {
}
char KeyEquivButtonGL::isFocused() {
if( !isEnabled() ) {
return false;
}
return true;
}
#include <SDL/SDL_keyboard.h>
SDLMod SDLCALL SDL_GetModState(void);
void KeyEquivButtonGL::keyPressed( unsigned char inKey,
double inX, double inY ) {
if( !isEnabled() ) {
return;
}
char controlDown = false;
SDLMod modState = SDL_GetModState();
if( ( modState & KMOD_CTRL )
||
( modState & KMOD_ALT )
||
( modState & KMOD_META ) ) {
controlDown = true;
}
// 26 is "SUB" which is ctrl-z on some platforms
// 24 is "CAN" which is ctrl-x on some platforms
// 23 is "ETB" which is ctrl-w on some platforms
// 5 is "ENQ" which is ctrl-e on some platforms
// 1 is "SOH" which is ctrl-a on some platforms
// but if alt-z or meta-z held, SUB won't be passed through
if( ( (mKeyA == 'z' ) && inKey == 26 ) ||
( (mKeyA == 'x' ) && inKey == 24 ) ||
( (mKeyA == 'w' ) && inKey == 23 ) ||
( (mKeyA == 'e' ) && inKey == 5 ) ||
( (mKeyA == 'a' ) && inKey == 1 ) ||
( controlDown && ( inKey == mKeyA || inKey == mKeyB ) ) ) {
fireActionPerformed( this );
}
}
UndoButtonGL::UndoButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: KeyEquivButtonGL( new Sprite( "undo.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY, inWidth, inHeight,
'z', 'Z' ) {
setToolTip( "tip_undo" );
}
RedoButtonGL::RedoButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "redo.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setToolTip( "tip_redo" );
}
FlipHButtonGL::FlipHButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "flipH.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setToolTip( "tip_flipH" );
}
FlipVButtonGL::FlipVButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "flipV.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setToolTip( "tip_flipV" );
}
RotateCCWButtonGL::RotateCCWButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "rotateCCW.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setToolTip( "tip_rotateCCW" );
}
RotateCWButtonGL::RotateCWButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "rotateCW.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setToolTip( "tip_rotateCW" );
}
ClearButtonGL::ClearButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "clear.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setToolTip( "tip_clear" );
}
ColorizeButtonGL::ColorizeButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( new Sprite( "colorize.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setToolTip( "tip_colorize" );
}
void SelectableButtonGL::setSelected( char inSelected ) {
mSelected = inSelected;
}
char SelectableButtonGL::getSelected() {
return mSelected;
}
SelectableButtonGL::SelectableButtonGL( Sprite *inSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
// leave room for external border
: SpriteButtonGL( inSprite, inSpriteDrawScale,
inAnchorX + 2, inAnchorY + 2,
inWidth - 4, inHeight - 4 ),
mSelected( false ),
mOuterAnchorX( inAnchorX ), mOuterAnchorY( inAnchorY ),
mOuterWidth( inWidth ), mOuterHeight( inHeight ) {
}
// overrides from BorderButtonGL
void SelectableButtonGL::drawBorder() {
if( mSelected ) {
// 1 pixel wide
glColor4f( mBorderColor.comp.r / 255.0f,
mBorderColor.comp.g / 255.0f,
mBorderColor.comp.b / 255.0f,
1 );
glBegin( GL_QUADS ); {
glVertex2d( mOuterAnchorX, mOuterAnchorY );
glVertex2d( mOuterAnchorX + mOuterWidth, mOuterAnchorY );
glVertex2d( mOuterAnchorX + mOuterWidth,
mOuterAnchorY + mOuterHeight );
glVertex2d( mOuterAnchorX, mOuterAnchorY + mOuterHeight );
}
glEnd();
// fill
glColor4f( mFillColor.comp.r / 255.0f,
mFillColor.comp.g / 255.0f,
mFillColor.comp.b / 255.0f,
1 );
glBegin( GL_QUADS ); {
glVertex2d( mOuterAnchorX + 1, mOuterAnchorY + 1 );
glVertex2d( mOuterAnchorX + mOuterWidth - 1, mOuterAnchorY + 1 );
glVertex2d( mOuterAnchorX + mOuterWidth - 1,
mOuterAnchorY + mOuterHeight - 1 );
glVertex2d( mOuterAnchorX + 1 , mOuterAnchorY + mOuterHeight - 1 );
}
glEnd();
}
// draw internal border
BorderButtonGL::drawBorder();
}
DoublePressSpriteButtonGL::DoublePressSpriteButtonGL(
Sprite *inSprite, Sprite *inConfirmSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( inSprite, inSpriteDrawScale, inAnchorX, inAnchorY,
inWidth, inHeight ),
mOtherSprite( inConfirmSprite ),
mPressedOnce( false ),
mFirstTip( NULL ),
mConfirmTip( NULL ) {
}
DoublePressSpriteButtonGL::~DoublePressSpriteButtonGL() {
delete mOtherSprite;
if( mFirstTip != NULL ) {
delete [] mFirstTip;
}
if( mConfirmTip != NULL ) {
delete [] mConfirmTip;
}
}
/*
void DoublePressSpriteButtonGL::resetPressState() {
if( mPressedOnce ) {
// swap sprites
Sprite *temp = mSprite;
mSprite = mOtherSprite;
mOtherSprite = temp;
mPressedOnce = false;
if( mTip != NULL ) {
delete [] mTip;
if( mFirstTip != NULL ) {
mTip = stringDuplicate( mFirstTip );
}
}
}
}
*/
void DoublePressSpriteButtonGL::setEnabled( char inEnabled ) {
SpriteButtonGL::setEnabled( inEnabled );
if( !inEnabled && mPressedOnce ) {
// swap sprites
Sprite *temp = mSprite;
mSprite = mOtherSprite;
mOtherSprite = temp;
mPressedOnce = false;
if( mTip != NULL ) {
delete [] mTip;
if( mFirstTip != NULL ) {
mTip = stringDuplicate( mFirstTip );
}
}
}
}
void DoublePressSpriteButtonGL::setSprite( Sprite *inSprite ) {
AppLog::warning( "unsupported setSprite called on "
"DoublePressSpriteButtonGL" );
}
// overrides
void DoublePressSpriteButtonGL::setToolTip( const char *inTipTranslationKey ) {
ToolTipButtonGL::setToolTip( inTipTranslationKey );
const char *confirmSuffix =
TranslationManager::translate( "tip_confirm" );
if( mFirstTip != NULL ) {
delete [] mFirstTip;
mFirstTip = NULL;
}
if( mConfirmTip != NULL ) {
delete [] mConfirmTip;
mConfirmTip = NULL;
}
if( mTip != NULL ) {
mFirstTip = stringDuplicate( mTip );
mConfirmTip = autoSprintf( "%s%s", mTip, confirmSuffix );
}
}
void DoublePressSpriteButtonGL::mouseReleased( double inX, double inY ) {
mPressed = false;
if( isEnabled() && isInside( inX, inY ) ) {
if( mPressedOnce ) {
// second press!
mPressedOnce = false;
fireActionPerformed( this );
}
else {
mPressedOnce = true;
// wait for second press
}
// swap sprites
Sprite *temp = mSprite;
mSprite = mOtherSprite;
mOtherSprite = temp;
}
else {
// press outside
if( mPressedOnce ) {
// cancel
mPressedOnce = false;
// swap sprites
Sprite *temp = mSprite;
mSprite = mOtherSprite;
mOtherSprite = temp;
}
}
if( mTip != NULL ) {
delete [] mTip;
if( mPressedOnce && mConfirmTip != NULL ) {
mTip = stringDuplicate( mConfirmTip );
}
else if( mFirstTip != NULL ) {
mTip = stringDuplicate( mFirstTip );
}
if( isEnabled() && isInside( inX, inY ) ) {
ToolTipManager::setTip( mTip );
}
if( !isEnabled() && isInside( inX, inY ) ) {
ToolTipManager::setTip( NULL );
}
}
}
DeleteButtonGL::DeleteButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: DoublePressSpriteButtonGL( new Sprite( "delete.tga", true ),
new Sprite( "confirm.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY,
inWidth, inHeight ) {
}
SendButtonGL::SendButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: DoublePressSpriteButtonGL( new Sprite( "send.tga", true ),
new Sprite( "sendConfirm.tga", true ),
inWidth / 16,
inAnchorX, inAnchorY,
inWidth, inHeight ) {
}
ToggleSpriteButtonGL::ToggleSpriteButtonGL(
Sprite *inSprite, Sprite *inSecondSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( inSprite, inSpriteDrawScale, inAnchorX, inAnchorY,
inWidth, inHeight ),
mOtherSprite( inSecondSprite ),
mState( false ),
mFirstTip( NULL ),
mSecondTip( NULL ) {
}
ToggleSpriteButtonGL::~ToggleSpriteButtonGL() {
delete mOtherSprite;
if( mFirstTip != NULL ) {
delete [] mFirstTip;
}
if( mSecondTip != NULL ) {
delete [] mSecondTip;
}
}
void ToggleSpriteButtonGL::setToolTip( const char *inTipTranslationKey ) {
ToolTipButtonGL::setToolTip( inTipTranslationKey );
if( mFirstTip != NULL ) {
delete [] mFirstTip;
mFirstTip = NULL;
}
if( mTip != NULL ) {
mFirstTip = stringDuplicate( mTip );
}
}
void ToggleSpriteButtonGL::setSecondToolTip(
const char *inTipTranslationKey ) {
if( mSecondTip != NULL ) {
delete [] mSecondTip;
mSecondTip = NULL;
}
if( inTipTranslationKey != NULL ) {
char *string =
(char *)TranslationManager::translate(
(char*)inTipTranslationKey );
mSecondTip = stringDuplicate( string );
}
}
void ToggleSpriteButtonGL::setSprite( Sprite *inSprite ) {
AppLog::warning( "unsupported setSprite called on "
"ToggleSpriteButtonGL" );
}
void ToggleSpriteButtonGL::setState( char inState ) {
if( inState != mState ) {
mState = !mState;
// swap sprites
Sprite *temp = mSprite;
mSprite = mOtherSprite;
mOtherSprite = temp;
if( mTip != NULL ) {
delete [] mTip;
mTip = NULL;
if( mState && mSecondTip != NULL ) {
mTip = stringDuplicate( mSecondTip );
}
else if( mFirstTip != NULL ) {
mTip = stringDuplicate( mFirstTip );
}
}
}
}
// overrides
void ToggleSpriteButtonGL::mouseReleased( double inX, double inY ) {
if( isEnabled() && isInside( inX, inY ) && mPressStartedOnUs ) {
setState( !mState );
if( isEnabled() && isInside( inX, inY ) ) {
ToolTipManager::setTip( mTip );
}
if( !isEnabled() && isInside( inX, inY ) ) {
ToolTipManager::setTip( NULL );
}
}
SpriteButtonGL::mouseReleased( inX, inY );
}
StackSearchButtonGL::StackSearchButtonGL( double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: ToggleSpriteButtonGL( new Sprite( "stack.tga", true ),
new Sprite( "search.tga", true ),
inWidth / 8,
inAnchorX, inAnchorY, inWidth, inHeight ) {
setToolTip( "tip_stackMode" );
setSecondToolTip( "tip_searchMode" );
}
SpriteCellButtonGL::SpriteCellButtonGL( Sprite *inSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: ToolTipButtonGL( inAnchorX, inAnchorY, inWidth, inHeight ),
mSprite( inSprite ),
mBlankSprite( NULL ),
mSpriteDrawScale( inSpriteDrawScale ),
mHighlightOn( false ),
mColor( NULL ), mFireOnDrag( true ), mFireOnRelease( true ) {
}
SpriteCellButtonGL::~SpriteCellButtonGL() {
setSprite( NULL );
if( mColor != NULL ) {
delete mColor;
}
}
void SpriteCellButtonGL::setColor( Color *inColor ) {
if( mColor != NULL ) {
delete mColor;
}
mColor = inColor;
}
void SpriteCellButtonGL::setHighlight( char inHighlightOn ) {
mHighlightOn = inHighlightOn;
}
void SpriteCellButtonGL::setSprite( Sprite *inSprite ) {
if( mSprite != NULL ) {
delete mSprite;
}
mSprite = inSprite;
}
Sprite *SpriteCellButtonGL::getSprite() {
return mSprite;
}
void SpriteCellButtonGL::setBlankSprite( Sprite *inSprite ) {
mBlankSprite = inSprite;
}
void SpriteCellButtonGL::drawPressed() {
// same as unpressed
drawUnpressed();
}
void SpriteCellButtonGL::drawUnpressed() {
if( mEnabled ) {
if( mSprite != NULL ) {
Vector3D pos( mAnchorX + mWidth / 2, mAnchorY + mHeight/2, 0 );
mSprite->draw( 0, 0, &pos, mSpriteDrawScale, 1, mColor );
}
else if( mBlankSprite != NULL ) {
Vector3D pos( mAnchorX + mWidth / 2, mAnchorY + mHeight/2, 0 );
mBlankSprite->draw( 0, 0, &pos, mSpriteDrawScale );
}
if( mHighlightOn ) {
// draw highlight over top
glColor4f( 1,
0, 0, 0.36f );
glBegin( GL_QUADS ); {
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY + mHeight );
glVertex2d( mAnchorX, mAnchorY + mHeight );
}
glEnd();
// draw x to make sure highlight visible
glColor4f( 1, 1, 1, 0.5f );
glBegin( GL_LINES ); {
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY + mHeight );
glVertex2d( mAnchorX + mWidth, mAnchorY );
glVertex2d( mAnchorX, mAnchorY + mHeight );
}
glEnd();
}
}
}
void SpriteCellButtonGL::mousePressed( double inX, double inY ) {
ButtonGL::mousePressed( inX, inY );
if( isEnabled() ) {
// event
fireActionPerformed( this );
}
}
void SpriteCellButtonGL::mouseDragged( double inX, double inY ) {
ButtonGL::mouseDragged( inX, inY );
if( mFireOnDrag && isEnabled() && isInside( inX, inY ) ) {
// override pressed behavior, even if press didn't start on us
mPressed = true;
// fire an event
fireActionPerformed( this );
}
}
void SpriteCellButtonGL::mouseReleased( double inX, double inY ) {
// always unpress on a release
mPressed = false;
if( mFireOnRelease && isEnabled() && isInside( inX, inY ) ) {
// fire an event, even if press didn't start on us
fireActionPerformed( this );
}
// reset for next time
mPressStartedOnUs = false;
}
#include "Song.h"
#include "musicPlayer.h"
// from musicPlayer.cpp
extern char noteToggles[PARTS][S][N][N];
extern int partLengths[PARTS];
extern int partPositions[PARTS];
extern int lastNoteColumnPlayed;
MusicCellButtonGL::MusicCellButtonGL(
Sprite *inSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteCellButtonGL( inSprite, inSpriteDrawScale,
inAnchorX, inAnchorY,
inWidth, inHeight ),
mTimeMark( "timeMark.tga", true ),
mPartNumber( 0 ), mPhraseNumber( 0 ) {
// only fire on press and release
// to avoid firing when press didn't start here
mFireOnDrag = false;
}
void MusicCellButtonGL::setMusicInfo( int inPartNumber, int inPhraseNumber ) {
mPartNumber = inPartNumber;
mPhraseNumber = inPhraseNumber;
}
void MusicCellButtonGL::drawUnpressed() {
if( mEnabled ) {
if( mSprite != NULL ) {
if( partPositions[ mPartNumber ] == mPhraseNumber ) {
Vector3D timePos( mAnchorX + lastNoteColumnPlayed + 1,
mAnchorY + mHeight / 2, 0 );
mTimeMark.draw( 0, 0, &timePos, mSpriteDrawScale );
}
}
}
// draw notes on top
SpriteCellButtonGL::drawUnpressed();
// thin white border, partly transparent
glColor4f( 1,
1, 1, 0.25f );
glBegin( GL_LINE_LOOP ); {
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY + mHeight );
glVertex2d( mAnchorX, mAnchorY + mHeight );
}
glEnd();
}
ScaleToggleButton::ScaleToggleButton(
Sprite *inSprite, Sprite *inSecondSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: ToggleSpriteButtonGL( inSprite, inSecondSprite,
inSpriteDrawScale,
inAnchorX, inAnchorY,
inWidth, inHeight ),
mOnFade( 0 ) {
}
void ScaleToggleButton::setMusicInfo( int inNoteNumber,
int inNotesPerOctave,
int inPartToWatch ) {
mNoteNumber = inNoteNumber;
mNotesPerOctave = inNotesPerOctave;
mPartToWatch = inPartToWatch;
}
Color *ScaleToggleButton::getDrawColor() {
char noteOn = false;
if( mNotesPerOctave > 0 ) {
for( int i=0; i<N && !noteOn; i++ ) {
if( i % mNotesPerOctave == mNoteNumber ) {
// our note!
noteOn = noteOn ||
noteToggles[mPartToWatch][partPositions[mPartToWatch]]
[i][lastNoteColumnPlayed];
}
}
}
char columnChange = false;
if( mLastColumnOn != lastNoteColumnPlayed ) {
columnChange = true;
mLastColumnOn = lastNoteColumnPlayed;
}
Color *c;
if( noteOn && columnChange ) {
// white
c = new Color( 1, 1, 1 );
mOnFade = true;
}
else if( mOnFade > 0 ) {
// gradual fade out after note hit
mOnFade -= 0.1;
if( mOnFade < 0 ) {
mOnFade = 0;
}
Color *cWhite = new Color( 1, 1, 1 );
c = Color::linearSum( cWhite, mColor, mOnFade );
delete cWhite;
}
/*
else if( (noteOn && mOnFade < 1.0 ) ||
(!noteOn && mOnFade > 0 ) ) {
if( noteOn ) {
// instant jump
mOnFade = 1.0;
}
else {
// gradual fade out
mOnFade -= 0.2;
if( mOnFade < 0 ) {
mOnFade = 0;
}
}
Color *cWhite = new Color( 1, 1, 1 );
c = Color::linearSum( cWhite, mColor, mOnFade );
}
*/
else {
// normal
c = mColor->copy();
}
return c;
}
void ScaleToggleButton::drawUnpressed() {
Color *oldColor = mColor;
mColor = getDrawColor();
ToggleSpriteButtonGL::drawUnpressed();
delete mColor;
mColor = oldColor;
}
void ScaleToggleButton::drawPressed() {
Color *oldColor = mColor;
mColor = getDrawColor();
ToggleSpriteButtonGL::drawPressed();
delete mColor;
mColor = oldColor;
}
HighlightColorButtonGL::HighlightColorButtonGL(
rgbaColor inColor,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: ColorButtonGL( inColor, inAnchorX, inAnchorY,
inWidth, inHeight ),
mHighlightOn( false ),
mSelectionOn( false ),
mOverlayOn( false ),
mOverlayTrans( false ) {
}
void HighlightColorButtonGL::setHighlight( char inHighlightOn ) {
mHighlightOn = inHighlightOn;
}
void HighlightColorButtonGL::setSelection( char inSelectionOn ) {
mSelectionOn = inSelectionOn;
}
void HighlightColorButtonGL::setOverlay( char inOverlayOn ) {
mOverlayOn = inOverlayOn;
}
void HighlightColorButtonGL::setOverlayColor( rgbaColor inColor ) {
mOverlayColor = inColor;
}
void HighlightColorButtonGL::setOverlayTrans( char inTrans ) {
mOverlayTrans = inTrans;
}
void HighlightColorButtonGL::drawPressed() {
// same as unpressed
drawUnpressed();
}
void HighlightColorButtonGL::drawCheckerboard( unsigned char inAlpha ) {
double halfWidth = (int)( mWidth / 2 );
double halfHeight = (int)( mHeight / 2 );
glBegin( GL_QUADS ); {
/*
// darker border
glColor4f( 0.32f, 0.32f, 0.32f, inAlpha / 255.0f );
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY + mHeight );
glVertex2d( mAnchorX, mAnchorY + mHeight );
*/
// black inner
glColor4f( 0, 0, 0, inAlpha / 255.0f );
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY + mHeight );
glVertex2d( mAnchorX, mAnchorY + mHeight );
// gray checks on top
glColor4f( 0.1875f, 0.1875f, 0.1875f, 1 );
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + halfWidth, mAnchorY );
glVertex2d( mAnchorX + halfWidth, mAnchorY + halfHeight );
glVertex2d( mAnchorX, mAnchorY + halfHeight );
glVertex2d( mAnchorX + halfWidth + 0.5,
mAnchorY + halfHeight + 0.5 );
glVertex2d( mAnchorX + mWidth,
mAnchorY + halfHeight + 0.5 );
glVertex2d( mAnchorX + mWidth,
mAnchorY + mHeight );
glVertex2d( mAnchorX + halfWidth + 0.5,
mAnchorY + mHeight );
}
glEnd();
}
void HighlightColorButtonGL::drawUnpressed() {
ColorButtonGL::drawUnpressed();
if( mEnabled ) {
if( mHighlightOn ) {
// the term "highlight" is outdated, since it used to be used
// to show transparency mask pixels in the sprite editor
// now a checkerboard is used instead
// draw checkerboard
drawCheckerboard( 255 );
}
if( mOverlayOn && ! mOverlayTrans ) {
// draw color overlay over top
glColor4f( mOverlayColor.comp.r / 255.0f,
mOverlayColor.comp.g / 255.0f,
mOverlayColor.comp.b / 255.0f, 0.5f );
glBegin( GL_QUADS ); {
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY + mHeight );
glVertex2d( mAnchorX, mAnchorY + mHeight );
}
glEnd();
// draw solid, internal box w/border to make sure overlay visible
double gap = 3;
glColor4f( mOverlayColor.comp.r / 255.0f,
mOverlayColor.comp.g / 255.0f,
mOverlayColor.comp.b / 255.0f, 0.5f );
glBegin( GL_QUADS ); {
glVertex2d( mAnchorX + gap, mAnchorY + gap );
glVertex2d( mAnchorX + mWidth - gap, mAnchorY + gap );
glVertex2d( mAnchorX + mWidth - gap,
mAnchorY + mHeight - gap );
glVertex2d( mAnchorX + gap, mAnchorY + mHeight - gap );
}
glEnd();
}
else if( mOverlayOn ) {
// draw trans checkerboard overlay
drawCheckerboard( 128 );
}
if( mSelectionOn ) {
// draw selection over top
glColor4f( 1,
0, 0, 0.36f );
glBegin( GL_QUADS ); {
glVertex2d( mAnchorX, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY );
glVertex2d( mAnchorX + mWidth, mAnchorY + mHeight );
glVertex2d( mAnchorX, mAnchorY + mHeight );
}
glEnd();
// draw internal box to make sure selection visible
double gap = 3;
glColor4f( 0, 0, 0, 0.5f );
glBegin( GL_LINE_LOOP ); {
glVertex2d( mAnchorX + gap, mAnchorY + gap );
glVertex2d( mAnchorX + mWidth - gap, mAnchorY + gap );
glVertex2d( mAnchorX + mWidth - gap,
mAnchorY + mHeight - gap );
glVertex2d( mAnchorX + gap, mAnchorY + mHeight - gap );
}
glEnd();
}
}
}
TwoSpriteButtonGL::TwoSpriteButtonGL( Sprite *inSprite,
Sprite *inFrontSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: SpriteButtonGL( inSprite, inSpriteDrawScale,
inAnchorX, inAnchorY, inWidth, inHeight ),
mFrontSprite( inFrontSprite ) {
}
TwoSpriteButtonGL::~TwoSpriteButtonGL() {
setFrontSprite( NULL );
}
void TwoSpriteButtonGL::setFrontSprite( Sprite *inSprite ) {
if( mFrontSprite != NULL ) {
delete mFrontSprite;
}
mFrontSprite = inSprite;
}
void TwoSpriteButtonGL::drawPressed() {
SpriteButtonGL::drawPressed();
if( mEnabled ) {
if( mFrontSprite != NULL ) {
Vector3D pos( mAnchorX + mWidth / 2, mAnchorY + mHeight/2, 0 );
// a bit darker when pressed
Color c( .75, .75, .75, 1 );
mFrontSprite->draw( 0, 0, &pos, mSpriteDrawScale, 1, &c );
}
}
}
void TwoSpriteButtonGL::drawUnpressed() {
SpriteButtonGL::drawUnpressed();
if( mEnabled ) {
if( mFrontSprite != NULL ) {
Vector3D pos( mAnchorX + mWidth / 2, mAnchorY + mHeight/2, 0 );
mFrontSprite->draw( 0, 0, &pos, mSpriteDrawScale );
}
}
}
DraggableTwoSpriteButtonGL::DraggableTwoSpriteButtonGL(
Sprite *inSprite,
Sprite *inFrontSprite,
double inSpriteDrawScale,
double inAnchorX, double inAnchorY,
double inWidth, double inHeight )
: TwoSpriteButtonGL( inSprite, inFrontSprite, inSpriteDrawScale,
inAnchorX, inAnchorY, inWidth, inHeight ),
mLastActionFromPress( false ) {
}
void DraggableTwoSpriteButtonGL::mousePressed( double inX, double inY ) {
TwoSpriteButtonGL::mousePressed( inX, inY );
if( isEnabled() ) {
mLastActionFromPress = true;
fireActionPerformed( this );
}
}
void DraggableTwoSpriteButtonGL::mouseReleased( double inX, double inY ) {
mLastActionFromPress = false;
TwoSpriteButtonGL::mouseReleased( inX, inY );
}