From d7db3bbc461eaf3cb5d0a109bb885eefcedaa239 Mon Sep 17 00:00:00 2001
From: thomahl <thomahl@stud.ntnu.no>
Date: Sat, 29 Feb 2020 16:28:00 +0100
Subject: [PATCH] =?UTF-8?q?#18=20inline=20edit=20st=C3=B8tter=20n=C3=A5=20?=
 =?UTF-8?q?flere=20sider=20+=20enkel=20header=20implementert?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- la til x og y som godkjente variabelnavn til pylint
- viewArea nå QScrollArea
---
 scripts/.pylintrc      |   2 +
 soitool/main_window.py | 130 +++++++++++++++++++++++++++++++++--------
 2 files changed, 107 insertions(+), 25 deletions(-)

diff --git a/scripts/.pylintrc b/scripts/.pylintrc
index 17b7830..33b7a33 100644
--- a/scripts/.pylintrc
+++ b/scripts/.pylintrc
@@ -404,6 +404,8 @@ function-naming-style=snake_case
 
 # Good variable names which should always be accepted, separated by a comma.
 good-names=app,
+           x,
+           y,
            ok,
            i,
            j,
diff --git a/soitool/main_window.py b/soitool/main_window.py
index 4f00083..d83ba26 100644
--- a/soitool/main_window.py
+++ b/soitool/main_window.py
@@ -10,8 +10,8 @@ from PySide2.QtCore import QRectF, QPoint, QTimer, Qt
 from PySide2.QtWidgets import QTabWidget, QWidget, QMainWindow, \
     QApplication, QHBoxLayout, QVBoxLayout, QPushButton, QLabel, \
     QAbstractItemView, QListWidget, QListWidgetItem, QAction, QGraphicsScene, \
-    QGraphicsView, QScrollArea, QGraphicsRectItem
-from PySide2.QtGui import QBrush, QIcon, QPalette
+    QGraphicsView, QScrollArea, QGraphicsRectItem, QTableWidget
+from PySide2.QtGui import QBrush, QIcon, QPalette, QFont, QPixmap
 
 
 class MainWindow(QMainWindow):
@@ -171,44 +171,136 @@ class SOIWorkspaceWidget(QWidget):
             self.list_modules.insertItem(i, item)
 
 
-class ViewArea(QWidget):
+class ViewArea(QScrollArea):
     """Widget som kan byttes ut med view, edit etc."""
 
     A4_RATIO = 1.414
+
+    # height must be adjusted to something that will look right when real
+    # wigets are placed inside the pages
     HEIGHT = 1700
     WIDTH = HEIGHT * A4_RATIO
     PADDING = 100
     CONTENT_WIDTH = WIDTH - PADDING * 2
     CONTENT_HEIGHT = HEIGHT - PADDING * 2
-    HEADER_HEIGHT = 200
+    HEADER_HEIGHT = 100
 
     def __init__(self):
         super().__init__()
 
-        self.layout = QHBoxLayout(self)
-        self.scroll_area = QScrollArea(self)
+        self.pages = []
 
         # necessary to make the scroll area fill the space it's given
-        self.scroll_area.setWidgetResizable(True)
+        self.setWidgetResizable(True)
 
         # scene and view widgets
         self.scene = QGraphicsScene()
+        table = QTableWidget(4, 4)
+        table.move(self.PADDING + 10, self.PADDING + self.HEADER_HEIGHT + 10)
         self.setup_scene()
+        self.scene.addWidget(table)
         self.view = QGraphicsView(self.scene)
-        self.view.scale(0.50, 0.50)
+        self.view.scale(0.66, 0.66)
+
+        self.setWidget(self.view)
 
-        self.scroll_area.setWidget(self.view)
-        self.layout.addWidget(self.scroll_area)
-        self.setLayout(self.layout)
+        # fill will dummy pages
+        self.pages.append(0)
+        self.pages.append(0)
+        self.pages.append(0)
+        self.pages.append(0)
+        self.pages.append(0)
 
+        self.update_drawn_pages()
         self.launch_auto_zoom()
 
