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
3232from AnyQt .QtGui import (
4848
4949OFFICIAL_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
5863Installable = 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+
193215class 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