From ecc8109d4360e0521efb97a095b42d9722da6ba4 Mon Sep 17 00:00:00 2001
From: Connor McLaughlin <stenzek@gmail.com>
Date: Wed, 8 Jan 2020 13:39:19 +1000
Subject: [PATCH] Qt: Show flags for region instead of text

---
 src/duckstation-qt/consolesettingswidget.ui   |  10 ++-
 .../duckstation-qt.vcxproj.filters            |   3 +-
 src/duckstation-qt/gamelistwidget.cpp         |  76 ++++++++++++++----
 src/duckstation-qt/qtutils.cpp                |   9 ++-
 src/duckstation-qt/resources/icons.qrc        |   6 ++
 .../resources/icons/flag-eu.png               | Bin 0 -> 4872 bytes
 .../resources/icons/flag-eu.svg               |  29 +++++++
 .../resources/icons/flag-jp.png               | Bin 0 -> 887 bytes
 .../resources/icons/flag-jp.svg               |   5 ++
 .../resources/icons/flag-us.png               | Bin 0 -> 8484 bytes
 .../resources/icons/flag-us.svg               |  12 +++
 11 files changed, 129 insertions(+), 21 deletions(-)
 create mode 100644 src/duckstation-qt/resources/icons/flag-eu.png
 create mode 100644 src/duckstation-qt/resources/icons/flag-eu.svg
 create mode 100644 src/duckstation-qt/resources/icons/flag-jp.png
 create mode 100644 src/duckstation-qt/resources/icons/flag-jp.svg
 create mode 100644 src/duckstation-qt/resources/icons/flag-us.png
 create mode 100644 src/duckstation-qt/resources/icons/flag-us.svg

diff --git a/src/duckstation-qt/consolesettingswidget.ui b/src/duckstation-qt/consolesettingswidget.ui
index 713c73791..252af2543 100644
--- a/src/duckstation-qt/consolesettingswidget.ui
+++ b/src/duckstation-qt/consolesettingswidget.ui
@@ -40,9 +40,9 @@
         </property>
        </item>
        <item>
-         <property name="text">
-           <string>NTSC-J (Japan)</string>
-         </property>
+        <property name="text">
+         <string>NTSC-J (Japan)</string>
+        </property>
        </item>
        <item>
         <property name="text">
@@ -109,6 +109,8 @@
    </item>
   </layout>
  </widget>
- <resources/>
+ <resources>
+  <include location="resources/icons.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/src/duckstation-qt/duckstation-qt.vcxproj.filters b/src/duckstation-qt/duckstation-qt.vcxproj.filters
index 2252a61f2..648aa4fbd 100644
--- a/src/duckstation-qt/duckstation-qt.vcxproj.filters
+++ b/src/duckstation-qt/duckstation-qt.vcxproj.filters
@@ -31,13 +31,13 @@
     <ClCompile Include="$(IntDir)moc_inputbindingwidgets.cpp" />
     <ClCompile Include="qtaudiostream.cpp" />
     <ClCompile Include="d3d11displaywindow.cpp" />
+    <ClCompile Include="$(IntDir)moc_d3d11displaywindow.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="qtsettingsinterface.h" />
     <ClInclude Include="qtutils.h" />
     <ClInclude Include="settingwidgetbinder.h" />
     <ClInclude Include="qtaudiostream.h" />
-    <ClInclude Include="d3d11displaywindow.h" />
   </ItemGroup>
   <ItemGroup>
     <Filter Include="resources">
@@ -60,6 +60,7 @@
     <QtMoc Include="gpusettingswidget.h" />
     <QtMoc Include="hotkeysettingswidget.h" />
     <QtMoc Include="inputbindingwidgets.h" />
+    <QtMoc Include="d3d11displaywindow.h" />
   </ItemGroup>
   <ItemGroup>
     <QtUi Include="consolesettingswidget.ui" />
diff --git a/src/duckstation-qt/gamelistwidget.cpp b/src/duckstation-qt/gamelistwidget.cpp
index 3e6b898fc..a2cbce438 100644
--- a/src/duckstation-qt/gamelistwidget.cpp
+++ b/src/duckstation-qt/gamelistwidget.cpp
@@ -2,6 +2,7 @@
 #include "core/settings.h"
 #include "qthostinterface.h"
 #include "qtutils.h"
+#include <QtGui/QPixmap>
 #include <QtWidgets/QHeaderView>
 
 class GameListModel : public QAbstractTableModel
@@ -21,6 +22,7 @@ public:
   GameListModel(GameList* game_list, QObject* parent = nullptr)
     : QAbstractTableModel(parent), m_game_list(game_list), m_size(static_cast<int>(m_game_list->GetEntryCount()))
   {
+    loadCommonImages();
   }
   ~GameListModel() = default;
 
