diff options
Diffstat (limited to 'todo/gui/tags/panel/dialog.py')
-rw-r--r-- | todo/gui/tags/panel/dialog.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/todo/gui/tags/panel/dialog.py b/todo/gui/tags/panel/dialog.py new file mode 100644 index 0000000..f1a669c --- /dev/null +++ b/todo/gui/tags/panel/dialog.py @@ -0,0 +1,64 @@ +from PyQt5 import QtCore, QtWidgets + +from todo.model.tag import Tag, ValidTagForm +import todo.db.tags +import todo.gui.tags.panel.form.widget +import todo.database + +def add(parent_widget, add_tag_signal): + + def on_add(form: ValidTagForm): + tag = todo.db.tags.insert(todo.database.cursor(), form) + todo.database.commit() + add_tag_signal.emit(tag) + + return widget(parent_widget, "Add a tag", "add", None, on_add) + +def update(parent_widget, update_tag_signal, row, tag): + + def on_update(form: ValidTagForm): + updated_tag = todo.db.tags.update(todo.database.cursor(), tag, form) + update_tag_signal.emit(row, updated_tag) + todo.database.commit() + + return widget(parent_widget, "Modify a tag", "modify", tag, on_update) + +def show_delete(table, rows): + confirm = QtWidgets.QMessageBox.question( + table, + "Tag deletion", + "Do you really want to delete the selected tags ?", + QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Yes, + QtWidgets.QMessageBox.Yes) + + if confirm == QtWidgets.QMessageBox.Yes: + todo.db.tags.delete(todo.database.cursor(), table.model().row_ids(rows)) + todo.database.commit() + table.model().delete_tags(rows) + +def widget( + parent: QtWidgets.QWidget, + title: str, + action_title: str, + tag: Tag, + on_validated): + + dialog = QtWidgets.QDialog(parent) + dialog.setWindowTitle(title) + dialog.setMinimumSize(QtCore.QSize(320, 240)) + + layout = QtWidgets.QVBoxLayout(dialog) + dialog.setLayout(layout) + + def on_dialog_validated(form): + dialog.accept() + on_validated(form) + + layout.addWidget(todo.gui.tags.panel.form.widget.widget( + parent = dialog, + action_title = action_title, + tag = tag, + on_validated = on_dialog_validated, + on_cancel = lambda: dialog.reject())) + + return dialog |