From e4bc578466eeab69c96d7b6795adf2f649a8a713 Mon Sep 17 00:00:00 2001
From: CozmoP <25121396+CozmoP@users.noreply.github.com>
Date: Wed, 16 Jan 2019 00:11:58 +0100
Subject: [PATCH] Qt: fix bug when grid item width > grid width

---
 ui/drivers/qt/gridview.cpp | 104 +++++++++++++++++++++----------------
 1 file changed, 59 insertions(+), 45 deletions(-)

diff --git a/ui/drivers/qt/gridview.cpp b/ui/drivers/qt/gridview.cpp
index 9d53c8c506..14d139b0e4 100644
--- a/ui/drivers/qt/gridview.cpp
+++ b/ui/drivers/qt/gridview.cpp
@@ -94,66 +94,80 @@ void GridView::calculateRectsIfNecessary() const
 
    const int maxWidth = viewport()->width();
 
-   switch (m_viewMode)
+   if (m_size + m_spacing * 2 > maxWidth)
    {
-      case Anchored:
+      m_rectForRow[0] = QRectF(x, y, m_size, m_size);
+
+      for (row = 1; row < model()->rowCount(); ++row)
       {
-         int columns = (maxWidth - m_spacing) / (m_size + m_spacing);
-         if (columns > 0)
+         y += m_size + m_spacing;
+         m_rectForRow[row] = QRectF(x, y, m_size, m_size);
+      }
+   }
+   else
+   {
+      switch (m_viewMode)
+      {
+         case Anchored:
          {
-            const int actualSpacing = (maxWidth - m_spacing - m_size - (columns - 1) * m_size) / columns;
+            int columns = (maxWidth - m_spacing) / (m_size + m_spacing);
+            if (columns > 0)
+            {
+               const int actualSpacing = (maxWidth - m_spacing - m_size - (columns - 1) * m_size) / columns;
+               for (row = 0; row < model()->rowCount(); ++row)
+               {
+                  nextX = x + m_size + actualSpacing;
+                  if (nextX > maxWidth)
+                  {
+                     x = m_spacing;
+                     y += m_size + m_spacing;
+                     nextX = x + m_size + actualSpacing;
+                  }
+                  m_rectForRow[row] = QRectF(x, y, m_size, m_size);
+                  x = nextX;
+               }
+            }
+            break;
+         }
+         case Centered:
+         {
+            int columns = (maxWidth - m_spacing) / (m_size + m_spacing);
+            if (columns > 0)
+            {
+               const int actualSpacing = (maxWidth - columns * m_size) / (columns + 1);
+               x = actualSpacing;
+               for (row = 0; row < model()->rowCount(); ++row)
+               {
+                  nextX = x + m_size + actualSpacing;
+                  if (nextX > maxWidth)
+                  {
+                     x = actualSpacing;
+                     y += m_size + m_spacing;
+                     nextX = x + m_size + actualSpacing;
+                  }
+                  m_rectForRow[row] = QRectF(x, y, m_size, m_size);
+                  x = nextX;
+               }
+            }
+            break;
+         }
+         case Simple:
             for (row = 0; row < model()->rowCount(); ++row)
             {
-               nextX = x + m_size + actualSpacing;
+               nextX = x + m_size + m_spacing;
                if (nextX > maxWidth)
                {
                   x = m_spacing;
                   y += m_size + m_spacing;
-                  nextX = x + m_size + actualSpacing;
+                  nextX = x + m_size + m_spacing;
                }
                m_rectForRow[row] = QRectF(x, y, m_size, m_size);
                x = nextX;
             }
+            break;
          }
-         break;
-      }
-      case Centered:
-      {
-         int columns = (maxWidth - m_spacing) / (m_size + m_spacing);
-         if (columns > 0)
-         {
-            const int actualSpacing = (maxWidth - columns * m_size) / (columns + 1);
-            x = actualSpacing;
-            for (row = 0; row < model()->rowCount(); ++row)
-            {
-               nextX = x + m_size + actualSpacing;
-               if (nextX > maxWidth)
-               {
-                  x = actualSpacing;
-                  y += m_size + m_spacing;
-                  nextX = x + m_size + actualSpacing;
-               }
-               m_rectForRow[row] = QRectF(x, y, m_size, m_size);
-               x = nextX;
-            }
-         }
-         break;
-      }
-      case Simple:
-         for (row = 0; row < model()->rowCount(); ++row)
-         {
-            nextX = x + m_size + m_spacing;
-            if (nextX > maxWidth)
-            {
-               x = m_spacing;
-               y += m_size + m_spacing;
-               nextX = x + m_size + m_spacing;
-            }
-            m_rectForRow[row] = QRectF(x, y, m_size, m_size);
-            x = nextX;
-         }
-         break;
    }
+
    m_idealHeight = y + m_size + m_spacing;
    m_hashIsDirty = false;
    viewport()->update();