Filebrowser search, cleaner filenames
This commit is contained in:
parent
df3b1e2a62
commit
6cc4648929
@ -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;
|
||||
|
@ -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_ */
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user