gui/mozregui/pref_editor.py (87 lines of code) (raw):

from mozprofile.prefs import Preferences from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt, Slot from PySide6.QtWidgets import QFileDialog, QWidget from mozregui.ui.pref_editor import Ui_PrefEditor class PreferencesModel(QAbstractTableModel): """ A Qt model that can edit preferences. """ def __init__(self): QAbstractTableModel.__init__(self) self.prefs = [] def rowCount(self, index=QModelIndex()): return len(self.prefs) def columnCount(self, index=QModelIndex()): return 2 def headerData(self, section, orientation, role=Qt.DisplayRole): if role == Qt.DisplayRole and orientation == Qt.Horizontal: return ("name", "value")[section] def data(self, index, role=Qt.DisplayRole): if role in (Qt.DisplayRole, Qt.EditRole): name, value = self.prefs[index.row()] if index.column() == 0: return name else: if isinstance(value, str): return '"' + value + '"' else: return value def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled def setData(self, index, new_value, role=Qt.EditRole): name, value = self.prefs[index.row()] if index.column() == 0: # change pref name name = new_value else: # change pref value value = Preferences.cast(new_value) self.prefs[index.row()] = (name, value) return True def add_empty_pref(self): nb_prefs = len(self.prefs) self.beginInsertRows(QModelIndex(), nb_prefs, nb_prefs) self.prefs.append(("", "")) self.endInsertRows() def add_prefs_from_file(self, fname): prefs = Preferences.read(fname) if prefs: nb_prefs = len(self.prefs) self.beginInsertRows(QModelIndex(), nb_prefs, nb_prefs + len(prefs) - 1) self.prefs.extend(list(prefs.items())) self.endInsertRows() def remove_pref(self, row): self.beginRemoveRows(QModelIndex(), row, row) self.prefs.pop(row) self.endRemoveRows() class PreferencesWidgetEditor(QWidget): """ A widget to edit preferences, using PreferencesModel in a table view and buttons to let the user interact. """ def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = Ui_PrefEditor() self.ui.setupUi(self) self.pref_model = PreferencesModel() self.ui.pref_view.setModel(self.pref_model) @Slot() def add_pref(self): self.pref_model.add_empty_pref() # enter in edit mode for the pref name index = self.pref_model.index(self.pref_model.rowCount() - 1, 0) self.ui.pref_view.edit(index) @Slot() def add_prefs_from_file(self): (fileName, _) = QFileDialog.getOpenFileName( self, "Choose a preference file", filter="pref file (*.json *.ini)", ) if fileName: self.pref_model.add_prefs_from_file(fileName) @Slot() def remove_selected_prefs(self): selected_rows = sorted( set(i.row() for i in self.ui.pref_view.selectedIndexes()), reverse=True ) for row in selected_rows: self.pref_model.remove_pref(row) def get_prefs(self): return self.pref_model.prefs[:] if __name__ == "__main__": from PySide6.QtWidgets import QApplication app = QApplication([]) view = PreferencesWidgetEditor() view.show() app.exec()