diff --git a/src/fime/report.py b/src/fime/report.py index 22e24e2..6fe5ffd 100644 --- a/src/fime/report.py +++ b/src/fime/report.py @@ -25,7 +25,6 @@ class Report(QtWidgets.QDialog): def __init__(self, tasks: Tasks, parent, *args, **kwargs): super().__init__(parent, *args, **kwargs) - self._tasks = tasks self._report = None self._report_data = None self._changing_items = False @@ -40,7 +39,7 @@ class Report(QtWidgets.QDialog): self.tableWidget.setColumnCount(3) self.tableWidget.setHorizontalHeaderLabels(["Task", "Start time", "Duration"]) self.tableWidget.cellChanged.connect(self.cell_changed) - taskItemCompleter = Report.TaskItemCompleter(self._tasks, self) + taskItemCompleter = Report.TaskItemCompleter(tasks, self) taskItemCompleter.editStarted.connect(self.disable_buttons) taskItemCompleter.editFinished.connect(self.enable_buttons) self.tableWidget.setItemDelegateForColumn(0, taskItemCompleter) diff --git a/src/fime/util.py b/src/fime/util.py index 183ae59..99261e3 100644 --- a/src/fime/util.py +++ b/src/fime/util.py @@ -35,5 +35,6 @@ class EditStartedDetector(QtWidgets.QStyledItemDelegate): def createEditor(self, parent, option, index): editor = super().createEditor(parent, option, index) editor.editingFinished.connect(self.editFinished) + editor.selectionChanged.connect(self.editFinished) self.editStarted.emit() return editor diff --git a/src/fime/worklog.py b/src/fime/worklog.py index ff1a432..7cd89b3 100644 --- a/src/fime/worklog.py +++ b/src/fime/worklog.py @@ -1,7 +1,9 @@ import enum +from functools import reduce from fime.progressindicator import ProgressIndicator -from fime.util import get_icon, get_screen_height +from fime.task_completer import TaskCompleter +from fime.util import get_icon, get_screen_height, EditStartedDetector try: from PySide6 import QtCore, QtGui, QtWidgets @@ -61,12 +63,25 @@ class Worklog(QtWidgets.QDialog): self.setFixedHeight(self.document().size().toSize().height()) self.text_changed.emit(self.document().toPlainText(), self.row) + class TaskItemCompleter(EditStartedDetector): + def __init__(self, config, parent=None): + super().__init__(parent) + self.config = config + + def createEditor(self, parent, option, index): + editor = super().createEditor(parent, option, index) + completer = TaskCompleter(self.config) + completer.setFilterMode(QtCore.Qt.MatchFlag.MatchContains) + completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + editor.setCompleter(completer) + return editor + class Status(enum.Enum): PROGRESS = enum.auto() OK = enum.auto() ERROR = enum.auto() - def __init__(self, parent, *args, **kwargs): + def __init__(self, config, parent, *args, **kwargs): super().__init__(parent, *args, **kwargs) self.setWindowTitle("Worklog") @@ -75,11 +90,16 @@ class Worklog(QtWidgets.QDialog): self._report_data = [] self._status = [] self.row_height = None + self.focussed = False self.tableWidget = Worklog.TabTable(self) self.tableWidget.setColumnCount(3) self.tableWidget.setHorizontalHeaderLabels(["Task", "Comment", "Duration"]) self.tableWidget.cellChanged.connect(self.cell_changed) + taskItemCompleter = Worklog.TaskItemCompleter(config, self) + taskItemCompleter.editStarted.connect(self.disable_buttons) + taskItemCompleter.editFinished.connect(self.enable_ok) + self.tableWidget.setItemDelegateForColumn(0, taskItemCompleter) self.hheader = QtWidgets.QHeaderView(QtCore.Qt.Orientation.Horizontal) self.hheader.setMinimumSectionSize(10) self.tableWidget.setHorizontalHeader(self.hheader) @@ -99,6 +119,7 @@ class Worklog(QtWidgets.QDialog): #self.upload_button.pressed.connect(self.del_log) self.upload_button.setAutoDefault(False) self.upload_button.setMinimumWidth(self.upload_button.minimumSizeHint().width() * 1.33) + self.upload_button.setEnabled(False) self.ok_button = QtWidgets.QPushButton() self.ok_button.setText("OK") @@ -119,14 +140,15 @@ class Worklog(QtWidgets.QDialog): def set_data(self, data): self._report_data = data for i, _ in enumerate(self._report_data): - self._status.append( - (Worklog.Status.PROGRESS, "Fetching") - ) + self._status.append((Worklog.Status.PROGRESS, "Fetching")) self.refresh_table() def update_status(self, row, new_status, status_text="Could not find specified issue"): self._status[row] = (new_status, status_text) self.update_status_view(row) + all_ok = reduce(lambda acc, it: acc and it[0] is Worklog.Status.OK, self._status, True) + if all_ok: + self.upload_button.setEnabled(True) def refresh_table(self): self._changing_items = True @@ -146,8 +168,9 @@ class Worklog(QtWidgets.QDialog): text_edit.setFrameStyle(QtWidgets.QFrame.NoFrame) text_edit.text_changed.connect(self.text_edit_changed) self.tableWidget.setCellWidget(row, 1, text_edit) - if row == 0: + if row == 0 and not self.focussed: text_edit.setFocus() + self.focussed = True item2 = QtWidgets.QTableWidgetItem(self._report_data[row][2]) self.tableWidget.setItem(row, 2, item2) item2.setFlags(item2.flags() & QtCore.Qt.ItemIsEnabled) @@ -156,6 +179,7 @@ class Worklog(QtWidgets.QDialog): self.tableWidget.resizeColumnToContents(0) desired_width = self.tableWidget.columnWidth(0) + self.tableWidget.columnWidth(1) + self.tableWidget.columnWidth(2) self.tableWidget.setMinimumWidth(min(desired_width, self.tableWidget.maximumWidth())) + screen = QtGui.QGuiApplication.screenAt(self.pos()) x = ((screen.size().width() - self.tableWidget.width()) // 2) + screen.geometry().left() y = ((screen.size().height() - self.height()) // 2) + screen.geometry().top() @@ -190,11 +214,12 @@ class Worklog(QtWidgets.QDialog): @QtCore.Slot() def disable_buttons(self): - pass + self.upload_button.setEnabled(False) + self.ok_button.setEnabled(False) @QtCore.Slot() - def enable_buttons(self): - pass + def enable_ok(self): + self.ok_button.setEnabled(True) @QtCore.Slot() def cell_changed(self, row, _):