diff options
Diffstat (limited to 'todo/gui/tags/panel/form')
-rw-r--r-- | todo/gui/tags/panel/form/__init__.py | 0 | ||||
-rw-r--r-- | todo/gui/tags/panel/form/state.py | 58 | ||||
-rw-r--r-- | todo/gui/tags/panel/form/widget.py | 137 |
3 files changed, 195 insertions, 0 deletions
diff --git a/todo/gui/tags/panel/form/__init__.py b/todo/gui/tags/panel/form/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/todo/gui/tags/panel/form/__init__.py diff --git a/todo/gui/tags/panel/form/state.py b/todo/gui/tags/panel/form/state.py new file mode 100644 index 0000000..f898ac4 --- /dev/null +++ b/todo/gui/tags/panel/form/state.py @@ -0,0 +1,58 @@ +from PyQt5 import QtCore +from typing import Optional + +from todo.model.tag import ValidTagForm + +class TagFormEdition: + def __init__( + self, + name, + name_signal, + color, + color_signal): + + self._name = name + self._color = color + self._signal = ValidTagFormSignal() + + name_signal.connect(lambda n: self.on_name_signal(n)) + color_signal.connect(lambda d: self.on_color_signal(d)) + + def get(self) -> Optional[ValidTagForm]: + name = self._name.strip() + color = self._color.strip() + + if name and color: + return ValidTagForm( + name = name, + color = color) + else: + return None + + def on_name_signal(self, name: str): + self._name = name + self.emit() + + def on_color_signal(self, color: str): + self._color = color + self.emit() + + def emit(self): + validForm = self.get() + if validForm: + self._signal.emit(validForm) + + def signal(self): + return self._signal + +class ValidTagFormSignal(QtCore.QObject): + _signal = QtCore.pyqtSignal(ValidTagForm, name = "validTagForm") + + def __init__(self): + QtCore.QObject.__init__(self) + + def emit(self, form: Optional[ValidTagForm]): + self._signal.emit(form) + + def connect(self, f): + self._signal.connect(f) diff --git a/todo/gui/tags/panel/form/widget.py b/todo/gui/tags/panel/form/widget.py new file mode 100644 index 0000000..9ac4eb1 --- /dev/null +++ b/todo/gui/tags/panel/form/widget.py @@ -0,0 +1,137 @@ +from PyQt5 import QtWidgets, QtCore, QtGui +from typing import Optional, Tuple, List, Any + +from todo.model.tag import Tag, ValidTagForm +from todo.model import difficulty, priority +import todo.gui.icon +import todo.gui.tags.panel.form.state +import todo.gui.color + +def widget( + parent: QtWidgets.QWidget, + action_title: str, + tag: Tag, + 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 = tag.name if tag is not None else "" + name_input = line_edit(grid, grid_layout, 0, "Name", init_name) + + init_color = tag.color if tag is not None else "#FFFFFF" + color_input = color_edit(grid, grid_layout, 1, "Color", QtGui.QColor(init_color)) + + tag_form_edition = todo.gui.tags.panel.form.state.TagFormEdition( + init_name, + name_input.textChanged, + init_color, + color_input.textChanged) + + def on_validate(): + form = tag_form_edition.get() + if form: + on_validated(form) + + layout.addWidget(buttons( + parent = widget, + action_title = action_title, + tag_form_signal = tag_form_edition.signal(), + on_validate = on_validate, + on_cancel = on_cancel)) + + return widget + +def line_edit( + parent, + layout: QtWidgets.QGridLayout, + n: int, + label: str, + default_value: str) -> QtWidgets.QLineEdit: + + label = QtWidgets.QLabel(label, parent) + layout.addWidget(label, n, 0) + + edit = QtWidgets.QLineEdit(parent) + if default_value != None: + edit.setText(default_value) + layout.addWidget(edit, n, 1) + + return edit + +def color_edit( + parent, + layout: QtWidgets.QGridLayout, + n: int, + label: str, + init_color: QtGui.QColor) -> QtWidgets.QLineEdit: + + label = QtWidgets.QLabel(label, parent) + layout.addWidget(label, n, 0) + + edit = ColorInput(init_color, parent) + layout.addWidget(edit, n, 1) + + return edit + +class ColorInput(QtWidgets.QLineEdit): + + def __init__(self, init_color: QtGui.QColor, parent): + super().__init__(parent) + self.setReadOnly(True) + self.installEventFilter(self) + self._color = init_color + self.update(init_color) + self._is_editing = False + + def eventFilter(self, source, event): + if source is self and event.type() == QtCore.QEvent.FocusIn: + if not self._is_editing: + self._is_editing = True + color = QtWidgets.QColorDialog.getColor(self._color, self) + if color.isValid(): + self.update(color) + else: + self._is_editing = False + self.clearFocus() + return super(ColorInput, self).eventFilter(source, event) + + def update(self, color: QtGui.QColor): + self._color = color + self.setText(color.name().upper()) + palette = QtGui.QPalette() + palette.setColor(QtGui.QPalette.Base, color) + palette.setColor(QtGui.QPalette.Text, color) + self.setPalette(palette) + +def buttons(parent, action_title, tag_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(todo.gui.icon.dialog_ok(validate.style())) + validate.clicked.connect(on_validate); + layout.addWidget(validate) + + def on_tag_form_signal(form: Optional[ValidTagForm]): + if form: + validate.setEnabled(True) + else: + validate.setDisabled(True) + + tag_form_signal.connect(on_tag_form_signal) + + cancel = QtWidgets.QPushButton("cancel", widget) + cancel.setIcon(todo.gui.icon.dialog_cancel(cancel.style())) + cancel.clicked.connect(on_cancel) + layout.addWidget(cancel) + + return widget |