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