152 lines
4.6 KiB
C++
152 lines
4.6 KiB
C++
#include "LocalSaveActivity.h"
|
|
|
|
#include "images.h"
|
|
|
|
#include "client/Client.h"
|
|
#include "client/GameSave.h"
|
|
#include "client/ThumbnailRendererTask.h"
|
|
|
|
#include "graphics/Graphics.h"
|
|
|
|
#include "gui/Style.h"
|
|
|
|
#include "gui/dialogues/ConfirmPrompt.h"
|
|
#include "gui/dialogues/ErrorMessage.h"
|
|
#include "gui/interface/Button.h"
|
|
#include "gui/interface/Label.h"
|
|
#include "gui/interface/Textbox.h"
|
|
|
|
LocalSaveActivity::LocalSaveActivity(SaveFile save, OnSaved onSaved_) :
|
|
WindowActivity(ui::Point(-1, -1), ui::Point(220, 200)),
|
|
save(save),
|
|
thumbnailRenderer(nullptr),
|
|
onSaved(onSaved_)
|
|
{
|
|
ui::Label * titleLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 16), "Save to computer:"_i18n);
|
|
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]"_i18n);
|
|
filenameField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
|
|
filenameField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
|
|
AddComponent(filenameField);
|
|
FocusComponent(filenameField);
|
|
|
|
ui::Button * cancelButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point(Size.X-75, 16), "Cancel"_i18n);
|
|
cancelButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
|
|
cancelButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
|
|
cancelButton->Appearance.BorderInactive = ui::Colour(200, 200, 200);
|
|
cancelButton->SetActionCallback({ [this] {
|
|
Exit();
|
|
} });
|
|
AddComponent(cancelButton);
|
|
SetCancelButton(cancelButton);
|
|
|
|
ui::Button * okayButton = new ui::Button(ui::Point(Size.X-76, Size.Y-16), ui::Point(76, 16), "Save"_i18n);
|
|
okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
|
|
okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
|
|
okayButton->Appearance.TextInactive = style::Colour::InformationTitle;
|
|
okayButton->SetActionCallback({ [this] {
|
|
Save();
|
|
} });
|
|
AddComponent(okayButton);
|
|
SetOkayButton(okayButton);
|
|
|
|
if(save.GetGameSave())
|
|
{
|
|
thumbnailRenderer = new ThumbnailRendererTask(save.GetGameSave(), Size.X-16, -1, false, true, false);
|
|
thumbnailRenderer->Start();
|
|
}
|
|
}
|
|
|
|
void LocalSaveActivity::OnTick(float dt)
|
|
{
|
|
if (thumbnailRenderer)
|
|
{
|
|
thumbnailRenderer->Poll();
|
|
if (thumbnailRenderer->GetDone())
|
|
{
|
|
thumbnail = thumbnailRenderer->Finish();
|
|
thumbnailRenderer = nullptr;
|
|
}
|
|
}
|
|
}
|
|
|
|
void LocalSaveActivity::Save()
|
|
{
|
|
if (filenameField->GetText().Contains('/') || filenameField->GetText().BeginsWith("."))
|
|
{
|
|
new ErrorMessage("Error"_i18n, "Invalid filename."_i18n);
|
|
}
|
|
else if (filenameField->GetText().length())
|
|
{
|
|
ByteString finalFilename = ByteString(LOCAL_SAVE_DIR) + ByteString(PATH_SEP) + filenameField->GetText().ToUtf8() + ".cps";
|
|
save.SetDisplayName(filenameField->GetText());
|
|
save.SetFileName(finalFilename);
|
|
if(Client::Ref().FileExists(finalFilename))
|
|
{
|
|
new ConfirmPrompt("Overwrite file"_i18n, "Are you sure you wish to overwrite\n"_i18n+finalFilename.FromUtf8(), { [this, finalFilename] {
|
|
saveWrite(finalFilename);
|
|
} });
|
|
}
|
|
else
|
|
{
|
|
saveWrite(finalFilename);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
new ErrorMessage("Error"_i18n, "You must specify a filename."_i18n);
|
|
}
|
|
}
|
|
|
|
void LocalSaveActivity::saveWrite(ByteString finalFilename)
|
|
{
|
|
Client::Ref().MakeDirectory(LOCAL_SAVE_DIR);
|
|
GameSave *gameSave = save.GetGameSave();
|
|
Json::Value localSaveInfo;
|
|
localSaveInfo["type"] = "localsave";
|
|
localSaveInfo["username"] = Client::Ref().GetAuthUser().Username;
|
|
localSaveInfo["title"] = finalFilename;
|
|
localSaveInfo["date"] = (Json::Value::UInt64)time(NULL);
|
|
Client::Ref().SaveAuthorInfo(&localSaveInfo);
|
|
gameSave->authors = localSaveInfo;
|
|
std::vector<char> saveData = gameSave->Serialise();
|
|
if (saveData.size() == 0)
|
|
new ErrorMessage("Error"_i18n, "Unable to serialize game data."_i18n);
|
|
else if (Client::Ref().WriteFile(saveData, finalFilename))
|
|
new ErrorMessage("Error"_i18n, "Unable to write save file."_i18n);
|
|
else
|
|
{
|
|
if (onSaved)
|
|
{
|
|
onSaved(&save);
|
|
}
|
|
Exit();
|
|
}
|
|
}
|
|
|
|
void LocalSaveActivity::OnDraw()
|
|
{
|
|
Graphics * g = GetGraphics();
|
|
g->draw_rgba_image(save_to_disk_image, 0, 0, 0.7f);
|
|
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.get(), Position.X+(Size.X-thumbnail->Width)/2, Position.Y+45, 255);
|
|
g->drawrect(Position.X+(Size.X-thumbnail->Width)/2, Position.Y+45, thumbnail->Width, thumbnail->Height, 180, 180, 180, 255);
|
|
}
|
|
}
|
|
|
|
LocalSaveActivity::~LocalSaveActivity()
|
|
{
|
|
if (thumbnailRenderer)
|
|
{
|
|
thumbnailRenderer->Abandon();
|
|
}
|
|
}
|