File 1261-fix-check-valid-document.patch of Package OpenBoard

From 2391cad7a1308219520d8183af5192423beffe95 Mon Sep 17 00:00:00 2001
From: letsfindaway <me@letsfindaway.de>
Date: Thu, 24 Apr 2025 11:08:29 +0200
Subject: [PATCH] fix: check for valid document in thumbnails view

- check for nullptr in UBDocumentThumbnailsView
- use member variable instead of access function for document
- remove assignment to unused variable

Signed-off-by: letsfindaway <me@letsfindaway.de>
---
 src/gui/UBDocumentThumbnailsView.cpp | 91 +++++++++++++++++-----------
 1 file changed, 54 insertions(+), 37 deletions(-)

diff --git a/src/gui/UBDocumentThumbnailsView.cpp b/src/gui/UBDocumentThumbnailsView.cpp
index 4c6ce00b5..ca9db384a 100644
--- a/src/gui/UBDocumentThumbnailsView.cpp
+++ b/src/gui/UBDocumentThumbnailsView.cpp
@@ -165,7 +165,7 @@ void UBDocumentThumbnailsView::mousePressEvent(QMouseEvent *event)
         return;
     }
 
-    auto thumbnailScene = document()->thumbnailScene();
+    auto thumbnailScene = mDocument->thumbnailScene();
 
     if (Qt::ShiftModifier & event->modifiers())
     {
@@ -233,7 +233,7 @@ void UBDocumentThumbnailsView::mouseMoveEvent(QMouseEvent *event)
             if (thumbnail)
             {
                 const auto pageNumber = UBDocumentContainer::pageFromSceneIndex(thumbnail->sceneIndex());
-                const auto itemPath = QUrl::fromLocalFile(document()->proxy()->persistencePath() + QString("/pages/%1").arg(pageNumber));
+                const auto itemPath = QUrl::fromLocalFile(mDocument->proxy()->persistencePath() + QString("/pages/%1").arg(pageNumber));
                 qlElements << itemPath;
             }
         }