@@ -45,30 +47,61 @@ public:
     if (!index.isValid())
       return {};
 
-    if (role != Qt::DisplayRole)
-      return {};
-
     const int row = index.row();
     if (row < 0 || row >= static_cast<int>(m_game_list->GetEntryCount()))
       return {};
 
     const GameList::GameListEntry& ge = m_game_list->GetEntries()[row];
-    switch (index.column())
+
+    switch (role)
     {
-      case Column_Code:
-        return QString::fromStdString(ge.code);
+      case Qt::DisplayRole:
+      {
+        switch (index.column())
+        {
+          case Column_Code:
+            return QString::fromStdString(ge.code);
 
-      case Column_Title:
-        return QString::fromStdString(ge.title);
+          case Column_Title:
+            return QString::fromStdString(ge.title);
 
-      case Column_Region:
-        return QString(Settings::GetConsoleRegionName(ge.region));
+          case Column_Region:
+            // return QString(Settings::GetConsoleRegionName(ge.region));
+            return {};
 
-      case Column_Size:
-        return QString("%1 MB").arg(static_cast<double>(ge.total_size) / 1048576.0, 0, 'f', 2);
+          case Column_Size:
+            return QString("%1 MB").arg(static_cast<double>(ge.total_size) / 1048576.0, 0, 'f', 2);
 
-      default:
-        return {};
+          default:
+            return {};
+        }
+      }
+
+      case Qt::DecorationRole:
+      {
+        switch (index.column())
+        {
+          case Column_Region:
+          {
+            switch (ge.region)
+            {
+              case ConsoleRegion::NTSC_J:
+                return m_region_jp_pixmap;
+              case ConsoleRegion::NTSC_U:
+                return m_region_us_pixmap;
+              case ConsoleRegion::PAL:
+              default:
+                return m_region_eu_pixmap;
+            }
+          }
+
+          default:
+            return {};
+        }
+
+        default:
+          return {};
+      }
     }
   }
 
@@ -110,8 +143,20 @@ public:
   }
 
 private:
+  void loadCommonImages()
+  {
+    // TODO: Use svg instead of 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"));
+  }
+
   GameList* m_game_list;
   int m_size;
+
+  QPixmap m_region_jp_pixmap;
+  QPixmap m_region_eu_pixmap;
+  QPixmap m_region_us_pixmap;
 };
 
 GameListWidget::GameListWidget(QWidget* parent /* = nullptr */) : QStackedWidget(parent) {}
@@ -135,6 +180,7 @@ void GameListWidget::initialize(QtHostInterface* host_interface)
   m_table_view->setCurrentIndex({});
   m_table_view->horizontalHeader()->setHighlightSections(false);
   m_table_view->verticalHeader()->hide();
+  m_table_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
   m_table_view->resizeColumnsToContents();
 
   connect(m_table_view, &QTableView::doubleClicked, this, &GameListWidget::onTableViewItemDoubleClicked);
@@ -161,5 +207,5 @@ void GameListWidget::resizeEvent(QResizeEvent* event)
 {
   QStackedWidget::resizeEvent(event);
 
-  QtUtils::ResizeColumnsForTableView(m_table_view, {100, -1, 100, 100});
+  QtUtils::ResizeColumnsForTableView(m_table_view, {100, -1, 60, 100});
 }
diff --git a/src/duckstation-qt/qtutils.cpp b/src/duckstation-qt/qtutils.cpp
index baa527d79..a85cd651c 100644
--- a/src/duckstation-qt/qtutils.cpp
+++ b/src/duckstation-qt/qtutils.cpp
@@ -4,6 +4,8 @@
 #include <QtGui/QKeyEvent>
 #include <QtWidgets/QDialog>
 #include <QtWidgets/QMainWindow>
+#include <QtWidgets/QScrollBar>
+#include <QtWidgets/QStyle>
 #include <QtWidgets/QTableView>
 #include <algorithm>
 #include <array>
