Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions es-app/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ set(ES_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiCollectionSystemsOptions.h
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiRandomCollectionOptions.h
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiInfoPopup.h
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiRomSelectionMenu.h
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiRomSelector.h
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiRomMetaDataEd.h

# Scrapers
${CMAKE_CURRENT_SOURCE_DIR}/src/scrapers/Scraper.h
Expand Down Expand Up @@ -96,6 +99,9 @@ set(ES_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiCollectionSystemsOptions.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiRandomCollectionOptions.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiInfoPopup.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiRomSelectionMenu.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiRomSelector.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/guis/GuiRomMetaDataEd.cpp

# Scrapers
${CMAKE_CURRENT_SOURCE_DIR}/src/scrapers/Scraper.cpp
Expand Down
102 changes: 93 additions & 9 deletions es-app/src/FileData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ FileData::FileData(FileType type, const std::string& path, SystemEnvironmentData
if(metadata.get("name").empty())
metadata.set("name", getDisplayName());
mSystemName = system->getName();
if(mType == GAME)
{
RomData rom;
rom.path = path;
rom.preferred = true;
mRoms.push_back(rom);
}
metadata.resetChangedFlag();
}

Expand Down Expand Up @@ -54,12 +61,22 @@ std::string FileData::getCleanName() const

const std::string FileData::getThumbnailPath() const
{
std::string thumbnail = metadata.get("thumbnail");
return getEffectiveThumbnailPath(getPreferredRom());
}

const std::string FileData::getEffectiveThumbnailPath(const RomData* rom) const
{
std::string thumbnail;
if(rom)
thumbnail = rom->thumbnail;

if(thumbnail.empty())
thumbnail = metadata.get("thumbnail");

// no thumbnail, try image
if(thumbnail.empty())
{
thumbnail = metadata.get("image");
thumbnail = getEffectiveImagePath(rom);

// no image, try to use local image
if(thumbnail.empty() && Settings::getInstance()->getBool("LocalArt"))
Expand Down Expand Up @@ -115,7 +132,17 @@ const std::vector<FileData*>& FileData::getChildrenListToDisplay() {

const std::string FileData::getVideoPath() const
{
std::string video = metadata.get("video");
return getEffectiveVideoPath(getPreferredRom());
}

const std::string FileData::getEffectiveVideoPath(const RomData* rom) const
{
std::string video;
if(rom)
video = rom->video;

if(video.empty())
video = metadata.get("video");

// no video, try to use local video
if(video.empty() && Settings::getInstance()->getBool("LocalArt"))
Expand All @@ -130,7 +157,17 @@ const std::string FileData::getVideoPath() const

const std::string FileData::getMarqueePath() const
{
std::string marquee = metadata.get("marquee");
return getEffectiveMarqueePath(getPreferredRom());
}

const std::string FileData::getEffectiveMarqueePath(const RomData* rom) const
{
std::string marquee;
if(rom)
marquee = rom->marquee;

if(marquee.empty())
marquee = metadata.get("marquee");

// no marquee, try to use local marquee
if(marquee.empty() && Settings::getInstance()->getBool("LocalArt"))
Expand All @@ -152,7 +189,17 @@ const std::string FileData::getMarqueePath() const

const std::string FileData::getImagePath() const
{
std::string image = metadata.get("image");
return getEffectiveImagePath(getPreferredRom());
}

const std::string FileData::getEffectiveImagePath(const RomData* rom) const
{
std::string image;
if(rom)
image = rom->image;

if(image.empty())
image = metadata.get("image");

// no image, try to use local image
if(image.empty())
Expand All @@ -172,6 +219,40 @@ const std::string FileData::getImagePath() const
return image;
}

const RomData* FileData::getPreferredRom() const
{
if(mRoms.empty())
return NULL;

for(auto it = mRoms.cbegin(); it != mRoms.cend(); ++it)
{
if(it->preferred)
return &(*it);
}

return &mRoms.front();
}

const RomData* FileData::getRomByPath(const std::string& path) const
{
for(auto it = mRoms.cbegin(); it != mRoms.cend(); ++it)
{
if(it->path == path)
return &(*it);
}

return NULL;
}

const std::string FileData::getLaunchRomPath() const
{
const RomData* preferred = getPreferredRom();
if(preferred != NULL && !preferred->path.empty())
return preferred->path;

return getPath();
}

std::vector<FileData*> FileData::getFilesRecursive(unsigned int typeMask, bool displayedOnly) const
{
std::vector<FileData*> out;
Expand Down Expand Up @@ -276,7 +357,7 @@ void FileData::sort(const SortType& type)
mSortDesc = type.description;
}

void FileData::launchGame(Window* window)
void FileData::launchGame(Window* window, const std::string& romPathOverride)
{
LOG(LogInfo) << "Attempting to launch game...";

Expand All @@ -287,9 +368,10 @@ void FileData::launchGame(Window* window)

std::string command = mEnvData->mLaunchCommand;

const std::string rom = Utils::FileSystem::getEscapedPath(getPath());
const std::string basename = Utils::FileSystem::getStem(getPath());
const std::string rom_raw = Utils::FileSystem::getPreferredPath(getPath());
const std::string launchPath = romPathOverride.empty() ? getLaunchRomPath() : romPathOverride;
const std::string rom = Utils::FileSystem::getEscapedPath(launchPath);
const std::string basename = Utils::FileSystem::getStem(launchPath);
const std::string rom_raw = Utils::FileSystem::getPreferredPath(launchPath);
const std::string name = getName();

command = Utils::String::replace(command, "%ROM%", rom);
Expand Down Expand Up @@ -335,6 +417,7 @@ CollectionFileData::CollectionFileData(FileData* file, SystemData* system)
refreshMetadata();
mParent = NULL;
metadata = mSourceFileData->metadata;
getRomsMutable() = mSourceFileData->getRoms();
mSystemName = mSourceFileData->getSystem()->getName();
}

Expand All @@ -358,6 +441,7 @@ FileData* CollectionFileData::getSourceFileData()
void CollectionFileData::refreshMetadata()
{
metadata = mSourceFileData->metadata;
getRomsMutable() = mSourceFileData->getRoms();
mDirty = true;
}

Expand Down
36 changes: 34 additions & 2 deletions es-app/src/FileData.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,29 @@ class SystemData;
class Window;
struct SystemEnvironmentData;

struct RomData
{
std::string path;
std::string romName;

std::vector<std::string> regions;
std::vector<std::string> languages;

std::string releaseDate;

std::string image;
std::string video;
std::string thumbnail;
std::string marquee;

bool preferred;

RomData() : preferred(false) {}
};

enum FileType
{
GAME = 1, // Cannot have children.
GAME = 1, // Cannot have FileData children (ROM variants are stored in mRoms, not as FileData nodes).
FOLDER = 2,
PLACEHOLDER = 3
};
Expand Down Expand Up @@ -49,6 +69,17 @@ class FileData
virtual const std::string getVideoPath() const;
virtual const std::string getMarqueePath() const;
virtual const std::string getImagePath() const;
const std::string getEffectiveImagePath(const RomData* rom) const;
const std::string getEffectiveVideoPath(const RomData* rom) const;
const std::string getEffectiveThumbnailPath(const RomData* rom) const;
const std::string getEffectiveMarqueePath(const RomData* rom) const;

inline const std::vector<RomData>& getRoms() const { return mRoms; }
// Mutable access for parser/migration code that needs to rebuild ROM variants in-place.
inline std::vector<RomData>& getRomsMutable() { return mRoms; }
const RomData* getPreferredRom() const;
const RomData* getRomByPath(const std::string& path) const;
const std::string getLaunchRomPath() const;

const std::vector<FileData*>& getChildrenListToDisplay();
std::vector<FileData*> getFilesRecursive(unsigned int typeMask, bool displayedOnly = false) const;
Expand All @@ -73,7 +104,7 @@ class FileData
// As above, but also remove parenthesis
std::string getCleanName() const;

void launchGame(Window* window);
void launchGame(Window* window, const std::string& romPathOverride = "");

typedef bool ComparisonFunction(const FileData* a, const FileData* b);
struct SortType
Expand Down Expand Up @@ -104,6 +135,7 @@ class FileData
std::unordered_map<std::string,FileData*> mChildrenByFilename;
std::vector<FileData*> mChildren;
std::vector<FileData*> mFilteredChildren;
std::vector<RomData> mRoms;
std::string mSortDesc;
};

Expand Down
Loading