@@ -264,9 +264,9 @@ void UBDocumentThumbnailsView::mouseReleaseEvent(QMouseEvent *event)
 
 void UBDocumentThumbnailsView::keyPressEvent(QKeyEvent *event)
 {
-    auto thumbnailScene = document()->thumbnailScene();
+    auto thumbnailScene = mDocument ? mDocument->thumbnailScene() : nullptr;
 
-    if (thumbnailScene->lastSelectedThumbnail())
+    if (thumbnailScene && thumbnailScene->lastSelectedThumbnail())
     {
         const int startSelectionIndex = thumbnailScene->lastSelectedThumbnail()->sceneIndex();
         const int previousSelectedThumbnailIndex = startSelectionIndex + mSelectionSpan;
@@ -283,7 +283,7 @@ void UBDocumentThumbnailsView::keyPressEvent(QKeyEvent *event)
                     if (Qt::Key_Down == event->key())
                     {
                         endSelectionIndex = previousSelectedThumbnailIndex + columnCount();
-                        if (endSelectionIndex >= document()->thumbnailScene()->thumbnailCount()) break;
+                        if (endSelectionIndex >= thumbnailScene->thumbnailCount()) break;
                     }
                     else
                     {
@@ -302,7 +302,7 @@ void UBDocumentThumbnailsView::keyPressEvent(QKeyEvent *event)
                     if (Qt::Key_Down == event->key())
                     {
                         toSelectIndex = previousSelectedThumbnailIndex + columnCount();
-                        if (toSelectIndex >= document()->thumbnailScene()->thumbnailCount()) break;
+                        if (toSelectIndex >= thumbnailScene->thumbnailCount()) break;
                     }
                     else
                     {
@@ -319,7 +319,7 @@ void UBDocumentThumbnailsView::keyPressEvent(QKeyEvent *event)
         case Qt::Key_Left:
         case Qt::Key_Right:
             {
-            UBThumbnail *previousSelectedThumbnail = document()->thumbnailScene()->thumbnailAt(previousSelectedThumbnailIndex);
+            UBThumbnail *previousSelectedThumbnail = thumbnailScene->thumbnailAt(previousSelectedThumbnailIndex);
 
                 if (!previousSelectedThumbnail)
                 {
@@ -333,7 +333,7 @@ void UBDocumentThumbnailsView::keyPressEvent(QKeyEvent *event)
                 else
                 {
                     if (previousSelectedThumbnail->column() == columnCount() - 1 ||
-                        previousSelectedThumbnailIndex == document()->thumbnailScene()->thumbnailCount() - 1) break;
+                        previousSelectedThumbnailIndex == thumbnailScene->thumbnailCount() - 1) break;
                 }
 
                 if (Qt::ShiftModifier & event->modifiers())
@@ -347,7 +347,7 @@ void UBDocumentThumbnailsView::keyPressEvent(QKeyEvent *event)
                     else
                     {
                         endSelectionIndex = previousSelectedThumbnailIndex + 1;
-                        if (endSelectionIndex >= document()->thumbnailScene()->thumbnailCount()) break;
+                        if (endSelectionIndex >= thumbnailScene->thumbnailCount()) break;
                     }
 
                     const int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex;
@@ -358,8 +358,6 @@ void UBDocumentThumbnailsView::keyPressEvent(QKeyEvent *event)
                 else
                 {
                     const auto selectedIndex = previousSelectedThumbnailIndex + (Qt::Key_Left == event->key() ? -1 : 1);
-                    const auto selectedItem = document()->thumbnailScene()->thumbnailAt(selectedIndex);
-
                     selectItemAt(selectedIndex, Qt::ControlModifier & event->modifiers());
                     mSelectionSpan = 0;
                 }
@@ -385,12 +383,12 @@ void UBDocumentThumbnailsView::keyPressEvent(QKeyEvent *event)
             {
                 if (Qt::ShiftModifier & event->modifiers())
                 {
-                    mSelectionSpan = document()->thumbnailScene()->thumbnailCount() - startSelectionIndex - 1;
+                    mSelectionSpan = thumbnailScene->thumbnailCount() - startSelectionIndex - 1;
                     selectItems(startSelectionIndex, mSelectionSpan + 1);
                 }
                 else
                 {
-                    const auto selectIndex = document()->thumbnailScene()->thumbnailCount() - 1;
+                    const auto selectIndex = thumbnailScene->thumbnailCount() - 1;
                     selectItemAt(selectIndex, Qt::ControlModifier & event->modifiers());
                     mSelectionSpan = 0;
                 }
@@ -412,7 +410,7 @@ void UBDocumentThumbnailsView::focusInEvent(QFocusEvent *event)
 {
     Q_UNUSED(event);
 
-    if (0 == selectedItems().count() && document()->thumbnailScene()->thumbnailCount() > 0 && Qt::TabFocusReason == event->reason())
+    if (0 == selectedItems().count() && mDocument && mDocument->thumbnailScene()->thumbnailCount() > 0 && Qt::TabFocusReason == event->reason())
     {
         selectItemAt(0);
         mSelectionSpan = 0;
@@ -424,9 +422,9 @@ void UBDocumentThumbnailsView::resizeEvent(QResizeEvent *event)
 {
     Q_UNUSED(event);
 
-    if (document())
+    if (mDocument)
     {
-        auto thumbnailScene = document()->thumbnailScene();
+        auto thumbnailScene = mDocument->thumbnailScene();
 
         thumbnailScene->arrangeThumbnails();
 
@@ -448,54 +446,73 @@ void UBDocumentThumbnailsView::sceneSelectionChanged()
 
 void UBDocumentThumbnailsView::selectItemAt(int pIndex, bool extend)
 {
-    const auto thumbnailScene = document()->thumbnailScene();
-    thumbnailScene->hightlightItem(pIndex, !extend);
-    ensureVisible(thumbnailScene->thumbnailAt(pIndex));
+    if (mDocument)
+    {
+        const auto thumbnailScene = mDocument->thumbnailScene();
+        thumbnailScene->hightlightItem(pIndex, !extend);
+        ensureVisible(thumbnailScene->thumbnailAt(pIndex));
+    }
 }
 
 
 void UBDocumentThumbnailsView::selectItems(int startIndex, int count)
 {
-    auto thumbnailScene = document()->thumbnailScene();
+    if (mDocument)
+    {
+        auto thumbnailScene = mDocument->thumbnailScene();
 
-    thumbnailScene->hightlightItem(startIndex, true);
+        thumbnailScene->hightlightItem(startIndex, true);
 
-    for (int i = 1; i < count; ++i)
-    {
-        thumbnailScene->hightlightItem(startIndex + i);
+        for (int i = 1; i < count; ++i)
+        {
+            thumbnailScene->hightlightItem(startIndex + i);
+        }
     }
 }
 
 
 void UBDocumentThumbnailsView::selectAll()
 {
-    auto thumbnailScene = document()->thumbnailScene();
-
-    for (int i = 0; i < thumbnailScene->thumbnailCount(); i++)
+    if (mDocument)
     {
-        thumbnailScene->hightlightItem(i);
+        auto thumbnailScene = mDocument->thumbnailScene();
+
+        for (int i = 0; i < thumbnailScene->thumbnailCount(); i++)
+        {
+            thumbnailScene->hightlightItem(i);
+        }
     }
 }
 
 int UBDocumentThumbnailsView::rowCount() const
 {
-    const auto thumbnailScene = document()->thumbnailScene();
+    if (mDocument)
+    {
+        const auto thumbnailScene = mDocument->thumbnailScene();
 
-    UBThumbnail *lastThumbnail = thumbnailScene->thumbnailAt(thumbnailScene->thumbnailCount() - 1);
+        UBThumbnail *lastThumbnail = thumbnailScene->thumbnailAt(thumbnailScene->thumbnailCount() - 1);
 
-    return lastThumbnail ? lastThumbnail->row() + 1 : 0;
+        return lastThumbnail ? lastThumbnail->row() + 1 : 0;
+    }
+
+    return 0;
 }
 
 int UBDocumentThumbnailsView::columnCount() const
 {
-    const auto thumbnailScene = document()->thumbnailScene();
+    if (mDocument)
+    {
+        const auto thumbnailScene = mDocument->thumbnailScene();
 
-    UBThumbnail *lastThumbnail = thumbnailScene->thumbnailAt(thumbnailScene->thumbnailCount() - 1);
+        UBThumbnail *lastThumbnail = thumbnailScene->thumbnailAt(thumbnailScene->thumbnailCount() - 1);
+
+        if (!lastThumbnail) return 0;
+        int lastRow = lastThumbnail->row();
+        int lastColumn = lastThumbnail->column();
+        return lastRow > 0 ? (thumbnailScene->thumbnailCount() - lastColumn - 1) / lastRow : lastColumn + 1;
+    }
 
-    if (!lastThumbnail) return 0;
-    int lastRow = lastThumbnail->row();
-    int lastColumn = lastThumbnail->column();
-    return lastRow > 0 ? (thumbnailScene->thumbnailCount() - lastColumn - 1) / lastRow : lastColumn + 1;
+    return 0;
 }
 
 
openSUSE Build Service is sponsored by