Merge pull request #3708 from FearlessTobi/add-region-column
citra_qt: Add a game region column to the Game List
This commit is contained in:
commit
a5f906b8ab
@ -231,6 +231,7 @@ GameList::GameList(GMainWindow* parent) : QWidget{parent} {
|
|||||||
item_model->insertColumns(0, COLUMN_COUNT);
|
item_model->insertColumns(0, COLUMN_COUNT);
|
||||||
item_model->setHeaderData(COLUMN_NAME, Qt::Horizontal, "Name");
|
item_model->setHeaderData(COLUMN_NAME, Qt::Horizontal, "Name");
|
||||||
item_model->setHeaderData(COLUMN_COMPATIBILITY, Qt::Horizontal, "Compatibility");
|
item_model->setHeaderData(COLUMN_COMPATIBILITY, Qt::Horizontal, "Compatibility");
|
||||||
|
item_model->setHeaderData(COLUMN_REGION, Qt::Horizontal, "Region");
|
||||||
item_model->setHeaderData(COLUMN_FILE_TYPE, Qt::Horizontal, "File type");
|
item_model->setHeaderData(COLUMN_FILE_TYPE, Qt::Horizontal, "File type");
|
||||||
item_model->setHeaderData(COLUMN_SIZE, Qt::Horizontal, "Size");
|
item_model->setHeaderData(COLUMN_SIZE, Qt::Horizontal, "Size");
|
||||||
|
|
||||||
@ -492,6 +493,7 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
|
|||||||
emit EntryReady({
|
emit EntryReady({
|
||||||
new GameListItemPath(QString::fromStdString(physical_name), smdh, program_id),
|
new GameListItemPath(QString::fromStdString(physical_name), smdh, program_id),
|
||||||
new GameListItemCompat(compatibility),
|
new GameListItemCompat(compatibility),
|
||||||
|
new GameListItemRegion(smdh),
|
||||||
new GameListItem(
|
new GameListItem(
|
||||||
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType()))),
|
QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType()))),
|
||||||
new GameListItemSize(FileUtil::GetSize(physical_name)),
|
new GameListItemSize(FileUtil::GetSize(physical_name)),
|
||||||
|
@ -31,6 +31,7 @@ public:
|
|||||||
enum {
|
enum {
|
||||||
COLUMN_NAME,
|
COLUMN_NAME,
|
||||||
COLUMN_COMPATIBILITY,
|
COLUMN_COMPATIBILITY,
|
||||||
|
COLUMN_REGION,
|
||||||
COLUMN_FILE_TYPE,
|
COLUMN_FILE_TYPE,
|
||||||
COLUMN_SIZE,
|
COLUMN_SIZE,
|
||||||
COLUMN_COUNT, // Number of columns
|
COLUMN_COUNT, // Number of columns
|
||||||
|
@ -73,6 +73,38 @@ static QString GetQStringShortTitleFromSMDH(const Loader::SMDH& smdh,
|
|||||||
return QString::fromUtf16(smdh.GetShortTitle(language).data());
|
return QString::fromUtf16(smdh.GetShortTitle(language).data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the game region from SMDH data.
|
||||||
|
* @param smdh SMDH data
|
||||||
|
* @return QString region
|
||||||
|
*/
|
||||||
|
static QString GetRegionFromSMDH(const Loader::SMDH& smdh) {
|
||||||
|
const Loader::SMDH::GameRegion region = smdh.GetRegion();
|
||||||
|
|
||||||
|
switch (region) {
|
||||||
|
case Loader::SMDH::GameRegion::Invalid:
|
||||||
|
return QObject::tr("Invalid region");
|
||||||
|
case Loader::SMDH::GameRegion::Japan:
|
||||||
|
return QObject::tr("Japan");
|
||||||
|
case Loader::SMDH::GameRegion::NorthAmerica:
|
||||||
|
return QObject::tr("North America");
|
||||||
|
case Loader::SMDH::GameRegion::Europe:
|
||||||
|
return QObject::tr("Europe");
|
||||||
|
case Loader::SMDH::GameRegion::Australia:
|
||||||
|
return QObject::tr("Australia");
|
||||||
|
case Loader::SMDH::GameRegion::China:
|
||||||
|
return QObject::tr("China");
|
||||||
|
case Loader::SMDH::GameRegion::Korea:
|
||||||
|
return QObject::tr("Korea");
|
||||||
|
case Loader::SMDH::GameRegion::Taiwan:
|
||||||
|
return QObject::tr("Taiwan");
|
||||||
|
case Loader::SMDH::GameRegion::RegionFree:
|
||||||
|
return QObject::tr("Region free");
|
||||||
|
default:
|
||||||
|
return QObject::tr("Invalid Region");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct CompatStatus {
|
struct CompatStatus {
|
||||||
QString color;
|
QString color;
|
||||||
const char* text;
|
const char* text;
|
||||||
@ -168,6 +200,22 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GameListItemRegion : public GameListItem {
|
||||||
|
public:
|
||||||
|
GameListItemRegion() = default;
|
||||||
|
explicit GameListItemRegion(const std::vector<u8>& smdh_data) {
|
||||||
|
if (!Loader::IsValidSMDH(smdh_data)) {
|
||||||
|
setText(QObject::tr("Invalid region"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader::SMDH smdh;
|
||||||
|
memcpy(&smdh, smdh_data.data(), sizeof(Loader::SMDH));
|
||||||
|
|
||||||
|
setText(GetRegionFromSMDH(smdh));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A specialization of GameListItem for size values.
|
* A specialization of GameListItem for size values.
|
||||||
* This class ensures that for every numerical size value it holds (in bytes), a correct
|
* This class ensures that for every numerical size value it holds (in bytes), a correct
|
||||||
|
@ -48,4 +48,20 @@ std::array<u16, 0x40> SMDH::GetShortTitle(Loader::SMDH::TitleLanguage language)
|
|||||||
return titles[static_cast<int>(language)].short_title;
|
return titles[static_cast<int>(language)].short_title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SMDH::GameRegion SMDH::GetRegion() const {
|
||||||
|
if (region_lockout == 0x7fffffff) {
|
||||||
|
return GameRegion::RegionFree;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr u32 REGION_COUNT = 7;
|
||||||
|
u32 region = 0;
|
||||||
|
for (; region < REGION_COUNT; ++region) {
|
||||||
|
if (region_lockout & (1 << region)) {
|
||||||
|
return static_cast<GameRegion>(region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GameRegion::Invalid;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Loader
|
} // namespace Loader
|
||||||
|
@ -62,6 +62,18 @@ struct SMDH {
|
|||||||
TraditionalChinese = 11
|
TraditionalChinese = 11
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class GameRegion {
|
||||||
|
Invalid = -1,
|
||||||
|
Japan = 0,
|
||||||
|
NorthAmerica = 1,
|
||||||
|
Europe = 2,
|
||||||
|
Australia = 3,
|
||||||
|
China = 4,
|
||||||
|
Korea = 5,
|
||||||
|
Taiwan = 6,
|
||||||
|
RegionFree = 7,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets game icon from SMDH
|
* Gets game icon from SMDH
|
||||||
* @param large If true, returns large icon (48x48), otherwise returns small icon (24x24)
|
* @param large If true, returns large icon (48x48), otherwise returns small icon (24x24)
|
||||||
@ -75,6 +87,8 @@ struct SMDH {
|
|||||||
* @return UTF-16 array of the short title
|
* @return UTF-16 array of the short title
|
||||||
*/
|
*/
|
||||||
std::array<u16, 0x40> GetShortTitle(Loader::SMDH::TitleLanguage language) const;
|
std::array<u16, 0x40> GetShortTitle(Loader::SMDH::TitleLanguage language) const;
|
||||||
|
|
||||||
|
GameRegion GetRegion() const;
|
||||||
};
|
};
|
||||||
static_assert(sizeof(SMDH) == 0x36C0, "SMDH structure size is wrong");
|
static_assert(sizeof(SMDH) == 0x36C0, "SMDH structure size is wrong");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user