diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 71bbfc4db..ec8892784 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -851,6 +851,7 @@ SaveInfo * Client::GetSave(int saveID, int saveDate) json::Number tempDate = objDocument["Date"]; json::Boolean tempPublished = objDocument["Published"]; json::Boolean tempFavourite = objDocument["Favourite"]; + json::Number tempComments = objDocument["Comments"]; json::Array tagsArray = objDocument["Tags"]; vector tempTags; @@ -873,6 +874,7 @@ SaveInfo * Client::GetSave(int saveID, int saveDate) tempPublished.Value(), tempTags ); + tempSave->Comments = tempComments.Value(); tempSave->Favourite = tempFavourite.Value(); return tempSave; } @@ -939,7 +941,7 @@ std::vector * Client::GetComments(int saveID, int start, int count std::stringstream urlStream; char * data; int dataStatus, dataLength; - urlStream << "http://" << SERVER << "/Browse/View.json?ID=" << saveID << "&Mode=Comments&Start=" << start << "&Count=" << count; + urlStream << "http://" << SERVER << "/Browse/Comments.json?ID=" << saveID << "&Start=" << start << "&Count=" << count; data = http_simple_get((char *)urlStream.str().c_str(), &dataStatus, &dataLength); if(dataStatus == 200 && data) { diff --git a/src/client/SaveInfo.cpp b/src/client/SaveInfo.cpp index bfacd7da3..da1033fd4 100644 --- a/src/client/SaveInfo.cpp +++ b/src/client/SaveInfo.cpp @@ -11,7 +11,7 @@ SaveInfo::SaveInfo(SaveInfo & save) : userName(save.userName), name(save.name), Description(save.Description), date( save.date), Published(save.Published), id(save.id), votesUp( - save.votesUp), votesDown(save.votesDown), gameSave(NULL), vote(save.vote), tags(save.tags) { + save.votesUp), votesDown(save.votesDown), gameSave(NULL), vote(save.vote), tags(save.tags), Comments(save.Comments) { if(save.gameSave) gameSave = new GameSave(*save.gameSave); } @@ -20,14 +20,14 @@ SaveInfo::SaveInfo(int _id, int _date, int _votesUp, int _votesDown, string _use string _name) : id(_id), votesUp(_votesUp), votesDown(_votesDown), userName(_userName), name( _name), Description("No description provided"), date(_date), Published( - true), gameSave(NULL), vote(0), tags() { + true), gameSave(NULL), vote(0), tags(), Comments(0) { } SaveInfo::SaveInfo(int _id, int date_, int _votesUp, int _votesDown, int _vote, string _userName, string _name, string description_, bool published_, vector tags_) : id(_id), votesUp(_votesUp), votesDown(_votesDown), userName(_userName), name( _name), Description(description_), date(date_), Published( - published_), gameSave(NULL), vote(_vote), tags(tags_) { + published_), gameSave(NULL), vote(_vote), tags(tags_), Comments(0) { } SaveInfo::~SaveInfo() diff --git a/src/client/SaveInfo.h b/src/client/SaveInfo.h index 5360f9035..e1b013ea3 100644 --- a/src/client/SaveInfo.h +++ b/src/client/SaveInfo.h @@ -18,6 +18,7 @@ public: int date; int votesUp, votesDown; bool Favourite; + int Comments; GameSave * gameSave; diff --git a/src/preview/PreviewController.cpp b/src/preview/PreviewController.cpp index 22913d7bc..63d37c3a7 100644 --- a/src/preview/PreviewController.cpp +++ b/src/preview/PreviewController.cpp @@ -86,6 +86,18 @@ void PreviewController::OpenInBrowser() } } +void PreviewController::NextCommentPage() +{ + if(previewModel->GetCommentsPageNum() < previewModel->GetCommentsPageCount() && previewModel->GetCommentsLoaded()) + previewModel->UpdateComments(previewModel->GetCommentsPageNum()+1); +} + +void PreviewController::PrevCommentPage() +{ + if(previewModel->GetCommentsPageNum()>1 && previewModel->GetCommentsLoaded()) + previewModel->UpdateComments(previewModel->GetCommentsPageNum()-1); +} + void PreviewController::Exit() { if(ui::Engine::Ref().GetWindow() == previewView) diff --git a/src/preview/PreviewController.h b/src/preview/PreviewController.h index 680a8f7bc..815ca5db8 100644 --- a/src/preview/PreviewController.h +++ b/src/preview/PreviewController.h @@ -32,6 +32,10 @@ public: PreviewView * GetView() { return previewView; } void Update(); void FavouriteSave(); + + void NextCommentPage(); + void PrevCommentPage(); + virtual ~PreviewController(); }; diff --git a/src/preview/PreviewModel.cpp b/src/preview/PreviewModel.cpp index f923ceb72..3066ac304 100644 --- a/src/preview/PreviewModel.cpp +++ b/src/preview/PreviewModel.cpp @@ -5,6 +5,7 @@ * Author: Simon */ +#include #include "PreviewModel.h" #include "client/Client.h" #include "PreviewModelException.h" @@ -18,7 +19,9 @@ PreviewModel::PreviewModel(): updateSaveInfoWorking(false), updateSaveInfoFinished(false), updateSaveCommentsWorking(false), - updateSaveCommentsFinished(false) + updateSaveCommentsFinished(false), + commentsTotal(0), + commentsPageNumber(1) { // TODO Auto-generated constructor stub @@ -58,7 +61,7 @@ void * PreviewModel::updateSaveDataT() void * PreviewModel::updateSaveCommentsT() { - std::vector * tempComments = Client::Ref().GetComments(tSaveID, 0, 10); + std::vector * tempComments = Client::Ref().GetComments(tSaveID, (commentsPageNumber-1)*10, 10); updateSaveCommentsFinished = true; return tempComments; } @@ -110,6 +113,7 @@ void PreviewModel::UpdateSave(int saveID, int saveDate) if(!updateSaveCommentsWorking) { + commentsLoaded = false; updateSaveCommentsWorking = true; updateSaveCommentsFinished = false; pthread_create(&updateSaveCommentsThread, 0, &PreviewModel::updateSaveCommentsTHelper, this); @@ -131,6 +135,46 @@ SaveInfo * PreviewModel::GetSave() return save; } +int PreviewModel::GetCommentsPageNum() +{ + return commentsPageNumber; +} + +int PreviewModel::GetCommentsPageCount() +{ + return max(1, (int)(ceil(commentsTotal/10))); +} + +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); + 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 * PreviewModel::GetComments() { return saveComments; @@ -144,6 +188,14 @@ void PreviewModel::notifySaveChanged() } } +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++) @@ -155,6 +207,8 @@ void PreviewModel::notifySaveCommentsChanged() void PreviewModel::AddObserver(PreviewView * observer) { observers.push_back(observer); observer->NotifySaveChanged(this); + observer->NotifyCommentsChanged(this); + observer->NotifyCommentsPageChanged(this); } void PreviewModel::Update() @@ -194,6 +248,7 @@ void PreviewModel::Update() pthread_join(updateSaveInfoThread, (void**)(&save)); if(updateSaveDataFinished && save) { + commentsTotal = save->Comments; try { save->SetGameSave(new GameSave(&saveDataBuffer[0], saveDataBuffer.size())); @@ -204,6 +259,7 @@ void PreviewModel::Update() } } notifySaveChanged(); + notifyCommentsPageChanged(); if(!save) throw PreviewModelException("Unable to load save"); } @@ -220,6 +276,7 @@ void PreviewModel::Update() delete saveComments; saveComments = NULL; } + commentsLoaded = true; updateSaveCommentsWorking = false; pthread_join(updateSaveCommentsThread, (void**)(&saveComments)); notifySaveCommentsChanged(); diff --git a/src/preview/PreviewModel.h b/src/preview/PreviewModel.h index 5a0fd536b..f00a4182b 100644 --- a/src/preview/PreviewModel.h +++ b/src/preview/PreviewModel.h @@ -33,11 +33,17 @@ class PreviewModel { std::vector * saveComments; void notifySaveChanged(); void notifySaveCommentsChanged(); + void notifyCommentsPageChanged(); //Background retrieval int tSaveID; int tSaveDate; + // + bool commentsLoaded; + int commentsTotal; + int commentsPageNumber; + bool updateSaveDataWorking; volatile bool updateSaveDataFinished; pthread_t updateSaveDataThread; @@ -59,6 +65,12 @@ public: PreviewModel(); SaveInfo * GetSave(); std::vector * GetComments(); + + bool GetCommentsLoaded(); + int GetCommentsPageNum(); + int GetCommentsPageCount(); + void UpdateComments(int pageNumber); + void AddObserver(PreviewView * observer); void UpdateSave(int saveID, int saveDate); void SetFavourite(bool favourite); diff --git a/src/preview/PreviewView.cpp b/src/preview/PreviewView.cpp index cc49f91fc..69229f000 100644 --- a/src/preview/PreviewView.cpp +++ b/src/preview/PreviewView.cpp @@ -21,7 +21,9 @@ PreviewView::PreviewView(): doOpen(false), commentsOffset(0), commentsVel(0), - maxOffset(0) + maxOffset(0), + commentsBegin(true), + commentsEnd(false) { class OpenAction: public ui::ButtonAction { @@ -112,6 +114,10 @@ PreviewView::PreviewView(): authorDateLabel = new ui::Label(ui::Point(5, (YRES/2)+15+14), ui::Point(100, 16), ""); authorDateLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; authorDateLabel->Appearance.VerticalAlign = ui::Appearance::AlignBottom; AddComponent(authorDateLabel); + + pageInfo = new ui::Label(ui::Point((XRES/2) + 5, Size.Y-15), ui::Point(Size.X-((XRES/2) + 10), 15), "Page 1 of 1"); + pageInfo->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; authorDateLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + AddComponent(pageInfo); } void PreviewView::DoDraw() @@ -185,12 +191,22 @@ void PreviewView::OnTick(float dt) { commentsOffset = 0; commentsVel = 0; + commentsBegin = true; + commentsEnd = false; } - if(commentsOffset>maxOffset) + else if(commentsOffset>maxOffset) { commentsOffset = maxOffset; commentsVel = 0; + commentsEnd = true; + commentsBegin = false; } + else + { + commentsEnd = false; + commentsBegin = false; + } + displayComments(commentsOffset); } @@ -303,6 +319,13 @@ void PreviewView::displayComments(int yOffset) } } +void PreviewView::NotifyCommentsPageChanged(PreviewModel * sender) +{ + std::stringstream pageInfoStream; + pageInfoStream << "Page " << sender->GetCommentsPageNum() << " of " << sender->GetCommentsPageCount(); + pageInfo->SetText(pageInfoStream.str()); +} + void PreviewView::NotifyCommentsChanged(PreviewModel * sender) { if(sender->GetComments()) @@ -335,6 +358,8 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender) maxOffset = (maxY-Size.Y)+16; + commentsBegin = true; + commentsEnd = false; commentsOffset = 0; commentsVel = 0; displayComments(commentsOffset); @@ -342,13 +367,18 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender) void PreviewView::OnMouseWheel(int x, int y, int d) { - commentsVel-=d; - /*if(!d) + if(!d) return; + commentsVel-=d; + if(d<0) - c->NextPage(); - else - c->PrevPage();*/ + { + if(commentsEnd) + c->NextCommentPage(); + } else { + if(commentsBegin) + c->PrevCommentPage(); + } } /*void PreviewView::NotifyPreviewChanged(PreviewModel * sender) diff --git a/src/preview/PreviewView.h b/src/preview/PreviewView.h index 33510a2de..58232bbb0 100644 --- a/src/preview/PreviewView.h +++ b/src/preview/PreviewView.h @@ -29,6 +29,7 @@ class PreviewView: public ui::Window { ui::Button * reportButton; ui::Label * saveNameLabel; ui::Label * authorDateLabel; + ui::Label * pageInfo; ui::Textblock * saveDescriptionTextblock; std::vector comments; std::vector commentComponents; @@ -37,6 +38,8 @@ class PreviewView: public ui::Window { int votesDown; bool doOpen; + bool commentsEnd; + bool commentsBegin; int maxOffset; float commentsOffset; float commentsVel; @@ -47,6 +50,7 @@ public: PreviewView(); void NotifySaveChanged(PreviewModel * sender); void NotifyCommentsChanged(PreviewModel * sender); + void NotifyCommentsPageChanged(PreviewModel * sender); virtual void OnDraw(); virtual void DoDraw(); virtual void OnTick(float dt);