diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-07-29 00:33:28 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-07-29 00:33:28 (GMT) |
| commit | 6cc4648929a8f4fc45531e4637f19b6b2e45f0fd (patch) | |
| tree | 854de1d4daad23ecdef968dd34565b572c856511 /src/filebrowser/FileBrowserActivity.cpp | |
| parent | df3b1e2a6210b45df8bcace1db81a0a0881efbab (diff) | |
| download | powder-6cc4648929a8f4fc45531e4637f19b6b2e45f0fd.zip powder-6cc4648929a8f4fc45531e4637f19b6b2e45f0fd.tar.gz | |
Filebrowser search, cleaner filenames
Diffstat (limited to 'src/filebrowser/FileBrowserActivity.cpp')
| -rw-r--r-- | src/filebrowser/FileBrowserActivity.cpp | 94 |
1 files changed, 76 insertions, 18 deletions
diff --git a/src/filebrowser/FileBrowserActivity.cpp b/src/filebrowser/FileBrowserActivity.cpp index 186ed6a..4bb68fa 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<SaveFile*> saveFiles; virtual void before() @@ -44,7 +45,7 @@ class LoadFilesTask: public Task virtual bool doWork() { - std::vector<std::string> files = Client::Ref().DirectorySearch(directory, "", ".cps"); + std::vector<std::string> 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,30 +164,50 @@ void FileBrowserActivity::SelectSave(SaveFile * file) Exit(); } -void FileBrowserActivity::loadDirectory(std::string directory) +void FileBrowserActivity::loadDirectory(std::string directory, std::string search) { + for(int i = 0; i < components.size(); i++) + { + RemoveComponent(components[i]); + itemList->RemoveChild(components[i]); + delete components[i]; + } + components.clear(); + + for(std::vector<ui::Component*>::iterator iter = componentsQueue.begin(), end = componentsQueue.end(); iter != end; ++iter) + { + delete *iter; + } + componentsQueue.clear(); + + for(std::vector<SaveFile*>::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); + loadFiles = new LoadFilesTask(directory, search); 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; + 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; } } |
