diff --git a/settings-gui/ui/pages/backup.py b/settings-gui/ui/pages/backup.py index 6c213fa..dd26915 100644 --- a/settings-gui/ui/pages/backup.py +++ b/settings-gui/ui/pages/backup.py @@ -58,7 +58,7 @@ def _setup_ui(self): self.import_desc = QLabel( _( - "Save your configurations to a JSON file, or restore them from a .lotusbak file. Select what you want to include:" + "Save or restore your configurations via JSON files. Select the components you wish to include:" ) ) self.import_desc.setWordWrap(True) @@ -134,13 +134,13 @@ def do_export(self): return default_filename = ( - f"lotus-backup-{datetime.now().strftime('%Y%m%d-%H%M%S')}.lotusbak" + f"lotus-backup-{datetime.now().strftime('%Y%m%d-%H%M%S')}.json" ) path, _filter = QFileDialog.getSaveFileName( self, _("Export Backup"), os.path.join(os.path.expanduser("~"), default_filename), - _("Lotus Backup (*.lotusbak);;All Files (*)"), + _("JSON Backup (*.json);;All Files (*)"), ) if not path: return @@ -194,7 +194,7 @@ def on_select_import_file(self): self, _("Select Backup File"), os.path.expanduser("~"), - _("Lotus Backup (*.lotusbak);;All Files (*)"), + _("JSON Backup (*.json);;All Files (*)"), ) if not path: return diff --git a/settings-gui/ui/pages/dict_editor.py b/settings-gui/ui/pages/dict_editor.py index 274e580..c0aeae6 100644 --- a/settings-gui/ui/pages/dict_editor.py +++ b/settings-gui/ui/pages/dict_editor.py @@ -294,7 +294,6 @@ def on_add(self): self.upsert_row(word) self.input_word.clear() - self._update_add_button_icon() self.input_word.setFocus() def _update_add_button_icon(self): diff --git a/settings-gui/ui/pages/keymap_editor.py b/settings-gui/ui/pages/keymap_editor.py index d111ce9..512fda2 100644 --- a/settings-gui/ui/pages/keymap_editor.py +++ b/settings-gui/ui/pages/keymap_editor.py @@ -298,13 +298,14 @@ def _setup_ui(self): for action_code, action_name in BAMBOO_ACTIONS: self.combo_action.addItem(action_name, action_code) - btn_add = QPushButton(QIcon.fromTheme("list-add"), _("Add")) - btn_add.setToolTip(_("Add / Update Keymap")) - btn_add.clicked.connect(self.on_add) + self.btn_add = QPushButton(QIcon.fromTheme("list-add"), _("Add")) + self.btn_add.setToolTip(_("Add Keymap")) + self.btn_add.clicked.connect(self.on_add) + self.input_key.textChanged.connect(self._update_add_button_icon) input_layout.addWidget(self.input_key) input_layout.addWidget(self.combo_action) - input_layout.addWidget(btn_add) + input_layout.addWidget(self.btn_add) editor_layout.addLayout(input_layout) # Table @@ -420,23 +421,59 @@ def on_search_changed(self): self.table.setRowHidden(row, search_text not in key and search_text not in action) def on_add(self): - """Adds a new keymap entry.""" + """Adds or updates a keymap entry.""" key = self.input_key.text().strip() if not key: return - # Check for update - for row in range(self.table.rowCount()): - item = self.table.item(row, 0) - if item and item.text() == key: - combo = self.table.cellWidget(row, 1) - if combo: - combo.setCurrentIndex(self.combo_action.currentIndex()) - return + self.upsert_row(key, self.combo_action.currentData()) + self.input_key.clear() + self.input_key.setFocus() + + def upsert_row(self, key: str, action_code: str): + """Adds or updates a row in the keymap table.""" + row = self._find_row_by_key(key) + if row is not None: + # Update existing + cell_combo = self.table.cellWidget(row, 1) + if cell_combo: + idx = cell_combo.findData(action_code) + if idx >= 0: + cell_combo.setCurrentIndex(idx) + self._on_item_changed() + return - self._add_row(key, self.combo_action.currentData()) + # Insert new + self._add_row(key, action_code) + self.on_search_changed() + self.update_button_states() self._on_item_changed() + def _find_row_by_key(self, key: str) -> int | None: + """Finds row index for a given key. Returns None if not found.""" + for r in range(self.table.rowCount()): + item = self.table.item(r, 0) + if item and item.text() == key: + return r + return None + + def _update_add_button_icon(self, *_args): + """Changes the Add button icon to Update if key exists.""" + key = self.input_key.text().strip() + + # Disable button if key is empty + self.btn_add.setEnabled(bool(key)) + + found = self._find_row_by_key(key) is not None + if found: + self.btn_add.setIcon(QIcon.fromTheme("document-save")) + self.btn_add.setText(_("Update")) + self.btn_add.setToolTip(_("Update Keymap")) + else: + self.btn_add.setIcon(QIcon.fromTheme("list-add")) + self.btn_add.setText(_("Add")) + self.btn_add.setToolTip(_("Add Keymap")) + def on_load_preset(self): """Loads a predefined set of keymaps.""" preset_name = self.combo_preset.currentText() diff --git a/settings-gui/ui/pages/macro_editor.py b/settings-gui/ui/pages/macro_editor.py index a70f13e..dedceb4 100644 --- a/settings-gui/ui/pages/macro_editor.py +++ b/settings-gui/ui/pages/macro_editor.py @@ -323,16 +323,25 @@ def save_data(self): self.dbus.set_sub_config_list("lotus-macro", "Macro", data) self.initial_state = self._get_current_state() + def _find_row_by_key(self, key: str) -> int | None: + """Finds row index for a given key. Returns None if not found.""" + for r in range(self.table.rowCount()): + item = self.table.item(r, 0) + if item and item.text() == key: + return r + return None + def upsert_row(self, key: str, value: str, sort: bool = True): # Update existing - for row in range(self.table.rowCount()): - if self.table.item(row, 0) and self.table.item(row, 0).text() == key: - self.table.item(row, 1).setText(value) - self._apply_row_highlight(row, key) - if sort: - self.on_search_changed() # Re-apply filter - self.update_button_states() - return + row = self._find_row_by_key(key) + if row is not None: + self.table.item(row, 1).setText(value) + self._apply_row_highlight(row, key) + if sort: + self.on_search_changed() # Re-apply filter + self.update_button_states() + self._on_item_changed() + return # Insert new row = self.table.rowCount() @@ -340,6 +349,7 @@ def upsert_row(self, key: str, value: str, sort: bool = True): self.table.setItem(row, 0, QTableWidgetItem(key)) self.table.setItem(row, 1, QTableWidgetItem(value)) self._apply_row_highlight(row, key) + self.on_search_changed() if sort: self.on_search_changed() # Re-apply filter self.update_button_states() @@ -420,7 +430,6 @@ def on_add(self): self.upsert_row(key, val) self.input_key.clear() self.input_val.clear() - self._update_add_button_icon() self.input_key.setFocus() def _update_add_button_icon(self): @@ -440,10 +449,7 @@ def _update_add_button_icon(self): # Disable button if key is invalid, empty, or value is empty self.btn_add.setEnabled(not is_invalid and bool(key) and bool(val)) - found = any( - self.table.item(r, 0) and self.table.item(r, 0).text() == key - for r in range(self.table.rowCount()) - ) + found = self._find_row_by_key(key) is not None if found: self.btn_add.setIcon(QIcon.fromTheme("document-save")) self.btn_add.setText(_("Update"))