diff --git a/src/client/SaveFile.cpp b/src/client/SaveFile.cpp index 7c35466c9..0694167a6 100644 --- a/src/client/SaveFile.cpp +++ b/src/client/SaveFile.cpp @@ -11,7 +11,9 @@ SaveFile::SaveFile(SaveFile & save): gameSave(NULL), - thumbnail(NULL) + thumbnail(NULL), + filename(save.filename), + displayName(save.displayName) { if(save.gameSave) gameSave = new GameSave(*save.gameSave); @@ -31,6 +33,7 @@ void SaveFile::SetThumbnail(Thumbnail * thumb) SaveFile::SaveFile(string filename): filename(filename), + displayName(filename), gameSave(NULL), thumbnail(NULL) { @@ -52,6 +55,16 @@ string SaveFile::GetName() return filename; } +string SaveFile::GetDisplayName() +{ + return displayName; +} + +void SaveFile::SetDisplayName(string displayName) +{ + this->displayName = displayName; +} + SaveFile::~SaveFile() { if(gameSave) delete gameSave; diff --git a/src/client/SaveFile.h b/src/client/SaveFile.h index 54a9290b1..d631bc110 100644 --- a/src/client/SaveFile.h +++ b/src/client/SaveFile.h @@ -24,6 +24,8 @@ public: GameSave * GetGameSave(); void SetThumbnail(Thumbnail * thumb); void SetGameSave(GameSave * save); + string GetDisplayName(); + void SetDisplayName(string displayName); string GetName(); virtual ~SaveFile(); @@ -31,6 +33,7 @@ private: Thumbnail * thumbnail; GameSave * gameSave; string filename; + string displayName; }; #endif /* SAVEFILE_H_ */ diff --git a/src/filebrowser/FileBrowserActivity.cpp b/src/filebrowser/FileBrowserActivity.cpp index 186ed6a12..4bb68fada 100644 --- a/src/filebrowser/FileBrowserActivity.cpp +++ b/src/filebrowser/FileBrowserActivity.cpp @@ -30,6 +30,7 @@ public: class LoadFilesTask: public Task { std::string directory; + std::string search; std::vector saveFiles; virtual void before() @@ -44,7 +45,7 @@ class LoadFilesTask: public Task virtual bool doWork() { - std::vector files = Client::Ref().DirectorySearch(directory, "", ".cps"); + std::vector files = Client::Ref().DirectorySearch(directory, search, ".cps"); notifyProgress(-1); @@ -57,6 +58,19 @@ class LoadFilesTask: public Task GameSave * tempSave = new GameSave(data); saveFile->SetGameSave(tempSave); saveFiles.push_back(saveFile); + + std::string filename = *iter; + size_t folderPos = filename.rfind(PATH_SEP); + if(folderPos!=std::string::npos && folderPos+1 < filename.size()) + { + filename = filename.substr(folderPos+1); + } + size_t extPos = filename.rfind("."); + if(extPos!=std::string::npos) + { + filename = filename.substr(0, extPos); + } + saveFile->SetDisplayName(filename); } catch(std::exception & e) { @@ -72,13 +86,24 @@ public: return saveFiles; } - LoadFilesTask(std::string directory): - directory(directory) + LoadFilesTask(std::string directory, std::string search): + directory(directory), + search(search) { } }; +class FileBrowserActivity::SearchAction: public ui::TextboxAction +{ +public: + FileBrowserActivity * a; + SearchAction(FileBrowserActivity * a) : a(a) {} + virtual void TextChangedCallback(ui::Textbox * sender) { + a->DoSearch(sender->GetText()); + } +}; + FileBrowserActivity::FileBrowserActivity(std::string directory, FileSelectedCallback * callback): ui::Window(ui::Point(-1, -1), ui::Point(450, 300)), callback(callback), @@ -93,10 +118,11 @@ FileBrowserActivity::FileBrowserActivity(std::string directory, FileSelectedCall 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); + 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; + textField->SetActionCallback(new SearchAction(this)); + AddComponent(textField); itemList = new ui::ScrollPanel(ui::Point(4, 45), ui::Point(Size.X-8, Size.Y-53)); AddComponent(itemList); @@ -104,6 +130,9 @@ FileBrowserActivity::FileBrowserActivity(std::string directory, FileSelectedCall progressBar = new ui::ProgressBar(ui::Point((Size.X-200)/2, 45+(Size.Y-66)/2), ui::Point(200, 17)); AddComponent(progressBar); + infoText = new ui::Label(ui::Point((Size.X-200)/2, 45+(Size.Y-66)/2), ui::Point(200, 17), "No saves found"); + AddComponent(infoText); + filesX = 4; filesY = 3; buttonPadding = 2; @@ -117,7 +146,15 @@ FileBrowserActivity::FileBrowserActivity(std::string directory, FileSelectedCall buttonWidth = (buttonAreaWidth/filesX) - buttonPadding*2; buttonHeight = (buttonAreaHeight/filesY) - buttonPadding*2; - loadDirectory(directory); + loadDirectory(directory, ""); +} + +void FileBrowserActivity::DoSearch(std::string search) +{ + if(!loadFiles) + { + loadDirectory(directory, search); + } } void FileBrowserActivity::SelectSave(SaveFile * file) @@ -127,17 +164,7 @@ void FileBrowserActivity::SelectSave(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) +void FileBrowserActivity::loadDirectory(std::string directory, std::string search) { for(int i = 0; i < components.size(); i++) { @@ -145,12 +172,42 @@ void FileBrowserActivity::NotifyDone(Task * task) itemList->RemoveChild(components[i]); delete components[i]; } + components.clear(); + + for(std::vector::iterator iter = componentsQueue.begin(), end = componentsQueue.end(); iter != end; ++iter) + { + delete *iter; + } + componentsQueue.clear(); + + for(std::vector::iterator iter = files.begin(), end = files.end(); iter != end; ++iter) + { + delete *iter; + } + files.clear(); + + infoText->Visible = false; + progressBar->Visible = true; + progressBar->SetProgress(-1); + progressBar->SetStatus("Loading files"); + loadFiles = new LoadFilesTask(directory, search); + loadFiles->AddTaskListener(this); + loadFiles->Start(); +} + +void FileBrowserActivity::NotifyDone(Task * task) +{ fileX = 0; fileY = 0; files = ((LoadFilesTask*)task)->GetSaveFiles(); totalFiles = files.size(); - delete task; + delete loadFiles; loadFiles = NULL; + if(!files.size()) + { + progressBar->Visible = false; + infoText->Visible = true; + } } void FileBrowserActivity::OnMouseDown(int x, int y, unsigned button) @@ -218,7 +275,8 @@ void FileBrowserActivity::OnTick(float dt) } componentsQueue.clear(); itemList->InnerSize.Y = (buttonHeight+(buttonPadding*2))*fileY; - progressBar->Visible = false; + if(!componentsQueue.size()) + progressBar->Visible = false; } } diff --git a/src/filebrowser/FileBrowserActivity.h b/src/filebrowser/FileBrowserActivity.h index 4a0020b25..3eb99d6d3 100644 --- a/src/filebrowser/FileBrowserActivity.h +++ b/src/filebrowser/FileBrowserActivity.h @@ -17,6 +17,7 @@ public: namespace ui { + class Label; class ScrollPanel; class ProgressBar; } @@ -27,6 +28,7 @@ class FileBrowserActivity: public ui::Window, public TaskListener LoadFilesTask * loadFiles; FileSelectedCallback * callback; ui::ScrollPanel * itemList; + ui::Label * infoText; std::vector files; std::vector components; std::vector componentsQueue; @@ -39,14 +41,17 @@ class FileBrowserActivity: public ui::Window, public TaskListener int fileX, fileY; int buttonWidth, buttonHeight, buttonAreaWidth, buttonAreaHeight, buttonXOffset, buttonYOffset; + + class SearchAction; void populateList(); public: FileBrowserActivity(std::string directory, FileSelectedCallback * callback); virtual void OnDraw(); virtual void OnTick(float dt); virtual void OnMouseDown(int x, int y, unsigned button); - void loadDirectory(std::string directory); + void loadDirectory(std::string directory, std::string search); void SelectSave(SaveFile * file); + void DoSearch(std::string search); virtual ~FileBrowserActivity(); virtual void NotifyDone(Task * task); diff --git a/src/interface/SaveButton.cpp b/src/interface/SaveButton.cpp index e3f74222f..b312d3ac4 100644 --- a/src/interface/SaveButton.cpp +++ b/src/interface/SaveButton.cpp @@ -66,7 +66,7 @@ SaveButton::SaveButton(Point position, Point size, SaveFile * file): { if(file) { - name = file->GetName(); + name = file->GetDisplayName(); if(Graphics::textwidth((char *)name.c_str()) > Size.X) { int position = Graphics::textwidthx((char *)name.c_str(), Size.X - 22); diff --git a/src/tasks/Task.h b/src/tasks/Task.h index f11e0b994..5a89278db 100644 --- a/src/tasks/Task.h +++ b/src/tasks/Task.h @@ -23,7 +23,7 @@ public: std::string GetError(); std::string GetStatus(); void Poll(); - Task() { progress = 0; } + Task() : listener(NULL) { progress = 0; } virtual ~Task(); protected: int progress;