@@ -34,7 +36,12 @@ void ResizeColumnsForTableView(QTableView* view, const std::initializer_list<int
   const int total_width =
     std::accumulate(widths.begin(), widths.end(), 0, [](int a, int b) { return a + std::max(b, 0); });
 
-  const int flex_width = std::max(view->width() - total_width - 2, 1);
+  const int padding = 2;
+  const int scrollbar_width = ((view->verticalScrollBar() && view->verticalScrollBar()->isVisible()) ||
+                               view->verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOn) ?
+                                view->style()->pixelMetric(QStyle::PM_ScrollBarExtent) :
+                                0;
+  const int flex_width = std::max(view->width() - total_width - scrollbar_width - padding, 1);
 
   int column_index = 0;
   for (const int spec_width : widths)
diff --git a/src/duckstation-qt/resources/icons.qrc b/src/duckstation-qt/resources/icons.qrc
index f461499bf..b2a7e40ec 100644
--- a/src/duckstation-qt/resources/icons.qrc
+++ b/src/duckstation-qt/resources/icons.qrc
@@ -1,5 +1,11 @@
 <RCC>
   <qresource>
+    <file>icons/flag-eu.png</file>
+    <file>icons/flag-eu.svg</file>
+    <file>icons/flag-jp.png</file>
+    <file>icons/flag-jp.svg</file>
+    <file>icons/flag-us.png</file>
+    <file>icons/flag-us.svg</file>
     <file>icons/applications-internet.png</file>
     <file>icons/system-search.png</file>
     <file>icons/list-add.png</file>
diff --git a/src/duckstation-qt/resources/icons/flag-eu.png b/src/duckstation-qt/resources/icons/flag-eu.png
new file mode 100644
index 0000000000000000000000000000000000000000..318ff09bde15a4c66a1f5730a67ecbd5b6a5f8bb
GIT binary patch
literal 4872
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

literal 0
HcmV?d00001

diff --git a/src/duckstation-qt/resources/icons/flag-eu.svg b/src/duckstation-qt/resources/icons/flag-eu.svg
new file mode 100644
index 000000000..0fa4e2414
--- /dev/null
+++ b/src/duckstation-qt/resources/icons/flag-eu.svg
@@ -0,0 +1,29 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 810 540">
+<desc>European flag</desc>
+<defs>
+<g id="s">
+<g id="c">
+<path id="t" d="M0,0v1h0.5z" transform="translate(0,-1)rotate(18)"/>
+<use xlink:href="#t" transform="scale(-1,1)"/>
+</g>
+<g id="a">
+<use xlink:href="#c" transform="rotate(72)"/>
+<use xlink:href="#c" transform="rotate(144)"/>
+</g>
+<use xlink:href="#a" transform="scale(-1,1)"/>
+</g>
+</defs>
+<rect fill="#039" width="810" height="540"/>
+<g fill="#fc0" transform="scale(30)translate(13.5,9)">
+<use xlink:href="#s" y="-6"/>
+<use xlink:href="#s" y="6"/>
+<g id="l">
+<use xlink:href="#s" x="-6"/>
+<use xlink:href="#s" transform="rotate(150)translate(0,6)rotate(66)"/>
+<use xlink:href="#s" transform="rotate(120)translate(0,6)rotate(24)"/>
+<use xlink:href="#s" transform="rotate(60)translate(0,6)rotate(12)"/>
+<use xlink:href="#s" transform="rotate(30)translate(0,6)rotate(42)"/>
+</g>
+<use xlink:href="#l" transform="scale(-1,1)"/>
+</g>
+</svg>
\ No newline at end of file
diff --git a/src/duckstation-qt/resources/icons/flag-jp.png b/src/duckstation-qt/resources/icons/flag-jp.png
new file mode 100644
index 0000000000000000000000000000000000000000..46b15cb30f5f6134996f9e591f410417804e0e4f
GIT binary patch
literal 887
zcmV--1Bm>IP)<h;3K|Lk000e1NJLTq001%o000;W1^@s6xCpM{0004nX+uL$Nkc;*
zaB^>EX>4Tx04R}tkvmAkP!xv$rb>&nIM_kNAwzYt;0tk-Di*;)X)CnqU~<zJG-*gu
zTpR`0f`gC6s)LKOt`4q(Aou`ra&%I3krK~M3N2zhaJe7<J^#<W=K?~r%2cyw98fjO
zNGIZAF25=UUg1L!euOb0F;h=w7PIiIuY2mIx{L8F@4i1PtQ1TJ_(bA4rW+RV2Jy_M
zrE}gVj<B+%5T6r|8FWG7N3P2*zi}=(Ebz>TkxkDNM~KBz7t3AD%7#ijO&nEJjq-(@
z%L?Z$&T6&J+V|uy3>CDM4A*H5BY`C(k%9;rbyQG=g&6G`DJIf%9{2DMIsO#6WO7x&
z$gzMLR7j2={11N5)+|m<x=Eop(EDQBA0t3u7icwX`}^3oTPJ}38Mx9q{#p~5{Up87
z(V|B{|2A-O-O=Pd;Bp5Te9|RDawI=3p;!do&*+=-z`!lgx8}~ReU8%yAWO4az5xyn
zfzc9WuY0^Z*gdy@d)o8+0Yb2Hl(v79OaK4?24YJ`L;(K){{a7>y{D4^000SaNLh0L
z01ejw01ejxLMWSf00007bV*G`2jl?=0}&YeCiipz00DDJL_t(o!((K?1OEU2|DRzH
z0Y*kfMqF}C48sJBdStKx7Frtq_uCJKACI0hFfcGMaLP+DFmbXEEswn0dy?T{=RAh@
z2Tn8m|NRG&QCV3S1Rc#76v~qr1f9&NUl35U)cXJDFT<_8c7`X@SK(DBlO4gJHldt>
zk%f71mRh&+I|zD$fq{YH$<!4Lw~M+5XN<f*aGK$qV=_sW8}6CSAmnU5xMJi%+Z>Yh
zJnEi5xQgGuU%xZFKX964eed_5X88N<$KdhE&nGY8r4uRO->=^cKcBoDL=_?<<G|>p
zwnx}y#2FY_Nw1Qa*jO1jWW)!LN0_-d7z7<jujB-s%&1n|Q?1les7fJOk9=w3;A=Dr
z+M6)QWJeIKUN%3Ps!bKD*6eB%${A#GB8l>ZYH#V_ZEGRd@((-aGQ8h^n&IEC-|&nr
z=w!wqUy;lpXm3LG9wJRV0<R~&|AaT=IpicM&e#Lyk<mW;XrFx;005a@coO<EGI9U_
N002ovPDHLkV1lTsj<^5-

literal 0
HcmV?d00001

diff --git a/src/duckstation-qt/resources/icons/flag-jp.svg b/src/duckstation-qt/resources/icons/flag-jp.svg
new file mode 100644
index 000000000..05ca6995a
--- /dev/null
+++ b/src/duckstation-qt/resources/icons/flag-jp.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600">
+<rect fill="#fff" height="600" width="900"/>
+<circle fill="#bc002d" cx="450" cy="300" r="180"/>
+</svg>
\ No newline at end of file
diff --git a/src/duckstation-qt/resources/icons/flag-us.png b/src/duckstation-qt/resources/icons/flag-us.png
new file mode 100644
index 0000000000000000000000000000000000000000..c54624c8d97fc1a7781969319e04c13b83b8072e
GIT binary patch
literal 8484
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
LMXFB1EbRXPG-z-N

literal 0
HcmV?d00001

diff --git a/src/duckstation-qt/resources/icons/flag-us.svg b/src/duckstation-qt/resources/icons/flag-us.svg
new file mode 100644
index 000000000..3f1081ccf
--- /dev/null
+++ b/src/duckstation-qt/resources/icons/flag-us.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1235" height="650">
+<defs>
+<polygon id="pt" points="-0.1624598481164531,0 0,-0.5 0.1624598481164531,0" transform="scale(0.0616)" fill="#FFF"/>
+<g id="star"><use xlink:href="#pt" transform="rotate(-144)"/><use xlink:href="#pt" transform="rotate(-72)"/><use xlink:href="#pt"/><use xlink:href="#pt" transform="rotate(72)"/><use xlink:href="#pt" transform="rotate(144)"/></g>
+<g id="s5"><use xlink:href="#star" x="-0.252"/><use xlink:href="#star" x="-0.126"/><use xlink:href="#star"/><use xlink:href="#star" x="0.126"/><use xlink:href="#star" x="0.252"/></g>
+<g id="s6"><use xlink:href="#s5" x="-0.063"/><use xlink:href="#star" x="0.315"/></g>
+<g id="x4"><use xlink:href="#s6"/><use xlink:href="#s5" y="0.054"/><use xlink:href="#s6" y="0.108"/><use xlink:href="#s5" y="0.162"/></g>
+<g id="u"><use xlink:href="#x4" y="-0.216"/><use xlink:href="#x4"/><use xlink:href="#s6" y="0.216"/></g>
+<rect id="stripe" width="1235" height="50" fill="#B22234"/>
+</defs>
+<rect width="1235" height="650" fill="#FFF"/><use xlink:href="#stripe"/><use xlink:href="#stripe" y="100"/><use xlink:href="#stripe" y="200"/><use xlink:href="#stripe" y="300"/><use xlink:href="#stripe" y="400"/><use xlink:href="#stripe" y="500"/><use xlink:href="#stripe" y="600"/><rect width="494" height="350" fill="#3C3B6E"/><use xlink:href="#u" transform="translate(247,175) scale(650)"/></svg>
\ No newline at end of file