Multiple pages of comments

This commit is contained in:
Simon Robertshaw 2012-06-22 16:35:32 +01:00
parent e6e23669ee
commit beee75d9d1
9 changed files with 140 additions and 13 deletions

View File

@ -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<string> 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<SaveComment*> * 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)
{

View File

@ -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<string> 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()

View File

@ -18,6 +18,7 @@ public:
int date;
int votesUp, votesDown;
bool Favourite;
int Comments;
GameSave * gameSave;

View File

@ -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)

View File

@ -32,6 +32,10 @@ public:
PreviewView * GetView() { return previewView; }
void Update();
void FavouriteSave();
void NextCommentPage();
void PrevCommentPage();
virtual ~PreviewController();
};

View File

@ -5,6 +5,7 @@
* Author: Simon
*/
#include <cmath>
#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<SaveComment*> * tempComments = Client::Ref().GetComments(tSaveID, 0, 10);
std::vector<SaveComment*> * 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<SaveComment*> * 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();

View File

@ -33,11 +33,17 @@ class PreviewModel {
std::vector<SaveComment*> * 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<SaveComment*> * 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);

View File

@ -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()
@ -130,6 +136,11 @@ void PreviewView::OnDraw()
{
Graphics * g = ui::Engine::Ref().g;
if(commentsEnd)
g->fillrect(10, 0, 10, 10, 255, 0, 0, 255);
if(commentsBegin)
g->fillrect(0, 0, 10, 10, 0, 255, 0, 255);
//Window Background+Outline
g->clearrect(Position.X-2, Position.Y-2, Size.X+4, Size.Y+4);
g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
@ -185,12 +196,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 +324,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 +363,8 @@ void PreviewView::NotifyCommentsChanged(PreviewModel * sender)
maxOffset = (maxY-Size.Y)+16;
commentsBegin = true;
commentsEnd = false;
commentsOffset = 0;
commentsVel = 0;
displayComments(commentsOffset);
@ -342,13 +372,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)

View File

@ -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<SaveComment> comments;
std::vector<ui::Component*> 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);