mirror of
https://github.com/citra-emu/citra.git
synced 2024-12-18 15:50:03 +00:00
Merge pull request #4992 from FearlessTobi/port-2513
yuzu/game_list&multiplayer: Specify string conversions explicitly
This commit is contained in:
commit
6d0189b4b1
@ -27,7 +27,6 @@
|
|||||||
#include "citra_qt/game_list_worker.h"
|
#include "citra_qt/game_list_worker.h"
|
||||||
#include "citra_qt/main.h"
|
#include "citra_qt/main.h"
|
||||||
#include "citra_qt/uisettings.h"
|
#include "citra_qt/uisettings.h"
|
||||||
#include "common/common_paths.h"
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/file_sys/archive_extsavedata.h"
|
#include "core/file_sys/archive_extsavedata.h"
|
||||||
#include "core/file_sys/archive_source_sd_savedata.h"
|
#include "core/file_sys/archive_source_sd_savedata.h"
|
||||||
@ -54,7 +53,7 @@ bool GameListSearchField::KeyReleaseEater::eventFilter(QObject* obj, QEvent* eve
|
|||||||
return QObject::eventFilter(obj, event);
|
return QObject::eventFilter(obj, event);
|
||||||
} else {
|
} else {
|
||||||
gamelist->search_field->edit_filter->clear();
|
gamelist->search_field->edit_filter->clear();
|
||||||
edit_filter_text = "";
|
edit_filter_text.clear();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -67,9 +66,9 @@ bool GameListSearchField::KeyReleaseEater::eventFilter(QObject* obj, QEvent* eve
|
|||||||
QString file_path = gamelist->getLastFilterResultItem();
|
QString file_path = gamelist->getLastFilterResultItem();
|
||||||
|
|
||||||
// To avoid loading error dialog loops while confirming them using enter
|
// To avoid loading error dialog loops while confirming them using enter
|
||||||
// Also users usually want to run a diffrent game after closing one
|
// Also users usually want to run a different game after closing one
|
||||||
gamelist->search_field->edit_filter->setText("");
|
gamelist->search_field->edit_filter->clear();
|
||||||
edit_filter_text = "";
|
edit_filter_text.clear();
|
||||||
emit gamelist->GameChosen(file_path);
|
emit gamelist->GameChosen(file_path);
|
||||||
} else {
|
} else {
|
||||||
return QObject::eventFilter(obj, event);
|
return QObject::eventFilter(obj, event);
|
||||||
@ -96,7 +95,7 @@ void GameListSearchField::setFilterResult(int visible, int total) {
|
|||||||
result_text = tr("results");
|
result_text = tr("results");
|
||||||
}
|
}
|
||||||
label_filter_result->setText(
|
label_filter_result->setText(
|
||||||
QString("%1 %2 %3 %4").arg(visible).arg(result_of_text).arg(total).arg(result_text));
|
QStringLiteral("%1 %2 %3 %4").arg(visible).arg(result_of_text).arg(total).arg(result_text));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GameList::getLastFilterResultItem() const {
|
QString GameList::getLastFilterResultItem() const {
|
||||||
@ -119,7 +118,7 @@ QString GameList::getLastFilterResultItem() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GameListSearchField::clear() {
|
void GameListSearchField::clear() {
|
||||||
edit_filter->setText("");
|
edit_filter->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameListSearchField::setFocus() {
|
void GameListSearchField::setFocus() {
|
||||||
@ -129,25 +128,26 @@ void GameListSearchField::setFocus() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GameListSearchField::GameListSearchField(GameList* parent) : QWidget{parent} {
|
GameListSearchField::GameListSearchField(GameList* parent) : QWidget{parent} {
|
||||||
KeyReleaseEater* keyReleaseEater = new KeyReleaseEater(parent);
|
auto* const key_release_eater = new KeyReleaseEater(parent);
|
||||||
layout_filter = new QHBoxLayout;
|
layout_filter = new QHBoxLayout;
|
||||||
layout_filter->setMargin(8);
|
layout_filter->setMargin(8);
|
||||||
label_filter = new QLabel;
|
label_filter = new QLabel;
|
||||||
label_filter->setText(tr("Filter:"));
|
label_filter->setText(tr("Filter:"));
|
||||||
edit_filter = new QLineEdit;
|
edit_filter = new QLineEdit;
|
||||||
edit_filter->setText("");
|
edit_filter->clear();
|
||||||
edit_filter->setPlaceholderText(tr("Enter pattern to filter"));
|
edit_filter->setPlaceholderText(tr("Enter pattern to filter"));
|
||||||
edit_filter->installEventFilter(keyReleaseEater);
|
edit_filter->installEventFilter(key_release_eater);
|
||||||
edit_filter->setClearButtonEnabled(true);
|
edit_filter->setClearButtonEnabled(true);
|
||||||
connect(edit_filter, &QLineEdit::textChanged, parent, &GameList::onTextChanged);
|
connect(edit_filter, &QLineEdit::textChanged, parent, &GameList::onTextChanged);
|
||||||
label_filter_result = new QLabel;
|
label_filter_result = new QLabel;
|
||||||
button_filter_close = new QToolButton(this);
|
button_filter_close = new QToolButton(this);
|
||||||
button_filter_close->setText("X");
|
button_filter_close->setText(QStringLiteral("X"));
|
||||||
button_filter_close->setCursor(Qt::ArrowCursor);
|
button_filter_close->setCursor(Qt::ArrowCursor);
|
||||||
button_filter_close->setStyleSheet("QToolButton{ border: none; padding: 0px; color: "
|
button_filter_close->setStyleSheet(
|
||||||
"#000000; font-weight: bold; background: #F0F0F0; }"
|
QStringLiteral("QToolButton{ border: none; padding: 0px; color: "
|
||||||
"QToolButton:hover{ border: none; padding: 0px; color: "
|
"#000000; font-weight: bold; background: #F0F0F0; }"
|
||||||
"#EEEEEE; font-weight: bold; background: #E81123}");
|
"QToolButton:hover{ border: none; padding: 0px; color: "
|
||||||
|
"#EEEEEE; font-weight: bold; background: #E81123}"));
|
||||||
connect(button_filter_close, &QToolButton::clicked, parent, &GameList::onFilterCloseClicked);
|
connect(button_filter_close, &QToolButton::clicked, parent, &GameList::onFilterCloseClicked);
|
||||||
layout_filter->setSpacing(10);
|
layout_filter->setSpacing(10);
|
||||||
layout_filter->addWidget(label_filter);
|
layout_filter->addWidget(label_filter);
|
||||||
@ -167,7 +167,7 @@ GameListSearchField::GameListSearchField(GameList* parent) : QWidget{parent} {
|
|||||||
*/
|
*/
|
||||||
static bool ContainsAllWords(const QString& haystack, const QString& userinput) {
|
static bool ContainsAllWords(const QString& haystack, const QString& userinput) {
|
||||||
const QStringList userinput_split =
|
const QStringList userinput_split =
|
||||||
userinput.split(' ', QString::SplitBehavior::SkipEmptyParts);
|
userinput.split(QLatin1Char{' '}, QString::SplitBehavior::SkipEmptyParts);
|
||||||
|
|
||||||
return std::all_of(userinput_split.begin(), userinput_split.end(),
|
return std::all_of(userinput_split.begin(), userinput_split.end(),
|
||||||
[&haystack](const QString& s) { return haystack.contains(s); });
|
[&haystack](const QString& s) { return haystack.contains(s); });
|
||||||
@ -183,16 +183,16 @@ void GameList::onItemExpanded(const QModelIndex& item) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Event in order to filter the gamelist after editing the searchfield
|
// Event in order to filter the gamelist after editing the searchfield
|
||||||
void GameList::onTextChanged(const QString& newText) {
|
void GameList::onTextChanged(const QString& new_text) {
|
||||||
const int folderCount = tree_view->model()->rowCount();
|
const int folder_count = tree_view->model()->rowCount();
|
||||||
QString edit_filter_text = newText.toLower();
|
QString edit_filter_text = new_text.toLower();
|
||||||
QStandardItem* folder;
|
QStandardItem* folder;
|
||||||
int children_total = 0;
|
int children_total = 0;
|
||||||
|
|
||||||
// If the searchfield is empty every item is visible
|
// If the searchfield is empty every item is visible
|
||||||
// Otherwise the filter gets applied
|
// Otherwise the filter gets applied
|
||||||
if (edit_filter_text.isEmpty()) {
|
if (edit_filter_text.isEmpty()) {
|
||||||
for (int i = 0; i < folderCount; ++i) {
|
for (int i = 0; i < folder_count; ++i) {
|
||||||
folder = item_model->item(i, 0);
|
folder = item_model->item(i, 0);
|
||||||
const QModelIndex folder_index = folder->index();
|
const QModelIndex folder_index = folder->index();
|
||||||
const int children_count = folder->rowCount();
|
const int children_count = folder->rowCount();
|
||||||
@ -204,7 +204,7 @@ void GameList::onTextChanged(const QString& newText) {
|
|||||||
search_field->setFilterResult(children_total, children_total);
|
search_field->setFilterResult(children_total, children_total);
|
||||||
} else {
|
} else {
|
||||||
int result_count = 0;
|
int result_count = 0;
|
||||||
for (int i = 0; i < folderCount; ++i) {
|
for (int i = 0; i < folder_count; ++i) {
|
||||||
folder = item_model->item(i, 0);
|
folder = item_model->item(i, 0);
|
||||||
const QModelIndex folder_index = folder->index();
|
const QModelIndex folder_index = folder->index();
|
||||||
const int children_count = folder->rowCount();
|
const int children_count = folder->rowCount();
|
||||||
@ -213,10 +213,9 @@ void GameList::onTextChanged(const QString& newText) {
|
|||||||
const QStandardItem* child = folder->child(j, 0);
|
const QStandardItem* child = folder->child(j, 0);
|
||||||
const QString file_path =
|
const QString file_path =
|
||||||
child->data(GameListItemPath::FullPathRole).toString().toLower();
|
child->data(GameListItemPath::FullPathRole).toString().toLower();
|
||||||
QString file_name = file_path.mid(file_path.lastIndexOf("/") + 1);
|
|
||||||
const QString file_title =
|
const QString file_title =
|
||||||
child->data(GameListItemPath::LongTitleRole).toString().toLower();
|
child->data(GameListItemPath::LongTitleRole).toString().toLower();
|
||||||
const QString file_programmid =
|
const QString file_program_id =
|
||||||
child->data(GameListItemPath::ProgramIdRole).toString().toLower();
|
child->data(GameListItemPath::ProgramIdRole).toString().toLower();
|
||||||
|
|
||||||
// Only items which filename in combination with its title contains all words
|
// Only items which filename in combination with its title contains all words
|
||||||
@ -224,8 +223,11 @@ void GameList::onTextChanged(const QString& newText) {
|
|||||||
// The search is case insensitive because of toLower()
|
// The search is case insensitive because of toLower()
|
||||||
// I decided not to use Qt::CaseInsensitive in containsAllWords to prevent
|
// I decided not to use Qt::CaseInsensitive in containsAllWords to prevent
|
||||||
// multiple conversions of edit_filter_text for each game in the gamelist
|
// multiple conversions of edit_filter_text for each game in the gamelist
|
||||||
if (ContainsAllWords(file_name.append(' ').append(file_title), edit_filter_text) ||
|
const QString file_name =
|
||||||
(file_programmid.count() == 16 && edit_filter_text.contains(file_programmid))) {
|
file_path.mid(file_path.lastIndexOf(QLatin1Char{'/'}) + 1) + QLatin1Char{' '} +
|
||||||
|
file_title;
|
||||||
|
if (ContainsAllWords(file_name, edit_filter_text) ||
|
||||||
|
(file_program_id.count() == 16 && edit_filter_text.contains(file_program_id))) {
|
||||||
tree_view->setRowHidden(j, folder_index, false);
|
tree_view->setRowHidden(j, folder_index, false);
|
||||||
++result_count;
|
++result_count;
|
||||||
} else {
|
} else {
|
||||||
@ -243,20 +245,23 @@ void GameList::onUpdateThemedIcons() {
|
|||||||
|
|
||||||
switch (child->data(GameListItem::TypeRole).value<GameListItemType>()) {
|
switch (child->data(GameListItem::TypeRole).value<GameListItemType>()) {
|
||||||
case GameListItemType::InstalledDir:
|
case GameListItemType::InstalledDir:
|
||||||
child->setData(QIcon::fromTheme("sd_card").pixmap(48), Qt::DecorationRole);
|
child->setData(QIcon::fromTheme(QStringLiteral("sd_card")).pixmap(48),
|
||||||
|
Qt::DecorationRole);
|
||||||
break;
|
break;
|
||||||
case GameListItemType::SystemDir:
|
case GameListItemType::SystemDir:
|
||||||
child->setData(QIcon::fromTheme("chip").pixmap(48), Qt::DecorationRole);
|
child->setData(QIcon::fromTheme(QStringLiteral("chip")).pixmap(48), Qt::DecorationRole);
|
||||||
break;
|
break;
|
||||||
case GameListItemType::CustomDir: {
|
case GameListItemType::CustomDir: {
|
||||||
const UISettings::GameDir* game_dir =
|
const UISettings::GameDir* game_dir =
|
||||||
child->data(GameListDir::GameDirRole).value<UISettings::GameDir*>();
|
child->data(GameListDir::GameDirRole).value<UISettings::GameDir*>();
|
||||||
const QString icon_name = QFileInfo::exists(game_dir->path) ? "folder" : "bad_folder";
|
const QString icon_name = QFileInfo::exists(game_dir->path)
|
||||||
|
? QStringLiteral("folder")
|
||||||
|
: QStringLiteral("bad_folder");
|
||||||
child->setData(QIcon::fromTheme(icon_name).pixmap(48), Qt::DecorationRole);
|
child->setData(QIcon::fromTheme(icon_name).pixmap(48), Qt::DecorationRole);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GameListItemType::AddDir:
|
case GameListItemType::AddDir:
|
||||||
child->setData(QIcon::fromTheme("plus").pixmap(48), Qt::DecorationRole);
|
child->setData(QIcon::fromTheme(QStringLiteral("plus")).pixmap(48), Qt::DecorationRole);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -288,7 +293,7 @@ GameList::GameList(GMainWindow* parent) : QWidget{parent} {
|
|||||||
tree_view->setSortingEnabled(true);
|
tree_view->setSortingEnabled(true);
|
||||||
tree_view->setEditTriggers(QHeaderView::NoEditTriggers);
|
tree_view->setEditTriggers(QHeaderView::NoEditTriggers);
|
||||||
tree_view->setContextMenuPolicy(Qt::CustomContextMenu);
|
tree_view->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
tree_view->setStyleSheet("QTreeView{ border: none; }");
|
tree_view->setStyleSheet(QStringLiteral("QTreeView{ border: none; }"));
|
||||||
|
|
||||||
item_model->insertColumns(0, COLUMN_COUNT);
|
item_model->insertColumns(0, COLUMN_COUNT);
|
||||||
item_model->setHeaderData(COLUMN_NAME, Qt::Horizontal, tr("Name"));
|
item_model->setHeaderData(COLUMN_NAME, Qt::Horizontal, tr("Name"));
|
||||||
@ -588,7 +593,7 @@ void GameList::AddPermDirPopup(QMenu& context_menu, QModelIndex selected) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GameList::LoadCompatibilityList() {
|
void GameList::LoadCompatibilityList() {
|
||||||
QFile compat_list{":compatibility_list/compatibility_list.json"};
|
QFile compat_list{QStringLiteral(":compatibility_list/compatibility_list.json")};
|
||||||
|
|
||||||
if (!compat_list.open(QFile::ReadOnly | QFile::Text)) {
|
if (!compat_list.open(QFile::ReadOnly | QFile::Text)) {
|
||||||
LOG_ERROR(Frontend, "Unable to open game compatibility list");
|
LOG_ERROR(Frontend, "Unable to open game compatibility list");
|
||||||
@ -606,25 +611,27 @@ void GameList::LoadCompatibilityList() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString string_content = content;
|
const QJsonDocument json = QJsonDocument::fromJson(content);
|
||||||
QJsonDocument json = QJsonDocument::fromJson(string_content.toUtf8());
|
const QJsonArray arr = json.array();
|
||||||
QJsonArray arr = json.array();
|
|
||||||
|
|
||||||
for (const QJsonValueRef value : arr) {
|
for (const QJsonValue value : arr) {
|
||||||
QJsonObject game = value.toObject();
|
const QJsonObject game = value.toObject();
|
||||||
|
const QString compatibility_key = QStringLiteral("compatibility");
|
||||||
|
|
||||||
if (game.contains("compatibility") && game["compatibility"].isDouble()) {
|
if (!game.contains(compatibility_key) || !game[compatibility_key].isDouble()) {
|
||||||
int compatibility = game["compatibility"].toInt();
|
continue;
|
||||||
QString directory = game["directory"].toString();
|
}
|
||||||
QJsonArray ids = game["releases"].toArray();
|
|
||||||
|
|
||||||
for (const QJsonValueRef id_ref : ids) {
|
const int compatibility = game[compatibility_key].toInt();
|
||||||
QJsonObject id_object = id_ref.toObject();
|
const QString directory = game[QStringLiteral("directory")].toString();
|
||||||
QString id = id_object["id"].toString();
|
const QJsonArray ids = game[QStringLiteral("releases")].toArray();
|
||||||
compatibility_list.emplace(
|
|
||||||
id.toUpper().toStdString(),
|
for (const QJsonValue id_ref : ids) {
|
||||||
std::make_pair(QString::number(compatibility), directory));
|
const QJsonObject id_object = id_ref.toObject();
|
||||||
}
|
const QString id = id_object[QStringLiteral("id")].toString();
|
||||||
|
|
||||||
|
compatibility_list.emplace(id.toUpper().toStdString(),
|
||||||
|
std::make_pair(QString::number(compatibility), directory));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -672,8 +679,9 @@ void GameList::LoadInterfaceLayout() {
|
|||||||
item_model->sort(header->sortIndicatorSection(), header->sortIndicatorOrder());
|
item_model->sort(header->sortIndicatorSection(), header->sortIndicatorOrder());
|
||||||
}
|
}
|
||||||
|
|
||||||
const QStringList GameList::supported_file_extensions = {"3ds", "3dsx", "elf", "axf",
|
const QStringList GameList::supported_file_extensions = {
|
||||||
"cci", "cxi", "app"};
|
QStringLiteral("3ds"), QStringLiteral("3dsx"), QStringLiteral("elf"), QStringLiteral("axf"),
|
||||||
|
QStringLiteral("cci"), QStringLiteral("cxi"), QStringLiteral("app")};
|
||||||
|
|
||||||
void GameList::RefreshGameDirectory() {
|
void GameList::RefreshGameDirectory() {
|
||||||
if (!UISettings::values.game_dirs.isEmpty() && current_worker != nullptr) {
|
if (!UISettings::values.game_dirs.isEmpty() && current_worker != nullptr) {
|
||||||
@ -697,7 +705,7 @@ QString GameList::FindGameByProgramID(QStandardItem* current_item, u64 program_i
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "";
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
GameListPlaceholder::GameListPlaceholder(GMainWindow* parent) : QWidget{parent} {
|
GameListPlaceholder::GameListPlaceholder(GMainWindow* parent) : QWidget{parent} {
|
||||||
@ -708,7 +716,7 @@ GameListPlaceholder::GameListPlaceholder(GMainWindow* parent) : QWidget{parent}
|
|||||||
image = new QLabel;
|
image = new QLabel;
|
||||||
text = new QLabel;
|
text = new QLabel;
|
||||||
layout->setAlignment(Qt::AlignCenter);
|
layout->setAlignment(Qt::AlignCenter);
|
||||||
image->setPixmap(QIcon::fromTheme("plus_folder").pixmap(200));
|
image->setPixmap(QIcon::fromTheme(QStringLiteral("plus_folder")).pixmap(200));
|
||||||
|
|
||||||
text->setText(tr("Double-click to add a new folder to the game list"));
|
text->setText(tr("Double-click to add a new folder to the game list"));
|
||||||
QFont font = text->font();
|
QFont font = text->font();
|
||||||
@ -725,7 +733,7 @@ GameListPlaceholder::GameListPlaceholder(GMainWindow* parent) : QWidget{parent}
|
|||||||
GameListPlaceholder::~GameListPlaceholder() = default;
|
GameListPlaceholder::~GameListPlaceholder() = default;
|
||||||
|
|
||||||
void GameListPlaceholder::onUpdateThemedIcons() {
|
void GameListPlaceholder::onUpdateThemedIcons() {
|
||||||
image->setPixmap(QIcon::fromTheme("plus_folder").pixmap(200));
|
image->setPixmap(QIcon::fromTheme(QStringLiteral("plus_folder")).pixmap(200));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameListPlaceholder::mouseDoubleClickEvent(QMouseEvent* event) {
|
void GameListPlaceholder::mouseDoubleClickEvent(QMouseEvent* event) {
|
||||||
|
@ -88,7 +88,7 @@ signals:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onItemExpanded(const QModelIndex& item);
|
void onItemExpanded(const QModelIndex& item);
|
||||||
void onTextChanged(const QString& newText);
|
void onTextChanged(const QString& new_text);
|
||||||
void onFilterCloseClicked();
|
void onFilterCloseClicked();
|
||||||
void onUpdateThemedIcons();
|
void onUpdateThemedIcons();
|
||||||
|
|
||||||
|
@ -244,13 +244,13 @@ public:
|
|||||||
};
|
};
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const std::map<QString, CompatStatus> status_data = {
|
static const std::map<QString, CompatStatus> status_data = {
|
||||||
{"0", {"#5c93ed", QT_TR_NOOP("Perfect"), QT_TR_NOOP("Game functions flawless with no audio or graphical glitches, all tested functionality works as intended without\nany workarounds needed.")}},
|
{QStringLiteral("0"), {QStringLiteral("#5c93ed"), QT_TR_NOOP("Perfect"), QT_TR_NOOP("Game functions flawless with no audio or graphical glitches, all tested functionality works as intended without\nany workarounds needed.")}},
|
||||||
{"1", {"#47d35c", QT_TR_NOOP("Great"), QT_TR_NOOP("Game functions with minor graphical or audio glitches and is playable from start to finish. May require some\nworkarounds.")}},
|
{QStringLiteral("1"), {QStringLiteral("#47d35c"), QT_TR_NOOP("Great"), QT_TR_NOOP("Game functions with minor graphical or audio glitches and is playable from start to finish. May require some\nworkarounds.")}},
|
||||||
{"2", {"#94b242", QT_TR_NOOP("Okay"), QT_TR_NOOP("Game functions with major graphical or audio glitches, but game is playable from start to finish with\nworkarounds.")}},
|
{QStringLiteral("2"), {QStringLiteral("#94b242"), QT_TR_NOOP("Okay"), QT_TR_NOOP("Game functions with major graphical or audio glitches, but game is playable from start to finish with\nworkarounds.")}},
|
||||||
{"3", {"#f2d624", QT_TR_NOOP("Bad"), QT_TR_NOOP("Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches\neven with workarounds.")}},
|
{QStringLiteral("3"), {QStringLiteral("#f2d624"), QT_TR_NOOP("Bad"), QT_TR_NOOP("Game functions, but with major graphical or audio glitches. Unable to progress in specific areas due to glitches\neven with workarounds.")}},
|
||||||
{"4", {"#ff0000", QT_TR_NOOP("Intro/Menu"), QT_TR_NOOP("Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start\nScreen.")}},
|
{QStringLiteral("4"), {QStringLiteral("#ff0000"), QT_TR_NOOP("Intro/Menu"), QT_TR_NOOP("Game is completely unplayable due to major graphical or audio glitches. Unable to progress past the Start\nScreen.")}},
|
||||||
{"5", {"#828282", QT_TR_NOOP("Won't Boot"), QT_TR_NOOP("The game crashes when attempting to startup.")}},
|
{QStringLiteral("5"), {QStringLiteral("#828282"), QT_TR_NOOP("Won't Boot"), QT_TR_NOOP("The game crashes when attempting to startup.")}},
|
||||||
{"99", {"#000000", QT_TR_NOOP("Not Tested"), QT_TR_NOOP("The game has not yet been tested.")}}};
|
{QStringLiteral("99"), {QStringLiteral("#000000"), QT_TR_NOOP("Not Tested"), QT_TR_NOOP("The game has not yet been tested.")}}};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
auto iterator = status_data.find(compatibility);
|
auto iterator = status_data.find(compatibility);
|
||||||
|
@ -91,7 +91,7 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
|
|||||||
auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id);
|
auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id);
|
||||||
|
|
||||||
// The game list uses this as compatibility number for untested games
|
// The game list uses this as compatibility number for untested games
|
||||||
QString compatibility("99");
|
QString compatibility(QStringLiteral("99"));
|
||||||
if (it != compatibility_list.end())
|
if (it != compatibility_list.end())
|
||||||
compatibility = it->second.first;
|
compatibility = it->second.first;
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, unsign
|
|||||||
void GameListWorker::run() {
|
void GameListWorker::run() {
|
||||||
stop_processing = false;
|
stop_processing = false;
|
||||||
for (UISettings::GameDir& game_dir : game_dirs) {
|
for (UISettings::GameDir& game_dir : game_dirs) {
|
||||||
if (game_dir.path == "INSTALLED") {
|
if (game_dir.path == QStringLiteral("INSTALLED")) {
|
||||||
QString games_path =
|
QString games_path =
|
||||||
QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)) +
|
QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir)) +
|
||||||
"Nintendo "
|
"Nintendo "
|
||||||
@ -138,7 +138,7 @@ void GameListWorker::run() {
|
|||||||
emit DirEntryReady(game_list_dir);
|
emit DirEntryReady(game_list_dir);
|
||||||
AddFstEntriesToGameList(games_path.toStdString(), 2, game_list_dir);
|
AddFstEntriesToGameList(games_path.toStdString(), 2, game_list_dir);
|
||||||
AddFstEntriesToGameList(demos_path.toStdString(), 2, game_list_dir);
|
AddFstEntriesToGameList(demos_path.toStdString(), 2, game_list_dir);
|
||||||
} else if (game_dir.path == "SYSTEM") {
|
} else if (game_dir.path == QStringLiteral("SYSTEM")) {
|
||||||
QString path =
|
QString path =
|
||||||
QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)) +
|
QString::fromStdString(FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)) +
|
||||||
"00000000000000000000000000000000/title/00040010";
|
"00000000000000000000000000000000/title/00040010";
|
||||||
|
@ -44,10 +44,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handle pings at the beginning and end of message
|
// Handle pings at the beginning and end of message
|
||||||
QString fixed_message = QString(" %1 ").arg(message);
|
QString fixed_message = QStringLiteral(" %1 ").arg(message);
|
||||||
if (fixed_message.contains(QString(" @%1 ").arg(cur_nickname)) ||
|
if (fixed_message.contains(QStringLiteral(" @%1 ").arg(cur_nickname)) ||
|
||||||
(!cur_username.isEmpty() &&
|
(!cur_username.isEmpty() &&
|
||||||
fixed_message.contains(QString(" @%1 ").arg(cur_username)))) {
|
fixed_message.contains(QStringLiteral(" @%1 ").arg(cur_username)))) {
|
||||||
|
|
||||||
contains_ping = true;
|
contains_ping = true;
|
||||||
} else {
|
} else {
|
||||||
@ -66,20 +66,20 @@ public:
|
|||||||
if (username.isEmpty() || username == nickname) {
|
if (username.isEmpty() || username == nickname) {
|
||||||
name = nickname;
|
name = nickname;
|
||||||
} else {
|
} else {
|
||||||
name = QString("%1 (%2)").arg(nickname, username);
|
name = QStringLiteral("%1 (%2)").arg(nickname, username);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString style, text_color;
|
QString style, text_color;
|
||||||
if (ContainsPing()) {
|
if (ContainsPing()) {
|
||||||
// Add a background color to these messages
|
// Add a background color to these messages
|
||||||
style = QString("background-color: %1").arg(ping_color);
|
style = QStringLiteral("background-color: %1").arg(QString::fromStdString(ping_color));
|
||||||
// Add a font color
|
// Add a font color
|
||||||
text_color = "color='#000000'";
|
text_color = QStringLiteral("color='#000000'");
|
||||||
}
|
}
|
||||||
|
|
||||||
return QString("[%1] <font color='%2'><%3></font> <font style='%4' "
|
return QStringLiteral("[%1] <font color='%2'><%3></font> <font style='%4' "
|
||||||
"%5>%6</font>")
|
"%5>%6</font>")
|
||||||
.arg(timestamp, color, name.toHtmlEscaped(), style, text_color,
|
.arg(timestamp, QString::fromStdString(color), name.toHtmlEscaped(), style, text_color,
|
||||||
message.toHtmlEscaped());
|
message.toHtmlEscaped());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +106,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString GetSystemChatMessage() const {
|
QString GetSystemChatMessage() const {
|
||||||
return QString("[%1] <font color='%2'>* %3</font>").arg(timestamp, system_color, message);
|
return QStringLiteral("[%1] <font color='%2'>* %3</font>")
|
||||||
|
.arg(timestamp, QString::fromStdString(system_color), message);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -146,9 +147,9 @@ public:
|
|||||||
if (username.isEmpty() || username == nickname) {
|
if (username.isEmpty() || username == nickname) {
|
||||||
name = nickname;
|
name = nickname;
|
||||||
} else {
|
} else {
|
||||||
name = QString("%1 (%2)").arg(nickname, username);
|
name = QStringLiteral("%1 (%2)").arg(nickname, username);
|
||||||
}
|
}
|
||||||
return QString("%1\n %2").arg(name, data(GameNameRole).toString());
|
return QStringLiteral("%1\n %2").arg(name, data(GameNameRole).toString());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -288,8 +289,8 @@ void ChatRoom::OnStatusMessageReceive(const Network::StatusMessageEntry& status_
|
|||||||
if (status_message.username.empty() || status_message.username == status_message.nickname) {
|
if (status_message.username.empty() || status_message.username == status_message.nickname) {
|
||||||
name = QString::fromStdString(status_message.nickname);
|
name = QString::fromStdString(status_message.nickname);
|
||||||
} else {
|
} else {
|
||||||
name = QString("%1 (%2)").arg(QString::fromStdString(status_message.nickname),
|
name = QStringLiteral("%1 (%2)").arg(QString::fromStdString(status_message.nickname),
|
||||||
QString::fromStdString(status_message.username));
|
QString::fromStdString(status_message.username));
|
||||||
}
|
}
|
||||||
QString message;
|
QString message;
|
||||||
switch (status_message.type) {
|
switch (status_message.type) {
|
||||||
@ -353,7 +354,8 @@ void ChatRoom::UpdateIconDisplay() {
|
|||||||
if (icon_cache.count(avatar_url)) {
|
if (icon_cache.count(avatar_url)) {
|
||||||
item->setData(icon_cache.at(avatar_url), Qt::DecorationRole);
|
item->setData(icon_cache.at(avatar_url), Qt::DecorationRole);
|
||||||
} else {
|
} else {
|
||||||
item->setData(QIcon::fromTheme("no_avatar").pixmap(48), Qt::DecorationRole);
|
item->setData(QIcon::fromTheme(QStringLiteral("no_avatar")).pixmap(48),
|
||||||
|
Qt::DecorationRole);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -373,7 +375,7 @@ void ChatRoom::SetPlayerList(const Network::RoomMember::MemberList& member_list)
|
|||||||
const QUrl url(QString::fromStdString(member.avatar_url));
|
const QUrl url(QString::fromStdString(member.avatar_url));
|
||||||
QFuture<std::string> future = QtConcurrent::run([url] {
|
QFuture<std::string> future = QtConcurrent::run([url] {
|
||||||
WebService::Client client(
|
WebService::Client client(
|
||||||
QString("%1://%2").arg(url.scheme(), url.host()).toStdString(), "", "");
|
QStringLiteral("%1://%2").arg(url.scheme(), url.host()).toStdString(), "", "");
|
||||||
auto result = client.GetImage(url.path().toStdString(), true);
|
auto result = client.GetImage(url.path().toStdString(), true);
|
||||||
if (result.returned_data.empty()) {
|
if (result.returned_data.empty()) {
|
||||||
LOG_ERROR(WebService, "Failed to get avatar");
|
LOG_ERROR(WebService, "Failed to get avatar");
|
||||||
@ -426,7 +428,7 @@ void ChatRoom::PopupContextMenu(const QPoint& menu_location) {
|
|||||||
QAction* view_profile_action = context_menu.addAction(tr("View Profile"));
|
QAction* view_profile_action = context_menu.addAction(tr("View Profile"));
|
||||||
connect(view_profile_action, &QAction::triggered, [username] {
|
connect(view_profile_action, &QAction::triggered, [username] {
|
||||||
QDesktopServices::openUrl(
|
QDesktopServices::openUrl(
|
||||||
QUrl(QString("https://community.citra-emu.org/u/%1").arg(username)));
|
QUrl(QStringLiteral("https://community.citra-emu.org/u/%1").arg(username)));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,8 +99,9 @@ void Lobby::RetranslateUi() {
|
|||||||
|
|
||||||
QString Lobby::PasswordPrompt() {
|
QString Lobby::PasswordPrompt() {
|
||||||
bool ok;
|
bool ok;
|
||||||
const QString text = QInputDialog::getText(this, tr("Password Required to Join"),
|
const QString text =
|
||||||
tr("Password:"), QLineEdit::Password, "", &ok);
|
QInputDialog::getText(this, tr("Password Required to Join"), tr("Password:"),
|
||||||
|
QLineEdit::Password, QString(), &ok);
|
||||||
return ok ? text : QString();
|
return ok ? text : QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +182,7 @@ void Lobby::OnJoinRoom(const QModelIndex& source) {
|
|||||||
void Lobby::ResetModel() {
|
void Lobby::ResetModel() {
|
||||||
model->clear();
|
model->clear();
|
||||||
model->insertColumns(0, Column::TOTAL);
|
model->insertColumns(0, Column::TOTAL);
|
||||||
model->setHeaderData(Column::EXPAND, Qt::Horizontal, "", Qt::DisplayRole);
|
model->setHeaderData(Column::EXPAND, Qt::Horizontal, QString(), Qt::DisplayRole);
|
||||||
model->setHeaderData(Column::ROOM_NAME, Qt::Horizontal, tr("Room Name"), Qt::DisplayRole);
|
model->setHeaderData(Column::ROOM_NAME, Qt::Horizontal, tr("Room Name"), Qt::DisplayRole);
|
||||||
model->setHeaderData(Column::GAME_NAME, Qt::Horizontal, tr("Preferred Game"), Qt::DisplayRole);
|
model->setHeaderData(Column::GAME_NAME, Qt::Horizontal, tr("Preferred Game"), Qt::DisplayRole);
|
||||||
model->setHeaderData(Column::HOST, Qt::Horizontal, tr("Host"), Qt::DisplayRole);
|
model->setHeaderData(Column::HOST, Qt::Horizontal, tr("Host"), Qt::DisplayRole);
|
||||||
|
@ -42,7 +42,7 @@ public:
|
|||||||
QVariant data(int role) const override {
|
QVariant data(int role) const override {
|
||||||
if (role == Qt::DecorationRole) {
|
if (role == Qt::DecorationRole) {
|
||||||
bool has_password = data(PasswordRole).toBool();
|
bool has_password = data(PasswordRole).toBool();
|
||||||
return has_password ? QIcon::fromTheme("lock").pixmap(16) : QIcon();
|
return has_password ? QIcon::fromTheme(QStringLiteral("lock")).pixmap(16) : QIcon();
|
||||||
}
|
}
|
||||||
if (role != Qt::DisplayRole) {
|
if (role != Qt::DisplayRole) {
|
||||||
return LobbyItem::data(role);
|
return LobbyItem::data(role);
|
||||||
@ -69,7 +69,7 @@ public:
|
|||||||
return LobbyItem::data(role);
|
return LobbyItem::data(role);
|
||||||
}
|
}
|
||||||
auto description = data(DescriptionRole).toString();
|
auto description = data(DescriptionRole).toString();
|
||||||
description.prepend("Description: ");
|
description.prepend(QStringLiteral("Description: "));
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ public:
|
|||||||
if (username.isEmpty() || username == nickname) {
|
if (username.isEmpty() || username == nickname) {
|
||||||
return nickname;
|
return nickname;
|
||||||
} else {
|
} else {
|
||||||
return QString("%1 (%2)").arg(nickname, username);
|
return QStringLiteral("%1 (%2)").arg(nickname, username);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
u64 GetTitleId() const {
|
u64 GetTitleId() const {
|
||||||
@ -192,8 +192,8 @@ public:
|
|||||||
return LobbyItem::data(role);
|
return LobbyItem::data(role);
|
||||||
}
|
}
|
||||||
auto members = data(MemberListRole).toList();
|
auto members = data(MemberListRole).toList();
|
||||||
return QString("%1 / %2").arg(QString::number(members.size()),
|
return QStringLiteral("%1 / %2").arg(QString::number(members.size()),
|
||||||
data(MaxPlayerRole).toString());
|
data(MaxPlayerRole).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator<(const QStandardItem& other) const override {
|
bool operator<(const QStandardItem& other) const override {
|
||||||
@ -225,7 +225,7 @@ public:
|
|||||||
bool first = true;
|
bool first = true;
|
||||||
for (const auto& member : members) {
|
for (const auto& member : members) {
|
||||||
if (!first)
|
if (!first)
|
||||||
out += '\n';
|
out.append(QStringLiteral("\n"));
|
||||||
const auto& m = member.value<LobbyMember>();
|
const auto& m = member.value<LobbyMember>();
|
||||||
if (m.GetGameName().isEmpty()) {
|
if (m.GetGameName().isEmpty()) {
|
||||||
out += QString(QObject::tr("%1 is not playing a game")).arg(m.GetName());
|
out += QString(QObject::tr("%1 is not playing a game")).arg(m.GetName());
|
||||||
|
@ -46,7 +46,7 @@ MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_lis
|
|||||||
status_icon = new ClickableLabel(this);
|
status_icon = new ClickableLabel(this);
|
||||||
status_text->setToolTip(tr("Current connection status"));
|
status_text->setToolTip(tr("Current connection status"));
|
||||||
status_text->setText(tr("Not Connected. Click here to find a room!"));
|
status_text->setText(tr("Not Connected. Click here to find a room!"));
|
||||||
status_icon->setPixmap(QIcon::fromTheme("disconnected").pixmap(16));
|
status_icon->setPixmap(QIcon::fromTheme(QStringLiteral("disconnected")).pixmap(16));
|
||||||
|
|
||||||
connect(status_text, &ClickableLabel::clicked, this, &MultiplayerState::OnOpenNetworkRoom);
|
connect(status_text, &ClickableLabel::clicked, this, &MultiplayerState::OnOpenNetworkRoom);
|
||||||
connect(status_icon, &ClickableLabel::clicked, this, &MultiplayerState::OnOpenNetworkRoom);
|
connect(status_icon, &ClickableLabel::clicked, this, &MultiplayerState::OnOpenNetworkRoom);
|
||||||
@ -113,12 +113,12 @@ void MultiplayerState::OnNetworkStateChanged(const Network::RoomMember::State& s
|
|||||||
state == Network::RoomMember::State::Moderator) {
|
state == Network::RoomMember::State::Moderator) {
|
||||||
|
|
||||||
OnOpenNetworkRoom();
|
OnOpenNetworkRoom();
|
||||||
status_icon->setPixmap(QIcon::fromTheme("connected").pixmap(16));
|
status_icon->setPixmap(QIcon::fromTheme(QStringLiteral("connected")).pixmap(16));
|
||||||
status_text->setText(tr("Connected"));
|
status_text->setText(tr("Connected"));
|
||||||
leave_room->setEnabled(true);
|
leave_room->setEnabled(true);
|
||||||
show_room->setEnabled(true);
|
show_room->setEnabled(true);
|
||||||
} else {
|
} else {
|
||||||
status_icon->setPixmap(QIcon::fromTheme("disconnected").pixmap(16));
|
status_icon->setPixmap(QIcon::fromTheme(QStringLiteral("disconnected")).pixmap(16));
|
||||||
status_text->setText(tr("Not Connected"));
|
status_text->setText(tr("Not Connected"));
|
||||||
leave_room->setEnabled(false);
|
leave_room->setEnabled(false);
|
||||||
show_room->setEnabled(false);
|
show_room->setEnabled(false);
|
||||||
@ -183,13 +183,14 @@ void MultiplayerState::OnAnnounceFailed(const Common::WebResult& result) {
|
|||||||
|
|
||||||
void MultiplayerState::UpdateThemedIcons() {
|
void MultiplayerState::UpdateThemedIcons() {
|
||||||
if (show_notification) {
|
if (show_notification) {
|
||||||
status_icon->setPixmap(QIcon::fromTheme("connected_notification").pixmap(16));
|
status_icon->setPixmap(
|
||||||
|
QIcon::fromTheme(QStringLiteral("connected_notification")).pixmap(16));
|
||||||
} else if (current_state == Network::RoomMember::State::Joined ||
|
} else if (current_state == Network::RoomMember::State::Joined ||
|
||||||
current_state == Network::RoomMember::State::Moderator) {
|
current_state == Network::RoomMember::State::Moderator) {
|
||||||
|
|
||||||
status_icon->setPixmap(QIcon::fromTheme("connected").pixmap(16));
|
status_icon->setPixmap(QIcon::fromTheme(QStringLiteral("connected")).pixmap(16));
|
||||||
} else {
|
} else {
|
||||||
status_icon->setPixmap(QIcon::fromTheme("disconnected").pixmap(16));
|
status_icon->setPixmap(QIcon::fromTheme(QStringLiteral("disconnected")).pixmap(16));
|
||||||
}
|
}
|
||||||
if (client_room)
|
if (client_room)
|
||||||
client_room->UpdateIconDisplay();
|
client_room->UpdateIconDisplay();
|
||||||
@ -245,13 +246,13 @@ void MultiplayerState::ShowNotification() {
|
|||||||
return; // Do not show notification if the chat window currently has focus
|
return; // Do not show notification if the chat window currently has focus
|
||||||
show_notification = true;
|
show_notification = true;
|
||||||
QApplication::alert(nullptr);
|
QApplication::alert(nullptr);
|
||||||
status_icon->setPixmap(QIcon::fromTheme("connected_notification").pixmap(16));
|
status_icon->setPixmap(QIcon::fromTheme(QStringLiteral("connected_notification")).pixmap(16));
|
||||||
status_text->setText(tr("New Messages Received"));
|
status_text->setText(tr("New Messages Received"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiplayerState::HideNotification() {
|
void MultiplayerState::HideNotification() {
|
||||||
show_notification = false;
|
show_notification = false;
|
||||||
status_icon->setPixmap(QIcon::fromTheme("connected").pixmap(16));
|
status_icon->setPixmap(QIcon::fromTheme(QStringLiteral("connected")).pixmap(16));
|
||||||
status_text->setText(tr("Connected"));
|
status_text->setText(tr("Connected"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QRegExp>
|
#include <QRegExp>
|
||||||
|
#include <QString>
|
||||||
#include <QValidator>
|
#include <QValidator>
|
||||||
|
|
||||||
class Validation {
|
class Validation {
|
||||||
@ -29,18 +30,18 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
/// room name can be alphanumeric and " " "_" "." and "-" and must have a size of 4-20
|
/// room name can be alphanumeric and " " "_" "." and "-" and must have a size of 4-20
|
||||||
QRegExp room_name_regex = QRegExp("^[a-zA-Z0-9._- ]{4,20}$");
|
QRegExp room_name_regex = QRegExp(QStringLiteral("^[a-zA-Z0-9._- ]{4,20}$"));
|
||||||
QRegExpValidator room_name;
|
QRegExpValidator room_name;
|
||||||
|
|
||||||
/// nickname can be alphanumeric and " " "_" "." and "-" and must have a size of 4-20
|
/// nickname can be alphanumeric and " " "_" "." and "-" and must have a size of 4-20
|
||||||
QRegExp nickname_regex = QRegExp("^[a-zA-Z0-9._- ]{4,20}$");
|
QRegExp nickname_regex = QRegExp(QStringLiteral("^[a-zA-Z0-9._- ]{4,20}$"));
|
||||||
QRegExpValidator nickname;
|
QRegExpValidator nickname;
|
||||||
|
|
||||||
/// ipv4 address only
|
/// ipv4 address only
|
||||||
// TODO remove this when we support hostnames in direct connect
|
// TODO remove this when we support hostnames in direct connect
|
||||||
QRegExp ip_regex = QRegExp(
|
QRegExp ip_regex = QRegExp(QStringLiteral(
|
||||||
"(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|"
|
"(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|"
|
||||||
"2[0-4][0-9]|25[0-5])");
|
"2[0-4][0-9]|25[0-5])"));
|
||||||
QRegExpValidator ip;
|
QRegExpValidator ip;
|
||||||
|
|
||||||
/// port must be between 0 and 65535
|
/// port must be between 0 and 65535
|
||||||
|
@ -59,8 +59,8 @@ private:
|
|||||||
|
|
||||||
bool launch_ui_on_exit = false;
|
bool launch_ui_on_exit = false;
|
||||||
|
|
||||||
QStringList run_arguments{"--updater"};
|
QStringList run_arguments{QStringLiteral("--updater")};
|
||||||
QStringList silent_arguments{"--silentUpdate"};
|
QStringList silent_arguments{QStringLiteral("--silentUpdate")};
|
||||||
|
|
||||||
friend class Updater;
|
friend class Updater;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user