2012-01-19 07:44:59 -06:00
|
|
|
#include <iostream>
|
2012-08-13 15:08:55 -05:00
|
|
|
#include <typeinfo>
|
2012-01-19 07:44:59 -06:00
|
|
|
|
|
|
|
#include "SaveButton.h"
|
2012-06-07 08:23:26 -05:00
|
|
|
#include "client/SaveInfo.h"
|
2012-07-06 10:06:26 -05:00
|
|
|
#include "graphics/Graphics.h"
|
2012-01-19 07:44:59 -06:00
|
|
|
#include "Engine.h"
|
2012-07-31 13:49:08 -05:00
|
|
|
#include "client/ThumbnailBroker.h"
|
2012-04-03 11:08:56 -05:00
|
|
|
#include "simulation/SaveRenderer.h"
|
2012-01-19 07:44:59 -06:00
|
|
|
|
|
|
|
namespace ui {
|
|
|
|
|
2012-06-07 08:23:26 -05:00
|
|
|
SaveButton::SaveButton(Point position, Point size, SaveInfo * save):
|
2012-01-19 07:44:59 -06:00
|
|
|
Component(position, size),
|
2012-06-07 08:23:26 -05:00
|
|
|
file(NULL),
|
2012-01-19 07:44:59 -06:00
|
|
|
save(save),
|
|
|
|
thumbnail(NULL),
|
|
|
|
isMouseInside(false),
|
|
|
|
isButtonDown(false),
|
2012-01-29 11:12:35 -06:00
|
|
|
actionCallback(NULL),
|
2012-04-06 18:45:24 -05:00
|
|
|
voteColour(255, 0, 0),
|
|
|
|
selectable(false),
|
2012-08-13 15:08:55 -05:00
|
|
|
selected(false),
|
2012-08-14 06:03:33 -05:00
|
|
|
waitingForThumb(false),
|
2012-09-10 19:09:22 -05:00
|
|
|
isMouseInsideAuthor(false),
|
|
|
|
MouseInsideHistory(false),
|
|
|
|
showVotes(false)
|
2012-01-19 07:44:59 -06:00
|
|
|
{
|
2012-04-19 09:22:18 -05:00
|
|
|
if(save)
|
|
|
|
{
|
|
|
|
if(save->votesUp==0)
|
|
|
|
voteRatio = 0.0f;
|
|
|
|
else if(save->votesDown==0)
|
|
|
|
voteRatio = 1.0f;
|
|
|
|
else
|
|
|
|
voteRatio = 1.0f-(float)(((float)(save->votesDown))/((float)(save->votesUp)));
|
|
|
|
if(voteRatio < 0.0f)
|
|
|
|
voteRatio = 0.0f;
|
|
|
|
if(voteRatio > 1.0f) //Not possible, but just in case the server were to give a negative value or something
|
|
|
|
voteRatio = 1.0f;
|
2012-01-19 07:44:59 -06:00
|
|
|
|
|
|
|
|
2012-04-19 09:22:18 -05:00
|
|
|
voteColour.Red = (1.0f-voteRatio)*255;
|
|
|
|
voteColour.Green = voteRatio*255;
|
|
|
|
}
|
2012-04-22 11:13:43 -05:00
|
|
|
|
|
|
|
if(save)
|
|
|
|
{
|
|
|
|
name = save->name;
|
|
|
|
if(Graphics::textwidth((char *)name.c_str()) > Size.X)
|
|
|
|
{
|
|
|
|
int position = Graphics::textwidthx((char *)name.c_str(), Size.X - 22);
|
|
|
|
name = name.erase(position, name.length()-position);
|
|
|
|
name += "...";
|
|
|
|
}
|
|
|
|
}
|
2012-01-19 07:44:59 -06:00
|
|
|
}
|
|
|
|
|
2012-06-07 08:23:26 -05:00
|
|
|
SaveButton::SaveButton(Point position, Point size, SaveFile * file):
|
|
|
|
Component(position, size),
|
|
|
|
save(NULL),
|
|
|
|
file(file),
|
|
|
|
thumbnail(NULL),
|
|
|
|
isMouseInside(false),
|
|
|
|
isButtonDown(false),
|
|
|
|
actionCallback(NULL),
|
|
|
|
voteColour(255, 0, 0),
|
|
|
|
selectable(false),
|
2012-07-27 14:06:17 -05:00
|
|
|
selected(false),
|
2012-07-31 13:49:08 -05:00
|
|
|
wantsDraw(false),
|
2012-08-14 06:03:33 -05:00
|
|
|
waitingForThumb(false),
|
2012-09-10 19:09:22 -05:00
|
|
|
isMouseInsideAuthor(false),
|
|
|
|
MouseInsideHistory(false),
|
|
|
|
showVotes(false)
|
2012-06-07 08:23:26 -05:00
|
|
|
{
|
|
|
|
if(file)
|
|
|
|
{
|
2012-07-28 19:33:28 -05:00
|
|
|
name = file->GetDisplayName();
|
2012-06-07 08:23:26 -05:00
|
|
|
if(Graphics::textwidth((char *)name.c_str()) > Size.X)
|
|
|
|
{
|
|
|
|
int position = Graphics::textwidthx((char *)name.c_str(), Size.X - 22);
|
|
|
|
name = name.erase(position, name.length()-position);
|
|
|
|
name += "...";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-19 07:44:59 -06:00
|
|
|
SaveButton::~SaveButton()
|
|
|
|
{
|
2012-07-31 13:49:08 -05:00
|
|
|
ThumbnailBroker::Ref().DetachThumbnailListener(this);
|
|
|
|
|
2012-01-19 07:44:59 -06:00
|
|
|
if(thumbnail)
|
|
|
|
delete thumbnail;
|
2012-01-20 17:52:19 -06:00
|
|
|
if(actionCallback)
|
|
|
|
delete actionCallback;
|
2012-01-20 18:17:42 -06:00
|
|
|
if(save)
|
|
|
|
delete save;
|
2012-06-07 08:23:26 -05:00
|
|
|
if(file)
|
|
|
|
delete file;
|
2012-01-19 07:44:59 -06:00
|
|
|
}
|
|
|
|
|
2012-07-31 13:49:08 -05:00
|
|
|
void SaveButton::OnThumbnailReady(Thumbnail * thumb)
|
|
|
|
{
|
|
|
|
if(thumb)
|
|
|
|
{
|
|
|
|
if(thumbnail)
|
|
|
|
delete thumbnail;
|
|
|
|
thumbnail = thumb;
|
|
|
|
waitingForThumb = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-19 07:44:59 -06:00
|
|
|
void SaveButton::Tick(float dt)
|
|
|
|
{
|
2012-07-31 13:49:08 -05:00
|
|
|
if(!thumbnail && !waitingForThumb)
|
|
|
|
{
|
|
|
|
if(save)
|
|
|
|
{
|
|
|
|
if(save->GetGameSave())
|
|
|
|
{
|
|
|
|
waitingForThumb = true;
|
|
|
|
ThumbnailBroker::Ref().RenderThumbnail(save->GetGameSave(), Size.X-3, Size.Y-25, this);
|
|
|
|
}
|
|
|
|
else if(save->GetID())
|
|
|
|
{
|
|
|
|
waitingForThumb = true;
|
2012-09-13 16:39:01 -05:00
|
|
|
ThumbnailBroker::Ref().RetrieveThumbnail(save->GetID(), save->GetVersion(), Size.X-3, Size.Y-25, this);
|
2012-07-31 13:49:08 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(file && file->GetGameSave())
|
|
|
|
{
|
|
|
|
waitingForThumb = true;
|
|
|
|
ThumbnailBroker::Ref().RenderThumbnail(file->GetGameSave(), Size.X-3, Size.Y-25, this);
|
|
|
|
}
|
|
|
|
}
|
2012-01-19 07:44:59 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void SaveButton::Draw(const Point& screenPos)
|
|
|
|
{
|
|
|
|
Graphics * g = ui::Engine::Ref().g;
|
|
|
|
float scaleFactor;
|
2012-01-29 11:12:35 -06:00
|
|
|
ui::Point thumbBoxSize(0, 0);
|
2012-01-19 07:44:59 -06:00
|
|
|
|
2012-07-27 14:06:17 -05:00
|
|
|
wantsDraw = true;
|
|
|
|
|
2012-04-06 18:45:24 -05:00
|
|
|
if(selected && selectable)
|
|
|
|
{
|
|
|
|
g->fillrect(screenPos.X, screenPos.Y, Size.X, Size.Y, 100, 170, 255, 100);
|
|
|
|
}
|
|
|
|
|
2012-01-19 07:44:59 -06:00
|
|
|
if(thumbnail)
|
|
|
|
{
|
2012-01-29 11:12:35 -06:00
|
|
|
thumbBoxSize = ui::Point(thumbnail->Size.X, thumbnail->Size.Y);
|
2012-06-07 08:23:26 -05:00
|
|
|
if(save && save->id)
|
2012-02-11 11:04:39 -06:00
|
|
|
g->draw_image(thumbnail->Data, screenPos.X-3+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbnail->Size.X, thumbnail->Size.Y, 255);
|
2012-01-29 11:12:35 -06:00
|
|
|
else
|
2012-02-11 11:04:39 -06:00
|
|
|
g->draw_image(thumbnail->Data, screenPos.X+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbnail->Size.X, thumbnail->Size.Y, 255);
|
2012-01-19 07:44:59 -06:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
scaleFactor = (Size.Y-25)/((float)YRES);
|
2012-01-29 11:12:35 -06:00
|
|
|
thumbBoxSize = ui::Point(((float)XRES)*scaleFactor, ((float)YRES)*scaleFactor);
|
|
|
|
}
|
2012-04-19 09:22:18 -05:00
|
|
|
if(save)
|
2012-01-29 11:12:35 -06:00
|
|
|
{
|
2012-04-19 09:22:18 -05:00
|
|
|
if(save->id)
|
|
|
|
{
|
|
|
|
if(isMouseInside)
|
|
|
|
g->drawrect(screenPos.X-3+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbBoxSize.X, thumbBoxSize.Y, 210, 230, 255, 255);
|
|
|
|
else
|
|
|
|
g->drawrect(screenPos.X-3+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbBoxSize.X, thumbBoxSize.Y, 180, 180, 180, 255);
|
2012-04-22 11:13:43 -05:00
|
|
|
g->drawrect(screenPos.X-4+thumbBoxSize.X+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, 7, thumbBoxSize.Y, 180, 180, 180, 255);
|
2012-04-19 09:22:18 -05:00
|
|
|
|
2012-08-12 16:32:57 -05:00
|
|
|
int voteBar = std::max(10.0f, ((float)(thumbBoxSize.Y-4))*voteRatio);
|
2012-04-22 11:13:43 -05:00
|
|
|
g->fillrect(1+screenPos.X-3+thumbBoxSize.X+(Size.X-thumbBoxSize.X)/2, (screenPos.Y-2)+(thumbBoxSize.Y-voteBar)+(Size.Y-21-thumbBoxSize.Y)/2, 3, voteBar, voteColour.Red, voteColour.Green, voteColour.Blue, 255);
|
2012-04-19 09:22:18 -05:00
|
|
|
}
|
2012-02-11 11:11:07 -06:00
|
|
|
else
|
2012-04-19 09:22:18 -05:00
|
|
|
{
|
|
|
|
if(isMouseInside)
|
|
|
|
g->drawrect(screenPos.X+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbBoxSize.X, thumbBoxSize.Y, 210, 230, 255, 255);
|
|
|
|
else
|
|
|
|
g->drawrect(screenPos.X+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbBoxSize.X, thumbBoxSize.Y, 180, 180, 180, 255);
|
|
|
|
}
|
2012-01-29 11:12:35 -06:00
|
|
|
|
2012-08-14 06:03:33 -05:00
|
|
|
if(isMouseInside && !isMouseInsideAuthor)
|
2012-04-22 11:13:43 -05:00
|
|
|
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)name.c_str()))/2, screenPos.Y+Size.Y - 21, name, 255, 255, 255, 255);
|
2012-02-11 11:11:07 -06:00
|
|
|
else
|
2012-04-22 11:13:43 -05:00
|
|
|
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)name.c_str()))/2, screenPos.Y+Size.Y - 21, name, 180, 180, 180, 255);
|
2012-08-14 06:03:33 -05:00
|
|
|
|
|
|
|
if(isMouseInsideAuthor)
|
|
|
|
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)save->userName.c_str()))/2, screenPos.Y+Size.Y - 10, save->userName, 200, 230, 255, 255);
|
|
|
|
else
|
2012-04-19 09:22:18 -05:00
|
|
|
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)save->userName.c_str()))/2, screenPos.Y+Size.Y - 10, save->userName, 100, 130, 160, 255);
|
2012-09-10 19:09:22 -05:00
|
|
|
if (!isMouseInside && showVotes)
|
|
|
|
{
|
|
|
|
char icon[64], votestring[64];
|
|
|
|
int j;
|
|
|
|
sprintf(votestring, "%d", save->GetVotesUp()-save->GetVotesDown());
|
|
|
|
icon[0] = 0xBB;
|
|
|
|
for (j = 1; j <= strlen(votestring); j++)
|
|
|
|
icon[j] = 0xBC;
|
|
|
|
icon[j-1] = 0xB9;
|
|
|
|
icon[j] = 0xBA;
|
|
|
|
icon[j+1] = 0;
|
|
|
|
int x = screenPos.X-7+(Size.X-thumbBoxSize.X)/2+thumbBoxSize.X-Graphics::textwidth(icon);
|
|
|
|
int y = screenPos.Y-23+(Size.Y-thumbBoxSize.Y)/2+thumbBoxSize.Y;
|
|
|
|
g->drawtext(x, y, icon, 16, 72, 16, 255);
|
|
|
|
for (j=0; icon[j]; j++)
|
|
|
|
icon[j] -= 14;
|
|
|
|
g->drawtext(x, y, icon, 192, 192, 192, 255);
|
|
|
|
for (j=0; votestring[j]; j++)
|
|
|
|
if (votestring[j] != '-')
|
|
|
|
votestring[j] += 127;
|
|
|
|
g->drawtext(x+3, y, votestring, 255, 255, 255, 255);
|
|
|
|
}
|
|
|
|
if (MouseInsideHistory && showVotes)
|
|
|
|
{
|
|
|
|
int x = screenPos.X;
|
|
|
|
int y = screenPos.Y-15+(Size.Y-thumbBoxSize.Y)/2+thumbBoxSize.Y;
|
|
|
|
g->fillrect(x+1, y+1, 7, 8, 255, 255, 255, 255);
|
|
|
|
if (MouseInsideHistory) {
|
|
|
|
g->drawtext(x, y, "\xA6", 200, 100, 80, 255);
|
|
|
|
} else {
|
|
|
|
g->drawtext(x, y, "\xA6", 160, 70, 50, 255);
|
|
|
|
}
|
|
|
|
}
|
2012-01-19 07:44:59 -06:00
|
|
|
}
|
2012-06-07 08:23:26 -05:00
|
|
|
if(file)
|
|
|
|
{
|
|
|
|
if(isMouseInside)
|
|
|
|
g->drawrect(screenPos.X+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbBoxSize.X, thumbBoxSize.Y, 210, 230, 255, 255);
|
|
|
|
else
|
|
|
|
g->drawrect(screenPos.X+(Size.X-thumbBoxSize.X)/2, screenPos.Y+(Size.Y-21-thumbBoxSize.Y)/2, thumbBoxSize.X, thumbBoxSize.Y, 180, 180, 180, 255);
|
|
|
|
|
|
|
|
if(isMouseInside)
|
|
|
|
{
|
|
|
|
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)name.c_str()))/2, screenPos.Y+Size.Y - 21, name, 255, 255, 255, 255);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g->drawtext(screenPos.X+(Size.X-Graphics::textwidth((char *)name.c_str()))/2, screenPos.Y+Size.Y - 21, name, 180, 180, 180, 255);
|
|
|
|
}
|
|
|
|
}
|
2012-04-06 18:45:24 -05:00
|
|
|
|
|
|
|
if(isMouseInside && selectable)
|
|
|
|
{
|
|
|
|
g->clearrect(screenPos.X+(Size.X-20), screenPos.Y+6, 14, 14);
|
|
|
|
g->drawrect(screenPos.X+(Size.X-20), screenPos.Y+6, 14, 14, 255, 255, 255, 255);
|
|
|
|
if(selected)
|
|
|
|
g->fillrect(screenPos.X+(Size.X-18), screenPos.Y+8, 10, 10, 255, 255, 255, 255);
|
|
|
|
}
|
2012-01-19 07:44:59 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void SaveButton::OnMouseUnclick(int x, int y, unsigned int button)
|
|
|
|
{
|
|
|
|
if(button != 1)
|
|
|
|
{
|
|
|
|
return; //left click only!
|
|
|
|
}
|
|
|
|
|
2012-04-06 18:45:24 -05:00
|
|
|
if(x>=Size.X-20 && y>=6 && y<=20 && x<=Size.X-6 && selectable)
|
|
|
|
{
|
|
|
|
selected = !selected;
|
|
|
|
DoSelection();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-01-19 07:44:59 -06:00
|
|
|
if(isButtonDown)
|
|
|
|
{
|
2012-09-15 10:45:53 -05:00
|
|
|
isButtonDown = false;
|
2012-08-14 06:03:33 -05:00
|
|
|
if(isMouseInsideAuthor)
|
|
|
|
DoAuthorAction();
|
2012-09-10 19:09:22 -05:00
|
|
|
else if (MouseInsideHistory)
|
|
|
|
DoHistoryAction();
|
2012-08-14 06:03:33 -05:00
|
|
|
else
|
|
|
|
DoAction();
|
2012-01-19 07:44:59 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveButton::OnMouseClick(int x, int y, unsigned int button)
|
|
|
|
{
|
2012-04-06 18:45:24 -05:00
|
|
|
if(button !=1 && selectable)
|
|
|
|
{
|
|
|
|
selected = !selected;
|
|
|
|
DoSelection();
|
|
|
|
}
|
2012-01-19 07:44:59 -06:00
|
|
|
if(button != 1) return; //left click only!
|
2012-04-06 18:45:24 -05:00
|
|
|
|
2012-01-19 07:44:59 -06:00
|
|
|
isButtonDown = true;
|
|
|
|
}
|
|
|
|
|
2012-08-14 06:03:33 -05:00
|
|
|
void SaveButton::OnMouseMovedInside(int x, int y, int dx, int dy)
|
|
|
|
{
|
|
|
|
if(y > Size.Y-11)
|
|
|
|
{
|
|
|
|
isMouseInsideAuthor = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
isMouseInsideAuthor = false;
|
2012-09-10 19:09:22 -05:00
|
|
|
|
|
|
|
if(showVotes && y > Size.Y-29 && y < Size.Y - 18 && x > 0 && x < 9)
|
|
|
|
{
|
|
|
|
MouseInsideHistory = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
MouseInsideHistory = false;
|
2012-08-14 06:03:33 -05:00
|
|
|
}
|
|
|
|
|
2012-01-19 07:44:59 -06:00
|
|
|
void SaveButton::OnMouseEnter(int x, int y)
|
|
|
|
{
|
|
|
|
isMouseInside = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveButton::OnMouseLeave(int x, int y)
|
|
|
|
{
|
|
|
|
isMouseInside = false;
|
2012-08-14 06:03:33 -05:00
|
|
|
isMouseInsideAuthor = false;
|
2012-09-10 19:09:22 -05:00
|
|
|
MouseInsideHistory = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveButton::DoHistoryAction()
|
|
|
|
{
|
|
|
|
if(actionCallback)
|
|
|
|
actionCallback->HistoryActionCallback(this);
|
2012-08-14 06:03:33 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
void SaveButton::DoAuthorAction()
|
|
|
|
{
|
|
|
|
if(actionCallback)
|
|
|
|
actionCallback->AuthorActionCallback(this);
|
2012-01-19 07:44:59 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
void SaveButton::DoAction()
|
|
|
|
{
|
|
|
|
if(actionCallback)
|
|
|
|
actionCallback->ActionCallback(this);
|
|
|
|
}
|
|
|
|
|
2012-04-06 18:45:24 -05:00
|
|
|
void SaveButton::DoSelection()
|
|
|
|
{
|
|
|
|
if(selectable)
|
|
|
|
actionCallback->SelectedCallback(this);
|
|
|
|
}
|
|
|
|
|
2012-01-19 07:44:59 -06:00
|
|
|
void SaveButton::SetActionCallback(SaveButtonAction * action)
|
|
|
|
{
|
|
|
|
actionCallback = action;
|
|
|
|
}
|
|
|
|
|
|
|
|
} /* namespace ui */
|