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): SaveFile::SaveFile(SaveFile & save):
gameSave(NULL), gameSave(NULL),
thumbnail(NULL) thumbnail(NULL),
filename(save.filename),
displayName(save.displayName)
{ {
if(save.gameSave) if(save.gameSave)
gameSave = new GameSave(*save.gameSave); gameSave = new GameSave(*save.gameSave);
@ -31,6 +33,7 @@ void SaveFile::SetThumbnail(Thumbnail * thumb)
SaveFile::SaveFile(string filename): SaveFile::SaveFile(string filename):
filename(filename), filename(filename),
displayName(filename),
gameSave(NULL), gameSave(NULL),
thumbnail(NULL) thumbnail(NULL)
{ {
@ -52,6 +55,16 @@ string SaveFile::GetName()
return filename; return filename;
} }
string SaveFile::GetDisplayName()
{
return displayName;
}
void SaveFile::SetDisplayName(string displayName)
{
this->displayName = displayName;
}
SaveFile::~SaveFile() { SaveFile::~SaveFile() {
if(gameSave) if(gameSave)
delete gameSave; delete gameSave;

View File

@ -24,6 +24,8 @@ public:
GameSave * GetGameSave(); GameSave * GetGameSave();
void SetThumbnail(Thumbnail * thumb); void SetThumbnail(Thumbnail * thumb);
void SetGameSave(GameSave * save); void SetGameSave(GameSave * save);
string GetDisplayName();
void SetDisplayName(string displayName);
string GetName(); string GetName();
virtual ~SaveFile(); virtual ~SaveFile();
@ -31,6 +33,7 @@ private:
Thumbnail * thumbnail; Thumbnail * thumbnail;
GameSave * gameSave; GameSave * gameSave;
string filename; string filename;
string displayName;
}; };
#endif /* SAVEFILE_H_ */ #endif /* SAVEFILE_H_ */

View File

@ -30,6 +30,7 @@ public:
class LoadFilesTask: public Task class LoadFilesTask: public Task
{ {
std::string directory; std::string directory;
std::string search;
std::vector<SaveFile*> saveFiles; std::vector<SaveFile*> saveFiles;
virtual void before() virtual void before()
@ -44,7 +45,7 @@ class LoadFilesTask: public Task
virtual bool doWork() 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); notifyProgress(-1);
@ -57,6 +58,19 @@ class LoadFilesTask: public Task
GameSave * tempSave = new GameSave(data); GameSave * tempSave = new GameSave(data);
saveFile->SetGameSave(tempSave); saveFile->SetGameSave(tempSave);
saveFiles.push_back(saveFile); 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) catch(std::exception & e)
{ {
@ -72,13 +86,24 @@ public:
return saveFiles; return saveFiles;
} }
LoadFilesTask(std::string directory): LoadFilesTask(std::string directory, std::string search):
directory(directory) 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): FileBrowserActivity::FileBrowserActivity(std::string directory, FileSelectedCallback * callback):
ui::Window(ui::Point(-1, -1), ui::Point(450, 300)), ui::Window(ui::Point(-1, -1), ui::Point(450, 300)),
callback(callback), callback(callback),
@ -93,10 +118,11 @@ FileBrowserActivity::FileBrowserActivity(std::string directory, FileSelectedCall
titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
AddComponent(titleLabel); AddComponent(titleLabel);
//ui::Textbox * textField = new ui::Textbox(ui::Point(8, 25), ui::Point(Size.X-16, 16), "", "[search]"); 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.VerticalAlign = ui::Appearance::AlignMiddle;
//textField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; textField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
//AddComponent(textField); textField->SetActionCallback(new SearchAction(this));
AddComponent(textField);
itemList = new ui::ScrollPanel(ui::Point(4, 45), ui::Point(Size.X-8, Size.Y-53)); itemList = new ui::ScrollPanel(ui::Point(4, 45), ui::Point(Size.X-8, Size.Y-53));
AddComponent(itemList); 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)); progressBar = new ui::ProgressBar(ui::Point((Size.X-200)/2, 45+(Size.Y-66)/2), ui::Point(200, 17));
AddComponent(progressBar); 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; filesX = 4;
filesY = 3; filesY = 3;
buttonPadding = 2; buttonPadding = 2;
@ -117,7 +146,15 @@ FileBrowserActivity::FileBrowserActivity(std::string directory, FileSelectedCall
buttonWidth = (buttonAreaWidth/filesX) - buttonPadding*2; buttonWidth = (buttonAreaWidth/filesX) - buttonPadding*2;
buttonHeight = (buttonAreaHeight/filesY) - 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) void FileBrowserActivity::SelectSave(SaveFile * file)
@ -127,17 +164,7 @@ void FileBrowserActivity::SelectSave(SaveFile * file)
Exit(); Exit();
} }
void FileBrowserActivity::loadDirectory(std::string directory) void FileBrowserActivity::loadDirectory(std::string directory, std::string search)
{
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++) for(int i = 0; i < components.size(); i++)
{ {
@ -145,12 +172,42 @@ void FileBrowserActivity::NotifyDone(Task * task)
itemList->RemoveChild(components[i]); itemList->RemoveChild(components[i]);
delete 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; fileX = 0;
fileY = 0; fileY = 0;
files = ((LoadFilesTask*)task)->GetSaveFiles(); files = ((LoadFilesTask*)task)->GetSaveFiles();
totalFiles = files.size(); totalFiles = files.size();
delete task; delete loadFiles;
loadFiles = NULL; loadFiles = NULL;
if(!files.size())
{
progressBar->Visible = false;
infoText->Visible = true;
}
} }
void FileBrowserActivity::OnMouseDown(int x, int y, unsigned button) void FileBrowserActivity::OnMouseDown(int x, int y, unsigned button)
@ -218,7 +275,8 @@ void FileBrowserActivity::OnTick(float dt)
} }
componentsQueue.clear(); componentsQueue.clear();
itemList->InnerSize.Y = (buttonHeight+(buttonPadding*2))*fileY; 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 namespace ui
{ {
class Label;
class ScrollPanel; class ScrollPanel;
class ProgressBar; class ProgressBar;
} }
@ -27,6 +28,7 @@ class FileBrowserActivity: public ui::Window, public TaskListener
LoadFilesTask * loadFiles; LoadFilesTask * loadFiles;
FileSelectedCallback * callback; FileSelectedCallback * callback;
ui::ScrollPanel * itemList; ui::ScrollPanel * itemList;
ui::Label * infoText;
std::vector<SaveFile*> files; std::vector<SaveFile*> files;
std::vector<ui::Component*> components; std::vector<ui::Component*> components;
std::vector<ui::Component*> componentsQueue; std::vector<ui::Component*> componentsQueue;
@ -39,14 +41,17 @@ class FileBrowserActivity: public ui::Window, public TaskListener
int fileX, fileY; int fileX, fileY;
int buttonWidth, buttonHeight, buttonAreaWidth, buttonAreaHeight, buttonXOffset, buttonYOffset; int buttonWidth, buttonHeight, buttonAreaWidth, buttonAreaHeight, buttonXOffset, buttonYOffset;
class SearchAction;
void populateList(); void populateList();
public: public:
FileBrowserActivity(std::string directory, FileSelectedCallback * callback); FileBrowserActivity(std::string directory, FileSelectedCallback * callback);
virtual void OnDraw(); virtual void OnDraw();
virtual void OnTick(float dt); virtual void OnTick(float dt);
virtual void OnMouseDown(int x, int y, unsigned button); 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 SelectSave(SaveFile * file);
void DoSearch(std::string search);
virtual ~FileBrowserActivity(); virtual ~FileBrowserActivity();
virtual void NotifyDone(Task * task); virtual void NotifyDone(Task * task);

View File

@ -66,7 +66,7 @@ SaveButton::SaveButton(Point position, Point size, SaveFile * file):
{ {
if(file) if(file)
{ {
name = file->GetName(); name = file->GetDisplayName();
if(Graphics::textwidth((char *)name.c_str()) > Size.X) if(Graphics::textwidth((char *)name.c_str()) > Size.X)
{ {
int position = Graphics::textwidthx((char *)name.c_str(), Size.X - 22); int position = Graphics::textwidthx((char *)name.c_str(), Size.X - 22);

View File

@ -23,7 +23,7 @@ public:
std::string GetError(); std::string GetError();
std::string GetStatus(); std::string GetStatus();
void Poll(); void Poll();
Task() { progress = 0; } Task() : listener(NULL) { progress = 0; }
virtual ~Task(); virtual ~Task();
protected: protected:
int progress; int progress;