summaryrefslogtreecommitdiff
path: root/src/preview
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-06-08 21:04:14 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-06-08 21:04:14 (GMT)
commit0ee1e1875d00876b946f358308f39dc33ef96ea4 (patch)
treec0ea64b19f03541cb71b96ed3acc4c6c3e2e1834 /src/preview
parent1dadb11fc218786a36cc46714a0478e229ca44a9 (diff)
downloadpowder-0ee1e1875d00876b946f358308f39dc33ef96ea4.zip
powder-0ee1e1875d00876b946f358308f39dc33ef96ea4.tar.gz
Load save data when showing the save preview
Diffstat (limited to 'src/preview')
-rw-r--r--src/preview/PreviewModel.cpp85
-rw-r--r--src/preview/PreviewModel.h21
-rw-r--r--src/preview/PreviewView.cpp28
-rw-r--r--src/preview/PreviewView.h1
4 files changed, 80 insertions, 55 deletions
diff --git a/src/preview/PreviewModel.cpp b/src/preview/PreviewModel.cpp
index de6c6e8..f923ceb 100644
--- a/src/preview/PreviewModel.cpp
+++ b/src/preview/PreviewModel.cpp
@@ -11,11 +11,10 @@
PreviewModel::PreviewModel():
save(NULL),
- savePreview(NULL),
saveComments(NULL),
doOpen(false),
- updateSavePreviewWorking(false),
- updateSavePreviewFinished(false),
+ updateSaveDataWorking(false),
+ updateSaveDataFinished(false),
updateSaveInfoWorking(false),
updateSaveInfoFinished(false),
updateSaveCommentsWorking(false),
@@ -30,9 +29,9 @@ void * PreviewModel::updateSaveInfoTHelper(void * obj)
return ((PreviewModel*)obj)->updateSaveInfoT();
}
-void * PreviewModel::updateSavePreviewTHelper(void * obj)
+void * PreviewModel::updateSaveDataTHelper(void * obj)
{
- return ((PreviewModel*)obj)->updateSavePreviewT();
+ return ((PreviewModel*)obj)->updateSaveDataT();
}
void * PreviewModel::updateSaveCommentsTHelper(void * obj)
@@ -47,11 +46,14 @@ void * PreviewModel::updateSaveInfoT()
return tempSave;
}
-void * PreviewModel::updateSavePreviewT()
+void * PreviewModel::updateSaveDataT()
{
- Thumbnail * tempThumb = Client::Ref().GetPreview(tSaveID, tSaveDate);
- updateSavePreviewFinished = true;
- return tempThumb;
+ int tempDataSize;
+ unsigned char * tempData = Client::Ref().GetSaveData(tSaveID, tSaveDate, tempDataSize);
+ saveDataBuffer.clear();
+ saveDataBuffer.insert(saveDataBuffer.begin(), tempData, tempData+tempDataSize);
+ updateSaveDataFinished = true;
+ return NULL;
}
void * PreviewModel::updateSaveCommentsT()
@@ -81,11 +83,7 @@ void PreviewModel::UpdateSave(int saveID, int saveDate)
delete save;
save = NULL;
}
- if(savePreview)
- {
- delete savePreview;
- savePreview = NULL;
- }
+ saveDataBuffer.clear();
if(saveComments)
{
for(int i = 0; i < saveComments->size(); i++)
@@ -93,15 +91,14 @@ void PreviewModel::UpdateSave(int saveID, int saveDate)
delete saveComments;
saveComments = NULL;
}
- notifyPreviewChanged();
notifySaveChanged();
notifySaveCommentsChanged();
- if(!updateSavePreviewWorking)
+ if(!updateSaveDataWorking)
{
- updateSavePreviewWorking = true;
- updateSavePreviewFinished = false;
- pthread_create(&updateSavePreviewThread, 0, &PreviewModel::updateSavePreviewTHelper, this);
+ updateSaveDataWorking = true;
+ updateSaveDataFinished = false;
+ pthread_create(&updateSaveDataThread, 0, &PreviewModel::updateSaveDataTHelper, this);
}
if(!updateSaveInfoWorking)
@@ -129,11 +126,6 @@ bool PreviewModel::GetDoOpen()
return doOpen;
}
-Thumbnail * PreviewModel::GetPreview()
-{
- return savePreview;
-}
-
SaveInfo * PreviewModel::GetSave()
{
return save;
@@ -144,14 +136,6 @@ std::vector<SaveComment*> * PreviewModel::GetComments()
return saveComments;
}
-void PreviewModel::notifyPreviewChanged()
-{
- for(int i = 0; i < observers.size(); i++)
- {
- observers[i]->NotifyPreviewChanged(this);
- }
-}
-
void PreviewModel::notifySaveChanged()
{
for(int i = 0; i < observers.size(); i++)
@@ -170,24 +154,30 @@ void PreviewModel::notifySaveCommentsChanged()
void PreviewModel::AddObserver(PreviewView * observer) {
observers.push_back(observer);
- observer->NotifyPreviewChanged(this);
observer->NotifySaveChanged(this);
}
void PreviewModel::Update()
{
- if(updateSavePreviewWorking)
+ if(updateSaveDataWorking)
{
- if(updateSavePreviewFinished)
+ if(updateSaveDataFinished)
{
- if(savePreview)
+ updateSaveDataWorking = false;
+ pthread_join(updateSaveDataThread, NULL);
+
+ if(updateSaveInfoFinished && save)
{
- delete savePreview;
- savePreview = NULL;
+ try
+ {
+ save->SetGameSave(new GameSave(&saveDataBuffer[0], saveDataBuffer.size()));
+ }
+ catch(ParseException &e)
+ {
+ throw PreviewModelException("Save file corrupt or from newer version");
+ }
+ notifySaveChanged();
}
- updateSavePreviewWorking = false;
- pthread_join(updateSavePreviewThread, (void**)(&savePreview));
- notifyPreviewChanged();
}
}
@@ -202,6 +192,17 @@ void PreviewModel::Update()
}
updateSaveInfoWorking = false;
pthread_join(updateSaveInfoThread, (void**)(&save));
+ if(updateSaveDataFinished && save)
+ {
+ try
+ {
+ save->SetGameSave(new GameSave(&saveDataBuffer[0], saveDataBuffer.size()));
+ }
+ catch(ParseException &e)
+ {
+ throw PreviewModelException("Save file corrupt or from newer version");
+ }
+ }
notifySaveChanged();
if(!save)
throw PreviewModelException("Unable to load save");
@@ -229,7 +230,5 @@ void PreviewModel::Update()
PreviewModel::~PreviewModel() {
if(save)
delete save;
- if(savePreview)
- delete savePreview;
}
diff --git a/src/preview/PreviewModel.h b/src/preview/PreviewModel.h
index af94af3..5a0fd53 100644
--- a/src/preview/PreviewModel.h
+++ b/src/preview/PreviewModel.h
@@ -9,6 +9,7 @@
#define PREVIEWMODEL_H_
#include <vector>
+#include <iostream>
#include <pthread.h>
#include "PreviewView.h"
#include "client/SaveInfo.h"
@@ -17,14 +18,19 @@
using namespace std;
+struct SaveData
+{
+ unsigned char * data;
+ int length;
+};
+
class PreviewView;
class PreviewModel {
bool doOpen;
vector<PreviewView*> observers;
SaveInfo * save;
- Thumbnail * savePreview;
+ vector<char> saveDataBuffer;
std::vector<SaveComment*> * saveComments;
- void notifyPreviewChanged();
void notifySaveChanged();
void notifySaveCommentsChanged();
@@ -32,11 +38,11 @@ class PreviewModel {
int tSaveID;
int tSaveDate;
- bool updateSavePreviewWorking;
- volatile bool updateSavePreviewFinished;
- pthread_t updateSavePreviewThread;
- static void * updateSavePreviewTHelper(void * obj);
- void * updateSavePreviewT();
+ bool updateSaveDataWorking;
+ volatile bool updateSaveDataFinished;
+ pthread_t updateSaveDataThread;
+ static void * updateSaveDataTHelper(void * obj);
+ void * updateSaveDataT();
bool updateSaveInfoWorking;
volatile bool updateSaveInfoFinished;
@@ -51,7 +57,6 @@ class PreviewModel {
void * updateSaveCommentsT();
public:
PreviewModel();
- Thumbnail * GetPreview();
SaveInfo * GetSave();
std::vector<SaveComment*> * GetComments();
void AddObserver(PreviewView * observer);
diff --git a/src/preview/PreviewView.cpp b/src/preview/PreviewView.cpp
index 4e0716b..5e1470e 100644
--- a/src/preview/PreviewView.cpp
+++ b/src/preview/PreviewView.cpp
@@ -8,6 +8,7 @@
#include <vector>
#include "PreviewView.h"
#include "dialogues/TextPrompt.h"
+#include "simulation/SaveRenderer.h"
#include "interface/Point.h"
#include "interface/Window.h"
#include "search/Thumbnail.h"
@@ -163,6 +164,9 @@ void PreviewView::OnMouseDown(int x, int y, unsigned button)
void PreviewView::NotifySaveChanged(PreviewModel * sender)
{
SaveInfo * save = sender->GetSave();
+ if(savePreview)
+ delete savePreview;
+ savePreview = NULL;
if(save)
{
votesUp = save->votesUp;
@@ -174,6 +178,24 @@ void PreviewView::NotifySaveChanged(PreviewModel * sender)
favButton->Enabled = false;
else
favButton->Enabled = true;
+
+ if(save->GetGameSave())
+ {
+ savePreview = SaveRenderer::Ref().Render(save->GetGameSave());
+
+ if(savePreview && savePreview->Data && !(savePreview->Size.X == XRES/2 && savePreview->Size.Y == YRES/2))
+ {
+ int newSizeX, newSizeY;
+ pixel * oldData = savePreview->Data;
+ float factorX = ((float)XRES/2)/((float)savePreview->Size.X);
+ float factorY = ((float)YRES/2)/((float)savePreview->Size.Y);
+ float scaleFactor = factorY < factorX ? factorY : factorX;
+ savePreview->Data = Graphics::resample_img(oldData, savePreview->Size.X, savePreview->Size.Y, savePreview->Size.X*scaleFactor, savePreview->Size.Y*scaleFactor);
+ free(oldData);
+ savePreview->Size.X *= scaleFactor;
+ savePreview->Size.Y *= scaleFactor;
+ }
+ }
}
else
{
@@ -230,9 +252,9 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender)
}
}
-void PreviewView::NotifyPreviewChanged(PreviewModel * sender)
+/*void PreviewView::NotifyPreviewChanged(PreviewModel * sender)
{
- savePreview = sender->GetPreview();
+ savePreview = sender->GetGameSave();
if(savePreview && savePreview->Data && !(savePreview->Size.X == XRES/2 && savePreview->Size.Y == YRES/2))
{
int newSizeX, newSizeY;
@@ -243,7 +265,7 @@ void PreviewView::NotifyPreviewChanged(PreviewModel * sender)
savePreview->Size.X *= scaleFactor;
savePreview->Size.Y *= scaleFactor;
}
-}
+}*/
PreviewView::~PreviewView() {
}
diff --git a/src/preview/PreviewView.h b/src/preview/PreviewView.h
index ca2e01b..a0e7c20 100644
--- a/src/preview/PreviewView.h
+++ b/src/preview/PreviewView.h
@@ -36,7 +36,6 @@ class PreviewView: public ui::Window {
public:
void AttachController(PreviewController * controller) { c = controller;}
PreviewView();
- void NotifyPreviewChanged(PreviewModel * sender);
void NotifySaveChanged(PreviewModel * sender);
void NotifyCommentsChanged(PreviewModel * sender);
virtual void OnDraw();