Fixed crash when gamelist view gets recreated while GuiGamelistOptions is open.

Ugly hack to fix it, but it will probably get rewritten in the future anyway.
This commit is contained in:
Aloshi 2014-05-16 17:40:58 -05:00
parent cf2294380a
commit 2f02ebeada
5 changed files with 22 additions and 20 deletions

View file

@ -1,9 +1,10 @@
#include "GuiGamelistOptions.h" #include "GuiGamelistOptions.h"
#include "GuiMetaDataEd.h" #include "GuiMetaDataEd.h"
#include "../views/gamelist/IGameListView.h" #include "../views/gamelist/IGameListView.h"
#include "../views/ViewController.h"
GuiGamelistOptions::GuiGamelistOptions(Window* window, IGameListView* gamelist) : GuiComponent(window), GuiGamelistOptions::GuiGamelistOptions(Window* window, SystemData* system) : GuiComponent(window),
mGamelist(gamelist), mSystem(system),
mMenu(window, "OPTIONS") mMenu(window, "OPTIONS")
{ {
addChild(&mMenu); addChild(&mMenu);
@ -33,25 +34,25 @@ GuiGamelistOptions::GuiGamelistOptions(Window* window, IGameListView* gamelist)
GuiGamelistOptions::~GuiGamelistOptions() GuiGamelistOptions::~GuiGamelistOptions()
{ {
// apply sort // apply sort
FileData* root = mGamelist->getCursor()->getSystem()->getRootFolder(); FileData* root = getGamelist()->getCursor()->getSystem()->getRootFolder();
root->sort(*mListSort->getSelected()); // will also recursively sort children root->sort(*mListSort->getSelected()); // will also recursively sort children
// notify that the root folder was sorted // notify that the root folder was sorted
mGamelist->onFileChanged(root, FILE_SORTED); getGamelist()->onFileChanged(root, FILE_SORTED);
} }
void GuiGamelistOptions::openMetaDataEd() void GuiGamelistOptions::openMetaDataEd()
{ {
// open metadata editor // open metadata editor
FileData* file = mGamelist->getCursor(); FileData* file = getGamelist()->getCursor();
ScraperSearchParams p; ScraperSearchParams p;
p.game = file; p.game = file;
p.system = file->getSystem(); p.system = file->getSystem();
mWindow->pushGui(new GuiMetaDataEd(mWindow, &file->metadata, file->metadata.getMDD(), p, file->getPath().filename().string(), mWindow->pushGui(new GuiMetaDataEd(mWindow, &file->metadata, file->metadata.getMDD(), p, file->getPath().filename().string(),
std::bind(&IGameListView::onFileChanged, mGamelist, file, FILE_METADATA_CHANGED), [this, file] { std::bind(&IGameListView::onFileChanged, getGamelist(), file, FILE_METADATA_CHANGED), [this, file] {
boost::filesystem::remove(file->getPath()); //actually delete the file on the filesystem boost::filesystem::remove(file->getPath()); //actually delete the file on the filesystem
file->getParent()->removeChild(file); //unlink it so list repopulations triggered from onFileChanged won't see it file->getParent()->removeChild(file); //unlink it so list repopulations triggered from onFileChanged won't see it
mGamelist->onFileChanged(file, FILE_REMOVED); //tell the view getGamelist()->onFileChanged(file, FILE_REMOVED); //tell the view
delete file; //free it delete file; //free it
})); }));
} }
@ -73,3 +74,8 @@ std::vector<HelpPrompt> GuiGamelistOptions::getHelpPrompts()
prompts.push_back(HelpPrompt("b", "close")); prompts.push_back(HelpPrompt("b", "close"));
return prompts; return prompts;
} }
IGameListView* GuiGamelistOptions::getGamelist()
{
return mWindow->getViewController()->getGameListView(mSystem).get();
}

View file

@ -9,7 +9,7 @@ class IGameListView;
class GuiGamelistOptions : public GuiComponent class GuiGamelistOptions : public GuiComponent
{ {
public: public:
GuiGamelistOptions(Window* window, IGameListView* gamelist); GuiGamelistOptions(Window* window, SystemData* system);
virtual ~GuiGamelistOptions(); virtual ~GuiGamelistOptions();
virtual bool input(InputConfig* config, Input input) override; virtual bool input(InputConfig* config, Input input) override;
@ -23,5 +23,6 @@ private:
typedef OptionListComponent<const FileData::SortType*> SortList; typedef OptionListComponent<const FileData::SortType*> SortList;
std::shared_ptr<SortList> mListSort; std::shared_ptr<SortList> mListSort;
IGameListView* mGamelist; SystemData* mSystem;
IGameListView* getGamelist();
}; };

View file

@ -19,7 +19,7 @@ SystemView::SystemView(Window* window) : IList<SystemViewData, SystemData*>(wind
setSize((float)Renderer::getScreenWidth(), (float)Renderer::getScreenHeight()); setSize((float)Renderer::getScreenWidth(), (float)Renderer::getScreenHeight());
mSystemInfo.setSize(mSize.x(), mSystemInfo.getSize().y() * 2.f); mSystemInfo.setSize(mSize.x(), mSystemInfo.getSize().y() * 1.333f);
mSystemInfo.setPosition(0, (mSize.y() + BAND_HEIGHT) / 2); mSystemInfo.setPosition(0, (mSize.y() + BAND_HEIGHT) / 2);
populate(); populate();

View file

@ -61,12 +61,12 @@ public:
virtual std::vector<HelpPrompt> getHelpPrompts() override; virtual std::vector<HelpPrompt> getHelpPrompts() override;
std::shared_ptr<IGameListView> getGameListView(SystemData* system);
std::shared_ptr<SystemView> getSystemListView();
private: private:
void playViewTransition(); void playViewTransition();
int getSystemId(SystemData* system); int getSystemId(SystemData* system);
std::shared_ptr<IGameListView> getGameListView(SystemData* system);
std::shared_ptr<SystemView> getSystemListView();
std::shared_ptr<GuiComponent> mCurrentView; std::shared_ptr<GuiComponent> mCurrentView;
std::map< SystemData*, std::shared_ptr<IGameListView> > mGameListViews; std::map< SystemData*, std::shared_ptr<IGameListView> > mGameListViews;

View file

@ -10,16 +10,11 @@
bool IGameListView::input(InputConfig* config, Input input) bool IGameListView::input(InputConfig* config, Input input)
{ {
// F3 to open metadata editor
if(config->getDeviceId() == DEVICE_KEYBOARD && input.id == SDLK_F3 && input.value != 0)
{
// select to open GuiGamelistOptions // select to open GuiGamelistOptions
}else if(config->isMappedTo("select", input) && input.value) if(config->isMappedTo("select", input) && input.value)
{ {
Sound::getFromTheme(mTheme, getName(), "menuOpen")->play(); Sound::getFromTheme(mTheme, getName(), "menuOpen")->play();
mWindow->pushGui(new GuiGamelistOptions(mWindow, this)); mWindow->pushGui(new GuiGamelistOptions(mWindow, this->mRoot->getSystem()));
return true; return true;
// Ctrl-R to reload a view when debugging // Ctrl-R to reload a view when debugging