from PyQt5 import QtWidgets from typing import Optional import db.tasks from model.task import Task, ValidTaskForm import gui.icons import gui.tasks.form.state import gui.tasks.duration def widget( parent: QtWidgets.QWidget, action_title: str, task: Task, on_validated, on_cancel): widget = QtWidgets.QWidget(parent) layout = QtWidgets.QVBoxLayout(widget) widget.setLayout(layout) grid = QtWidgets.QWidget(widget) layout.addWidget(grid) grid_layout = QtWidgets.QGridLayout(grid) grid.setLayout(grid_layout) init_name = task.name if task is not None else '' name_input = add_input(grid, grid_layout, 0, 'Name', init_name) init_duration = gui.tasks.duration.format(task.duration) if task is not None else '' duration_input = add_input(grid, grid_layout, 1, 'Duration', init_duration) init_tag = task.tag if task is not None else '' tag_input = add_input(grid, grid_layout, 2, 'Tag', init_tag) task_form_edition = gui.tasks.form.state.TaskFormEdition( init_name, name_input.textChanged, init_duration, duration_input.textChanged, init_tag, tag_input.textChanged) layout.addWidget(buttons( parent = widget, action_title = action_title, task_form_signal = task_form_edition.signal(), on_validate = lambda: validate(task_form_edition.get(), on_validated), on_cancel = on_cancel)) return widget def add_input( parent, layout: QtWidgets.QGridLayout, n: int, label: str, default_value: str) -> QtWidgets.QLineEdit: label = QtWidgets.QLabel(label, parent) layout.addWidget(label, n, 0) line_edit = QtWidgets.QLineEdit(parent) if default_value != None: line_edit.setText(default_value) layout.addWidget(line_edit, n, 1) return line_edit def buttons(parent, action_title, task_form_signal, on_validate, on_cancel): widget = QtWidgets.QWidget(parent) layout = QtWidgets.QHBoxLayout(widget) validate = QtWidgets.QPushButton(action_title, widget) validate.setDisabled(True) validate.setIcon(gui.icons.dialog_apply(validate.style())) validate.clicked.connect(on_validate); layout.addWidget(validate) def on_task_form_signal(form: Optional[ValidTaskForm]): if form: validate.setEnabled(True) else: validate.setDisabled(True) task_form_signal.connect(on_task_form_signal) cancel = QtWidgets.QPushButton('cancel', widget) cancel.setIcon(gui.icons.dialog_cancel(cancel.style())) cancel.clicked.connect(on_cancel) layout.addWidget(cancel) return widget def validate(form: Optional[ValidTaskForm], on_validated): if form: on_validated(form)