"""Contains GUI layouts."""
from typing import Any
from PyQt5 import QtWidgets
from PyQt5.QtCore import QMetaObject, Qt
from PyQt5.QtGui import QIcon, QPixmap
from .resources import Traversable, get_svg, root
STYLE_SHEET: Traversable = root / "style_sheet.qss"
"""The style sheet resource.
:meta hide-value:
"""
[docs]def get_icon(name: str) -> QIcon:
"""Create a :py:class:`QIcon` from an svg resource.
Args:
name: The name of svg resource (without file extension).
Returns:
The created :py:class:`QIcon`.
"""
pixmap = QPixmap()
pixmap.loadFromData(get_svg(name))
icon = QIcon()
icon.addPixmap(pixmap, QIcon.Normal, QIcon.On)
return icon
[docs]class Task(QtWidgets.QFrame):
"""Horizontal container that stores information about task."""
[docs] def __init__(
self,
description: str,
time_text: str,
*args: Any,
**kwargs: Any,
):
"""Initialize task.
Args:
description: Task description that will appear on the screen.
time_text: Task time/due-date that will appear on the screen.
"""
super().__init__(*args, **kwargs)
self.horizontal_layout = QtWidgets.QHBoxLayout(self)
self.button = QtWidgets.QToolButton(self)
self.button.setIcon(get_icon("task"))
self.button.setProperty("class", "Task")
self.description = QtWidgets.QLabel(self)
self.description.setProperty("class", "TaskText")
self.description.setText(description)
self.time = QtWidgets.QLabel(self)
self.time.setProperty("class", "TaskTime")
self.time.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.time.setText(time_text)
self.horizontal_layout.addWidget(self.button)
self.horizontal_layout.addWidget(self.description)
self.horizontal_layout.addWidget(self.time)
[docs]class Queue(QtWidgets.QFrame):
"""Vertical container that stores tasks organized in a queue."""
[docs] def __init__(self, queue_name: str, *args: Any, **kwargs: Any):
"""Initialize queue.
Args:
queue_name: Queue name, will be used to initialize header attribute.
"""
super().__init__(*args, **kwargs)
self.vertical_layout = QtWidgets.QVBoxLayout(self)
self.header = QueueHeader(queue_name, self)
self.tasks_frame = QtWidgets.QFrame(self)
size_policy = QtWidgets.QSizePolicy(
QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.MinimumExpanding
)
self.tasks_frame.setSizePolicy(size_policy)
self.vertical_layout.addWidget(self.header)
self.vertical_layout.addWidget(self.tasks_frame)
self.vertical_task_layout = QtWidgets.QVBoxLayout(self.tasks_frame)
task = Task("Task 1", "Time", self.tasks_frame)
self.vertical_task_layout.addWidget(task, 0, Qt.AlignTop)
self.vertical_task_layout.addStretch(0)
[docs]class AsideWindow(QtWidgets.QMainWindow):
"""Main window of the app."""
[docs] def __init__(self, *args: Any, **kwargs: Any):
"""Initialize main window."""
super().__init__(*args, **kwargs)
self.resize(653, 612)
self.setWindowTitle("aside")
self.setStyleSheet(STYLE_SHEET.read_text())
self.central_widget = QtWidgets.QWidget(self)
self.grid_layout = QtWidgets.QGridLayout(self.central_widget)
self.logo = QtWidgets.QLabel(self.central_widget)
self.logo.setObjectName("Logo")
pixmap = QPixmap()
pixmap.loadFromData(get_svg("logo"))
self.logo.setPixmap(pixmap)
self.logo.setScaledContents(True)
self.settings = QtWidgets.QToolButton(self.central_widget)
self.settings.setObjectName("Settings")
self.settings.setFocusPolicy(Qt.ClickFocus)
self.settings.setIcon(get_icon("settings"))
self.search = QtWidgets.QLineEdit(self.central_widget)
self.search.setPlaceholderText("Search...")
size_policy = QtWidgets.QSizePolicy(
QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum
)
self.search.setSizePolicy(size_policy)
self.grid_layout.addWidget(self.logo, 0, 0, 1, 2, Qt.AlignCenter)
self.grid_layout.addWidget(self.settings, 0, 2)
self.grid_layout.addWidget(self.search, 1, 0, Qt.AlignVCenter)
queue = Queue("Queue of tasks", self.central_widget)
self.grid_layout.addWidget(queue, 2, 0, 1, 3)
self.setCentralWidget(self.central_widget)
QMetaObject.connectSlotsByName(self)
[docs]def main(*argv: str) -> int: # pragma: no cover
"""Execute the main GUI entrypoint."""
app = QtWidgets.QApplication(list(argv))
main_window = AsideWindow()
main_window.show()
return app.exec_()