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) init_name = task.name if task is not None else '' (name_labelled_input, name_input) = labelled_input(widget, 'Name', init_name) layout.addWidget(name_labelled_input) init_duration = gui.tasks.duration.format(task.duration) if task is not None else '' (duration_labelled_input, duration_input) = labelled_input(widget, 'Duration', init_duration) layout.addWidget(duration_labelled_input) init_tag = task.tag if task is not None else '' (tag_labelled_input, tag_input) = labelled_input(widget, 'Tag', init_tag) layout.addWidget(tag_labelled_input) 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 labelled_input(parent, label: str, default_value: str): widget = QtWidgets.QWidget(parent) layout = QtWidgets.QHBoxLayout(widget) widget.setLayout(layout) label = QtWidgets.QLabel(label, widget) layout.addWidget(label) line_edit = QtWidgets.QLineEdit(widget) if default_value != None: line_edit.setText(default_value) layout.addWidget(line_edit) return (widget, 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)