Filebrowser search, cleaner filenames

This commit is contained in:
Simon Robertshaw 2012-07-29 01:33:28 +01:00
parent df3b1e2a62
commit 6cc4648929
6 changed files with 104 additions and 25 deletions

View File

@ -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;

View File

@ -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_ */

View File

@ -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,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<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, 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;
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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;