1 #include "PreviewController.h"
2 
3 #include "PreviewView.h"
4 #include "PreviewModel.h"
5 
6 #include "client/Client.h"
7 #include "client/SaveInfo.h"
8 
9 #include "PreviewModelException.h"
10 
11 #include "gui/dialogues/InformationMessage.h"
12 #include "gui/dialogues/ErrorMessage.h"
13 #include "gui/login/LoginController.h"
14 #include "gui/login/LoginView.h"
15 
16 #include "Controller.h"
17 #include "Platform.h"
18 #include "Config.h"
19 
PreviewController(int saveID,int saveDate,bool instant,std::function<void ()> onDone_)20 PreviewController::PreviewController(int saveID, int saveDate, bool instant, std::function<void ()> onDone_):
21 	saveId(saveID),
22 	loginWindow(NULL),
23 	HasExited(false)
24 {
25 	previewModel = new PreviewModel();
26 	previewView = new PreviewView();
27 	previewModel->AddObserver(previewView);
28 	previewView->AttachController(this);
29 	previewModel->SetDoOpen(instant);
30 
31 	previewModel->UpdateSave(saveID, saveDate);
32 
33 	if(Client::Ref().GetAuthUser().UserID)
34 	{
35 		previewModel->SetCommentBoxEnabled(true);
36 	}
37 
38 	Client::Ref().AddListener(this);
39 
40 	onDone = onDone_;
41 }
42 
Update()43 void PreviewController::Update()
44 {
45 	previewModel->Update();
46 	if (loginWindow && loginWindow->HasExited == true)
47 	{
48 		delete loginWindow;
49 		loginWindow = NULL;
50 	}
51 	if (previewModel->GetDoOpen() && previewModel->GetSaveInfo() && previewModel->GetSaveInfo()->GetGameSave())
52 	{
53 		Exit();
54 	}
55 }
56 
SubmitComment(String comment)57 bool PreviewController::SubmitComment(String comment)
58 {
59 	if(comment.length() < 4)
60 	{
61 		new ErrorMessage("Error", "Comment is too short");
62 		return false;
63 	}
64 	else
65 	{
66 		RequestStatus status = Client::Ref().AddComment(saveId, comment);
67 		if(status != RequestOkay)
68 		{
69 			new ErrorMessage("Error submitting comment", Client::Ref().GetLastError());
70 			return false;
71 		}
72 		else
73 		{
74 			previewModel->CommentAdded();
75 			previewModel->UpdateComments(1);
76 		}
77 	}
78 	return true;
79 }
80 
ShowLogin()81 void PreviewController::ShowLogin()
82 {
83 	loginWindow = new LoginController();
84 	loginWindow->GetView()->MakeActiveWindow();
85 }
86 
NotifyAuthUserChanged(Client * sender)87 void PreviewController::NotifyAuthUserChanged(Client * sender)
88 {
89 	previewModel->SetCommentBoxEnabled(sender->GetAuthUser().UserID);
90 }
91 
GetSaveInfo()92 SaveInfo * PreviewController::GetSaveInfo()
93 {
94 	return previewModel->GetSaveInfo();
95 }
96 
GetDoOpen()97 bool PreviewController::GetDoOpen()
98 {
99 	return previewModel->GetDoOpen();
100 }
101 
DoOpen()102 void PreviewController::DoOpen()
103 {
104 	previewModel->SetDoOpen(true);
105 }
106 
Report(String message)107 void PreviewController::Report(String message)
108 {
109 	if(Client::Ref().ReportSave(saveId, message) == RequestOkay)
110 	{
111 		Exit();
112 		new InformationMessage("Information", "Report submitted", false);
113 	}
114 	else
115 		new ErrorMessage("Error", "Unable to file report: " + Client::Ref().GetLastError());
116 }
117 
FavouriteSave()118 void PreviewController::FavouriteSave()
119 {
120 	if(previewModel->GetSaveInfo() && Client::Ref().GetAuthUser().UserID)
121 	{
122 		try
123 		{
124 			if(previewModel->GetSaveInfo()->Favourite)
125 				previewModel->SetFavourite(false);
126 			else
127 				previewModel->SetFavourite(true);
128 		}
129 		catch (PreviewModelException & e)
130 		{
131 			new ErrorMessage("Error", ByteString(e.what()).FromUtf8());
132 		}
133 	}
134 }
135 
OpenInBrowser()136 void PreviewController::OpenInBrowser()
137 {
138 	ByteString uri = ByteString::Build(SCHEME, SERVER, "/Browse/View.html?ID=", saveId);
139 	Platform::OpenURI(uri);
140 }
141 
NextCommentPage()142 bool PreviewController::NextCommentPage()
143 {
144 	if(previewModel->GetCommentsPageNum() < previewModel->GetCommentsPageCount() && previewModel->GetCommentsLoaded() && !previewModel->GetDoOpen())
145 	{
146 		previewModel->UpdateComments(previewModel->GetCommentsPageNum()+1);
147 		return true;
148 	}
149 	return false;
150 }
151 
PrevCommentPage()152 bool PreviewController::PrevCommentPage()
153 {
154 	if(previewModel->GetCommentsPageNum() > 1 && previewModel->GetCommentsLoaded() && !previewModel->GetDoOpen())
155 	{
156 		previewModel->UpdateComments(previewModel->GetCommentsPageNum()-1);
157 		return true;
158 	}
159 	return false;
160 }
161 
Exit()162 void PreviewController::Exit()
163 {
164 	previewView->CloseActiveWindow();
165 	HasExited = true;
166 	if (onDone)
167 		onDone();
168 }
169 
~PreviewController()170 PreviewController::~PreviewController()
171 {
172 	previewView->CloseActiveWindow();
173 	Client::Ref().RemoveListener(this);
174 	delete previewModel;
175 	delete previewView;
176 }
177