Skip to content

Commit e0da7f6

Browse files
authored
Merge pull request #2899 from markotoplak/addons-trusted
[ENH] Add-ons: Option to list only trusted add-ons
2 parents 9f1bc00 + d9cd2a0 commit e0da7f6

File tree

1 file changed

+39
-14
lines changed

1 file changed

+39
-14
lines changed

Orange/canvas/application/addons.py

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
QWidget, QDialog, QLabel, QLineEdit, QTreeView, QHeaderView,
2727
QTextBrowser, QDialogButtonBox, QProgressDialog,
2828
QVBoxLayout, QStyle, QStyledItemDelegate, QStyleOptionViewItem,
29-
QApplication, QHBoxLayout
29+
QApplication, QHBoxLayout, QCheckBox
3030
)
3131

3232
from AnyQt.QtGui import (
@@ -48,11 +48,16 @@
4848

4949
OFFICIAL_ADDONS = [
5050
"Orange-Bioinformatics",
51-
"Orange3-DataFusion",
5251
"Orange3-Prototypes",
5352
"Orange3-Text",
5453
"Orange3-Network",
5554
"Orange3-Associate",
55+
"Orange-Spectroscopy",
56+
"Orange3-Textable",
57+
"Orange3-Educational",
58+
"Orange3-Geo",
59+
"Orange3-ImageAnalytics",
60+
"Orange3-Timeseries",
5661
]
5762

5863
Installable = namedtuple(
@@ -190,6 +195,23 @@ def cleanup(name, sep="-"):
190195
return " ".join(re.findall("[A-Z][a-z]*", name[0].upper() + name[1:]))
191196

192197

198+
class SortFilterProxyTrusted(QSortFilterProxyModel):
199+
200+
show_only_trusted = True
201+
202+
def set_show_only_trusted(self, s):
203+
self.show_only_trusted = s
204+
self.invalidateFilter()
205+
206+
def filterAcceptsRow(self, source_row, source_parent):
207+
if self.show_only_trusted:
208+
model = self.sourceModel()
209+
item = self.sourceModel().data(model.index(source_row, 1), Qt.UserRole)
210+
if isinstance(item, Available) and item.installable.name not in OFFICIAL_ADDONS:
211+
return False
212+
return super().filterAcceptsRow(source_row, source_parent)
213+
214+
193215
class AddonManagerWidget(QWidget):
194216

195217
statechanged = Signal()
@@ -206,8 +228,18 @@ def __init__(self, parent=None, **kwargs):
206228
self.__search = QLineEdit(
207229
placeholderText=self.tr("Filter")
208230
)
231+
self.__only_trusted = QCheckBox(
232+
self.tr("Show only trusted add-ons"),
233+
)
234+
235+
topline = QHBoxLayout()
236+
topline.addWidget(self.__search)
237+
topline.addWidget(self.__only_trusted)
238+
self.layout().addLayout(topline)
209239

210-
self.layout().addWidget(self.__search)
240+
self.__only_trusted.setChecked(True)
241+
self.show_only_trusted = True
242+
self.__only_trusted.stateChanged.connect(self._show_only_trusted_changed)
211243

212244
self.__view = view = QTreeView(
213245
rootIsDecorated=False,
@@ -221,7 +253,7 @@ def __init__(self, parent=None, **kwargs):
221253
self.__model = model = QStandardItemModel()
222254
model.setHorizontalHeaderLabels(["", "Name", "Version", "Action"])
223255
model.dataChanged.connect(self.__data_changed)
224-
proxy = QSortFilterProxyModel(
256+
self.__proxy = proxy = SortFilterProxyTrusted(
225257
filterKeyColumn=1,
226258
filterCaseSensitivity=Qt.CaseInsensitive
227259
)
@@ -249,6 +281,9 @@ def __init__(self, parent=None, **kwargs):
249281
self.__details.setPalette(palette)
250282
self.layout().addWidget(self.__details)
251283

284+
def _show_only_trusted_changed(self):
285+
self.__proxy.set_show_only_trusted(self.__only_trusted.isChecked())
286+
252287
def set_items(self, items):
253288
self.__items = items
254289
model = self.__model
@@ -372,16 +407,6 @@ def __update_details(self):
372407
item = self.__model.item(index, 1)
373408
item = item.data(Qt.UserRole)
374409
assert isinstance(item, (Installed, Available))
375-
# if isinstance(item, Available):
376-
# self.__installed_label.setText("")
377-
# self.__available_label.setText(str(item.available.version))
378-
# elif item.installable is not None:
379-
# self.__installed_label.setText(str(item.local.version))
380-
# self.__available_label.setText(str(item.available.version))
381-
# else:
382-
# self.__installed_label.setText(str(item.local.version))
383-
# self.__available_label.setText("")
384-
385410
text = self._detailed_text(item)
386411
self.__details.setText(text)
387412

0 commit comments

Comments
 (0)