+    def update_drawn_pages(self):
+        """Upate pages to reflect pages."""
+        for i, _ in enumerate(self.pages, start=1):
+
+            x = 0
+            y = self.HEIGHT * max(i - 1, 0) + self.PADDING * max(i - 1, 0)
+
+            # adjust page size
+            full_scene_height = y + self.HEIGHT
+            self.scene.setSceneRect(QRectF(0, 0, self.WIDTH,
+                                           full_scene_height))
+
+            self.draw_page(x, y)
+            self.draw_header(x + self.PADDING, y + self.PADDING, i)
+
+    def draw_header(self, x, y, page_number):
+        """Draw header staring at given position.
+
+        Parameters
+        ----------
+        x : int
+        y : int
+        """
+        # title
+        label = QLabel("SOI TITLE HERE")
+        label.move(x, y)
+        label.setStyleSheet("background-color: rgba(0,0,0,0%)")
+        label.setFont(QFont("Times New Roman", 50))
+        self.scene.addWidget(label)
+
+        # page numbering
+        label = QLabel("{} av {}".format(page_number, len(self.pages)))
+        label.setStyleSheet("background-color: rgba(0,0,0,0%)")
+        label.setFont(QFont("Times New Roman", 50))
+        # source: https://stackoverflow.com/a/8638114/3545896
+        # CAUTION: does not work if font is set through stylesheet
+        label_width = label.fontMetrics().boundingRect(label.text()).width()
+        label.move(x + (self.CONTENT_WIDTH - label_width) / 2, y)
+        self.scene.addWidget(label)
+
+        # grading
+        label = QLabel("UGRADERT")
+        label.setStyleSheet("background-color: rgba(0,0,0,0%); color: red")
+        label.setFont(QFont("Times New Roman", 50))
+        # source: https://stackoverflow.com/a/8638114/3545896
+        # CAUTION: does not work if font is set through stylesheet
+        label_width = label.fontMetrics().boundingRect(label.text()).width()
+        label.move(x + self.CONTENT_WIDTH - label_width - self.HEADER_HEIGHT,
+                   y)
+        self.scene.addWidget(label)
+
+        # patch
+        pixmap = QPixmap("soitool/media/HVlogo.png")
+        label = QLabel()
+        label.setPixmap(pixmap.scaled(self.HEADER_HEIGHT, self.HEADER_HEIGHT))
+        label.move(x + self.CONTENT_WIDTH - self.HEADER_HEIGHT, y)
+        self.scene.addWidget(label)
+
+    def draw_page(self, x, y):
+        """Draw page starting at given position.
+
+        Parameters
+        ----------
+        x : int
+        y : int
+        """
+        # color the page white
+        page_background = QGraphicsRectItem(x, y, self.WIDTH, self.HEIGHT)
+        page_background.setBrush(QBrush(Qt.white))
+        self.scene.addItem(page_background)
+
+        # draw borders
+        self.scene.addRect(x, y, self.WIDTH, self.HEIGHT)
+        self.scene.addRect(x + self.PADDING, y + self.PADDING,
+                           self.CONTENT_WIDTH, self.CONTENT_HEIGHT)
+        self.scene.addRect(x + self.PADDING, y + self.PADDING,
+                           self.CONTENT_WIDTH, self.CONTENT_HEIGHT)
+        self.scene.addRect(x + self.PADDING, y + self.PADDING,
+                           self.CONTENT_WIDTH, self.HEADER_HEIGHT)
+
     def setup_scene(self):
         """Prepare scene for use.
 
         Draws borders, background, etc.
         """
-        self.scene.setSceneRect(QRectF(0, 0, self.WIDTH, self.HEIGHT))
+        self.scene.setSceneRect(QRectF(0, 0, self.WIDTH,
+                                       self.HEIGHT * 3 + self.PADDING * 2))
 
         # sets the background color of the scene to be the appropriate
         # system-specific background color
@@ -216,19 +308,7 @@ class ViewArea(QWidget):
         # source: https://stackoverflow.com/questions/15519749/how-to-get-widget-background-qcolor
         self.scene.setBackgroundBrush(app.palette().color(QPalette.Window))
 
-        # color the page white
-        page_background = QGraphicsRectItem(0, 0, self.WIDTH, self.HEIGHT)
-        page_background.setBrush(QBrush(Qt.white))
-        self.scene.addItem(page_background)
-
-        # draw borders
-        self.scene.addRect(0, 0, self.WIDTH, self.HEIGHT)
-        self.scene.addRect(self.PADDING, self.PADDING, self.CONTENT_WIDTH,
-                           self.CONTENT_HEIGHT)
-        self.scene.addRect(self.PADDING, self.PADDING, self.CONTENT_WIDTH,
-                           self.CONTENT_HEIGHT)
-        self.scene.addRect(self.PADDING, self.PADDING, self.CONTENT_WIDTH,
-                           self.HEADER_HEIGHT)
+        self.update_drawn_pages()
 
     def launch_auto_zoom(self):
         """Zoom in a regular interval.
-- 
GitLab