From 980bb17964ef862634e7fec1fe8836095d144bfc Mon Sep 17 00:00:00 2001 From: Vishal Date: Mon, 22 Apr 2024 15:33:31 +0530 Subject: [PATCH] Plugins can be now viewed in A-Z or Z-A order. --- plugin_manager.py | 55 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/plugin_manager.py b/plugin_manager.py index 8d7e528..a597073 100644 --- a/plugin_manager.py +++ b/plugin_manager.py @@ -1628,6 +1628,8 @@ class PluginManagerWindow(bui.Window): self.category_selection_button = None self.selected_category = None self.plugins_in_current_view = {} + self.selected_alphabet_order = 'a_z' + self.alphabet_order_selection_button = None loop.create_task(self.draw_index()) @@ -1761,7 +1763,7 @@ class PluginManagerWindow(bui.Window): def draw_category_selection_button(self, post_label): category_pos_x = (440 if _uiscale is babase.UIScale.SMALL else - 340 if _uiscale is babase.UIScale.MEDIUM else 350) + 340 if _uiscale is babase.UIScale.MEDIUM else 370) category_pos_y = self._height - (141 if _uiscale is babase.UIScale.SMALL else 110 if _uiscale is babase.UIScale.MEDIUM else 110) b_size = (140, 30) @@ -1769,6 +1771,25 @@ class PluginManagerWindow(bui.Window): b_textcolor = (0.8, 0.8, 0.85) # b_color = (0.6, 0.53, 0.63) + if self.alphabet_order_selection_button is None: + self.alphabet_order_selection_button = bui.buttonwidget(parent=self._root_widget, + size=(40,30), + position=( + category_pos_x - 47, + category_pos_y), + label=( + 'Z - A' if self.selected_alphabet_order == 'z_a' + else 'A - Z'), + on_activate_call=( + lambda: loop.create_task(self._on_order_button_press())), + button_type="square", + textcolor=b_textcolor, + text_scale=0.6) + else: + bui.buttonwidget(edit=self.alphabet_order_selection_button, + label = ('Z - A' if self.selected_alphabet_order == 'z_a' else 'A - Z') + ) + label = f"Category: {post_label}" if self.category_selection_button is None: @@ -1788,9 +1809,19 @@ class PluginManagerWindow(bui.Window): self.category_selection_button = bui.buttonwidget(edit=self.category_selection_button, label=label) + async def _on_order_button_press(self) -> None: + self.selected_alphabet_order = ('a_z' if self.selected_alphabet_order == 'z_a' else 'z_a') + bui.buttonwidget(edit=self.alphabet_order_selection_button, + label = ('Z - A' if self.selected_alphabet_order == 'z_a' else 'A - Z') + ) + filter_text = bui.textwidget(parent=self._root_widget, query=self._filter_widget) + await self.draw_plugin_names( + self.selected_category, refresh=True, order=self.selected_alphabet_order + ) + def draw_search_bar(self): search_bar_pos_x = (85 if _uiscale is babase.UIScale.SMALL else - 68 if _uiscale is babase.UIScale.MEDIUM else 90) + 68 if _uiscale is babase.UIScale.MEDIUM else 75) search_bar_pos_y = self._height - ( 145 if _uiscale is babase.UIScale.SMALL else 110 if _uiscale is babase.UIScale.MEDIUM else 116) @@ -1802,7 +1833,7 @@ class PluginManagerWindow(bui.Window): 35 if _uiscale is babase.UIScale.MEDIUM else 45) filter_txt_pos_x = (60 if _uiscale is babase.UIScale.SMALL else - 40 if _uiscale is babase.UIScale.MEDIUM else 60) + 40 if _uiscale is babase.UIScale.MEDIUM else 50) filter_txt_pos_y = search_bar_pos_y + (3 if _uiscale is babase.UIScale.SMALL else 4 if _uiscale is babase.UIScale.MEDIUM else 8) @@ -1845,7 +1876,8 @@ class PluginManagerWindow(bui.Window): if self.selected_category is None: continue try: - await self.draw_plugin_names(self.selected_category, search_term=filter_text.lower()) + await self.draw_plugin_names( + self.selected_category, search_term=filter_text.lower(), order=self.selected_alphabet_order) except CategoryDoesNotExist: pass # XXX: This may be more efficient, but we need a way to get a plugin's textwidget @@ -1927,7 +1959,7 @@ class PluginManagerWindow(bui.Window): # await asyncio.gather(*plugin_names_to_draw) # XXX: Not sure if this is the best way to handle search filters. - async def draw_plugin_names(self, category, search_term="", refresh=False): + async def draw_plugin_names(self, category, search_term="", refresh=False, order='a_z'): # Re-draw plugin list UI if either search term or category was switched. to_draw_plugin_names = (search_term, category) != (self._last_filter_text, self.selected_category) @@ -1940,14 +1972,18 @@ class PluginManagerWindow(bui.Window): raise CategoryDoesNotExist(f"{category} does not exist.") if search_term: - plugins = filter( + plugins = list(filter( lambda plugin: self.search_term_filterer(plugin, search_term), category_plugins, - ) + )) else: plugins = category_plugins - if plugins == self._last_filter_plugins: + def return_name(val): + return val.name + plugins.sort(key=return_name, reverse=(True if order == 'z_a' else False)) + + if plugins == self._last_filter_plugins and not refresh: # Plugins names to draw on UI are already drawn. return @@ -2017,7 +2053,8 @@ class PluginManagerWindow(bui.Window): async def select_category(self, category): self.plugins_in_current_view.clear() self.draw_category_selection_button(post_label=category) - await self.draw_plugin_names(category, search_term=self._last_filter_text, refresh=True) + await self.draw_plugin_names( + category, search_term=self._last_filter_text, refresh=True, order=self.selected_alphabet_order) self.selected_category = category def cleanup(self):