diff --git a/src/main/python/main/ayab/ayab.py b/src/main/python/main/ayab/ayab.py index 010c0ecc..f73f4de8 100644 --- a/src/main/python/main/ayab/ayab.py +++ b/src/main/python/main/ayab/ayab.py @@ -77,10 +77,10 @@ def __init__(self, app_context: AppContext): # self.setStatusBar(self.statusbar) self.about: About = About(self) self.scene: Scene = Scene(self) - self.knitprog = KnitProgress(self) self.engine: Engine = Engine(self) self.hw_test = HardwareTestDialog(self) self.progbar = ProgressBar(self) + self.knitprog = KnitProgress(self) self.flash = FirmwareFlash(self) self.audio = AudioPlayer(self) self.knit_thread = GenericThread(self.engine.run, Operation.KNIT) diff --git a/src/main/python/main/ayab/knitprogress.py b/src/main/python/main/ayab/knitprogress.py index 5fb02fa9..92101107 100644 --- a/src/main/python/main/ayab/knitprogress.py +++ b/src/main/python/main/ayab/knitprogress.py @@ -20,7 +20,7 @@ from __future__ import annotations from PySide6.QtCore import QCoreApplication, QRect, Qt -from PySide6.QtWidgets import QTableWidget, QTableWidgetItem, QHeaderView +from PySide6.QtWidgets import QTableWidget, QTableWidgetItem, QHeaderView, QAbstractItemView from PySide6.QtGui import QBrush, QColor from typing import TYPE_CHECKING, Optional, cast, List from math import floor @@ -47,13 +47,26 @@ def __init__(self, parent: GuiMain): self.clear() self.setRowCount(0) self.__prefs: Preferences = parent.prefs + self.__progbar = parent.progbar self.setGeometry(QRect(0, 0, 700, 220)) self.setContentsMargins(1, 1, 1, 1) self.verticalHeader().setSectionResizeMode( QHeaderView.ResizeMode.Fixed ) + self.verticalHeader().setSectionsClickable(False) + self.horizontalHeader().setMinimumSectionSize(0) + self.horizontalHeader().setDefaultSectionSize(self.__prefs.value("lower_display_stitch_width")) + self.horizontalHeader().setSectionsClickable(False) + self.horizontalHeader().setSectionResizeMode( + QHeaderView.ResizeMode.Fixed + ) + self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectItems) + self.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) + self.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) + self.previousStatus: Optional[Status] = None self.scene = parent.scene + self.currentItemChanged.connect(self.onStitchSelect) def start(self) -> None: self.clearContents() @@ -105,12 +118,12 @@ def update_progress( # When we show a new row, we recover the header info and recombine it with its row (now row idx 2) self.make_row_with_spacer() - self.instantiate_row_from_columns(midline, columns) if self.columnCount() != len(columns): self.setColumnCount(len(columns)) n_cols = len(columns) if n_cols < 4: self.hideColumn(5) + self.instantiate_row_from_columns(midline, columns) self.previousStatus = status self.previous_row_mulitplier = row_multiplier @@ -141,19 +154,18 @@ def instantiate_row_from_columns(self, midline: int, columns: List[QTableWidgetI self.setVerticalHeaderItem(0, QTableWidgetItem("To Be Selected")) for i, col in enumerate(columns): self.setItem(0, i, col) - self.setColumnWidth(i, cast(int, self.__prefs.settings.value("lower_display_stitch_width"))) + self.setColumnWidth(i, self.__prefs.value("lower_display_stitch_width")) # when width is under 20, the column numbers are unreadable. if self.columnWidth(i) < 20: self.horizontalHeader().setVisible(False) - continue - self.horizontalHeader().setVisible(True) + else: + self.horizontalHeader().setVisible(True) if i < midline: header = QTableWidgetItem(f"{(midline)-(i)}") header.font().setBold(True) header.setForeground(QBrush(QColor(f"#{self.orange:06x}"))) header.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.setHorizontalHeaderItem(i, header) - self.horizontalHeader().setMinimumSectionSize(0) else: header = QTableWidgetItem(f"{(i+1)-(midline)}") header.setForeground(QBrush(QColor(f"#{self.green:06x}"))) @@ -164,6 +176,7 @@ def make_row_with_spacer(self) -> None: self.removeRow(1) self.insertRow(0) self.insertRow(1) + self.setVerticalHeaderItem(1, QTableWidgetItem("")) if self.rowCount() > 2: self.setVerticalHeaderItem(2, self.format_row_header_text(self.previousStatus, self.previous_row_mulitplier)) self.verticalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.Fixed) @@ -218,3 +231,14 @@ def __stitch(self, color: int, bit: bool, alt_color: Optional[int] = None, bg_co if bg_color is not None: stitch.setBackground(QBrush(bg_color)) return stitch + + def onStitchSelect(self, current: QTableWidgetItem | None) -> None: + if current is None: + self.__progbar.set_selection_label("") + return + if self.horizontalHeaderItem(current.column()).foreground().color().red() == 187: + side = "Right" + else: + side = "Left" + selection_string = f"Selection: {self.verticalHeaderItem(current.row()).text()} , stitch {side}-{self.horizontalHeaderItem(current.column()).text()}" + self.__progbar.set_selection_label(selection_string) diff --git a/src/main/python/main/ayab/main_gui.ui b/src/main/python/main/ayab/main_gui.ui index 7dd30cdb..a8672e49 100644 --- a/src/main/python/main/ayab/main_gui.ui +++ b/src/main/python/main/ayab/main_gui.ui @@ -34,6 +34,13 @@ + + + + + + + diff --git a/src/main/python/main/ayab/preferences.py b/src/main/python/main/ayab/preferences.py index d0e032de..b0e02d65 100644 --- a/src/main/python/main/ayab/preferences.py +++ b/src/main/python/main/ayab/preferences.py @@ -46,6 +46,7 @@ TypeVar, TypedDict, cast, + overload, ) if TYPE_CHECKING: @@ -141,6 +142,13 @@ def reset(self) -> None: var, self.default_value(cast(PreferencesDictKeys, var)) ) + @overload + def value(self, var: PreferencesDictBoolKeys) -> bool: ... + @overload + def value(self, var: PreferencesDictIntKeys | PreferencesDictObjKeys) -> int: ... + @overload + def value(self, var: Literal["language"]) -> str: ... + def value(self, var: PreferencesDictKeys) -> Any: if var in self.settings.allKeys(): try: diff --git a/src/main/python/main/ayab/progressbar.py b/src/main/python/main/ayab/progressbar.py index 4d723bb5..f4a1f2ba 100644 --- a/src/main/python/main/ayab/progressbar.py +++ b/src/main/python/main/ayab/progressbar.py @@ -34,6 +34,7 @@ def __init__(self, parent: GuiMain): self.__row_label = parent.ui.label_current_row self.__color_label = parent.ui.label_current_color self.__status_label = parent.engine.status.ui.label_progress + self.__selection_label = parent.ui.label_selection self.reset() def reset(self) -> None: @@ -45,6 +46,7 @@ def reset(self) -> None: self.__row_label.setText("") self.__color_label.setText("") self.__status_label.setText("") + self.__selection_label.setText("") def update( self, @@ -60,6 +62,9 @@ def update( self.refresh() return True + def set_selection_label(self, text: str) -> None: + self.__selection_label.setText(text) + def refresh(self) -> None: """Updates the color and row in progress bar""" if self.row < 0 or self.total < 0: