summaryrefslogtreecommitdiff
path: root/src/save
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-11-17 19:44:09 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-11-17 19:44:09 (GMT)
commit058a2edd75debbd0297f92572316daa704bd379f (patch)
treead303f091f9a08b209b91eb34a9fcad996a3de69 /src/save
parente3594aba9e05c6865d396418c028049cda92c2f3 (diff)
parent7a21ae192fe19868539956f3fe28e62b2c7c4429 (diff)
downloadpowder-058a2edd75debbd0297f92572316daa704bd379f.zip
powder-058a2edd75debbd0297f92572316daa704bd379f.tar.gz
Merge branch 'master' of github.com:FacialTurd/PowderToypp
Diffstat (limited to 'src/save')
-rw-r--r--src/save/LocalSaveActivity.cpp138
-rw-r--r--src/save/LocalSaveActivity.h39
-rw-r--r--src/save/ServerSaveActivity.cpp261
-rw-r--r--src/save/ServerSaveActivity.h48
4 files changed, 486 insertions, 0 deletions
diff --git a/src/save/LocalSaveActivity.cpp b/src/save/LocalSaveActivity.cpp
new file mode 100644
index 0000000..b57a993
--- /dev/null
+++ b/src/save/LocalSaveActivity.cpp
@@ -0,0 +1,138 @@
+#include "LocalSaveActivity.h"
+#include "interface/Label.h"
+#include "interface/Textbox.h"
+#include "interface/Button.h"
+#include "search/Thumbnail.h"
+#include "client/ThumbnailBroker.h"
+#include "dialogues/ErrorMessage.h"
+#include "dialogues/ConfirmPrompt.h"
+#include "client/Client.h"
+#include "client/GameSave.h"
+#include "Style.h"
+
+class LocalSaveActivity::CancelAction: public ui::ButtonAction
+{
+ LocalSaveActivity * a;
+public:
+ CancelAction(LocalSaveActivity * a) : a(a) {}
+ virtual void ActionCallback(ui::Button * sender)
+ {
+ a->Exit();
+ }
+};
+
+class LocalSaveActivity::SaveAction: public ui::ButtonAction
+{
+ LocalSaveActivity * a;
+public:
+ SaveAction(LocalSaveActivity * a) : a(a) {}
+ virtual void ActionCallback(ui::Button * sender)
+ {
+ a->Save();
+ }
+};
+
+LocalSaveActivity::LocalSaveActivity(SaveFile save, FileSavedCallback * callback) :
+ WindowActivity(ui::Point(-1, -1), ui::Point(220, 200)),
+ thumbnail(NULL),
+ save(save),
+ callback(callback)
+{
+ ui::Label * titleLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 16), "Save to computer:");
+ titleLabel->SetTextColour(style::Colour::InformationTitle);
+ titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ AddComponent(titleLabel);
+
+ filenameField = new ui::Textbox(ui::Point(8, 25), ui::Point(Size.X-16, 16), save.GetDisplayName(), "[filename]");
+ filenameField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ filenameField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ AddComponent(filenameField);
+
+ ui::Button * cancelButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point(Size.X-75, 16), "Cancel");
+ cancelButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ cancelButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ cancelButton->Appearance.BorderInactive = ui::Colour(200, 200, 200);
+ cancelButton->SetActionCallback(new CancelAction(this));
+ AddComponent(cancelButton);
+ SetCancelButton(cancelButton);
+
+ ui::Button * okayButton = new ui::Button(ui::Point(Size.X-76, Size.Y-16), ui::Point(76, 16), "Save");
+ okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ okayButton->Appearance.TextInactive = style::Colour::InformationTitle;
+ okayButton->SetActionCallback(new SaveAction(this));
+ AddComponent(okayButton);
+ SetOkayButton(okayButton);
+
+ if(save.GetGameSave())
+ ThumbnailBroker::Ref().RenderThumbnail(save.GetGameSave(), true, false, Size.X-16, -1, this);
+}
+
+void LocalSaveActivity::Save()
+{
+ class FileOverwriteConfirmation: public ConfirmDialogueCallback {
+ public:
+ LocalSaveActivity * a;
+ std::string filename;
+ FileOverwriteConfirmation(LocalSaveActivity * a, std::string finalFilename) : a(a), filename(finalFilename) {}
+ virtual void ConfirmCallback(ConfirmPrompt::DialogueResult result) {
+ if (result == ConfirmPrompt::ResultOkay)
+ {
+ a->saveWrite(filename);
+ a->Exit();
+ }
+ }
+ virtual ~FileOverwriteConfirmation() { }
+ };
+
+ if(filenameField->GetText().length())
+ {
+ std::string finalFilename = std::string(LOCAL_SAVE_DIR) + std::string(PATH_SEP) + filenameField->GetText() + ".cps";
+ save.SetDisplayName(filenameField->GetText());
+ save.SetFileName(finalFilename);
+ if(Client::Ref().FileExists(finalFilename))
+ {
+ new ConfirmPrompt("Overwrite file", "Are you sure you wish to overwrite\n"+finalFilename, new FileOverwriteConfirmation(this, finalFilename));
+ }
+ else
+ {
+ saveWrite(finalFilename);
+ Exit();
+ }
+ }
+ else
+ {
+ new ErrorMessage("Error", "You must specify a filename.");
+ }
+}
+
+void LocalSaveActivity::saveWrite(std::string finalFilename)
+{
+ Client::Ref().MakeDirectory(LOCAL_SAVE_DIR);
+ Client::Ref().WriteFile(save.GetGameSave()->Serialise(), finalFilename);
+ callback->FileSaved(&save);
+}
+
+void LocalSaveActivity::OnDraw()
+{
+ Graphics * g = ui::Engine::Ref().g;
+ g->clearrect(Position.X-2, Position.Y-2, Size.X+3, Size.Y+3);
+ g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
+
+ if(thumbnail)
+ {
+ g->draw_image(thumbnail->Data, Position.X+(Size.X-thumbnail->Size.X)/2, Position.Y+45, thumbnail->Size.X, thumbnail->Size.Y, 255);
+ g->drawrect(Position.X+(Size.X-thumbnail->Size.X)/2, Position.Y+45, thumbnail->Size.X, thumbnail->Size.Y, 180, 180, 180, 255);
+ }
+}
+
+void LocalSaveActivity::OnThumbnailReady(Thumbnail * thumbnail)
+{
+ this->thumbnail = thumbnail;
+}
+
+LocalSaveActivity::~LocalSaveActivity()
+{
+
+} \ No newline at end of file
diff --git a/src/save/LocalSaveActivity.h b/src/save/LocalSaveActivity.h
new file mode 100644
index 0000000..aacbc0b
--- /dev/null
+++ b/src/save/LocalSaveActivity.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include "Activity.h"
+#include "client/SaveFile.h"
+#include "client/ThumbnailListener.h"
+
+namespace ui
+{
+ class Textbox;
+}
+
+class Thumbnail;
+
+class FileSavedCallback
+{
+public:
+ FileSavedCallback() {}
+ virtual ~FileSavedCallback() {}
+ virtual void FileSaved(SaveFile * file) {}
+};
+
+class LocalSaveActivity: public WindowActivity, public ThumbnailListener
+{
+ SaveFile save;
+ Thumbnail * thumbnail;
+ ui::Textbox * filenameField;
+ class CancelAction;
+ class SaveAction;
+ friend class CancelAction;
+ friend class SaveAction;
+ FileSavedCallback * callback;
+public:
+ LocalSaveActivity(SaveFile save, FileSavedCallback * callback);
+ void saveWrite(std::string finalFilename);
+ virtual void Save();
+ virtual void OnDraw();
+ virtual void OnThumbnailReady(Thumbnail * thumbnail);
+ virtual ~LocalSaveActivity();
+}; \ No newline at end of file
diff --git a/src/save/ServerSaveActivity.cpp b/src/save/ServerSaveActivity.cpp
new file mode 100644
index 0000000..eda807b
--- /dev/null
+++ b/src/save/ServerSaveActivity.cpp
@@ -0,0 +1,261 @@
+#include "ServerSaveActivity.h"
+#include "interface/Label.h"
+#include "interface/Textbox.h"
+#include "interface/Button.h"
+#include "interface/Checkbox.h"
+#include "search/Thumbnail.h"
+#include "client/ThumbnailBroker.h"
+#include "dialogues/ErrorMessage.h"
+#include "dialogues/ConfirmPrompt.h"
+#include "client/Client.h"
+#include "tasks/Task.h"
+#include "Style.h"
+
+class ServerSaveActivity::CancelAction: public ui::ButtonAction
+{
+ ServerSaveActivity * a;
+public:
+ CancelAction(ServerSaveActivity * a) : a(a) {}
+ virtual void ActionCallback(ui::Button * sender)
+ {
+ a->Exit();
+ }
+};
+
+class ServerSaveActivity::SaveAction: public ui::ButtonAction
+{
+ ServerSaveActivity * a;
+public:
+ SaveAction(ServerSaveActivity * a) : a(a) {}
+ virtual void ActionCallback(ui::Button * sender)
+ {
+ a->Save();
+ }
+};
+
+class SaveUploadTask: public Task
+{
+ SaveInfo save;
+
+ virtual void before()
+ {
+
+ }
+
+ virtual void after()
+ {
+
+ }
+
+ virtual bool doWork()
+ {
+ notifyProgress(-1);
+ return Client::Ref().UploadSave(save) == RequestOkay;
+ }
+
+public:
+ SaveInfo GetSave()
+ {
+ return save;
+ }
+
+ SaveUploadTask(SaveInfo save):
+ save(save)
+ {
+
+ }
+};
+
+ServerSaveActivity::ServerSaveActivity(SaveInfo save, ServerSaveActivity::SaveUploadedCallback * callback) :
+ WindowActivity(ui::Point(-1, -1), ui::Point(440, 200)),
+ thumbnail(NULL),
+ save(save),
+ callback(callback),
+ saveUploadTask(NULL)
+{
+ ui::Label * titleLabel = new ui::Label(ui::Point(4, 5), ui::Point((Size.X/2)-8, 16), "Save to server:");
+ titleLabel->SetTextColour(style::Colour::InformationTitle);
+ titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ AddComponent(titleLabel);
+
+ ui::Label * previewLabel = new ui::Label(ui::Point((Size.X/2)+4, 5), ui::Point((Size.X/2)-8, 16), "Preview:");
+ previewLabel->SetTextColour(style::Colour::InformationTitle);
+ previewLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ previewLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ AddComponent(previewLabel);
+
+ nameField = new ui::Textbox(ui::Point(8, 25), ui::Point((Size.X/2)-16, 16), save.GetName(), "[save name]");
+ nameField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ nameField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ AddComponent(nameField);
+
+ descriptionField = new ui::Textbox(ui::Point(8, 65), ui::Point((Size.X/2)-16, Size.Y-(65+16+4)), save.GetDescription(), "[save description]");
+ descriptionField->SetMultiline(true);
+ descriptionField->SetLimit(254);
+ descriptionField->Appearance.VerticalAlign = ui::Appearance::AlignTop;
+ descriptionField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ AddComponent(descriptionField);
+
+ publishedCheckbox = new ui::Checkbox(ui::Point(8, 45), ui::Point((Size.X/2)-16, 16), "Publish", "");
+ if(Client::Ref().GetAuthUser().Username != save.GetUserName())
+ {
+ //Save is not owned by the user, disable by default
+ publishedCheckbox->SetChecked(false);
+ }
+ else
+ {
+ //Save belongs to the current user, use published state already set
+ publishedCheckbox->SetChecked(save.GetPublished());
+ }
+ AddComponent(publishedCheckbox);
+
+ ui::Button * cancelButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point((Size.X/2)-75, 16), "Cancel");
+ cancelButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ cancelButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ cancelButton->Appearance.BorderInactive = ui::Colour(200, 200, 200);
+ cancelButton->SetActionCallback(new CancelAction(this));
+ AddComponent(cancelButton);
+ SetCancelButton(cancelButton);
+
+ ui::Button * okayButton = new ui::Button(ui::Point((Size.X/2)-76, Size.Y-16), ui::Point(76, 16), "Save");
+ okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ okayButton->Appearance.TextInactive = style::Colour::InformationTitle;
+ okayButton->SetActionCallback(new SaveAction(this));
+ AddComponent(okayButton);
+ SetOkayButton(okayButton);
+
+ if(save.GetGameSave())
+ ThumbnailBroker::Ref().RenderThumbnail(save.GetGameSave(), false, true, (Size.X/2)-16, -1, this);
+}
+
+ServerSaveActivity::ServerSaveActivity(SaveInfo save, bool saveNow, ServerSaveActivity::SaveUploadedCallback * callback) :
+ WindowActivity(ui::Point(-1, -1), ui::Point(200, 50)),
+ thumbnail(NULL),
+ save(save),
+ callback(callback),
+ saveUploadTask(NULL)
+{
+ ui::Label * titleLabel = new ui::Label(ui::Point(0, 0), Size, "Saving to server...");
+ titleLabel->SetTextColour(style::Colour::InformationTitle);
+ titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignCentre;
+ titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ AddComponent(titleLabel);
+
+ saveUploadTask = new SaveUploadTask(save);
+ saveUploadTask->AddTaskListener(this);
+ saveUploadTask->Start();
+}
+
+void ServerSaveActivity::NotifyDone(Task * task)
+{
+ if(!task->GetSuccess())
+ {
+ Exit();
+ new ErrorMessage("Error", Client::Ref().GetLastError());
+ }
+ else
+ {
+ if(callback)
+ {
+ callback->SaveUploaded(save);
+ }
+ Exit();
+ }
+}
+
+void ServerSaveActivity::Save()
+{
+ class PublishConfirmation: public ConfirmDialogueCallback {
+ public:
+ ServerSaveActivity * a;
+ PublishConfirmation(ServerSaveActivity * a) : a(a) {}
+ virtual void ConfirmCallback(ConfirmPrompt::DialogueResult result) {
+ if (result == ConfirmPrompt::ResultOkay)
+ {
+ a->Exit();
+ a->saveUpload();
+ }
+ }
+ virtual ~PublishConfirmation() { }
+ };
+
+ if(nameField->GetText().length())
+ {
+ if(Client::Ref().GetAuthUser().Username != save.GetUserName() && publishedCheckbox->GetChecked())
+ {
+ new ConfirmPrompt("Publish", "This save was created by " + save.GetUserName() + ", you're about to publish this under your own name; If you haven't been given permission by the author to do so, please untick the publish box, otherwise continue", new PublishConfirmation(this));
+ }
+ else
+ {
+ Exit();
+ saveUpload();
+ }
+ }
+ else
+ {
+ new ErrorMessage("Error", "You must specify a save name.");
+ }
+}
+
+void ServerSaveActivity::saveUpload()
+{
+ save.SetName(nameField->GetText());
+ save.SetDescription(descriptionField->GetText());
+ save.SetPublished(publishedCheckbox->GetChecked());
+ save.SetUserName(Client::Ref().GetAuthUser().Username);
+ save.SetID(0);
+
+ if(Client::Ref().UploadSave(save) != RequestOkay)
+ {
+ new ErrorMessage("Error", "Upload failed with error:\n"+Client::Ref().GetLastError());
+ }
+ else if(callback)
+ {
+ callback->SaveUploaded(save);
+ }
+}
+
+void ServerSaveActivity::Exit()
+{
+ if(callback)
+ {
+ delete callback;
+ callback = NULL;
+ }
+ WindowActivity::Exit();
+}
+
+void ServerSaveActivity::OnTick(float dt)
+{
+ if(saveUploadTask)
+ saveUploadTask->Poll();
+}
+
+void ServerSaveActivity::OnDraw()
+{
+ Graphics * g = ui::Engine::Ref().g;
+ g->clearrect(Position.X-2, Position.Y-2, Size.X+3, Size.Y+3);
+ g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
+
+ if(Size.X>220)
+ g->draw_line(Position.X+(Size.X/2)-1, Position.Y, Position.X+(Size.X/2)-1, Position.Y+Size.Y-1, 255, 255, 255, 255);
+
+ if(thumbnail)
+ {
+ g->draw_image(thumbnail->Data, Position.X+(Size.X/2)+((Size.X/2)-thumbnail->Size.X)/2, Position.Y+25, thumbnail->Size.X, thumbnail->Size.Y, 255);
+ g->drawrect(Position.X+(Size.X/2)+((Size.X/2)-thumbnail->Size.X)/2, Position.Y+25, thumbnail->Size.X, thumbnail->Size.Y, 180, 180, 180, 255);
+ }
+}
+
+void ServerSaveActivity::OnThumbnailReady(Thumbnail * thumbnail)
+{
+ this->thumbnail = thumbnail;
+}
+
+ServerSaveActivity::~ServerSaveActivity()
+{
+ if(saveUploadTask)
+ delete saveUploadTask;
+} \ No newline at end of file
diff --git a/src/save/ServerSaveActivity.h b/src/save/ServerSaveActivity.h
new file mode 100644
index 0000000..4bf581c
--- /dev/null
+++ b/src/save/ServerSaveActivity.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include "Activity.h"
+#include "client/SaveInfo.h"
+#include "client/ThumbnailListener.h"
+#include "tasks/TaskListener.h"
+
+namespace ui
+{
+ class Textbox;
+ class Checkbox;
+}
+
+class Task;
+class Thumbnail;
+class ServerSaveActivity: public WindowActivity, public ThumbnailListener, public TaskListener
+{
+public:
+ class SaveUploadedCallback
+ {
+ public:
+ SaveUploadedCallback() {}
+ virtual ~SaveUploadedCallback() {}
+ virtual void SaveUploaded(SaveInfo save) {}
+ };
+ ServerSaveActivity(SaveInfo save, SaveUploadedCallback * callback);
+ ServerSaveActivity(SaveInfo save, bool saveNow, SaveUploadedCallback * callback);
+ void saveUpload();
+ virtual void Save();
+ virtual void Exit();
+ virtual void OnDraw();
+ virtual void OnThumbnailReady(Thumbnail * thumbnail);
+ virtual void OnTick(float dt);
+ virtual ~ServerSaveActivity();
+protected:
+ virtual void NotifyDone(Task * task);
+ Task * saveUploadTask;
+ SaveUploadedCallback * callback;
+ SaveInfo save;
+ Thumbnail * thumbnail;
+ ui::Textbox * nameField;
+ ui::Textbox * descriptionField;
+ ui::Checkbox * publishedCheckbox;
+ class CancelAction;
+ class SaveAction;
+ friend class CancelAction;
+ friend class SaveAction;
+}; \ No newline at end of file