Multiple pages of comments
This commit is contained in:
parent
e6e23669ee
commit
beee75d9d1
@ -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)
|
||||
{
|
||||
|
@ -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()
|
||||
|
@ -18,6 +18,7 @@ public:
|
||||
int date;
|
||||
int votesUp, votesDown;
|
||||
bool Favourite;
|
||||
int Comments;
|
||||
|
||||
GameSave * gameSave;
|
||||
|
||||
|
@ -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)
|
||||
|
@ -32,6 +32,10 @@ public:
|
||||
PreviewView * GetView() { return previewView; }
|
||||
void Update();
|
||||
void FavouriteSave();
|
||||
|
||||
void NextCommentPage();
|
||||
void PrevCommentPage();
|
||||
|
||||
virtual ~PreviewController();
|
||||
};
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user