From 6e0b71ace48c8bff751d89b219dc32de65b3330e Mon Sep 17 00:00:00 2001
From: Albert Liu <45282415+ggrtk@users.noreply.github.com>
Date: Tue, 11 Aug 2020 11:17:01 -0700
Subject: [PATCH] QtUtils: Improve QTableView column resizing

---
 src/duckstation-qt/qtutils.cpp | 12 ++++++++----
 src/duckstation-qt/qtutils.h   |  2 +-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/duckstation-qt/qtutils.cpp b/src/duckstation-qt/qtutils.cpp
index f86d98af0..47fcf4450 100644
--- a/src/duckstation-qt/qtutils.cpp
+++ b/src/duckstation-qt/qtutils.cpp
@@ -4,6 +4,7 @@
 #include <QtGui/QDesktopServices>
 #include <QtGui/QKeyEvent>
 #include <QtWidgets/QDialog>
+#include <QtWidgets/QHeaderView>
 #include <QtWidgets/QMainWindow>
 #include <QtWidgets/QMessageBox>
 #include <QtWidgets/QScrollBar>
@@ -43,15 +44,18 @@ QWidget* GetRootWidget(QWidget* widget, bool stop_at_window_or_dialog)
 
 void ResizeColumnsForTableView(QTableView* view, const std::initializer_list<int>& widths)
 {
+  const int min_column_width = view->horizontalHeader()->minimumSectionSize();
+  const int max_column_width = view->horizontalHeader()->maximumSectionSize();
   const int total_width =
-    std::accumulate(widths.begin(), widths.end(), 0, [](int a, int b) { return a + std::max(b, 0); });
+    std::accumulate(widths.begin(), widths.end(), 0, [&min_column_width, &max_column_width](int a, int b) {
+      return a + ((b < 0) ? 0 : std::clamp(b, min_column_width, max_column_width));
+    });
 
-  const int padding = 2;
   const int scrollbar_width = ((view->verticalScrollBar() && view->verticalScrollBar()->isVisible()) ||
                                view->verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOn) ?
-                                view->style()->pixelMetric(QStyle::PM_ScrollBarExtent) :
+                                view->verticalScrollBar()->width() :
                                 0;
-  const int flex_width = std::max(view->width() - total_width - scrollbar_width - padding, 1);
+  const int flex_width = std::max(view->contentsRect().width() - total_width - scrollbar_width, 1);
 
   int column_index = 0;
   for (const int spec_width : widths)
diff --git a/src/duckstation-qt/qtutils.h b/src/duckstation-qt/qtutils.h
index 6ca193fde..ef9975616 100644
--- a/src/duckstation-qt/qtutils.h
+++ b/src/duckstation-qt/qtutils.h
@@ -20,7 +20,7 @@ QFrame* CreateHorizontalLine(QWidget* parent);
 /// Returns the greatest parent of a widget, i.e. its dialog/window.
 QWidget* GetRootWidget(QWidget* widget, bool stop_at_window_or_dialog = true);
 
-/// Resizes columns of the table view to at the specified widths. A width of -1 will stretch the column to use the
+/// Resizes columns of the table view to at the specified widths. A negative width will stretch the column to use the
 /// remaining space.
 void ResizeColumnsForTableView(QTableView* view, const std::initializer_list<int>& widths);