gui/mozregui/addons_editor.py (55 lines of code) (raw):

from PySide6.QtCore import QAbstractListModel, QModelIndex, Qt, Slot from PySide6.QtWidgets import QFileDialog, QWidget from mozregui.ui.addons_editor import Ui_AddonsEditor class AddonsModel(QAbstractListModel): """ A Qt model that can edit addons path. """ def __init__(self, parent=None): QAbstractListModel.__init__(self, parent) self.addons = [] def rowCount(self, index=QModelIndex()): return len(self.addons) def data(self, index, role=Qt.DisplayRole): if role == Qt.DisplayRole: return self.addons[index.row()] def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEnabled def add_addon(self, addon): if addon: addons_list_length = len(self.addons) self.beginInsertRows(QModelIndex(), addons_list_length, addons_list_length) self.addons.append(addon) self.endInsertRows() def remove_pref(self, row): self.beginRemoveRows(QModelIndex(), row, row) self.addons.pop(row) self.endRemoveRows() class AddonsWidgetEditor(QWidget): """ A widget to add or remove addons, and buttons to let the user interact. """ def __init__(self, parent=None): QWidget.__init__(self, parent) self.ui = Ui_AddonsEditor() self.ui.setupUi(self) self.list_model = AddonsModel() self.ui.list_view.setModel(self.list_model) @Slot() def add_addon(self): (fileNames, _) = QFileDialog.getOpenFileNames( self, "Choose one or more addon files", filter="addon file (*.xpi)", ) for fileName in fileNames: self.list_model.add_addon(fileName) @Slot() def remove_selected_addons(self): selected_rows = sorted( set(i.row() for i in self.ui.list_view.selectedIndexes()), reverse=True ) for row in selected_rows: self.list_model.remove_pref(row) def get_addons(self): return self.list_model.addons if __name__ == "__main__": from PySide6.QtWidgets import QApplication app = QApplication([]) view = AddonsWidgetEditor() view.show() app.exec()