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()