Stamps browser, placement + clipboard sampling and placement - No clipboard or stamp thumbnail generation, needs thumbnail generator from SaveLoader

This commit is contained in:
Simon Robertshaw 2012-04-02 17:01:28 +01:00
parent 289556ac70
commit efddc12e5d
19 changed files with 794 additions and 61 deletions

View File

@ -51,6 +51,8 @@
#define LOCAL_SAVE_DIR "Saves"
#define STAMPS_DIR "stamps"
#define APPDATA_SUBDIR "\\HardWIRED"
//Number of unique thumbnails to have in cache at one time

View File

@ -3,8 +3,16 @@
#include <sstream>
#include <string>
#include <vector>
#include <iomanip>
#include <time.h>
#ifdef WIN32
#include <direct.h>
#else
#include <sys/stat.h>
#include <unistd.h>
#endif
#include "Config.h"
#include "Client.h"
#include "MD5.h"
@ -76,6 +84,21 @@ Client::Client():
{
http_init(NULL);
}
//Read stamps library
std::ifstream stampsLib;
stampsLib.open(STAMPS_DIR PATH_SEP "stamps.def", ios::binary);
while(true)
{
char data[11];
memset(data, 0, 11);
if(stampsLib.readsome(data, 10)!=10)
break;
if(!data[0])
break;
stampIDs.push_back(data);
}
stampsLib.close();
}
Client::~Client()
@ -169,6 +192,95 @@ RequestStatus Client::UploadSave(Save * save)
return RequestFailure;
}
Save * Client::GetStamp(string stampID)
{
std::ifstream stampFile;
stampFile.open(string(STAMPS_DIR PATH_SEP + stampID + ".stm").c_str(), ios::binary);
if(stampFile.is_open())
{
stampFile.seekg(0, ios::end);
size_t fileSize = stampFile.tellg();
stampFile.seekg(0);
unsigned char * tempData = (unsigned char *)malloc(fileSize);
stampFile.read((char *)tempData, fileSize);
stampFile.close();
Save * tempSave = new Save(0, 0, 0, 0, "", "");
tempSave->SetData(tempData, fileSize);
return tempSave;
}
else
{
return NULL;
}
}
void Client::DeleteStamp(string stampID)
{
return;
}
string Client::AddStamp(Save * saveData)
{
unsigned t=(unsigned)time(NULL);
if (lastStampTime!=t)
{
lastStampTime=t;
lastStampName=0;
}
else
lastStampName++;
std::stringstream saveID;
//sprintf(saveID, "%08x%02x", lastStampTime, lastStampName);
saveID
<< std::setw(8) << std::setfill('0') << std::hex << lastStampTime
<< std::setw(2) << std::setfill('0') << std::hex << lastStampName;
#ifdef WIN32
_mkdir(STAMPS_DIR);
#else
mkdir(STAMPS_DIR, 0755);
#endif
std::ofstream stampStream;
stampStream.open(string(STAMPS_DIR PATH_SEP + saveID.str()+".stm").c_str(), ios::binary);
stampStream.write((const char *)saveData->data, saveData->dataLength);
stampStream.close();
stampIDs.push_back(saveID.str());
updateStamps();
return saveID.str();
}
void Client::updateStamps()
{
#ifdef WIN32
_mkdir(STAMPS_DIR);
#else
mkdir(STAMPS_DIR, 0755);
#endif
std::ofstream stampsStream;
stampsStream.open(string(STAMPS_DIR PATH_SEP "stamps.def").c_str(), ios::binary);
for(int i = 0; i < stampIDs.size(); i++)
{
stampsStream.write(stampIDs[i].c_str(), 10);
}
stampsStream.write("\0", 1);
stampsStream.close();
return;
}
vector<string> Client::GetStamps()
{
return stampIDs;
}
RequestStatus Client::ExecVote(int saveID, int direction)
{
lastError = "";

View File

@ -29,6 +29,10 @@ class Client: public Singleton<Client> {
private:
std::string lastError;
vector<string> stampIDs;
int lastStampTime;
int lastStampName;
//Auth session
User authUser;
@ -39,6 +43,7 @@ private:
int activeThumbRequestTimes[IMGCONNS];
int activeThumbRequestCompleteTimes[IMGCONNS];
std::string activeThumbRequestIDs[IMGCONNS];
void updateStamps();
public:
//Config file handle
json::Object configDocument;
@ -49,6 +54,11 @@ public:
RequestStatus ExecVote(int saveID, int direction);
RequestStatus UploadSave(Save * save);
Save * GetStamp(string stampID);
void DeleteStamp(string stampID);
string AddStamp(Save * saveData);
vector<string> GetStamps();
unsigned char * GetSaveData(int saveID, int saveDate, int & dataLength);
LoginStatus Login(string username, string password, User & user);
void ClearThumbnailRequests();
@ -59,7 +69,7 @@ public:
Save * GetSave(int saveID, int saveDate);
void SetAuthUser(User user);
User GetAuthUser();
std::vector<string> * RemoveTag(int saveID, string tag);
std::vector<string> * RemoveTag(int saveID, string tag); //TODO RequestStatus
std::vector<string> * AddTag(int saveID, string tag);
std::string GetLastError() {
return lastError;

View File

@ -86,6 +86,20 @@ public:
}
};
class GameController::StampsCallback: public ControllerCallback
{
GameController * cc;
public:
StampsCallback(GameController * cc_) { cc = cc_; }
virtual void ControllerExit()
{
if(cc->stamps->GetStamp())
{
cc->gameModel->SetStamp(cc->stamps->GetStamp());
}
}
};
GameController::GameController():
search(NULL),
renderOptions(NULL),
@ -140,6 +154,24 @@ GameView * GameController::GetView()
return gameView;
}
void GameController::PlaceStamp(ui::Point position)
{
if(gameModel->GetStamp())
{
gameModel->GetSimulation()->Load(position.X, position.Y, gameModel->GetStamp()->data, gameModel->GetStamp()->dataLength);
gameModel->SetPaused(gameModel->GetPaused());
}
}
void GameController::PlaceClipboard(ui::Point position)
{
if(gameModel->GetClipboard())
{
gameModel->GetSimulation()->Load(position.X, position.Y, gameModel->GetClipboard()->data, gameModel->GetClipboard()->dataLength);
gameModel->SetPaused(gameModel->GetPaused());
}
}
void GameController::AdjustBrushSize(int direction)
{
ui::Point newSize = gameModel->GetBrush()->GetRadius() + ui::Point(direction, direction);
@ -395,6 +427,12 @@ void GameController::OpenTags()
}
}
void GameController::OpenStamps()
{
stamps = new StampsController(new StampsCallback(this));
ui::Engine::Ref().ShowWindow(stamps->GetView());
}
void GameController::OpenDisplayOptions()
{
//TODO: Implement

View File

@ -12,6 +12,7 @@
#include "ssave/SSaveController.h"
#include "tags/TagsController.h"
#include "console/ConsoleController.h"
#include "stamps/StampsController.h"
//#include "cat/TPTScriptInterface.h"
#include "cat/LuaScriptInterface.h"
#include "Menu.h"
@ -34,6 +35,7 @@ private:
SSaveController * ssave;
ConsoleController * console;
TagsController * tagsWindow;
StampsController * stamps;
CommandInterface * commandInterface;
public:
class LoginCallback;
@ -41,6 +43,7 @@ public:
class RenderCallback;
class SSaveCallback;
class TagsCallback;
class StampsCallback;
GameController();
~GameController();
GameView * GetView();
@ -68,6 +71,9 @@ public:
void OpenDisplayOptions();
void OpenRenderOptions();
void OpenSaveWindow();
void OpenStamps();
void PlaceStamp(ui::Point position);
void PlaceClipboard(ui::Point position);
void ClearSim();
void ReloadSim();
void Vote(int direction);

View File

@ -18,7 +18,8 @@ GameModel::GameModel():
currentUser(0, ""),
currentSave(NULL),
colourSelector(false),
clipboardData(NULL)
clipboard(NULL),
stamp(NULL)
{
sim = new Simulation();
ren = new Renderer(ui::Engine::Ref().g, sim);
@ -158,6 +159,10 @@ GameModel::~GameModel()
}
delete sim;
delete ren;
if(clipboard)
delete clipboard;
if(stamp)
delete stamp;
if(activeTools)
delete activeTools;
}
@ -414,23 +419,42 @@ void GameModel::ClearSimulation()
void GameModel::AddStamp(unsigned char * saveData, int saveSize)
{
//Do nothing
//die alone
Save * tempSave = new Save(0, 0, 0, 0, "", "");
tempSave->SetData(saveData, saveSize);
Client::Ref().AddStamp(tempSave);
delete tempSave;
}
void GameModel::SetClipboard(unsigned char * saveData, int saveSize)
{
if(clipboardData)
free(clipboardData);
clipboardData = saveData;
clipboardSize = saveSize;
if(clipboard)
delete clipboard;
clipboard = new Save(0, 0, 0, 0, "", "");
clipboard->SetData(saveData, saveSize);
notifyClipboardChanged();
}
unsigned char * GameModel::GetClipboard(int & saveSize)
Save * GameModel::GetClipboard()
{
saveSize = clipboardSize;
return clipboardData;
return clipboard;
}
Save * GameModel::GetStamp()
{
return stamp;
}
void GameModel::SetStamp(Save * newStamp)
{
if(stamp)
delete stamp;
if(newStamp)
{
stamp = new Save(*newStamp);
}
else
stamp = NULL;
notifyStampChanged();
}
void GameModel::notifyColourSelectorColourChanged()
@ -537,6 +561,14 @@ void GameModel::notifyZoomChanged()
}
}
void GameModel::notifyStampChanged()
{
for(int i = 0; i < observers.size(); i++)
{
observers[i]->NotifyStampChanged(this);
}
}
void GameModel::notifyClipboardChanged()
{
for(int i = 0; i < observers.size(); i++)

View File

@ -31,8 +31,10 @@ public:
class GameModel
{
private:
int clipboardSize;
unsigned char * clipboardData;
//int clipboardSize;
//unsigned char * clipboardData;
Save * stamp;
Save * clipboard;
vector<GameView*> observers;
vector<Tool*> toolList;
vector<Menu*> menuList;
@ -59,6 +61,7 @@ private:
void notifyUserChanged();
void notifyZoomChanged();
void notifyClipboardChanged();
void notifyStampChanged();
void notifyColourSelectorColourChanged();
void notifyColourSelectorVisibilityChanged();
public:
@ -104,9 +107,11 @@ public:
ui::Point GetZoomPosition();
void SetZoomWindowPosition(ui::Point position);
ui::Point GetZoomWindowPosition();
void SetStamp(Save * newStamp);
void AddStamp(unsigned char * saveData, int saveSize);
void SetClipboard(unsigned char * saveData, int saveSize);
unsigned char * GetClipboard(int & saveSize);
Save * GetClipboard();
Save * GetStamp();
};
#endif // GAMEMODEL_H

View File

@ -8,6 +8,7 @@
#include "interface/Colour.h"
#include "interface/Keys.h"
#include "interface/Slider.h"
#include "search/Thumbnail.h"
GameView::GameView():
ui::Window(ui::Point(0, 0), ui::Point(XRES+BARSIZE, YRES+MENUSIZE)),
@ -25,7 +26,9 @@ GameView::GameView():
drawModeReset(false),
selectMode(SelectNone),
selectPoint1(0, 0),
selectPoint2(0, 0)
selectPoint2(0, 0),
stampThumb(NULL),
clipboardThumb(NULL)
{
int currentX = 1;
//Set up UI
@ -467,6 +470,8 @@ void GameView::OnMouseMove(int x, int y, int dx, int dy)
{
if(selectMode!=SelectNone)
{
if(selectMode==PlaceStamp || selectMode==PlaceClipboard)
selectPoint1 = ui::Point(x, y);
if(selectPoint1.X!=-1)
selectPoint2 = ui::Point(x, y);
return;
@ -514,16 +519,46 @@ void GameView::OnMouseUp(int x, int y, unsigned button)
{
if(selectMode!=SelectNone)
{
int x2 = (selectPoint1.X>selectPoint2.X)?selectPoint1.X:selectPoint2.X;
int y2 = (selectPoint1.Y>selectPoint2.Y)?selectPoint1.Y:selectPoint2.Y;
int x1 = (selectPoint2.X<selectPoint1.X)?selectPoint2.X:selectPoint1.X;
int y1 = (selectPoint2.Y<selectPoint1.Y)?selectPoint2.Y:selectPoint1.Y;
if(button==BUTTON_LEFT && x2-x1>0 && y2-y1>0)
if(button==BUTTON_LEFT)
{
if(selectMode==SelectCopy)
c->CopyRegion(ui::Point(x1, y1), ui::Point(x2, y2));
else if(selectMode==SelectStamp)
c->StampRegion(ui::Point(x1, y1), ui::Point(x2, y2));
if(selectMode==PlaceStamp || selectMode==PlaceClipboard)
{
Thumbnail * tempThumb = selectMode==PlaceStamp?stampThumb:clipboardThumb;
if(tempThumb)
{
int thumbX = selectPoint2.X - (tempThumb->Size.X/2);
int thumbY = selectPoint2.Y - (tempThumb->Size.Y/2);
if(thumbX<0)
thumbX = 0;
if(thumbX+(tempThumb->Size.X)>=XRES)
thumbX = XRES-tempThumb->Size.X;
if(thumbY<0)
thumbY = 0;
if(thumbY+(tempThumb->Size.Y)>=YRES)
thumbY = YRES-tempThumb->Size.Y;
if(selectMode==PlaceStamp)
c->PlaceStamp(ui::Point(thumbX, thumbY));
if(selectMode==PlaceClipboard)
c->PlaceClipboard(ui::Point(thumbX, thumbY));
}
}
else
{
int x2 = (selectPoint1.X>selectPoint2.X)?selectPoint1.X:selectPoint2.X;
int y2 = (selectPoint1.Y>selectPoint2.Y)?selectPoint1.Y:selectPoint2.Y;
int x1 = (selectPoint2.X<selectPoint1.X)?selectPoint2.X:selectPoint1.X;
int y1 = (selectPoint2.Y<selectPoint1.Y)?selectPoint2.Y:selectPoint1.Y;
if(x2-x1>0 && y2-y1>0)
{
if(selectMode==SelectCopy)
c->CopyRegion(ui::Point(x1, y1), ui::Point(x2, y2));
else if(selectMode==SelectStamp)
c->StampRegion(ui::Point(x1, y1), ui::Point(x2, y2));
}
}
}
selectMode = SelectNone;
return;
@ -643,6 +678,20 @@ void GameView::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool
selectPoint1 = ui::Point(-1, -1);
}
break;
case 'v':
if(ctrl && clipboardThumb)
{
selectMode = PlaceClipboard;
selectPoint2 = ui::Point(-1, -1);
selectPoint1 = selectPoint2;
}
break;
case 'l':
selectMode = PlaceStamp;
selectPoint2 = ui::Point(-1, -1);
selectPoint1 = selectPoint2;
c->OpenStamps();
break;
}
}
@ -694,7 +743,27 @@ void GameView::NotifyZoomChanged(GameModel * sender)
void GameView::NotifyClipboardChanged(GameModel * sender)
{
//Could use this to have a mini preview of the clipboard, meh
if(clipboardThumb)
delete clipboardThumb;
if(sender->GetClipboard())
{
clipboardThumb = new Thumbnail(0, 0, (pixel*)malloc((256*256)*PIXELSIZE), ui::Point(256, 256));
}
else
clipboardThumb = NULL;
}
void GameView::NotifyStampChanged(GameModel * sender)
{
if(stampThumb)
delete stampThumb;
if(sender->GetStamp())
{
stampThumb = new Thumbnail(0, 0, (pixel*)malloc((256*256)*PIXELSIZE), ui::Point(256, 256));
}
else
stampThumb = NULL;
}
void GameView::changeColour()
@ -730,29 +799,53 @@ void GameView::OnDraw()
if(selectMode!=SelectNone)
{
if(selectPoint1.X==-1)
if(selectMode==PlaceStamp || selectMode==PlaceClipboard)
{
g->fillrect(0, 0, XRES, YRES, 0, 0, 0, 100);
Thumbnail * tempThumb = selectMode==PlaceStamp?stampThumb:clipboardThumb;
if(tempThumb && selectPoint2.X!=-1)
{
int thumbX = selectPoint2.X - (tempThumb->Size.X/2);
int thumbY = selectPoint2.Y - (tempThumb->Size.Y/2);
if(thumbX<0)
thumbX = 0;
if(thumbX+(tempThumb->Size.X)>=XRES)
thumbX = XRES-tempThumb->Size.X;
if(thumbY<0)
thumbY = 0;
if(thumbY+(tempThumb->Size.Y)>=YRES)
thumbY = YRES-tempThumb->Size.Y;
g->draw_image(tempThumb->Data, thumbX, thumbY, tempThumb->Size.X, tempThumb->Size.Y, 128);
}
}
else
{
int x2 = (selectPoint1.X>selectPoint2.X)?selectPoint1.X:selectPoint2.X;
int y2 = (selectPoint1.Y>selectPoint2.Y)?selectPoint1.Y:selectPoint2.Y;
int x1 = (selectPoint2.X<selectPoint1.X)?selectPoint2.X:selectPoint1.X;
int y1 = (selectPoint2.Y<selectPoint1.Y)?selectPoint2.Y:selectPoint1.Y;
if(selectPoint1.X==-1)
{
g->fillrect(0, 0, XRES, YRES, 0, 0, 0, 100);
}
else
{
int x2 = (selectPoint1.X>selectPoint2.X)?selectPoint1.X:selectPoint2.X;
int y2 = (selectPoint1.Y>selectPoint2.Y)?selectPoint1.Y:selectPoint2.Y;
int x1 = (selectPoint2.X<selectPoint1.X)?selectPoint2.X:selectPoint1.X;
int y1 = (selectPoint2.Y<selectPoint1.Y)?selectPoint2.Y:selectPoint1.Y;
if(x2>XRES-1)
x2 = XRES-1;
if(y2>YRES-1)
y2 = YRES-1;
if(x2>XRES-1)
x2 = XRES-1;
if(y2>YRES-1)
y2 = YRES-1;
g->fillrect(0, 0, XRES, y1, 0, 0, 0, 100);
g->fillrect(0, y2, XRES, YRES-y2, 0, 0, 0, 100);
g->fillrect(0, 0, XRES, y1, 0, 0, 0, 100);
g->fillrect(0, y2, XRES, YRES-y2, 0, 0, 0, 100);
g->fillrect(0, y1-1, x1, (y2-y1)+2, 0, 0, 0, 100);
g->fillrect(x2, y1-1, XRES-x2, (y2-y1)+2, 0, 0, 0, 100);
g->fillrect(0, y1-1, x1, (y2-y1)+2, 0, 0, 0, 100);
g->fillrect(x2, y1-1, XRES-x2, (y2-y1)+2, 0, 0, 0, 100);
g->xor_rect(x1, y1, (x2-x1)+1, (y2-y1)+1);
g->xor_rect(x1, y1, (x2-x1)+1, (y2-y1)+1);
}
}
}
}

View File

@ -21,7 +21,7 @@ enum DrawMode
enum SelectMode
{
SelectNone, SelectStamp, SelectCopy
SelectNone, SelectStamp, SelectCopy, PlaceClipboard, PlaceStamp
};
class GameController;
@ -67,6 +67,9 @@ private:
ui::Point selectPoint1;
ui::Point selectPoint2;
Thumbnail * clipboardThumb;
Thumbnail * stampThumb;
void changeColour();
public:
GameView();
@ -84,6 +87,7 @@ public:
void NotifyColourSelectorVisibilityChanged(GameModel * sender);
void NotifyColourSelectorColourChanged(GameModel * sender);
void NotifyClipboardChanged(GameModel * sender);
void NotifyStampChanged(GameModel * sender);
virtual void OnMouseMove(int x, int y, int dx, int dy);
virtual void OnMouseDown(int x, int y, unsigned button);
virtual void OnMouseUp(int x, int y, unsigned button);

View File

@ -51,28 +51,31 @@ void SaveButton::Tick(float dt)
float scaleFactorY = 1.0f, scaleFactorX = 1.0f;
if(!thumbnail)
{
tempThumb = Client::Ref().GetThumbnail(save->GetID(), 0);
if(tempThumb)
if(save->GetID())
{
thumbnail = new Thumbnail(*tempThumb); //Store a local copy of the thumbnail
if(thumbnail->Data)
tempThumb = Client::Ref().GetThumbnail(save->GetID(), 0);
if(tempThumb)
{
if(thumbnail->Size.Y > (Size.Y-25))
thumbnail = new Thumbnail(*tempThumb); //Store a local copy of the thumbnail
if(thumbnail->Data)
{
scaleFactorY = ((float)(Size.Y-25))/((float)thumbnail->Size.Y);
}
if(thumbnail->Size.X > Size.X-3)
{
scaleFactorX = ((float)Size.X-3)/((float)thumbnail->Size.X);
}
if(scaleFactorY < 1.0f || scaleFactorX < 1.0f)
{
float scaleFactor = scaleFactorY < scaleFactorX ? scaleFactorY : scaleFactorX;
pixel * thumbData = thumbnail->Data;
thumbnail->Data = Graphics::resample_img(thumbData, thumbnail->Size.X, thumbnail->Size.Y, thumbnail->Size.X * scaleFactor, thumbnail->Size.Y * scaleFactor);
thumbnail->Size.X *= scaleFactor;
thumbnail->Size.Y *= scaleFactor;
free(thumbData);
if(thumbnail->Size.Y > (Size.Y-25))
{
scaleFactorY = ((float)(Size.Y-25))/((float)thumbnail->Size.Y);
}
if(thumbnail->Size.X > Size.X-3)
{
scaleFactorX = ((float)Size.X-3)/((float)thumbnail->Size.X);
}
if(scaleFactorY < 1.0f || scaleFactorX < 1.0f)
{
float scaleFactor = scaleFactorY < scaleFactorX ? scaleFactorY : scaleFactorX;
pixel * thumbData = thumbnail->Data;
thumbnail->Data = Graphics::resample_img(thumbData, thumbnail->Size.X, thumbnail->Size.Y, thumbnail->Size.X * scaleFactor, thumbnail->Size.Y * scaleFactor);
thumbnail->Size.X *= scaleFactor;
thumbnail->Size.Y *= scaleFactor;
free(thumbData);
}
}
}
}

View File

@ -13,6 +13,11 @@ int Simulation::Load(unsigned char * data, int dataLength)
return SaveLoader::LoadSave(data, dataLength, this, true, 0, 0);
}
int Simulation::Load(int x, int y, unsigned char * data, int dataLength)
{
return SaveLoader::LoadSave(data, dataLength, this, false, x, y);
}
unsigned char * Simulation::Save(int & dataLength)
{
return SaveLoader::BuildSave(dataLength, this, 0, 0, XRES, YRES);

View File

@ -207,6 +207,7 @@ public:
int sandcolour_b; //TODO: Make a single variable
int Load(unsigned char * data, int dataLength);
int Load(int x, int y, unsigned char * data, int dataLength);
unsigned char * Save(int & dataLength);
unsigned char * Save(int x1, int y1, int x2, int y2, int & dataLength);
inline int is_blocking(int t, int x, int y);

View File

@ -0,0 +1,69 @@
/*
* StampsController.cpp
*
* Created on: Mar 29, 2012
* Author: Simon
*/
#include "StampsController.h"
#include "interface/Engine.h"
#include "StampsModel.h"
#include "StampsView.h"
StampsController::StampsController(ControllerCallback * callback):
HasDone(false)
{
stampsModel = new StampsModel();
stampsView = new StampsView();
stampsView->AttachController(this);
stampsModel->AddObserver(stampsView);
this->callback = callback;
stampsModel->UpdateStampsList(1);
}
void StampsController::OpenStamp(Save * stamp)
{
stampsModel->SetStamp(stamp);
}
Save * StampsController::GetStamp()
{
return stampsModel->GetStamp();
}
void StampsController::NextPage()
{
if(stampsModel->GetPageNum()>1)
stampsModel->UpdateStampsList(stampsModel->GetPageNum()-1);
}
void StampsController::PrevPage()
{
if(stampsModel->GetPageNum() <= stampsModel->GetPageCount())
stampsModel->UpdateStampsList(stampsModel->GetPageNum()+1);
}
void StampsController::Update()
{
if(stampsModel->GetStamp())
{
Exit();
}
}
void StampsController::Exit()
{
if(ui::Engine::Ref().GetWindow() == stampsView)
ui::Engine::Ref().CloseWindow();
if(callback)
callback->ControllerExit();
HasDone = true;
}
StampsController::~StampsController() {
// TODO Auto-generated destructor stub
}

View File

@ -0,0 +1,35 @@
/*
* StampsController.h
*
* Created on: Mar 29, 2012
* Author: Simon
*/
#ifndef STAMPSCONTROLLER_H_
#define STAMPSCONTROLLER_H_
#include "Controller.h"
#include "StampsView.h"
#include "search/Save.h"
class StampsView;
class StampsModel;
class StampsController {
ControllerCallback * callback;
StampsView * stampsView;
StampsModel * stampsModel;
public:
bool HasDone;
StampsController(ControllerCallback * callback);
StampsView * GetView() {return stampsView;}
Save * GetStamp();
void OpenStamp(Save * stamp);
void SetStamp();
void NextPage();
void PrevPage();
void Update();
void Exit();
virtual ~StampsController();
};
#endif /* STAMPSCONTROLLER_H_ */

View File

@ -0,0 +1,84 @@
/*
* StampsModel.cpp
*
* Created on: Mar 29, 2012
* Author: Simon
*/
#include "StampsModel.h"
#include "StampsView.h"
#include "client/Client.h"
#include "StampsModelException.h"
StampsModel::StampsModel():
stamp(NULL)
{
// TODO Auto-generated constructor stub
stampIDs = Client::Ref().GetStamps();
}
std::vector<Save *> StampsModel::GetStampsList()
{
return stampsList;
}
void StampsModel::AddObserver(StampsView * observer)
{
observers.push_back(observer);
observer->NotifyStampsListChanged(this);
}
void StampsModel::notifyStampsListChanged()
{
for(int i = 0; i < observers.size(); i++)
{
observers[i]->NotifyStampsListChanged(this);
}
}
void StampsModel::notifyPageChanged()
{
for(int i = 0; i < observers.size(); i++)
{
observers[i]->NotifyPageChanged(this);
}
}
Save * StampsModel::GetStamp()
{
return stamp;
}
void StampsModel::SetStamp(Save * newStamp)
{
if(stamp)
delete stamp;
stamp = new Save(*newStamp);
}
void StampsModel::UpdateStampsList(int pageNumber)
{
std::vector<Save*> tempStampsList = stampsList;
stampsList.clear();
/*notifyStampsListChanged();
for(int i = 0; i < tempStampsList.size(); i++)
{
delete tempStampsList[i];
}*/
int stampsEnd = pageNumber*20;
for(int i = stampsEnd-20; i<stampIDs.size() && i<stampsEnd; i++)
{
Save * tempSave = Client::Ref().GetStamp(stampIDs[i]);
stampsList.push_back(tempSave);
}
notifyStampsListChanged();
}
StampsModel::~StampsModel() {
if(stamp)
delete stamp;
}

36
src/stamps/StampsModel.h Normal file
View File

@ -0,0 +1,36 @@
/*
* StampsModel.h
*
* Created on: Mar 29, 2012
* Author: Simon
*/
#ifndef STAMPSMODEL_H_
#define STAMPSMODEL_H_
#include <vector>
#include <math.h>
#include "search/Save.h"
class StampsView;
class StampsModel {
Save * stamp;
std::vector<std::string> stampIDs;
std::vector<Save*> stampsList;
std::vector<StampsView*> observers;
int currentPage;
void notifyStampsListChanged();
void notifyPageChanged();
public:
StampsModel();
int GetPageCount() { return max(1, (int)(ceil(stampIDs.size()/16))); }
int GetPageNum() { return currentPage; }
void AddObserver(StampsView * observer);
std::vector<Save *> GetStampsList();
void UpdateStampsList(int pageNumber);
Save * GetStamp();
void SetStamp(Save * newStamp);
virtual ~StampsModel();
};
#endif /* STAMPSMODEL_H_ */

View File

@ -0,0 +1,23 @@
/*
* StampsModelException.h
*
* Created on: Mar 29, 2012
* Author: Simon
*/
#ifndef STAMPSMODELEXCEPTION_H_
#define STAMPSMODELEXCEPTION_H_
#include <string>
#include <exception>
using namespace std;
class StampsModelException {
string message;
public:
StampsModelException(string message_): message(message_) {};
const char * what() const throw() { return message.c_str(); };
~StampsModelException() throw() {};
};
#endif /* STAMPSMODELEXCEPTION_H_ */

140
src/stamps/StampsView.cpp Normal file
View File

@ -0,0 +1,140 @@
/*
* StampsView.cpp
*
* Created on: Mar 29, 2012
* Author: Simon
*/
#include <sstream>
#include "client/Client.h"
#include "StampsView.h"
#include "interface/SaveButton.h"
#include "dialogues/ErrorMessage.h"
#include "StampsController.h"
#include "StampsModel.h"
#include "StampsModelException.h"
StampsView::StampsView():
ui::Window(ui::Point(0, 0), ui::Point(XRES+BARSIZE, YRES+MENUSIZE))
{
nextButton = new ui::Button(ui::Point(XRES+BARSIZE-52, YRES+MENUSIZE-18), ui::Point(50, 16), "Next \x95");
previousButton = new ui::Button(ui::Point(1, YRES+MENUSIZE-18), ui::Point(50, 16), "\x96 Prev");
infoLabel = new ui::Label(ui::Point(51, YRES+MENUSIZE-18), ui::Point(XRES+BARSIZE-102, 16), "Loading...");
AddComponent(infoLabel);
AddComponent(nextButton);
AddComponent(previousButton);
class NextPageAction : public ui::ButtonAction
{
StampsView * v;
public:
NextPageAction(StampsView * _v) { v = _v; }
void ActionCallback(ui::Button * sender)
{
v->c->NextPage();
}
};
nextButton->SetActionCallback(new NextPageAction(this));
nextButton->SetAlignment(AlignRight, AlignBottom);
class PrevPageAction : public ui::ButtonAction
{
StampsView * v;
public:
PrevPageAction(StampsView * _v) { v = _v; }
void ActionCallback(ui::Button * sender)
{
v->c->PrevPage();
}
};
previousButton->SetActionCallback(new PrevPageAction(this));
previousButton->SetAlignment(AlignLeft, AlignBottom);
}
void StampsView::OnTick(float dt)
{
c->Update();
}
void StampsView::NotifyPageChanged(StampsModel * sender)
{
std::stringstream pageInfo;
pageInfo << "Page " << sender->GetPageNum() << " of " << sender->GetPageCount();
infoLabel->SetText(pageInfo.str());
if(sender->GetPageNum() == 1)
{
previousButton->Visible = false;
}
else
{
previousButton->Visible = true;
}
if(sender->GetPageNum() == sender->GetPageCount())
{
nextButton->Visible = false;
}
else
{
nextButton->Visible = true;
}
}
void StampsView::NotifyStampsListChanged(StampsModel * sender)
{
int i = 0;
int buttonWidth, buttonHeight, saveX = 0, saveY = 0, savesX = 5, savesY = 4, buttonPadding = 2;
int buttonAreaWidth, buttonAreaHeight, buttonXOffset, buttonYOffset;
vector<Save*> saves = sender->GetStampsList();
Client::Ref().ClearThumbnailRequests();
for(i = 0; i < stampButtons.size(); i++)
{
RemoveComponent(stampButtons[i]);
delete stampButtons[i];
}
buttonXOffset = 0;
buttonYOffset = 50;
buttonAreaWidth = Size.X;
buttonAreaHeight = Size.Y - buttonYOffset - 18;
buttonWidth = (buttonAreaWidth/savesX) - buttonPadding*2;
buttonHeight = (buttonAreaHeight/savesY) - buttonPadding*2;
class SaveOpenAction: public ui::SaveButtonAction
{
StampsView * v;
public:
SaveOpenAction(StampsView * _v) { v = _v; }
virtual void ActionCallback(ui::SaveButton * sender)
{
v->c->OpenStamp(sender->GetSave());
}
};
for(i = 0; i < saves.size(); i++)
{
if(saveX == savesX)
{
if(saveY == savesY-1)
break;
saveX = 0;
saveY++;
}
ui::SaveButton * saveButton;
saveButton = new ui::SaveButton(
ui::Point(
buttonXOffset + buttonPadding + saveX*(buttonWidth+buttonPadding*2),
buttonYOffset + buttonPadding + saveY*(buttonHeight+buttonPadding*2)
),
ui::Point(buttonWidth, buttonHeight),
saves[i]);
saveButton->SetActionCallback(new SaveOpenAction(this));
stampButtons.push_back(saveButton);
AddComponent(saveButton);
saveX++;
}
}
StampsView::~StampsView() {
// TODO Auto-generated destructor stub
}

35
src/stamps/StampsView.h Normal file
View File

@ -0,0 +1,35 @@
/*
* StampsView.h
*
* Created on: Mar 29, 2012
* Author: Simon
*/
#ifndef STAMPSVIEW_H_
#define STAMPSVIEW_H_
#include <vector>
#include "interface/Window.h"
#include "interface/Button.h"
#include "interface/Textbox.h"
#include "interface/Label.h"
class StampsController;
class StampsModel;
class StampsView: public ui::Window {
StampsController * c;
std::vector<ui::Component*> stampButtons;
ui::Button * previousButton;
ui::Button * nextButton;
ui::Label * infoLabel;
public:
StampsView();
//virtual void OnDraw();
virtual void OnTick(float dt);
void AttachController(StampsController * c_) { c = c_; };
void NotifyPageChanged(StampsModel * sender);
void NotifyStampsListChanged(StampsModel * sender);
virtual ~StampsView();
};
#endif /* STAMPSVIEW_H_ */