This repository has been archived on 2025-03-20. You can view files and clone it, but cannot push or open issues or pull requests.
The-Powder-Toy/src/gui/preview/PreviewController.cpp
jacob1 40c2ff27b0 Test using DownloadManager from my mod instead of RequestBroker
The crash when opening saves on mac is definitely something to do with the threading, and i'd rather just test this first to see if it fixes it

Copied from my mod almost entirely as-is, with the changes to HTTP.cpp included, also added locks into Download.cpp even though it is probably overkill
2016-03-27 11:41:36 -04:00

201 lines
4.3 KiB
C++

#include <sstream>
#include "client/Client.h"
#include "PreviewController.h"
#include "PreviewView.h"
#include "PreviewModel.h"
#include "PreviewModelException.h"
#include "gui/dialogues/ErrorMessage.h"
#include "gui/login/LoginController.h"
#include "Controller.h"
#include "Platform.h"
PreviewController::PreviewController(int saveID, int saveDate, bool instant, ControllerCallback * callback):
saveId(saveID),
saveDate(saveDate),
loginWindow(NULL),
HasExited(false)
{
previewModel = new PreviewModel();
previewView = new PreviewView();
previewModel->AddObserver(previewView);
previewView->AttachController(this);
previewModel->SetDoOpen(instant);
previewModel->UpdateSave(saveID, saveDate);
if(Client::Ref().GetAuthUser().ID)
{
previewModel->SetCommentBoxEnabled(true);
}
Client::Ref().AddListener(this);
this->callback = callback;
}
PreviewController::PreviewController(int saveID, bool instant, ControllerCallback * callback):
saveId(saveID),
saveDate(0),
loginWindow(NULL),
HasExited(false)
{
previewModel = new PreviewModel();
previewView = new PreviewView();
previewModel->AddObserver(previewView);
previewView->AttachController(this);
previewModel->UpdateSave(saveID, 0);
if(Client::Ref().GetAuthUser().ID)
{
previewModel->SetCommentBoxEnabled(true);
}
Client::Ref().AddListener(this);
this->callback = callback;
}
void PreviewController::Update()
{
previewModel->Update();
if (loginWindow && loginWindow->HasExited == true)
{
delete loginWindow;
loginWindow = NULL;
}
if (previewModel->GetDoOpen() && previewModel->GetSaveInfo() && previewModel->GetSaveInfo()->GetGameSave())
{
Exit();
}
}
bool PreviewController::SubmitComment(std::string comment)
{
if(comment.length() < 4)
{
new ErrorMessage("Error", "Comment is too short");
return false;
}
else
{
RequestStatus status = Client::Ref().AddComment(saveId, comment);
if(status != RequestOkay)
{
new ErrorMessage("Error Submitting comment", Client::Ref().GetLastError());
return false;
}
else
{
previewModel->CommentAdded();
previewModel->UpdateComments(1);
}
}
return true;
}
void PreviewController::ShowLogin()
{
loginWindow = new LoginController();
ui::Engine::Ref().ShowWindow(loginWindow->GetView());
}
void PreviewController::NotifyAuthUserChanged(Client * sender)
{
previewModel->SetCommentBoxEnabled(sender->GetAuthUser().ID);
}
SaveInfo * PreviewController::GetSaveInfo()
{
return previewModel->GetSaveInfo();
}
bool PreviewController::GetDoOpen()
{
return previewModel->GetDoOpen();
}
void PreviewController::DoOpen()
{
previewModel->SetDoOpen(true);
}
void PreviewController::Report(std::string message)
{
if(Client::Ref().ReportSave(saveId, message) == RequestOkay)
{
Exit();
new ErrorMessage("Information", "Report submitted"); //TODO: InfoMessage
}
else
new ErrorMessage("Error", "Unable file report: " + Client::Ref().GetLastError());
}
void PreviewController::FavouriteSave()
{
if(previewModel->GetSaveInfo() && Client::Ref().GetAuthUser().ID)
{
try
{
if(previewModel->GetSaveInfo()->Favourite)
previewModel->SetFavourite(false);
else
previewModel->SetFavourite(true);
}
catch (PreviewModelException & e)
{
new ErrorMessage("Error", e.what());
}
}
}
void PreviewController::OpenInBrowser()
{
std::stringstream uriStream;
uriStream << "http://" << SERVER << "/Browse/View.html?ID=" << saveId;
Platform::OpenURI(uriStream.str());
}
bool PreviewController::NextCommentPage()
{
if(previewModel->GetCommentsPageNum() < previewModel->GetCommentsPageCount() && previewModel->GetCommentsLoaded() && !previewModel->GetDoOpen())
{
previewModel->UpdateComments(previewModel->GetCommentsPageNum()+1);
return true;
}
return false;
}
bool PreviewController::PrevCommentPage()
{
if(previewModel->GetCommentsPageNum() > 1 && previewModel->GetCommentsLoaded() && !previewModel->GetDoOpen())
{
previewModel->UpdateComments(previewModel->GetCommentsPageNum()-1);
return true;
}
return false;
}
void PreviewController::Exit()
{
if(ui::Engine::Ref().GetWindow() == previewView)
{
ui::Engine::Ref().CloseWindow();
}
HasExited = true;
if(callback)
callback->ControllerExit();
}
PreviewController::~PreviewController() {
if(ui::Engine::Ref().GetWindow() == previewView)
{
ui::Engine::Ref().CloseWindow();
}
Client::Ref().RemoveListener(this);
delete previewModel;
delete previewView;
delete callback;
}