From c01c5e0e6067d39c24dfefd338c2bd11f188afc7 Mon Sep 17 00:00:00 2001 From: Ellwood Zwovic Date: Tue, 25 Jul 2017 01:07:06 -0700 Subject: [PATCH] Implement more filter methods Add filtering by support level and installed/update-able --- package_manager/__init__.py | 73 +++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 12 deletions(-) diff --git a/package_manager/__init__.py b/package_manager/__init__.py index fe22969..cfacaa1 100644 --- a/package_manager/__init__.py +++ b/package_manager/__init__.py @@ -59,8 +59,27 @@ class ConsolidatedPackage: if pkg is not None: self.add_version(pkg) + @property + def installed(self) -> bool: + """Return true if any version of this package is installed""" + for pkg in self.versions: + if pkg.installed: + return True + return False + + def get_latest_installed_version(self) -> bpkg.Package: + """ + Return the installed package with the highest version number. + If no packages are installed, return None. + """ + #self.versions is always sorted newer -> older, so we can just grab the first we find + for pkg in self.versions: + if pkg.installed: + return pkg + return None + def get_latest_version(self) -> bpkg.Package: - """Get package with highest version number""" + """Return package with highest version number""" return self.versions[0] # this is always sorted with the highest on top def add_version(self, pkg: Package): @@ -596,8 +615,8 @@ class USERPREF_PT_packages(bpy.types.Panel): log = logging.getLogger(__name__ + '.USERPREF_PT_packages') - available_packages = [] - installed_packages = [] + # available_packages = [] + # installed_packages = [] displayed_packages = [] expanded_packages = [] @@ -612,25 +631,27 @@ class USERPREF_PT_packages(bpy.types.Panel): prefs = context.user_preferences.addons[__package__].preferences main = layout.row() - spl = main.split(.22) + spl = main.split(.2) sidebar = spl.column(align=True) pkgzone = spl.column() sidebar.label("Repositories") - row = sidebar.row() row.template_list("PACKAGE_UL_repositories", "", prefs, "repositories", prefs, "active_repository") col = row.column(align=True) col.operator(PACKAGE_OT_add_repository.bl_idname, text="", icon='ZOOMIN') col.operator(PACKAGE_OT_remove_repository.bl_idname, text="", icon='ZOOMOUT') - sidebar.separator() sidebar.operator(PACKAGE_OT_refresh_repositories.bl_idname) sidebar.separator() - sidebar.label(text="Category") + sidebar.label("Category") sidebar.prop(wm, "addon_filter", text="") + sidebar.separator() + sidebar.label("Support level") + sidebar.prop(wm, "addon_support") + top = pkgzone.row() spl = top.split(.6) spl.prop(wm, "package_search", text="", icon='VIEWZOOM') @@ -651,6 +672,29 @@ class USERPREF_PT_packages(bpy.types.Panel): return True return False + def match_support(blinfo) -> bool: + if 'support' in blinfo: + if set((blinfo['support'],)).issubset(filters['support']): + return True + else: + if {'COMMUNITY'}.issubset(filters['support']): + return True + return False + + def match_installstate(metapkg: ConsolidatedPackage) -> bool: + if filters['installstate'] == 'AVAILABLE': + return True + + if filters['installstate'] == 'INSTALLED': + if metapkg.installed: + return True + + if filters['installstate'] == 'UPDATES': + if metapkg.installed: + if metapkg.get_latest_installed_version().version < metapkg.get_latest_version().version: + return True + return False + def match_category(blinfo) -> bool: if filters['category'].lower() == 'all': return True @@ -665,9 +709,11 @@ class USERPREF_PT_packages(bpy.types.Panel): contains = [] startswith = [] - for pkgname, pkg in packages.items(): - blinfo = pkg.versions[0].bl_info - if match_category(blinfo): + for pkgname, metapkg in packages.items(): + blinfo = metapkg.versions[0].bl_info + if match_category(blinfo)\ + and match_support(blinfo)\ + and match_installstate(metapkg): if len(filters['search']) == 0: startswith.append(pkgname) continue @@ -837,9 +883,12 @@ class USERPREF_PT_packages(bpy.types.Panel): center_message(pkgzone, "No packages found") return + wm = bpy.context.window_manager filters = { - 'category': bpy.context.window_manager.addon_filter, - 'search': bpy.context.window_manager.package_search, + 'category': wm.addon_filter, + 'search': wm.package_search, + 'support': wm.addon_support, + 'installstate': wm.package_install_filter, } USERPREF_PT_packages.displayed_packages = filtered_packages(filters, _packages)