summaryrefslogtreecommitdiff
path: root/src/filebrowser/FileBrowserActivity.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/filebrowser/FileBrowserActivity.cpp')
-rw-r--r--src/filebrowser/FileBrowserActivity.cpp238
1 files changed, 238 insertions, 0 deletions
diff --git a/src/filebrowser/FileBrowserActivity.cpp b/src/filebrowser/FileBrowserActivity.cpp
new file mode 100644
index 0000000..186ed6a
--- /dev/null
+++ b/src/filebrowser/FileBrowserActivity.cpp
@@ -0,0 +1,238 @@
+#include <sstream>
+#include <iostream>
+#include "FileBrowserActivity.h"
+#include "interface/Label.h"
+#include "interface/Textbox.h"
+#include "interface/ScrollPanel.h"
+#include "interface/SaveButton.h"
+#include "interface/ProgressBar.h"
+#include "client/Client.h"
+#include "client/SaveFile.h"
+#include "Style.h"
+#include "tasks/Task.h"
+#include "simulation/SaveRenderer.h"
+
+class Thumbnail;
+
+
+class SaveSelectedAction: public ui::SaveButtonAction
+{
+ FileBrowserActivity * a;
+public:
+ SaveSelectedAction(FileBrowserActivity * _a) { a = _a; }
+ virtual void ActionCallback(ui::SaveButton * sender)
+ {
+ a->SelectSave(sender->GetSaveFile());
+ }
+};
+
+//Currently, reading is done on another thread, we can't render outside the main thread due to some bullshit with OpenGL
+class LoadFilesTask: public Task
+{
+ std::string directory;
+ std::vector<SaveFile*> saveFiles;
+
+ virtual void before()
+ {
+
+ }
+
+ virtual void after()
+ {
+
+ }
+
+ virtual bool doWork()
+ {
+ std::vector<std::string> files = Client::Ref().DirectorySearch(directory, "", ".cps");
+
+
+ notifyProgress(-1);
+ for(std::vector<std::string>::iterator iter = files.begin(), end = files.end(); iter != end; ++iter)
+ {
+ SaveFile * saveFile = new SaveFile(*iter);
+ try
+ {
+ std::vector<unsigned char> data = Client::Ref().ReadFile(*iter);
+ GameSave * tempSave = new GameSave(data);
+ saveFile->SetGameSave(tempSave);
+ saveFiles.push_back(saveFile);
+ }
+ catch(std::exception & e)
+ {
+ //:(
+ }
+ }
+ return true;
+ }
+
+public:
+ std::vector<SaveFile*> GetSaveFiles()
+ {
+ return saveFiles;
+ }
+
+ LoadFilesTask(std::string directory):
+ directory(directory)
+ {
+
+ }
+};
+
+FileBrowserActivity::FileBrowserActivity(std::string directory, FileSelectedCallback * callback):
+ ui::Window(ui::Point(-1, -1), ui::Point(450, 300)),
+ callback(callback),
+ directory(directory),
+ totalFiles(0)
+{
+ ui::Engine::Ref().ShowWindow(this);
+
+ ui::Label * titleLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 18), "Save Browser");
+ titleLabel->SetTextColour(style::Colour::WarningTitle);
+ titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ AddComponent(titleLabel);
+
+ //ui::Textbox * textField = new ui::Textbox(ui::Point(8, 25), ui::Point(Size.X-16, 16), "", "[search]");
+ //textField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ //textField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ //AddComponent(textField);
+
+ itemList = new ui::ScrollPanel(ui::Point(4, 45), ui::Point(Size.X-8, Size.Y-53));
+ AddComponent(itemList);
+
+ progressBar = new ui::ProgressBar(ui::Point((Size.X-200)/2, 45+(Size.Y-66)/2), ui::Point(200, 17));
+ AddComponent(progressBar);
+
+ filesX = 4;
+ filesY = 3;
+ buttonPadding = 2;
+ fileX = 0;
+ fileY = 0;
+
+ buttonXOffset = 0;
+ buttonYOffset = 0;
+ buttonAreaWidth = itemList->Size.X;
+ buttonAreaHeight = itemList->Size.Y;// - buttonYOffset - 18;
+ buttonWidth = (buttonAreaWidth/filesX) - buttonPadding*2;
+ buttonHeight = (buttonAreaHeight/filesY) - buttonPadding*2;
+
+ loadDirectory(directory);
+}
+
+void FileBrowserActivity::SelectSave(SaveFile * file)
+{
+ if(callback)
+ callback->FileSelected(new SaveFile(*file));
+ Exit();
+}
+
+void FileBrowserActivity::loadDirectory(std::string directory)
+{
+ progressBar->Visible = true;
+ progressBar->SetProgress(-1);
+ progressBar->SetStatus("Loading files");
+ loadFiles = new LoadFilesTask(directory);
+ loadFiles->AddTaskListener(this);
+ loadFiles->Start();
+}
+
+void FileBrowserActivity::NotifyDone(Task * task)
+{
+ for(int i = 0; i < components.size(); i++)
+ {
+ RemoveComponent(components[i]);
+ itemList->RemoveChild(components[i]);
+ delete components[i];
+ }
+ fileX = 0;
+ fileY = 0;
+ files = ((LoadFilesTask*)task)->GetSaveFiles();
+ totalFiles = files.size();
+ delete task;
+ loadFiles = NULL;
+}
+
+void FileBrowserActivity::OnMouseDown(int x, int y, unsigned button)
+{
+ if(!(x > Position.X && y > Position.Y && y < Position.Y+Size.Y && x < Position.X+Size.X)) //Clicked outside window
+ Exit();
+}
+
+void FileBrowserActivity::Exit()
+{
+ ui::Engine::Ref().CloseWindow();
+ SelfDestruct();
+}
+
+void FileBrowserActivity::NotifyError(Task * task)
+{
+
+}
+
+void FileBrowserActivity::NotifyProgress(Task * task)
+{
+ progressBar->SetProgress(task->GetProgress());
+}
+
+void FileBrowserActivity::NotifyStatus(Task * task)
+{
+
+}
+
+void FileBrowserActivity::OnTick(float dt)
+{
+ if(loadFiles)
+ loadFiles->Poll();
+
+ if(files.size())
+ {
+ SaveFile * saveFile = files.back();
+ files.pop_back();
+
+ if(fileX == filesX)
+ {
+ fileX = 0;
+ fileY++;
+ }
+ ui::SaveButton * saveButton = new ui::SaveButton(
+ ui::Point(
+ buttonXOffset + buttonPadding + fileX*(buttonWidth+buttonPadding*2),
+ buttonYOffset + buttonPadding + fileY*(buttonHeight+buttonPadding*2)
+ ),
+ ui::Point(buttonWidth, buttonHeight),
+ saveFile);
+ saveButton->Tick(dt);
+ saveButton->SetActionCallback(new SaveSelectedAction(this));
+ progressBar->SetStatus("Rendering thumbnails");
+ progressBar->SetProgress((float(totalFiles-files.size())/float(totalFiles))*100.0f);
+ componentsQueue.push_back(saveButton);
+ fileX++;
+ }
+ else if(componentsQueue.size())
+ {
+ for(std::vector<ui::Component*>::iterator iter = componentsQueue.begin(), end = componentsQueue.end(); iter != end; ++iter)
+ {
+ components.push_back(*iter);
+ itemList->AddChild(*iter);
+ }
+ componentsQueue.clear();
+ itemList->InnerSize.Y = (buttonHeight+(buttonPadding*2))*fileY;
+ progressBar->Visible = false;
+ }
+}
+
+void FileBrowserActivity::OnDraw()
+{
+ Graphics * g = ui::Engine::Ref().g;
+
+ //Window Background+Outline
+ g->clearrect(Position.X-2, Position.Y-2, Size.X+4, Size.Y+4);
+ g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
+}
+
+FileBrowserActivity::~FileBrowserActivity()
+{
+ if(callback)
+ delete callback;
+} \ No newline at end of file