diff options
| author | Simon 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) |
| commit | 0ee1e1875d00876b946f358308f39dc33ef96ea4 (patch) | |
| tree | c0ea64b19f03541cb71b96ed3acc4c6c3e2e1834 /src/preview | |
| parent | 1dadb11fc218786a36cc46714a0478e229ca44a9 (diff) | |
| download | powder-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.cpp | 85 | ||||
| -rw-r--r-- | src/preview/PreviewModel.h | 21 | ||||
| -rw-r--r-- | src/preview/PreviewView.cpp | 28 | ||||
| -rw-r--r-- | src/preview/PreviewView.h | 1 |
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(); |
