@@ -43,28 +43,43 @@ def _fill_addon_list(self) -> None:
4343 if widget :
4444 widget .deleteLater ()
4545
46- for i , addon in enumerate (self ._addon_information ):
47- if addon .installed and addon .official and not addon .is_installable :
48- btn = create_button ("Remove" , font_size = 16 , max_w = 150 , css_class = "btn-inverted destructive" )
49- btn .clicked .connect (lambda _ , a = addon , b = btn , c = i : self ._remove_addon (a , b , c ))
50- elif addon .official and addon .is_installable :
51- btn = create_button ("Install" , font_size = 16 , max_w = 150 , css_class = "btn-inverted" )
52- btn .clicked .connect (lambda _ , a = addon , b = btn , c = i : self ._install_addon (a , b , c ))
53- else :
54- if addon .disabled :
55- text = "Disabled"
56- elif not addon .official :
57- text = "Unofficial"
58- else :
59- text = f"needs { addon .minimal_version } +"
60- btn = create_button (text , font_size = 16 , max_w = 150 , css_class = "neutral btn-inverted" )
61- btn .setEnabled (False )
46+ current_grid_index = 0
6247
63- self .gridLayout_2 .addWidget (btn , i , 0 )
48+ for addon in sorted (
49+ self ._addon_information ,
50+ key = lambda x : (x .official , x .installed , x .is_installable , x .name ),
51+ reverse = True ,
52+ ):
53+ btn = self ._create_addon_button (current_grid_index , addon )
54+ self .gridLayout_2 .addWidget (btn , current_grid_index , 0 )
6455 content = f"{ addon .name } ({ addon .file_name } )\n { addon .description } "
6556 label = create_label (content , SMALL_FONT )
6657 label .setWordWrap (True )
67- self .gridLayout_2 .addWidget (label , i , 1 )
58+ self .gridLayout_2 .addWidget (label , current_grid_index , 1 )
59+ current_grid_index += 1
60+ if addon .can_update :
61+ btn = create_button (f"Update ({ addon .version } )" , font_size = 16 , css_class = "btn-inverted" )
62+ btn .clicked .connect (lambda _ , a = addon , b = btn , c = current_grid_index : self ._update_addon (a , b , c ))
63+ self .gridLayout_2 .addWidget (btn , current_grid_index , 1 )
64+ current_grid_index += 1
65+
66+ def _create_addon_button (self , current_grid_index : int , addon : AddonData ) -> QPushButton :
67+ if addon .installed and addon .official :
68+ btn = create_button ("Remove" , font_size = 16 , max_w = 150 , css_class = "btn-inverted destructive" )
69+ btn .clicked .connect (lambda _ , a = addon , b = btn , c = current_grid_index : self ._remove_addon (a , b , c ))
70+ elif addon .official and addon .is_installable :
71+ btn = create_button ("Install" , font_size = 16 , max_w = 150 , css_class = "btn-inverted" )
72+ btn .clicked .connect (lambda _ , a = addon , b = btn , c = current_grid_index : self ._install_addon (a , b , c ))
73+ else :
74+ if addon .disabled :
75+ text = "Disabled"
76+ elif not addon .official :
77+ text = "Unofficial"
78+ else :
79+ text = f"needs { addon .minimal_version } +"
80+ btn = create_button (text , font_size = 16 , max_w = 150 , css_class = "neutral btn-inverted" )
81+ btn .setEnabled (False )
82+ return btn
6883
6984 def _install_addon (self , addon : AddonData , btn : QPushButton , pos : int ) -> None :
7085 """Try to install addon, log if req is not ok or no connection."""
@@ -88,3 +103,12 @@ def _remove_addon(self, addon: AddonData, btn: QPushButton, pos: int) -> None:
88103 btn = create_button ("Install" , font_size = 16 , max_w = 200 , css_class = "btn-inverted" )
89104 btn .clicked .connect (lambda _ , a = addon , b = btn , c = pos : self ._install_addon (a , b , c ))
90105 self .gridLayout_2 .addWidget (btn , pos , 0 )
106+
107+ def _update_addon (self , addon : AddonData , btn : QPushButton , pos : int ) -> None :
108+ """Try to update addon, log if req is not ok or no connection."""
109+ try :
110+ ADDONS .reload_addon (addon )
111+ DIALOG_HANDLER .standard_box ("Addon updated successfully" , "Success" )
112+ btn .deleteLater ()
113+ except CouldNotInstallAddonError as e :
114+ _logger .log_event ("ERROR" , str (e ))
0 commit comments