diff --git a/src/duckstation-qt/CMakeLists.txt b/src/duckstation-qt/CMakeLists.txt
index 4361d79d9..2d7549da3 100644
--- a/src/duckstation-qt/CMakeLists.txt
+++ b/src/duckstation-qt/CMakeLists.txt
@@ -17,6 +17,8 @@ set(SRCS
consolesettingswidget.ui
controllersettingswidget.cpp
controllersettingswidget.h
+ gamelistmodel.cpp
+ gamelistmodel.h
gamelistsettingswidget.cpp
gamelistsettingswidget.h
gamelistsettingswidget.ui
diff --git a/src/duckstation-qt/duckstation-qt.vcxproj b/src/duckstation-qt/duckstation-qt.vcxproj
index c1e833a5a..175564251 100644
--- a/src/duckstation-qt/duckstation-qt.vcxproj
+++ b/src/duckstation-qt/duckstation-qt.vcxproj
@@ -39,6 +39,7 @@
+
@@ -70,6 +71,7 @@
+
@@ -144,6 +146,7 @@
+
diff --git a/src/duckstation-qt/duckstation-qt.vcxproj.filters b/src/duckstation-qt/duckstation-qt.vcxproj.filters
index 429ae02e1..eb05dc600 100644
--- a/src/duckstation-qt/duckstation-qt.vcxproj.filters
+++ b/src/duckstation-qt/duckstation-qt.vcxproj.filters
@@ -42,11 +42,13 @@
+
+
@@ -103,11 +105,6 @@
-
-
-
-
- translations
-
+
\ No newline at end of file
diff --git a/src/duckstation-qt/gamelistmodel.cpp b/src/duckstation-qt/gamelistmodel.cpp
new file mode 100644
index 000000000..1e77277dc
--- /dev/null
+++ b/src/duckstation-qt/gamelistmodel.cpp
@@ -0,0 +1,296 @@
+#include "gamelistmodel.h"
+#include "common/string_util.h"
+
+static constexpr std::array s_column_names = {
+ {"Type", "Code", "Title", "File Title", "Size", "Region", "Compatibility"}};
+
+std::optional GameListModel::getColumnIdForName(std::string_view name)
+{
+ for (int column = 0; column < Column_Count; column++)
+ {
+ if (name == s_column_names[column])
+ return static_cast(column);
+ }
+
+ return std::nullopt;
+}
+
+const char* GameListModel::getColumnName(Column col)
+{
+ return s_column_names[static_cast(col)];
+}
+
+GameListModel::GameListModel(GameList* game_list, QObject* parent /* = nullptr */)
+ : QAbstractTableModel(parent), m_game_list(game_list)
+{
+ loadCommonImages();
+ setColumnDisplayNames();
+}
+GameListModel::~GameListModel() = default;
+
+int GameListModel::rowCount(const QModelIndex& parent) const
+{
+ if (parent.isValid())
+ return 0;
+
+ return static_cast(m_game_list->GetEntryCount());
+}
+
+int GameListModel::columnCount(const QModelIndex& parent) const
+{
+ if (parent.isValid())
+ return 0;
+
+ return Column_Count;
+}
+
+QVariant GameListModel::data(const QModelIndex& index, int role) const
+{
+ if (!index.isValid())
+ return {};
+
+ const int row = index.row();
+ if (row < 0 || row >= static_cast(m_game_list->GetEntryCount()))
+ return {};
+
+ const GameListEntry& ge = m_game_list->GetEntries()[row];
+
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ {
+ switch (index.column())
+ {
+ case Column_Code:
+ return QString::fromStdString(ge.code);
+
+ case Column_Title:
+ return QString::fromStdString(ge.title);
+
+ case Column_FileTitle:
+ {
+ const std::string_view file_title(GameList::GetTitleForPath(ge.path.c_str()));
+ return QString::fromUtf8(file_title.data(), static_cast(file_title.length()));
+ }
+
+ case Column_Size:
+ return QString("%1 MB").arg(static_cast(ge.total_size) / 1048576.0, 0, 'f', 2);
+
+ default:
+ return {};
+ }
+ }
+
+ case Qt::InitialSortOrderRole:
+ {
+ switch (index.column())
+ {
+ case Column_Type:
+ return static_cast(ge.type);
+
+ case Column_Code:
+ return QString::fromStdString(ge.code);
+
+ case Column_Title:
+ return QString::fromStdString(ge.title);
+
+ case Column_FileTitle:
+ {
+ const std::string_view file_title(GameList::GetTitleForPath(ge.path.c_str()));
+ return QString::fromUtf8(file_title.data(), static_cast(file_title.length()));
+ }
+
+ case Column_Region:
+ return static_cast(ge.region);
+
+ case Column_Compatibility:
+ return static_cast(ge.compatibility_rating);
+
+ case Column_Size:
+ return static_cast(ge.total_size);
+
+ default:
+ return {};
+ }
+ }
+
+ case Qt::DecorationRole:
+ {
+ switch (index.column())
+ {
+ case Column_Type:
+ {
+ switch (ge.type)
+ {
+ case GameListEntryType::Disc:
+ return m_type_disc_pixmap;
+ case GameListEntryType::PSExe:
+ default:
+ return m_type_exe_pixmap;
+ }
+ }
+
+ case Column_Region:
+ {
+ switch (ge.region)
+ {
+ case DiscRegion::NTSC_J:
+ return m_region_jp_pixmap;
+ case DiscRegion::NTSC_U:
+ return m_region_us_pixmap;
+ case DiscRegion::PAL:
+ default:
+ return m_region_eu_pixmap;
+ }
+ }
+
+ case Column_Compatibility:
+ {
+ return m_compatibiliy_pixmaps[static_cast(
+ (ge.compatibility_rating >= GameListCompatibilityRating::Count) ? GameListCompatibilityRating::Unknown :
+ ge.compatibility_rating)];
+ }
+
+ default:
+ return {};
+ }
+
+ default:
+ return {};
+ }
+ }
+}
+
+QVariant GameListModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ if (orientation != Qt::Horizontal || role != Qt::DisplayRole || section < 0 || section >= Column_Count)
+ return {};
+
+ return m_column_display_names[section];
+}
+
+void GameListModel::refresh()
+{
+ beginResetModel();
+ endResetModel();
+}
+
+bool GameListModel::titlesLessThan(int left_row, int right_row, bool ascending) const
+{
+ if (left_row < 0 || left_row >= static_cast(m_game_list->GetEntryCount()) || right_row < 0 ||
+ right_row >= static_cast(m_game_list->GetEntryCount()))
+ {
+ return false;
+ }
+
+ const GameListEntry& left = m_game_list->GetEntries().at(left_row);
+ const GameListEntry& right = m_game_list->GetEntries().at(right_row);
+ return ascending ? (left.title < right.title) : (right.title < left.title);
+}
+
+bool GameListModel::lessThan(const QModelIndex& left_index, const QModelIndex& right_index, int column,
+ bool ascending) const
+{
+ if (!left_index.isValid() || !right_index.isValid())
+ return false;
+
+ const int left_row = left_index.row();
+ const int right_row = right_index.row();
+ if (left_row < 0 || left_row >= static_cast(m_game_list->GetEntryCount()) || right_row < 0 ||
+ right_row >= static_cast(m_game_list->GetEntryCount()))
+ {
+ return false;
+ }
+
+ const GameListEntry& left = m_game_list->GetEntries()[left_row];
+ const GameListEntry& right = m_game_list->GetEntries()[right_row];
+ switch (column)
+ {
+ case Column_Type:
+ {
+ if (left.type == right.type)
+ return titlesLessThan(left_row, right_row, ascending);
+
+ return ascending ? (static_cast(left.type) < static_cast(right.type)) :
+ (static_cast(right.type) > static_cast(left.type));
+ }
+
+ case Column_Code:
+ {
+ if (left.code == right.code)
+ return titlesLessThan(left_row, right_row, ascending);
+ return ascending ? (left.code < right.code) : (right.code > left.code);
+ }
+
+ case Column_Title:
+ {
+ if (left.title == right.title)
+ return titlesLessThan(left_row, right_row, ascending);
+
+ return ascending ? (left.title < right.title) : (right.title > left.title);
+ }
+
+ case Column_FileTitle:
+ {
+ const std::string_view file_title_left(GameList::GetTitleForPath(left.path.c_str()));
+ const std::string_view file_title_right(GameList::GetTitleForPath(right.path.c_str()));
+ if (file_title_left == file_title_right)
+ return titlesLessThan(left_row, right_row, ascending);
+
+ return ascending ? (file_title_left < file_title_right) : (file_title_right > file_title_left);
+ }
+
+ case Column_Region:
+ {
+ if (left.region == right.region)
+ return titlesLessThan(left_row, right_row, ascending);
+ return ascending ? (static_cast(left.region) < static_cast(right.region)) :
+ (static_cast(right.region) > static_cast(left.region));
+ }
+
+ case Column_Compatibility:
+ {
+ if (left.compatibility_rating == right.compatibility_rating)
+ return titlesLessThan(left_row, right_row, ascending);
+
+ return ascending ? (static_cast(left.compatibility_rating) < static_cast(right.compatibility_rating)) :
+ (static_cast(right.compatibility_rating) > static_cast(left.compatibility_rating));
+ }
+
+ case Column_Size:
+ {
+ if (left.total_size == right.total_size)
+ return titlesLessThan(left_row, right_row, ascending);
+
+ return ascending ? (left.total_size < right.total_size) : (right.total_size > left.total_size);
+ }
+
+ default:
+ return false;
+ }
+}
+
+void GameListModel::loadCommonImages()
+{
+ // TODO: Use svg instead of png
+ m_type_disc_pixmap.load(QStringLiteral(":/icons/media-optical-24.png"));
+ m_type_exe_pixmap.load(QStringLiteral(":/icons/applications-system-24.png"));
+ m_region_eu_pixmap.load(QStringLiteral(":/icons/flag-eu.png"));
+ m_region_jp_pixmap.load(QStringLiteral(":/icons/flag-jp.png"));
+ m_region_us_pixmap.load(QStringLiteral(":/icons/flag-us.png"));
+ m_region_eu_pixmap.load(QStringLiteral(":/icons/flag-eu.png"));
+
+ for (int i = 0; i < static_cast(GameListCompatibilityRating::Count); i++)
+ m_compatibiliy_pixmaps[i].load(QStringLiteral(":/icons/star-%1.png").arg(i));
+}
+
+void GameListModel::setColumnDisplayNames()
+{
+ m_column_display_names[Column_Type] = tr("Type");
+ m_column_display_names[Column_Code] = tr("Code");
+ m_column_display_names[Column_Title] = tr("Title");
+ m_column_display_names[Column_FileTitle] = tr("File Title");
+ m_column_display_names[Column_Size] = tr("Size");
+ m_column_display_names[Column_Region] = tr("Region");
+ m_column_display_names[Column_Compatibility] = tr("Compatibility");
+}
diff --git a/src/duckstation-qt/gamelistmodel.h b/src/duckstation-qt/gamelistmodel.h
new file mode 100644
index 000000000..8cb6e5b5d
--- /dev/null
+++ b/src/duckstation-qt/gamelistmodel.h
@@ -0,0 +1,62 @@
+#pragma once
+#include "core/game_list.h"
+#include "core/types.h"
+#include
+#include
+#include
+#include
+
+class GameListModel final : public QAbstractTableModel
+{
+ Q_OBJECT
+
+public:
+ enum Column : int
+ {
+ Column_Type,
+ Column_Code,
+ Column_Title,
+ Column_FileTitle,
+ Column_Size,
+ Column_Region,
+ Column_Compatibility,
+
+ Column_Count
+ };
+
+ static std::optional getColumnIdForName(std::string_view name);
+ static const char* getColumnName(Column col);
+
+ GameListModel(GameList* game_list, QObject* parent = nullptr);
+ ~GameListModel();
+
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
+
+ ALWAYS_INLINE const QString& getColumnDisplayName(int column) { return m_column_display_names[column]; }
+
+ void refresh();
+
+ bool titlesLessThan(int left_row, int right_row, bool ascending) const;
+
+ bool lessThan(const QModelIndex& left_index, const QModelIndex& right_index, int column, bool ascending) const;
+
+private:
+ void loadCommonImages();
+ void setColumnDisplayNames();
+
+ GameList* m_game_list;
+
+ std::array m_column_display_names;
+
+ QPixmap m_type_disc_pixmap;
+ QPixmap m_type_exe_pixmap;
+
+ QPixmap m_region_jp_pixmap;
+ QPixmap m_region_eu_pixmap;
+ QPixmap m_region_us_pixmap;
+
+ std::array(GameListCompatibilityRating::Count)> m_compatibiliy_pixmaps;
+};
\ No newline at end of file
diff --git a/src/duckstation-qt/gamelistwidget.cpp b/src/duckstation-qt/gamelistwidget.cpp
index 623e49317..e06aa3f7f 100644
--- a/src/duckstation-qt/gamelistwidget.cpp
+++ b/src/duckstation-qt/gamelistwidget.cpp
@@ -2,6 +2,7 @@
#include "common/string_util.h"
#include "core/game_list.h"
#include "core/settings.h"
+#include "gamelistmodel.h"
#include "qthostinterface.h"
#include "qtutils.h"
#include
@@ -9,327 +10,6 @@
#include
#include
-class GameListModel final : public QAbstractTableModel
-{
-public:
- enum Column : int
- {
- Column_Type,
- Column_Code,
- Column_Title,
- Column_FileTitle,
- Column_Size,
- Column_Region,
- Column_Compatibility,
-
- Column_Count
- };
-
- static inline constexpr std::array s_column_names = {
- {"Type", "Code", "Title", "File Title", "Size", "Region", "Compatibility"}};
-
- static std::optional getColumnIdForName(std::string_view name)
- {
- for (int column = 0; column < Column_Count; column++)
- {
- if (name == s_column_names[column])
- return static_cast(column);
- }
-
- return std::nullopt;
- }
-
- GameListModel(GameList* game_list, QObject* parent = nullptr) : QAbstractTableModel(parent), m_game_list(game_list)
- {
- loadCommonImages();
- setColumnDisplayNames();
- }
- ~GameListModel() = default;
-
- int rowCount(const QModelIndex& parent = QModelIndex()) const override
- {
- if (parent.isValid())
- return 0;
-
- return static_cast(m_game_list->GetEntryCount());
- }
-
- int columnCount(const QModelIndex& parent = QModelIndex()) const override
- {
- if (parent.isValid())
- return 0;
-
- return Column_Count;
- }
-
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override
- {
- if (!index.isValid())
- return {};
-
- const int row = index.row();
- if (row < 0 || row >= static_cast(m_game_list->GetEntryCount()))
- return {};
-
- const GameListEntry& ge = m_game_list->GetEntries()[row];
-
- switch (role)
- {
- case Qt::DisplayRole:
- {
- switch (index.column())
- {
- case Column_Code:
- return QString::fromStdString(ge.code);
-
- case Column_Title:
- return QString::fromStdString(ge.title);
-
- case Column_FileTitle:
- {
- const std::string_view file_title(GameList::GetTitleForPath(ge.path.c_str()));
- return QString::fromUtf8(file_title.data(), static_cast(file_title.length()));
- }
-
- case Column_Size:
- return QString("%1 MB").arg(static_cast(ge.total_size) / 1048576.0, 0, 'f', 2);
-
- default:
- return {};
- }
- }
-
- case Qt::InitialSortOrderRole:
- {
- switch (index.column())
- {
- case Column_Type:
- return static_cast(ge.type);
-
- case Column_Code:
- return QString::fromStdString(ge.code);
-
- case Column_Title:
- return QString::fromStdString(ge.title);
-
- case Column_FileTitle:
- {
- const std::string_view file_title(GameList::GetTitleForPath(ge.path.c_str()));
- return QString::fromUtf8(file_title.data(), static_cast(file_title.length()));
- }
-
- case Column_Region:
- return static_cast(ge.region);
-
- case Column_Compatibility:
- return static_cast(ge.compatibility_rating);
-
- case Column_Size:
- return static_cast(ge.total_size);
-
- default:
- return {};
- }
- }
-
- case Qt::DecorationRole:
- {
- switch (index.column())
- {
- case Column_Type:
- {
- switch (ge.type)
- {
- case GameListEntryType::Disc:
- return m_type_disc_pixmap;
- case GameListEntryType::PSExe:
- default:
- return m_type_exe_pixmap;
- }
- }
-
- case Column_Region:
- {
- switch (ge.region)
- {
- case DiscRegion::NTSC_J:
- return m_region_jp_pixmap;
- case DiscRegion::NTSC_U:
- return m_region_us_pixmap;
- case DiscRegion::PAL:
- default:
- return m_region_eu_pixmap;
- }
- }
-
- case Column_Compatibility:
- {
- return m_compatibiliy_pixmaps[static_cast(
- (ge.compatibility_rating >= GameListCompatibilityRating::Count) ? GameListCompatibilityRating::Unknown :
- ge.compatibility_rating)];
- }
-
- default:
- return {};
- }
-
- default:
- return {};
- }
- }
- }
-
- QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
- {
- if (orientation != Qt::Horizontal || role != Qt::DisplayRole || section < 0 || section >= Column_Count)
- return {};
-
- return m_column_display_names[section];
- }
-
- ALWAYS_INLINE const QString& getColumnDisplayName(int column) { return m_column_display_names[column]; }
-
- void refresh()
- {
- beginResetModel();
- endResetModel();
- }
-
- bool titlesLessThan(int left_row, int right_row, bool ascending) const
- {
- if (left_row < 0 || left_row >= static_cast(m_game_list->GetEntryCount()) || right_row < 0 ||
- right_row >= static_cast(m_game_list->GetEntryCount()))
- {
- return false;
- }
-
- const GameListEntry& left = m_game_list->GetEntries().at(left_row);
- const GameListEntry& right = m_game_list->GetEntries().at(right_row);
- return ascending ? (left.title < right.title) : (right.title < left.title);
- }
-
- bool lessThan(const QModelIndex& left_index, const QModelIndex& right_index, int column, bool ascending) const
- {
- if (!left_index.isValid() || !right_index.isValid())
- return false;
-
- const int left_row = left_index.row();
- const int right_row = right_index.row();
- if (left_row < 0 || left_row >= static_cast(m_game_list->GetEntryCount()) || right_row < 0 ||
- right_row >= static_cast(m_game_list->GetEntryCount()))
- {
- return false;
- }
-
- const GameListEntry& left = m_game_list->GetEntries()[left_row];
- const GameListEntry& right = m_game_list->GetEntries()[right_row];
- switch (column)
- {
- case Column_Type:
- {
- if (left.type == right.type)
- return titlesLessThan(left_row, right_row, ascending);
-
- return ascending ? (static_cast(left.type) < static_cast(right.type)) :
- (static_cast(right.type) > static_cast(left.type));
- }
-
- case Column_Code:
- {
- if (left.code == right.code)
- return titlesLessThan(left_row, right_row, ascending);
- return ascending ? (left.code < right.code) : (right.code > left.code);
- }
-
- case Column_Title:
- {
- if (left.title == right.title)
- return titlesLessThan(left_row, right_row, ascending);
-
- return ascending ? (left.title < right.title) : (right.title > left.title);
- }
-
- case Column_FileTitle:
- {
- const std::string_view file_title_left(GameList::GetTitleForPath(left.path.c_str()));
- const std::string_view file_title_right(GameList::GetTitleForPath(right.path.c_str()));
- if (file_title_left == file_title_right)
- return titlesLessThan(left_row, right_row, ascending);
-
- return ascending ? (file_title_left < file_title_right) : (file_title_right > file_title_left);
- }
-
- case Column_Region:
- {
- if (left.region == right.region)
- return titlesLessThan(left_row, right_row, ascending);
- return ascending ? (static_cast(left.region) < static_cast(right.region)) :
- (static_cast(right.region) > static_cast(left.region));
- }
-
- case Column_Compatibility:
- {
- if (left.compatibility_rating == right.compatibility_rating)
- return titlesLessThan(left_row, right_row, ascending);
-
- return ascending ?
- (static_cast(left.compatibility_rating) < static_cast(right.compatibility_rating)) :
- (static_cast(right.compatibility_rating) > static_cast(left.compatibility_rating));
- }
-
- case Column_Size:
- {
- if (left.total_size == right.total_size)
- return titlesLessThan(left_row, right_row, ascending);
-
- return ascending ? (left.total_size < right.total_size) : (right.total_size > left.total_size);
- }
-
- default:
- return false;
- }
- }
-
-private:
- void loadCommonImages()
- {
- // TODO: Use svg instead of png
- m_type_disc_pixmap.load(QStringLiteral(":/icons/media-optical-24.png"));
- m_type_exe_pixmap.load(QStringLiteral(":/icons/applications-system-24.png"));
- m_region_eu_pixmap.load(QStringLiteral(":/icons/flag-eu.png"));
- m_region_jp_pixmap.load(QStringLiteral(":/icons/flag-jp.png"));
- m_region_us_pixmap.load(QStringLiteral(":/icons/flag-us.png"));
- m_region_eu_pixmap.load(QStringLiteral(":/icons/flag-eu.png"));
-
- for (int i = 0; i < static_cast(GameListCompatibilityRating::Count); i++)
- m_compatibiliy_pixmaps[i].load(QStringLiteral(":/icons/star-%1.png").arg(i));
- }
-
- void setColumnDisplayNames()
- {
- m_column_display_names[Column_Type] = tr("Type");
- m_column_display_names[Column_Code] = tr("Code");
- m_column_display_names[Column_Title] = tr("Title");
- m_column_display_names[Column_FileTitle] = tr("File Title");
- m_column_display_names[Column_Size] = tr("Size");
- m_column_display_names[Column_Region] = tr("Region");
- m_column_display_names[Column_Compatibility] = tr("Compatibility");
- }
-
- GameList* m_game_list;
-
- std::array m_column_display_names;
-
- QPixmap m_type_disc_pixmap;
- QPixmap m_type_exe_pixmap;
-
- QPixmap m_region_jp_pixmap;
- QPixmap m_region_eu_pixmap;
- QPixmap m_region_us_pixmap;
-
- std::array(GameListCompatibilityRating::Count)> m_compatibiliy_pixmaps;
-};
-
class GameListSortModel final : public QSortFilterProxyModel
{
public:
@@ -472,7 +152,7 @@ void GameListWidget::resizeTableViewColumnsToFit()
static TinyString getColumnVisibilitySettingsKeyName(int column)
{
- return TinyString::FromFormat("Show%s", GameListModel::s_column_names[column]);
+ return TinyString::FromFormat("Show%s", GameListModel::getColumnName(static_cast(column)));
}
void GameListWidget::loadTableViewColumnVisibilitySettings()
@@ -523,8 +203,8 @@ void GameListWidget::saveTableViewColumnSortSettings()
if (sort_column >= 0 && sort_column < GameListModel::Column_Count)
{
- m_host_interface->SetStringSettingValue("GameListTableView", "SortColumn",
- GameListModel::s_column_names[sort_column]);
+ m_host_interface->SetStringSettingValue(
+ "GameListTableView", "SortColumn", GameListModel::getColumnName(static_cast(sort_column)));
}
m_host_interface->SetBoolSettingValue("GameListTableView", "SortDescending", sort_descending);
diff --git a/src/duckstation-qt/translations/duckstation-qt_pt.ts b/src/duckstation-qt/translations/duckstation-qt_pt.ts
index d83a05388..efdcef835 100644
--- a/src/duckstation-qt/translations/duckstation-qt_pt.ts
+++ b/src/duckstation-qt/translations/duckstation-qt_pt.ts
@@ -13,24 +13,31 @@
Duckstation
-
-
-
-
- %1 (%2)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AdvancedSettingsWidget
@@ -115,7 +122,7 @@ p, li { white-space: pre-wrap; }
- Formulário
+ Form
@@ -176,7 +183,7 @@ p, li { white-space: pre-wrap; }
- As opções disponiveis determinam como o jogo irá reproduzir os sons; Cubed, fornece menor latência (atraso), se tiver problemas tente usar a opção SDL. A opção Nulo desativa o som completamente do jogo no emulador.
+ As opções disponiveis determinam como o jogo irá reproduzir os sons; Cubed, fornece menor latência (atraso), se tiver problemas tente usar a opção SDL. A opção Nulo desativa o som do jogo completamente no emulador.
@@ -186,12 +193,12 @@ p, li { white-space: pre-wrap; }
- O Tamanho do Buffer determina o quaão preciso será o som no emulador.Valores menores reduzem a latência de saída, mas podem causar problemas se a velocidade da emulação for inconsistente.Usar a opção Cubed implica em valores menores independente da latência o que não fará muita diferença final.
+ O Tamanho do Buffer determina o quão preciso será o som no emulador.Valores menores reduzem a latência de saída, mas podem causar problemas se a velocidade da emulação for inconsistente.Usar a opção Cubed implica em valores menores independente da latência o que não fará muita diferença final.
- Marcado
+
@@ -207,7 +214,7 @@ p, li { white-space: pre-wrap; }
- Inicia o despejo do audio para um arquivo assim que o emulador é iniciado. Útil em caso de depuração.
+ Inicia o despejo do audio para um arquivo assim que o emulador é iniciado. Útil só em caso de depuração.
@@ -217,7 +224,7 @@ p, li { white-space: pre-wrap; }
- Contrla o volume do aúdio. Valores são mostrados em %.
+ Controla o volume do aúdio. Valores são mostrados em porcentagem.
@@ -240,7 +247,7 @@ p, li { white-space: pre-wrap; }
- Formulário
+
@@ -300,7 +307,7 @@ p, li { white-space: pre-wrap; }
- Carregar Jogo para RAM
+ Carregar jogo para RAM
@@ -338,7 +345,7 @@ p, li { white-space: pre-wrap; }
- Tem certeza que quer todas as atribuições feitas, isto não poderá ser desfeito.
+ Tem certeza que quer limpar todos os vinculos, isto não poderá ser desfeito.
@@ -422,258 +429,320 @@ p, li { white-space: pre-wrap; }
- Formulário
+
-
+ Básico
-
+ Renderizador:
-
+ Adaptador:
-
-
+
+ Usar Dispositivo de Depuração
-
+ Exibição
-
+ Proporção e Aspecto:
-
+ Cortar:
-
-
+
+ Escalonamento Linear
-
-
+
+ Escalonamento Integro
-
-
+
+ Sincronização Vertical (V-Sync)
-
+ Aprimoramentos
-
+
+ ou Relação de AspectoEscala de Resolução:
-
-
+
+ Renderização em (24 Cores, desativa o efeito dithering)
-
-
+
+
- Dithering Escalonado, (escalona o padrão do dithering para a resolução)
+ Dithering Escalonado, (Escalona o padrão do dithering para a resolução)
-
-
+
+
- Desativa o entrelaçamento(força rederização progressiva)
+ Desativa o entrelaçamento (Força Rederização Progressiva)
-
-
+
+ Força o temporizador rodar em NTSC (60hz em jogos EU)
-
-
+
+ Filtragem de Textura Bilinear
-
-
+
+ Hack para Telas Widescreen
-
-
- Renderizador
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Escolhe a opção a ser usada para emular a GPU. Dependendo do seu sistema e hardware, As opções DX11 e OpenGL podem aparecer.O renderizador de software oferece a melhor compatibilidade, mas é o mais lento e não oferece nenhum aprimoramento.
-
+ Adaptador
-
+
- Se você tiver várias GPUs ,você poderá selecionar qual delas deseja usar para nos renderizadores de hardware. Esta opção é suportada apenas no Direct3D e no Vulkan, OpenGL sempre usará o dispositivo padrão.
+ Se você tem várias GPUs ,você poderá selecionar qual delas deseja usar para os renderizadores de hardware. Esta opção é suportada apenas no Direct3D e no Vulkan, OpenGL sempre usará o dispositivo padrão.
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Desmarcado
-
+ Permite o uso de dispositivos de depuração e shaders para renderizar APIs que os suportam. Só deve ser usado ao depurar o emulador.
-
+ Razão de Aspecto
-
+ Altera a proporção usada para exibir o jogo na tela. O padrão é 4:3, que corresponde a uma TV típica da época.CRT mais conhecida como Tubão.
-
+ Modo de Corte
-
+
- Somente área renderizada
+ Somente Área Renderizada
-
+
- Determina quanto da area normalmente não visivel em uma TV o usuário pode ver ou não.Alguns jogos mostram conteúdo fora desta area pré-determinada.Somente esta opção "overscan" pode oferecer um boa estabilidade na hora de ocultar as tarjas(bordas)pretas quando ocorrem.
+ Determina quanto da area normalmente não visivel em uma TV o usuário pode ver ou não.Alguns jogos mostram conteúdo fora desta area pré-determinada.Somente esta opção "overscan" (fora da área visivel) pode oferecer um boa estabilidade na hora de ocultar as tarjas (bordas)pretas quando ocorrem.
+
+
+
+
+
+
+
+
+
+
-
- Força o modo de quadros por segundo em modo progressivo. Se o jogo já tem essa opção nativamente ele não irá ter nenhum beneficio podendo assim deixar a mesma ligada.
+ Força o modo de quadros por segundo em modo progressivo. Se o jogo já tem essa opção nativamente ele não irá ter nenhum beneficio podendo assim deixar a mesma ligada.
-
-
+
+
+
+ Marcado
-
+
- Usa textura bilinear filttrando todo buffer para a tela principal.Desabilitar esta filtragem produzirá uma imagem mais nitida porém pixelada. Ativar irá deixar a imagem mais suave. Esta opção fica menos notável em resoluções mais altas.
+ Usa textura bilinear filtrando todo buffer para a tela principal.Desabilitar esta filtragem produzirá uma imagem mais nítida porém pixelada. Ativar irá deixar a imagem mais suave. Esta opção fica menos notável em resoluções mais altas.
-
+ Adiciona preenchimento na tela para garantir que a proporção entre pixels seja um número inteiro. Pode resultar em uma imagem mais nítida em alguns jogos 2D.
-
+
- Ativa a sincronização quando possível.A ativação dessa opção fornecerá melhor ritmo de quadros por segundo e movimento mais suave com menos quadros duplicados.<br><br>O VSync é desativado automaticamente quando não é possível usá-lo (por exemplo, quando executado a uma velocidade que não seja 100%).
+ Ativa a sincronização quando possível. A ativação dessa opção fornecerá melhor ritmo de quadros por segundo e movimento mais suave com menos quadros duplicados.<br><br>O V-Sync é desativado automaticamente quando não é possível usá-lo (por exemplo quando o jogo não estiver rodando a 100%).
-
+
- Escala de Resolução
+
-
+ Permite o aumento de escala de objetos 3D renderizados, aplica-se apenas aos back-end de hardware é seguro usar essa opção na maioria dos jogos ficando melhor ainda em resoluções mais altas; Isto implica também no maior uso da sua Placa de Video.
-
+
- Força a precisão das cores produz efeitos de gradientes mais agradável ao custo de fazer com que algumas cores pareçam um pouco diferentes. Desativar a opção também ativa alguns pontilhados, o que torna a transição entre cores menos nítida a maioria dos jogos é compatível com esta opção, os que não forem terão efeitos quebrados com a opção ativada. Aplica-se apenas aos renderizadores de hardware.
+ Força a precisão das cores produz efeitos de gradientes mais agradável ao custo de fazer com que algumas cores pareçam um pouco diferentes. Desativar a opção também ativa alguns pontilhados, o que torna a transição entre cores menos nítida a maioria dos jogos é compatível com esta opção, os que não forem terão efeitos quebrados com a opção ativada. Aplica-se apenas aos renderizadores por hardware.
-
+
- Geralmente seguro ativar e suportado apenas pelos rederizadores por Hardware (ou seja usando sua placa de vídeo). Escalona os 'ditherings' - pontilhados na imagem - para a placa de Video.Torna a visão destes pontos muito menos visivel em resoluções mais altas.
+ Escalona os 'ditherings' - pontilhados na imagem para a placa de Video.Torna a visão destes pontos muito menos visiveis em resoluções mais altas.Geralmente seguro ativar e suportado apenas pelos rederizadores por Hardware (ou seja usando sua placa de vídeo).
-
- Forç os jogos PAL a serem executados a 60 hz,resultará no jogo aproximadamente 17% mais rápido.isso pode não afetar a taxa de quadros em jogos com FPS variável.
+ Força os jogos PAL a serem executados a 60 hz, resultará nos jogos rodando 17% mais rápido. Isso pode não afetar a taxa de quadros em jogos com FPS variável.
-
+ Suaviza as texturas ampliadas nos objetos 3D usando a filtragem bilinear.Terá um efeito maior em escalas de resolução mais alta. Atualmente, esta opção produz artefatos em torno de objetos em muitos jogos.Apenas recomendado seu uso em rederizadores baseados em Hardware.
-
+
- Dimensiona as posições dos vértices da tela para a proporção widescreen,aumentando o campo de visão de 4:3 para 16: 9 em jogos 3D. Para jogos 2D ou jogos que usam fundos pré-renderizados, esse aprimoramento não funcionará conforme o esperado.
+ Dimensiona as posições dos vértices da tela para a proporção mais larga (Widescreen), aumentando o campo de visão de 4:3 para 16: 9 em jogos 3D. Para jogos 2D ou jogos que usam fundos pré-renderizados, esse aprimoramento não funcionará conforme o esperado.
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- (para 720p)
+ >(720p)
-
+
- (para 1080p)
+ >(1080p)
-
+
- (para 1440p)
+ >(1440p)
-
+
- (para 4k)
+ >(4k)
-
+ Automático, baseado no tamanho da janela aberta
-
+ %1x%2
@@ -682,8 +751,8 @@ p, li { white-space: pre-wrap; }
%1x (%2x%3 VRAM)
-
-
+
+ Padrão
@@ -691,37 +760,37 @@ p, li { white-space: pre-wrap; }
GameListModel
-
+ Tipo
-
+
- Cód
+ Codigo
-
+ Titulo
-
+ Titulo do Jogo
-
+ Tamanho
-
+ Região
-
+ Compatibilidade
@@ -729,12 +798,12 @@ p, li { white-space: pre-wrap; }
GameListSearchDirectoriesModel
-
+ Caminho
-
+ Recursivo
@@ -744,7 +813,7 @@ p, li { white-space: pre-wrap; }
- Formulário
+
@@ -758,6 +827,7 @@ p, li { white-space: pre-wrap; }
+ Remover
@@ -774,64 +844,69 @@ p, li { white-space: pre-wrap; }
- Atualizar Base de Dados (Do Redump)
+ Atualizar Lista de Jogos
-
+
+
+
+
+
+ Escolha o Diretório de Busca
-
+ Ler Recursivamente?
-
+ Gostaria der ler o diretório recursivamente? Escanear o diretório desta forma demora mais tempo porém, identificará arquivos em sub-pastas.
-
+
- Atualizar Lista de Jogos?
+
-
+
- Quer baixar o banco de dados do redump.org? Isto significa que serão baixados até 4MB de informação.
+ Quer baixar o banco de dados do redump? Isto significa que serão baixados 4MB de informação.
-
+ Baixando %1...
-
+ Cancelar
-
+ Falha ao Baixar
-
+ Extraindo...
-
+ Falha na Extração
-
+ Extração do banco de dados falhou.
@@ -841,7 +916,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Dialogo
+
@@ -871,7 +946,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Problemas no Escalonamento:
+ Problemas Escalonamento:
@@ -951,22 +1026,22 @@ This will download approximately 4 megabytes over your current internet connecti
- Não Gerado
+
- Ainda não Implementado
+ Não Implementado Ainda
- Exportar Informação de compatibilidade
+
- Dê OK para copiar para área de transferência.
+ Dê ok para copiar para área de transferência.
@@ -974,7 +1049,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Formulário
+
@@ -991,7 +1066,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Confirmar que Deseja Fechar
+ Confirmar ao Fechar
@@ -1106,7 +1181,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Renderiza o jogo na janela principal do emulador,sob ajanela da lista de jogos. Se desmarcado, o jogo irá rodar em uma janela separada.
+ Renderiza o jogo na janela principal do emulador sob a janela da lista de jogos. Se desmarcado, o jogo irá rodar em uma janela separada.
@@ -1131,7 +1206,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Ajusta a velocidade da emulação. Não é garantido que a velocidade será alcançada, e se não for o emulador irá rodar o mais rápido que pode.
+ Ajusta a velocidade da emulação. Não é garantido que a velocidade será alcançada sendo assim o emulador irá rodar o mais rápido que pode.
@@ -1151,7 +1226,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Mostra o número de quadros exibidos por segundo pelo sistema no canto superior direito da tela.
+ Mostra o FPS no canto superior direito da tela.
@@ -1161,7 +1236,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Mostra a velocidade de emulação atual do sistema no canto superior direito da tela registrado em %.
+ Mostra a velocidade de emulação atual do sistema no canto superior direito da tela registrado em porcentagem.
@@ -1185,7 +1260,6 @@ This will download approximately 4 megabytes over your current internet connecti
- Edita as entradas dos botões já atribuidosEditar Vinculos
@@ -1303,7 +1377,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Barra de ferramentas
+
@@ -1443,7 +1517,7 @@ This will download approximately 4 megabytes over your current internet connecti
- De Arquivo...
+ Do Arquivo...
@@ -1528,7 +1602,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Resumir o Último Estado Salvo
+ Resumir Último Estado Salvo
@@ -1579,7 +1653,7 @@ This will download approximately 4 megabytes over your current internet connecti
- Adicione um diretório de busca...
+ Adicione diretório de busca...
@@ -1668,12 +1742,12 @@ The URL was: %1
QtHostInterface
-
+ Resumir
-
+ Carregar Estado
@@ -1695,7 +1769,7 @@ The URL was: %1
- Apagar jogos Salvos...
+ Apagar Jogos Salvos...
@@ -1707,7 +1781,7 @@ The URL was: %1
- Tem certeza que quer apagar os estados salvos %1? não será possivel reverter esta ação.
+ Tem certeza que quer apagar os estados salvos %1? Não será possivel reverter esta ação.
@@ -1731,58 +1805,58 @@ The saves will not be recoverable.
- Pergunta
+ SettingsDialog
-
+ Configurações
-
+ Configurações Gerais
-
+ Configurações do Console
-
+ Configurar Lista de Jogos
-
+ Configurações de Atalhos
-
+ Configurações de Controle
-
+ Cartões de Memória
-
+ Configurações da GPU
-
+ Configurações de Aúdio
-
+ Configurações Avançadas
@@ -1794,38 +1868,38 @@ The saves will not be recoverable.
- <strong>Configurações do Console</strong><hr>Estas opções determinam a config. do console emulado.<br><br>Repouse o ponteiro do mouse para mais informações.
+ <strong>Configurações do Console</strong><hr>Estas opções determinam a config. do console emulado.<br><br> passe o ponteiro do mouse para mais informações.
- <strong>Config. Lista de Jogos</strong><hr>A lista acima mostra os diretórios que serão pesquisados pelo DuckStation para preencher a lista de jogos.Os diretórios de pesquisa podem ser adicionados, removidos e alternados para recursivo / não recursivo. Além disso, o banco de dados pode ser baixado ou atualizado para fornecer mais títulos, pois os próprios discos não fornecem tais informações.
+ <strong>Configuração Lista de Jogos</strong><hr>A lista acima mostra os diretórios que serão pesquisados pelo DuckStation para preencher a lista de jogos.Os diretórios de pesquisa podem ser adicionados, removidos e alternados para recursivo / não recursivo. Além disso, o banco de dados pode ser baixado ou atualizado para fornecer mais títulos, pois os próprios discos não fornecem tais informações.
- <strong>Config. de Atalhos</strong><hr>Vincular uma tecla de atalho permite acionar eventos como redefinir ou tirar capturas de tela com o pressionar de uma tecla . Clicando em uma das opções iniciará uma contagem regressiva;Neste caso, você deve pressionar uma tecla referente ao botão ou eixo que quer vincular.Se nenhum botão for pressionado e o cronômetro irá parar o vinculo permanecerá inalterado.Para limpar um vinculo clique com o direito sobre o botão desejado.Para vincular mais de um botão segure Shift e clique no que quer vincular.
+ <strong>Configuração de Atalhos</strong><hr>Vincular uma tecla de atalho permite acionar eventos como redefinir botões vinculados ou tirar capturas de tela com o pressionar de uma tecla. Clicando em uma das opções iniciará uma contagem regressiva; Neste caso você deve pressionar uma tecla referente ao botão ou eixo que quer vincular. Se nenhum botão for pressionado o cronômetro irá parar e o vinculo permanecerá inalterado. Para limpar um vinculo clique com o direito sobre o botão desejado. Para vincular mais de um botão segure Shift e clique no que quer vincular.
- <strong>Config. de Controle</strong><hr>Esta página permite escolher o tipo de controle que você deseja emular bem como vincular teclas ou botões para controle a vontade Clicar em vincular iniciará uma contagem regressiva;Você deve pressionar a tecla ou botão /analogico do controle que deseja vincular. (Para vibração, pressione qualquer botão no controle para o qual você deseja atribuir.
+ <strong>Configuração de Controle</strong><hr>Esta página permite escolher o tipo de controle que você deseja emular bem como vincular teclas ou botões para seu controle a vontade Clicar em vincular iniciará uma contagem regressiva; Você deve pressionar a tecla ou botão /analógico do controle que deseja vincular. (Para vibração, pressione qualquer botão no controle para o qual você deseja atribuir.
- <strong>Configs. de Cartão de Memória</strong><hr>Esta página permite controlar em que modo a emulação do cartão de memória funcionará e onde as imagens desses cartões serão armazenadas no disco.
+ <strong>Configuração de Cartão de Memória</strong><hr>Esta página permite controlar em que modo a emulação do cartão de memória funcionará e onde as imagens desses cartões serão armazenadas no disco.
- <strong>Config. da GPU</strong><hr>Essas opções controlam a simulação da GPU no console. Estão disponíveis várias melhorias, passe o mouse sobre cada uma para obter informações adicionais.
+ <strong>Configuração da GPU</strong><hr>Essas opções controlam a simulação da GPU no console. Estão disponíveis várias melhorias, passe o mouse sobre cada uma para obter informações adicionais.
- <strong>Configurações de Aúdio</strong><hr>Estas opções controlam a saída do som no emulador. passe o mouse sobre cada para obter informações adicionais.
+ <strong>Configurações de Aúdio</strong><hr>Estas opções controlam a saída do som no emulador. passe o ponteiro do mouse para mais informações.
@@ -1835,7 +1909,7 @@ The saves will not be recoverable.
- Valor Recomendado
+ Recomendado