diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj
index a2006a95e4..6b5509c6d4 100644
--- a/rpcs3/rpcs3.vcxproj
+++ b/rpcs3/rpcs3.vcxproj
@@ -1570,6 +1570,7 @@
+
diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters
index 5b5b4075e1..d797365bc7 100644
--- a/rpcs3/rpcs3.vcxproj.filters
+++ b/rpcs3/rpcs3.vcxproj.filters
@@ -1108,6 +1108,9 @@
Io\DualSense
+
+ Gui\game list
+
diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt
index 4d01dcc4f9..dbd8fc13ac 100644
--- a/rpcs3/rpcs3qt/CMakeLists.txt
+++ b/rpcs3/rpcs3qt/CMakeLists.txt
@@ -12,6 +12,7 @@ set(SRC_FILES
config_adapter.cpp
curl_handle.cpp
custom_dialog.cpp
+ custom_table_widget_item.cpp
debugger_frame.cpp
debugger_list.cpp
downloader.cpp
diff --git a/rpcs3/rpcs3qt/custom_table_widget_item.cpp b/rpcs3/rpcs3qt/custom_table_widget_item.cpp
new file mode 100644
index 0000000000..e6dbb27418
--- /dev/null
+++ b/rpcs3/rpcs3qt/custom_table_widget_item.cpp
@@ -0,0 +1,72 @@
+#include "custom_table_widget_item.h"
+#include "Utilities/StrFmt.h"
+
+#include
+
+custom_table_widget_item::custom_table_widget_item(const std::string& text, int sort_role, const QVariant& sort_value)
+ : QTableWidgetItem(QString::fromStdString(text).simplified()) // simplified() forces single line text
+{
+ if (sort_role != Qt::DisplayRole)
+ {
+ setData(sort_role, sort_value, true);
+ }
+}
+
+custom_table_widget_item::custom_table_widget_item(const QString& text, int sort_role, const QVariant& sort_value)
+ : QTableWidgetItem(text.simplified()) // simplified() forces single line text
+{
+ if (sort_role != Qt::DisplayRole)
+ {
+ setData(sort_role, sort_value, true);
+ }
+}
+
+bool custom_table_widget_item::operator<(const QTableWidgetItem& other) const
+{
+ if (m_sort_role == Qt::DisplayRole)
+ {
+ return QTableWidgetItem::operator<(other);
+ }
+
+ const QVariant data_l = data(m_sort_role);
+ const QVariant data_r = other.data(m_sort_role);
+ const QVariant::Type type_l = data_l.type();
+ const QVariant::Type type_r = data_r.type();
+
+ assert(type_l == type_r);
+
+ switch (type_l)
+ {
+ case QVariant::Type::Bool:
+ case QVariant::Type::Int:
+ return data_l.toInt() < data_r.toInt();
+ case QVariant::Type::UInt:
+ return data_l.toUInt() < data_r.toUInt();
+ case QVariant::Type::LongLong:
+ return data_l.toLongLong() < data_r.toLongLong();
+ case QVariant::Type::ULongLong:
+ return data_l.toULongLong() < data_r.toULongLong();
+ case QVariant::Type::Double:
+ return data_l.toDouble() < data_r.toDouble();
+ case QVariant::Type::Date:
+ return data_l.toDate() < data_r.toDate();
+ case QVariant::Type::Time:
+ return data_l.toTime() < data_r.toTime();
+ case QVariant::Type::DateTime:
+ return data_l.toDateTime() < data_r.toDateTime();
+ case QVariant::Type::Char:
+ case QVariant::Type::String:
+ return data_l.toString() < data_r.toString();
+ default:
+ fmt::throw_exception("Unimplemented type %s", QVariant::typeToName(type_l));
+ }
+}
+
+void custom_table_widget_item::setData(int role, const QVariant& value, bool assign_sort_role)
+{
+ if (assign_sort_role)
+ {
+ m_sort_role = role;
+ }
+ QTableWidgetItem::setData(role, value);
+}
diff --git a/rpcs3/rpcs3qt/custom_table_widget_item.h b/rpcs3/rpcs3qt/custom_table_widget_item.h
index 9c69573893..f465fa908f 100644
--- a/rpcs3/rpcs3qt/custom_table_widget_item.h
+++ b/rpcs3/rpcs3qt/custom_table_widget_item.h
@@ -11,41 +11,10 @@ public:
using QTableWidgetItem::setData;
custom_table_widget_item(){}
- custom_table_widget_item(const std::string& text, int sort_role = Qt::DisplayRole, const QVariant& sort_value = 0)
- : QTableWidgetItem(QString::fromStdString(text).simplified()) // simplified() forces single line text
- {
- if (sort_role != Qt::DisplayRole)
- {
- setData(sort_role, sort_value, true);
- }
- }
- custom_table_widget_item(const QString& text, int sort_role = Qt::DisplayRole, const QVariant& sort_value = 0)
- : QTableWidgetItem(text.simplified()) // simplified() forces single line text
- {
- if (sort_role != Qt::DisplayRole)
- {
- setData(sort_role, sort_value, true);
- }
- }
+ custom_table_widget_item(const std::string& text, int sort_role = Qt::DisplayRole, const QVariant& sort_value = 0);
+ custom_table_widget_item(const QString& text, int sort_role = Qt::DisplayRole, const QVariant& sort_value = 0);
- bool operator <(const QTableWidgetItem& other) const
- {
-#ifndef _MSC_VER
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
- return data(m_sort_role) < other.data(m_sort_role);
-#ifndef _MSC_VER
-#pragma GCC diagnostic pop
-#endif
- }
+ bool operator<(const QTableWidgetItem& other) const;
- void setData(int role, const QVariant& value, bool assign_sort_role)
- {
- if (assign_sort_role)
- {
- m_sort_role = role;
- }
- QTableWidgetItem::setData(role, value);
- }
+ void setData(int role, const QVariant& value, bool assign_sort_role);
};