diff options
author | Joris | 2020-05-08 14:33:15 +0200 |
---|---|---|
committer | Joris | 2020-05-08 14:33:15 +0200 |
commit | bff2dfd96169f595510b16980a4cb2f3d4548029 (patch) | |
tree | 716d09dc4b2b20be565188539883853601fa32ca | |
parent | df828c4b141f84f731afffbe17c80618cacf9480 (diff) |
Extract task form code from the dialog file
-rw-r--r-- | src/gui/tasks/form/state.py | 39 | ||||
-rw-r--r-- | src/gui/tasks/form/widget.py | 100 | ||||
-rw-r--r-- | src/gui/tasks/modal.py | 127 | ||||
-rw-r--r-- | src/gui/tasks/table/widget.py (renamed from src/gui/tasks/table/main.py) | 0 | ||||
-rw-r--r-- | src/gui/tasks/widget.py (renamed from src/gui/tasks/main.py) | 4 | ||||
-rw-r--r-- | src/gui/window.py | 4 |
6 files changed, 151 insertions, 123 deletions
diff --git a/src/gui/tasks/form/state.py b/src/gui/tasks/form/state.py new file mode 100644 index 0000000..6aedb95 --- /dev/null +++ b/src/gui/tasks/form/state.py @@ -0,0 +1,39 @@ +from PyQt5 import QtCore + +from model.task import TaskForm + +class TaskFormEdition: + def __init__(self, name, name_signal, tag, tag_signal): + self._name = name + self._tag = tag + self._signal = TaskFormSignal() + name_signal.connect(lambda name: self.on_name_signal(name)) + tag_signal.connect(lambda tag: self.on_tag_signal(tag)) + + def get(self): + return TaskForm( + name = self._name, + tag = self._tag) + + def on_name_signal(self, name: str): + self._name = name + self._signal.emit(self.get()) + + def on_tag_signal(self, tag: str): + self._tag = tag + self._signal.emit(self.get()) + + def signal(self): + return self._signal + +class TaskFormSignal(QtCore.QObject): + _signal = QtCore.pyqtSignal(TaskForm, name = 'taskForm') + + def __init__(self): + QtCore.QObject.__init__(self) + + def emit(self, taskForm): + self._signal.emit(taskForm) + + def connect(self, f): + self._signal.connect(f) diff --git a/src/gui/tasks/form/widget.py b/src/gui/tasks/form/widget.py new file mode 100644 index 0000000..61fa24d --- /dev/null +++ b/src/gui/tasks/form/widget.py @@ -0,0 +1,100 @@ +from PyQt5 import QtWidgets + +import db.tasks +from model.task import Task, TaskForm + +import gui.icons +import gui.tasks.form.state + +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_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_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 + +# Use grid ? +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(task_form): + if validate_form(task_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(task_form: TaskForm, on_validated): + valid_form = validate_form(task_form) + if valid_form: + on_validated(valid_form) + +def clean_form(task_form: TaskForm): + return TaskForm( + name = task_form.name.strip(), + tag = task_form.tag.strip()) + +def validate_form(task_form: TaskForm): + task_form = clean_form(task_form) + if task_form.name: + return task_form + else: + return None diff --git a/src/gui/tasks/modal.py b/src/gui/tasks/modal.py index 3ccf56e..3662947 100644 --- a/src/gui/tasks/modal.py +++ b/src/gui/tasks/modal.py @@ -1,9 +1,8 @@ from PyQt5 import QtCore, QtWidgets -import db.tasks -from model.task import Task, TaskForm +from model.task import Task -import gui.icons +import gui.tasks.form.widget def dialog( parent: QtWidgets.QWidget, @@ -19,125 +18,15 @@ def dialog( layout = QtWidgets.QVBoxLayout(dialog) dialog.setLayout(layout) - init_name = task.name if task is not None else '' - (name_labelled_input, name_input) = labelled_input(dialog, 'Name', init_name) - layout.addWidget(name_labelled_input) - - init_tag = task.tag if task is not None else '' - (tag_labelled_input, tag_input) = labelled_input(dialog, 'Tag', init_tag) - layout.addWidget(tag_labelled_input) - - task_form_edition = TaskFormEdition( - init_name, - name_input.textChanged, - init_tag, - tag_input.textChanged) - - layout.addWidget(buttons( + layout.addWidget(gui.tasks.form.widget.widget( parent = dialog, action_title = action_title, - task_form_signal = task_form_edition.signal(), - on_validate = lambda: validate(dialog, task_form_edition.get(), on_validated), + task = task, + on_validated = lambda form: on_dialog_validated(dialog, on_validated, form), on_cancel = lambda: dialog.reject())) return dialog -# Use grid ? -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(task_form): - if validate_form(task_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(dialog, task_form: TaskForm, on_validated): - valid_form = validate_form(task_form) - if valid_form: - on_validated(valid_form) - dialog.accept() - -def clean_form(task_form: TaskForm): - return TaskForm( - name = task_form.name.strip(), - tag = task_form.tag.strip()) - -def validate_form(task_form: TaskForm): - task_form = clean_form(task_form) - if task_form.name: - return task_form - else: - return None - -##################### -# Task form edition # -##################### - -class TaskFormEdition: - def __init__(self, name, name_signal, tag, tag_signal): - self._name = name - self._tag = tag - self._signal = TaskFormSignal() - name_signal.connect(lambda name: self.on_name_signal(name)) - tag_signal.connect(lambda tag: self.on_tag_signal(tag)) - - def get(self): - return TaskForm( - name = self._name, - tag = self._tag) - - def on_name_signal(self, name: str): - self._name = name - self._signal.emit(self.get()) - - def on_tag_signal(self, tag: str): - self._tag = tag - self._signal.emit(self.get()) - - def signal(self): - return self._signal - -class TaskFormSignal(QtCore.QObject): - _signal = QtCore.pyqtSignal(TaskForm, name = 'taskForm') - - def __init__(self): - QtCore.QObject.__init__(self) - - def emit(self, taskForm): - self._signal.emit(taskForm) - - def connect(self, f): - self._signal.connect(f) +def on_dialog_validated(dialog, on_validated, f): + dialog.accept() + on_validated(f) diff --git a/src/gui/tasks/table/main.py b/src/gui/tasks/table/widget.py index a990c0e..a990c0e 100644 --- a/src/gui/tasks/table/main.py +++ b/src/gui/tasks/table/widget.py diff --git a/src/gui/tasks/main.py b/src/gui/tasks/widget.py index 3c7d3db..bca6585 100644 --- a/src/gui/tasks/main.py +++ b/src/gui/tasks/widget.py @@ -2,7 +2,7 @@ from PyQt5 import QtWidgets, QtCore import db.tasks import gui.tasks.signal -import gui.tasks.table.main +import gui.tasks.table.widget import gui.icons from model.task import TaskForm @@ -19,7 +19,7 @@ def widget(database, parent): add_task_button.clicked.connect(lambda: show_add_dialog(database, widget, add_task_signal)) layout.addWidget(add_task_button) - table = gui.tasks.table.main.widget(database, widget, add_task_signal) + table = gui.tasks.table.widget.widget(database, widget, add_task_signal) layout.addWidget(table) return widget diff --git a/src/gui/window.py b/src/gui/window.py index 67d1dea..aa22f7e 100644 --- a/src/gui/window.py +++ b/src/gui/window.py @@ -1,6 +1,6 @@ from PyQt5 import QtCore, QtWidgets -import gui.tasks.main +import gui.tasks.widget def get(database): window = QtWidgets.QMainWindow() @@ -8,6 +8,6 @@ def get(database): window.setMinimumSize(QtCore.QSize(640, 480)) centralWidget = QtWidgets.QWidget(window) - window.setCentralWidget(gui.tasks.main.widget(database, centralWidget)) + window.setCentralWidget(gui.tasks.widget.widget(database, centralWidget)) return window |