summaryrefslogtreecommitdiff
path: root/src/gui/preview/PreviewModel.cpp
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2013-03-24 12:24:17 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2013-03-24 12:24:17 (GMT)
commit9b5b85f9b01cbda7ef9a7ec2a15b2a35630a5b9d (patch)
treeac7d040253b459ce102e476cb19ab59e3cfa90d7 /src/gui/preview/PreviewModel.cpp
parent6bf98ccdca39936a3c51367862eed7c49f8786ec (diff)
parentbdc69f31c0be94191015838886bdcc2bc67f1acb (diff)
downloadpowder-9b5b85f9b01cbda7ef9a7ec2a15b2a35630a5b9d.zip
powder-9b5b85f9b01cbda7ef9a7ec2a15b2a35630a5b9d.tar.gz
Merge branch 'reorganisation' of github.com:FacialTurd/The-Powder-Toy
Diffstat (limited to 'src/gui/preview/PreviewModel.cpp')
-rw-r--r--src/gui/preview/PreviewModel.cpp360
1 files changed, 360 insertions, 0 deletions
diff --git a/src/gui/preview/PreviewModel.cpp b/src/gui/preview/PreviewModel.cpp
new file mode 100644
index 0000000..8d608cf
--- /dev/null
+++ b/src/gui/preview/PreviewModel.cpp
@@ -0,0 +1,360 @@
+#include <cmath>
+#include "PreviewModel.h"
+#include "client/Client.h"
+#include "client/GameSave.h";
+#include "PreviewModelException.h"
+
+PreviewModel::PreviewModel():
+ save(NULL),
+ saveComments(NULL),
+ doOpen(false),
+ updateSaveDataWorking(false),
+ updateSaveDataFinished(false),
+ updateSaveInfoWorking(false),
+ updateSaveInfoFinished(false),
+ updateSaveCommentsWorking(false),
+ updateSaveCommentsFinished(false),
+ commentsTotal(0),
+ commentsPageNumber(1),
+ commentBoxEnabled(false)
+{
+
+}
+
+void * PreviewModel::updateSaveInfoTHelper(void * obj)
+{
+ return ((PreviewModel*)obj)->updateSaveInfoT();
+}
+
+void * PreviewModel::updateSaveDataTHelper(void * obj)
+{
+ return ((PreviewModel*)obj)->updateSaveDataT();
+}
+
+void * PreviewModel::updateSaveCommentsTHelper(void * obj)
+{
+ return ((PreviewModel*)obj)->updateSaveCommentsT();
+}
+
+void PreviewModel::updateSaveInfoTDelete(void * arg)
+{
+ delete arg;
+}
+void PreviewModel::updateSaveDataTDelete(void * arg)
+{
+ free(arg);
+}
+void PreviewModel::updateSaveCommentsTDelete(void * arg)
+{
+ for(int i = 0; i < ((std::vector<SaveComment*> *)arg)->size(); i++)
+ delete ((std::vector<SaveComment*> *)arg)->at(i);
+ ((std::vector<SaveComment*> *)arg)->clear();
+ delete arg;
+}
+
+void * PreviewModel::updateSaveInfoT()
+{
+ SaveInfo * tempSave;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
+ tempSave = Client::Ref().GetSave(tSaveID, tSaveDate);
+ pthread_cleanup_push(&updateSaveInfoTDelete,tempSave);
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
+ pthread_testcancel();
+ updateSaveInfoFinished = true;
+ pthread_cleanup_pop(0);
+ return tempSave;
+}
+
+void * PreviewModel::updateSaveDataT()
+{
+ int tempDataSize;
+ unsigned char * tempData;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
+ tempData = Client::Ref().GetSaveData(tSaveID, tSaveDate, tempDataSize);
+ pthread_cleanup_push(&updateSaveDataTDelete,tempData);
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
+ pthread_testcancel();
+ saveDataBuffer.clear();
+ if (tempData)
+ saveDataBuffer.insert(saveDataBuffer.begin(), tempData, tempData+tempDataSize);
+ updateSaveDataFinished = true;
+ pthread_cleanup_pop(1);
+ return NULL;
+}
+
+void * PreviewModel::updateSaveCommentsT()
+{
+ std::vector<SaveComment*> * tempComments;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
+ tempComments = Client::Ref().GetComments(tSaveID, (commentsPageNumber-1)*20, 20);
+ pthread_cleanup_push(&updateSaveCommentsTDelete,tempComments);
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
+ pthread_testcancel();
+ updateSaveCommentsFinished = true;
+ pthread_cleanup_pop(0);
+ return tempComments;
+}
+
+void PreviewModel::SetFavourite(bool favourite)
+{
+ if(save)
+ {
+ Client::Ref().FavouriteSave(save->id, favourite);
+ save->Favourite = favourite;
+ notifySaveChanged();
+ }
+}
+
+bool PreviewModel::GetCommentBoxEnabled()
+{
+ return commentBoxEnabled;
+}
+
+void PreviewModel::SetCommentBoxEnabled(bool enabledState)
+{
+ if(enabledState != commentBoxEnabled)
+ {
+ commentBoxEnabled = enabledState;
+ notifyCommentBoxEnabledChanged();
+ }
+}
+
+void PreviewModel::UpdateSave(int saveID, int saveDate)
+{
+ this->tSaveID = saveID;
+ this->tSaveDate = saveDate;
+
+ if(save)
+ {
+ delete save;
+ save = NULL;
+ }
+ saveDataBuffer.clear();
+ if(saveComments)
+ {
+ for(int i = 0; i < saveComments->size(); i++)
+ delete saveComments->at(i);
+ saveComments->clear();
+ delete saveComments;
+ saveComments = NULL;
+ }
+ notifySaveChanged();
+ notifySaveCommentsChanged();
+
+ if(!updateSaveDataWorking)
+ {
+ updateSaveDataWorking = true;
+ updateSaveDataFinished = false;
+ pthread_create(&updateSaveDataThread, 0, &PreviewModel::updateSaveDataTHelper, this);
+ }
+
+ if(!updateSaveInfoWorking)
+ {
+ updateSaveInfoWorking = true;
+ updateSaveInfoFinished = false;
+ pthread_create(&updateSaveInfoThread, 0, &PreviewModel::updateSaveInfoTHelper, this);
+ }
+
+ if(!updateSaveCommentsWorking)
+ {
+ commentsLoaded = false;
+ updateSaveCommentsWorking = true;
+ updateSaveCommentsFinished = false;
+ pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsTHelper, this);
+ }
+}
+
+void PreviewModel::SetDoOpen(bool doOpen)
+{
+ this->doOpen = doOpen;
+}
+
+bool PreviewModel::GetDoOpen()
+{
+ return doOpen;
+}
+
+SaveInfo * PreviewModel::GetSave()
+{
+ return save;
+}
+
+int PreviewModel::GetCommentsPageNum()
+{
+ return commentsPageNumber;
+}
+
+int PreviewModel::GetCommentsPageCount()
+{
+ return max(1, (int)(ceil(commentsTotal/20.0f)));
+}
+
+bool PreviewModel::GetCommentsLoaded()
+{
+ return commentsLoaded;
+}
+
+void PreviewModel::UpdateComments(int pageNumber)
+{
+ commentsLoaded = false;
+ if(saveComments)
+ {
+ for(int i = 0; i < saveComments->size(); i++)
+ delete saveComments->at(i);
+ saveComments->clear();
+ delete saveComments;
+ saveComments = NULL;
+ }
+
+ //resultCount = 0;
+ commentsPageNumber = pageNumber;
+ notifySaveCommentsChanged();
+ notifyCommentsPageChanged();
+
+ //Threading
+ if(!updateSaveCommentsWorking)
+ {
+ updateSaveCommentsFinished = false;
+ updateSaveCommentsWorking = true;
+ pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsTHelper, this);
+ }
+}
+
+std::vector<SaveComment*> * PreviewModel::GetComments()
+{
+ return saveComments;
+}
+
+void PreviewModel::notifySaveChanged()
+{
+ for(int i = 0; i < observers.size(); i++)
+ {
+ observers[i]->NotifySaveChanged(this);
+ }
+}
+
+void PreviewModel::notifyCommentBoxEnabledChanged()
+{
+ for(int i = 0; i < observers.size(); i++)
+ {
+ observers[i]->NotifyCommentBoxEnabledChanged(this);
+ }
+}
+
+void PreviewModel::notifyCommentsPageChanged()
+{
+ for(int i = 0; i < observers.size(); i++)
+ {
+ observers[i]->NotifyCommentsPageChanged(this);
+ }
+}
+
+void PreviewModel::notifySaveCommentsChanged()
+{
+ for(int i = 0; i < observers.size(); i++)
+ {
+ observers[i]->NotifyCommentsChanged(this);
+ }
+}
+
+void PreviewModel::AddObserver(PreviewView * observer) {
+ observers.push_back(observer);
+ observer->NotifySaveChanged(this);
+ observer->NotifyCommentsChanged(this);
+ observer->NotifyCommentsPageChanged(this);
+ observer->NotifyCommentBoxEnabledChanged(this);
+}
+
+void PreviewModel::Update()
+{
+ if(updateSaveDataWorking)
+ {
+ if(updateSaveDataFinished)
+ {
+ updateSaveDataWorking = false;
+ pthread_join(updateSaveDataThread, NULL);
+
+ if(updateSaveInfoFinished && save)
+ {
+ commentsTotal = save->Comments;
+ try
+ {
+ save->SetGameSave(new GameSave(&saveDataBuffer[0], saveDataBuffer.size()));
+ }
+ catch(ParseException &e)
+ {
+ throw PreviewModelException("Save file corrupt or from newer version");
+ }
+ notifySaveChanged();
+ notifyCommentsPageChanged();
+ }
+ }
+ }
+
+ if(updateSaveInfoWorking)
+ {
+ if(updateSaveInfoFinished)
+ {
+ if(save)
+ {
+ delete save;
+ save = NULL;
+ }
+ updateSaveInfoWorking = false;
+ pthread_join(updateSaveInfoThread, (void**)(&save));
+ if(updateSaveDataFinished && save)
+ {
+ commentsTotal = save->Comments;
+ try
+ {
+ save->SetGameSave(new GameSave(&saveDataBuffer[0], saveDataBuffer.size()));
+ }
+ catch(ParseException &e)
+ {
+ throw PreviewModelException("Save file corrupt or from newer version");
+ }
+ notifyCommentsPageChanged();
+ }
+ notifySaveChanged();
+
+ if(!save)
+ throw PreviewModelException("Unable to load save");
+ }
+ }
+
+ if(updateSaveCommentsWorking)
+ {
+ if(updateSaveCommentsFinished)
+ {
+ if(saveComments)
+ {
+ for(int i = 0; i < saveComments->size(); i++)
+ delete saveComments->at(i);
+ saveComments->clear();
+ delete saveComments;
+ saveComments = NULL;
+ }
+ commentsLoaded = true;
+ updateSaveCommentsWorking = false;
+ pthread_join(updateSaveCommentsThread, (void**)(&saveComments));
+ notifySaveCommentsChanged();
+ }
+ }
+}
+
+PreviewModel::~PreviewModel() {
+ pthread_cancel(updateSaveDataThread);
+ pthread_cancel(updateSaveInfoThread);
+ pthread_cancel(updateSaveCommentsThread);
+ if(save)
+ delete save;
+ if(saveComments)
+ {
+ for(int i = 0; i < saveComments->size(); i++)
+ delete saveComments->at(i);
+ saveComments->clear();
+ delete saveComments;
+ }
+ saveDataBuffer.clear();
+}
+