summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon 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)
commit6cc4648929a8f4fc45531e4637f19b6b2e45f0fd (patch)
tree854de1d4daad23ecdef968dd34565b572c856511 /src
parentdf3b1e2a6210b45df8bcace1db81a0a0881efbab (diff)
downloadpowder-6cc4648929a8f4fc45531e4637f19b6b2e45f0fd.zip
powder-6cc4648929a8f4fc45531e4637f19b6b2e45f0fd.tar.gz
Filebrowser search, cleaner filenames
Diffstat (limited to 'src')
-rw-r--r--src/client/SaveFile.cpp15
-rw-r--r--src/client/SaveFile.h3
-rw-r--r--src/filebrowser/FileBrowserActivity.cpp94
-rw-r--r--src/filebrowser/FileBrowserActivity.h7
-rw-r--r--src/interface/SaveButton.cpp2
-rw-r--r--src/tasks/Task.h2
6 files changed, 101 insertions, 22 deletions
diff --git a/src/client/SaveFile.cpp b/src/client/SaveFile.cpp
index 7c35466..0694167 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 54a9290..d631bc1 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 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;
}
}
diff --git a/src/filebrowser/FileBrowserActivity.h b/src/filebrowser/FileBrowserActivity.h
index 4a0020b..3eb99d6 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<SaveFile*> files;
std::vector<ui::Component*> components;
std::vector<ui::Component*> 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 e3f7422..b312d3a 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 f11e0b9..5a89278 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;