Blame |
Last modification |
View Log
| RSS feed
#include "ButtonWidget.h"
#include "Image.h"
#include "SysFont.h"
#include "WidgetManager.h"
#include "ButtonListener.h"
using namespace Sexy;
static int gButtonWidgetColors[][3] = {
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{255, 255, 255},
{132, 132, 132},
{212, 212, 212}};
ButtonWidget::ButtonWidget(int theId, ButtonListener* theButtonListener)
{
mId = theId;
mFont = NULL;
mLabelJustify = BUTTON_LABEL_CENTER;
mButtonImage = NULL;
mOverImage = NULL;
mDownImage = NULL;
mDisabledImage = NULL;
mInverted = false;
mBtnNoDraw = false;
mFrameNoDraw = false;
mButtonListener = theButtonListener;
mHasAlpha = true;
mOverAlpha = 0;
mOverAlphaSpeed = 0;
mOverAlphaFadeInSpeed = 0;
SetColors(gButtonWidgetColors, NUM_COLORS);
}
ButtonWidget::~ButtonWidget()
{
delete mFont;
}
void ButtonWidget::SetFont(Font* theFont)
{
delete mFont;
mFont = theFont->Duplicate();
}
bool ButtonWidget::IsButtonDown()
{
return mIsDown && mIsOver && !mDisabled;
}
bool ButtonWidget::HaveButtonImage(Image *theImage, const Rect &theRect)
{
return (theImage!=NULL || theRect.mWidth!=0);
}
void ButtonWidget::DrawButtonImage(Graphics *g, Image *theImage, const Rect &theRect, int x, int y)
{
if (theRect.mWidth != 0)
g->DrawImage(mButtonImage,x,y,theRect);
else
g->DrawImage(theImage,x,y);
}
void ButtonWidget::Draw(Graphics* g)
{
if (mBtnNoDraw)
return;
if ((mFont == NULL) && (mLabel.length() > 0))
mFont = new SysFont(mWidgetManager->mApp, "Arial Unicode MS", 10);
bool isDown = mIsDown && mIsOver && !mDisabled;
isDown ^= mInverted;
int aFontX = 0; // BUTTON_LABEL_LEFT
int aFontY = 0;
if (mFont != NULL)
{
if (mLabelJustify == BUTTON_LABEL_CENTER)
aFontX = (mWidth - mFont->StringWidth(mLabel))/2;
else if (mLabelJustify == BUTTON_LABEL_RIGHT)
aFontX = mWidth - mFont->StringWidth(mLabel);
aFontY = (mHeight + mFont->GetAscent() - mFont->GetAscent()/6 - 1)/2;
//aFontX = (mWidth - mFont->StringWidth(mLabel))/2;
//aFontY = (mHeight - mFont->GetHeight())/2 + mFont->GetAscent() - 1;
}
g->SetFont(mFont);
if ((mButtonImage == NULL) && (mDownImage == NULL))
{
if (!mFrameNoDraw)
{
g->SetColor(mColors[COLOR_BKG]);
g->FillRect(0, 0, mWidth, mHeight);
}
if (isDown)
{
if (!mFrameNoDraw)
{
g->SetColor(mColors[COLOR_DARK_OUTLINE]);
g->FillRect(0, 0, mWidth-1, 1);
g->FillRect(0, 0, 1, mHeight-1);
g->SetColor(mColors[COLOR_LIGHT_OUTLINE]);
g->FillRect(0, mHeight - 1, mWidth, 1);
g->FillRect(mWidth - 1, 0, 1, mHeight);
g->SetColor(mColors[COLOR_MEDIUM_OUTLINE]);
g->FillRect(1, 1, mWidth - 3, 1);
g->FillRect(1, 1, 1, mHeight - 3);
}
if (mIsOver)
g->SetColor(mColors[COLOR_LABEL_HILITE]);
else
g->SetColor(mColors[COLOR_LABEL]);
g->DrawString(mLabel, aFontX+1, aFontY+1);
}
else
{
if (!mFrameNoDraw)
{
g->SetColor(mColors[COLOR_LIGHT_OUTLINE]);
g->FillRect(0, 0, mWidth-1, 1);
g->FillRect(0, 0, 1, mHeight-1);
g->SetColor(mColors[COLOR_DARK_OUTLINE]);
g->FillRect(0, mHeight - 1, mWidth, 1);
g->FillRect(mWidth - 1, 0, 1, mHeight);
g->SetColor(mColors[COLOR_MEDIUM_OUTLINE]);
g->FillRect(1, mHeight - 2, mWidth - 2, 1);
g->FillRect(mWidth - 2, 1, 1, mHeight - 2);
}
if (mIsOver)
g->SetColor(mColors[COLOR_LABEL_HILITE]);
else
g->SetColor(mColors[COLOR_LABEL]);
g->DrawString(mLabel, aFontX, aFontY);
}
}
else
{
if (!isDown)
{
if (mDisabled && HaveButtonImage(mDisabledImage,mDisabledRect))
DrawButtonImage(g,mDisabledImage,mDisabledRect,0,0);
else if ((mOverAlpha > 0) && HaveButtonImage(mOverImage,mOverRect))
{
if (HaveButtonImage(mButtonImage, mNormalRect) && mOverAlpha<1)
DrawButtonImage(g,mButtonImage,mNormalRect,0,0);
g->SetColorizeImages(true);
g->SetColor(Color(255,255,255,(int)(mOverAlpha * 255)));
DrawButtonImage(g,mOverImage,mOverRect,0,0);
g->SetColorizeImages(false);
}
else if ((mIsOver || mIsDown) && HaveButtonImage(mOverImage,mOverRect))
{
DrawButtonImage(g,mOverImage,mOverRect,0,0);
}
else if (HaveButtonImage(mButtonImage,mNormalRect))
DrawButtonImage(g,mButtonImage,mNormalRect,0,0);
if (mIsOver)
g->SetColor(mColors[COLOR_LABEL_HILITE]);
else
g->SetColor(mColors[COLOR_LABEL]);
g->DrawString(mLabel, aFontX, aFontY);
}
else
{
if (HaveButtonImage(mDownImage, mDownRect))
DrawButtonImage(g, mDownImage, mDownRect, 0, 0);
else if (HaveButtonImage(mOverImage,mOverRect))
DrawButtonImage(g, mOverImage, mOverRect, 1, 1);
else
DrawButtonImage(g, mButtonImage, mNormalRect, 1, 1);
g->SetColor(mColors[COLOR_LABEL_HILITE]);
g->DrawString(mLabel, aFontX+1, aFontY+1);
}
}
}
void ButtonWidget::SetDisabled(bool isDisabled)
{
Widget::SetDisabled(isDisabled);
if (HaveButtonImage(mDisabledImage,mDisabledRect))
MarkDirty();
}
void ButtonWidget::MouseEnter()
{
Widget::MouseEnter();
if (mOverAlphaFadeInSpeed==0 && mOverAlpha>0)
mOverAlpha = 0;
if (mIsDown || (HaveButtonImage(mOverImage,mOverRect)) || (mColors[COLOR_LABEL_HILITE] != mColors[COLOR_LABEL]))
MarkDirty();
mButtonListener->ButtonMouseEnter(mId);
}
void ButtonWidget::MouseLeave()
{
Widget::MouseLeave();
if (mOverAlphaSpeed==0 && mOverAlpha>0)
mOverAlpha = 0;
else if (mOverAlphaSpeed>0 && mOverAlpha==0) // fade out from full
mOverAlpha = 1;
if (mIsDown || HaveButtonImage(mOverImage,mOverRect) || (mColors[COLOR_LABEL_HILITE] != mColors[COLOR_LABEL]))
MarkDirty();
mButtonListener->ButtonMouseLeave(mId);
}
void ButtonWidget::MouseMove(int theX, int theY)
{
Widget::MouseMove(theX, theY);
mButtonListener->ButtonMouseMove(mId, theX, theY);
}
void ButtonWidget::MouseDown(int theX, int theY, int theBtnNum, int theClickCount)
{
Widget::MouseDown(theX, theY, theBtnNum, theClickCount);
mButtonListener->ButtonPress(mId, theClickCount);
MarkDirty();
}
void ButtonWidget::MouseUp(int theX, int theY, int theBtnNum, int theClickCount)
{
Widget::MouseUp(theX, theY, theBtnNum, theClickCount);
if (mIsOver && mWidgetManager->mHasFocus)
mButtonListener->ButtonDepress(mId);
MarkDirty();
}
void ButtonWidget::Update()
{
Widget::Update();
if (mIsDown && mIsOver)
mButtonListener->ButtonDownTick(mId);
if (!mIsDown && !mIsOver && (mOverAlpha > 0))
{
if (mOverAlphaSpeed>0)
{
mOverAlpha -= mOverAlphaSpeed;
if (mOverAlpha < 0)
mOverAlpha = 0;
}
else
mOverAlpha = 0;
MarkDirty();
}
else if (mIsOver && mOverAlphaFadeInSpeed>0 && mOverAlpha<1)
{
mOverAlpha += mOverAlphaFadeInSpeed;
if (mOverAlpha > 1)
mOverAlpha = 1;
MarkDirty();
}
}