From 28257cad3145a615a057eb324bd05c7acc547f9d Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Thu, 6 Jan 2022 18:42:48 +0000 Subject: [PATCH] Another enum cleanup. While testing that I found several problems related to adding and editing columns when the table was sorted differently. Also prevented moving rows when the table is sorted by anything but row number ascending. This isn't the nicest fix but making it work with new columns while the sort is descending is harder than I want to deal with tonight. --- src/calibre/gui2/preferences/columns.py | 70 +++++++++++++++++-------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/src/calibre/gui2/preferences/columns.py b/src/calibre/gui2/preferences/columns.py index 70c2438e78..162903eeef 100644 --- a/src/calibre/gui2/preferences/columns.py +++ b/src/calibre/gui2/preferences/columns.py @@ -37,7 +37,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.add_custcol_button.clicked.connect(self.add_custcol) self.add_col_button.clicked.connect(self.add_custcol) self.edit_custcol_button.clicked.connect(self.edit_custcol) - self.opt_columns.currentCellChanged.connect(self.current_cell_changed) + self.opt_columns.currentItemChanged.connect(self.set_up_down_enabled) for signal in ('Activated', 'Changed', 'DoubleClicked', 'Clicked'): signal = getattr(self.opt_columns, 'item'+signal) signal.connect(self.columns_changed) @@ -89,18 +89,22 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): CreateCustomColumn.column_types)) for row, key in enumerate(colmap): - self.setup_row(row, key) + self.setup_row(row, key, row) self.initial_row_count = row self.opt_columns.setSortingEnabled(True) - self.opt_columns.horizontalHeader().setSortIndicator(0, Qt.AscendingOrder) + self.opt_columns.horizontalHeader().setSortIndicator(0, Qt.SortOrder.AscendingOrder) self.restore_geometry() self.opt_columns.cellDoubleClicked.connect(self.row_double_clicked) + self.opt_columns.setCurrentCell(0, 1) + self.set_up_down_enabled(self.opt_columns.currentItem(), None) self.opt_columns.blockSignals(False) - def current_cell_changed(self, current_row, current_col, prev_row, prev_col): - if self.opt_columns.horizontalHeader().sortIndicatorSection() == 0: - self.column_up.setEnabled(current_row > 0 and current_row <= self.initial_row_count) - self.column_down.setEnabled(current_row < self.initial_row_count) + def set_up_down_enabled(self, current_item, _): + h = self.opt_columns.horizontalHeader() + row = current_item.row() + if h.sortIndicatorSection() == 0 and h.sortIndicatorOrder() == Qt.SortOrder.AscendingOrder: + self.column_up.setEnabled(row > 0 and row <= self.initial_row_count) + self.column_down.setEnabled(row < self.initial_row_count) def columns_changed(self, *args): self.changed_signal.emit() @@ -111,9 +115,12 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): return self.gui.library_view.get_state() def table_sorted(self, column): - self.column_up.setEnabled(column == 0) - self.column_down.setEnabled(column == 0) + h = self.opt_columns.horizontalHeader() + enabled = column == 0 and h.sortIndicatorOrder() == Qt.SortOrder.AscendingOrder + self.column_up.setEnabled(enabled) + self.column_down.setEnabled(enabled) self.opt_columns.scrollTo(self.opt_columns.currentIndex()) + self.set_up_down_enabled(self.opt_columns.currentItem(), _) def row_double_clicked(self, r, c): self.edit_custcol() @@ -127,7 +134,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): return self.opt_columns.resizeColumnsToContents() - def setup_row(self, row, key): + def setup_row(self, row, key, order): flags = Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable if self.is_custom_key(key): @@ -137,9 +144,10 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): cc = self.field_metadata[key] original_key = key + self.opt_columns.setSortingEnabled(False) item = QTableWidgetItem() - item.setData(Qt.ItemDataRole.DisplayRole, row) - item.setToolTip(str(row)) + item.setData(Qt.ItemDataRole.DisplayRole, order) + item.setToolTip(str(order)) item.setData(Qt.ItemDataRole.UserRole, key) item.setFlags(flags) self.opt_columns.setItem(row, 0, item) @@ -203,8 +211,10 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): item.setToolTip(col_status) item.setFlags(flags) self.opt_columns.setItem(row, 5, item) + self.opt_columns.setSortingEnabled(True) def up_column(self): + self.opt_columns.setSortingEnabled(False) row = self.opt_columns.currentRow() if row > 0: for i in range(0, self.opt_columns.columnCount()): @@ -212,12 +222,14 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): upper = self.opt_columns.takeItem(row, i) self.opt_columns.setItem(row, i, lower) self.opt_columns.setItem(row-1, i, upper) - self.setup_row(row-1, self.opt_columns.item(row-1, 2).text()) - self.setup_row(row, self.opt_columns.item(row, 2).text()) - self.opt_columns.setCurrentCell(row-1, 0) + self.setup_row(row-1, self.opt_columns.item(row-1, 2).text(), row-1) + self.setup_row(row, self.opt_columns.item(row, 2).text(), row) + self.opt_columns.setCurrentCell(row-1, 1) self.changed_signal.emit() + self.opt_columns.setSortingEnabled(True) def down_column(self): + self.opt_columns.setSortingEnabled(False) row = self.opt_columns.currentRow() if row < self.opt_columns.rowCount()-1: for i in range(0, self.opt_columns.columnCount()): @@ -225,10 +237,11 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): upper = self.opt_columns.takeItem(row+1, i) self.opt_columns.setItem(row+1, i, lower) self.opt_columns.setItem(row, i, upper) - self.setup_row(row+1, self.opt_columns.item(row+1, 2).text()) - self.setup_row(row, self.opt_columns.item(row, 2).text()) - self.opt_columns.setCurrentCell(row+1, 0) + self.setup_row(row+1, self.opt_columns.item(row+1, 2).text(), row+1) + self.setup_row(row, self.opt_columns.item(row, 2).text(), row) + self.opt_columns.setCurrentCell(row+1, 1) self.changed_signal.emit() + self.opt_columns.setSortingEnabled(True) def is_new_custom_column(self, cc): return 'colnum' in cc and cc['colnum'] >= self.initial_created_count @@ -255,7 +268,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.opt_columns.removeRow(row) else: self.custcols[key]['*deleted'] = True - self.setup_row(row, key) + self.setup_row(row, key, self.column_order_val(row)) self.changed_signal.emit() def add_custcol(self): @@ -267,8 +280,15 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.set_new_custom_column(cc) cc['original_key'] = self.cc_column_key row = self.opt_columns.rowCount() - self.opt_columns.setRowCount(row + 1) - self.setup_row(row, self.cc_column_key) + o = self.opt_columns + o.setRowCount(row + 1) + self.setup_row(row, self.cc_column_key, row) + # We need to find the new item after sorting + for i in range(0, o.rowCount()): + if self.column_order_val(i) == row: + o.setCurrentCell(i, 1) + o.scrollTo(o.currentIndex()) + break; self.changed_signal.emit() def label_to_lookup_name(self, label): @@ -277,6 +297,9 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): def is_custom_key(self, key): return key.startswith('#') + def column_order_val(self, row): + return int(self.opt_columns.item(row, 0).text()) + def edit_custcol(self): model = self.gui.library_view.model() row = self.opt_columns.currentRow() @@ -292,7 +315,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): _('The column is to be deleted. Do you want to undelete it?'), show_copy_button=False): cc.pop('*deleted', None) - self.setup_row(row, key) + self.setup_row(row, key, self.column_order_val(row)) return CreateCustomColumn(self.gui, self, self.label_to_lookup_name(self.custcols[key]['label']), @@ -306,7 +329,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): cc = self.custcols[new_key] if self.is_new_custom_column(cc): cc.pop('*edited', None) - self.setup_row(row, new_key) + self.setup_row(row, new_key, self.column_order_val(row)) + self.opt_columns.scrollTo(self.opt_columns.currentIndex()) self.changed_signal.emit() except: import traceback