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