Implement more filter methods

Add filtering by support level and installed/update-able
This commit is contained in:
Ellwood Zwovic
2017-07-25 01:07:06 -07:00
parent 5e034855c0
commit c01c5e0e60

View File

@@ -59,8 +59,27 @@ class ConsolidatedPackage:
if pkg is not None: if pkg is not None:
self.add_version(pkg) 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: 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 return self.versions[0] # this is always sorted with the highest on top
def add_version(self, pkg: Package): def add_version(self, pkg: Package):
@@ -596,8 +615,8 @@ class USERPREF_PT_packages(bpy.types.Panel):
log = logging.getLogger(__name__ + '.USERPREF_PT_packages') log = logging.getLogger(__name__ + '.USERPREF_PT_packages')
available_packages = [] # available_packages = []
installed_packages = [] # installed_packages = []
displayed_packages = [] displayed_packages = []
expanded_packages = [] expanded_packages = []
@@ -612,25 +631,27 @@ class USERPREF_PT_packages(bpy.types.Panel):
prefs = context.user_preferences.addons[__package__].preferences prefs = context.user_preferences.addons[__package__].preferences
main = layout.row() main = layout.row()
spl = main.split(.22) spl = main.split(.2)
sidebar = spl.column(align=True) sidebar = spl.column(align=True)
pkgzone = spl.column() pkgzone = spl.column()
sidebar.label("Repositories") sidebar.label("Repositories")
row = sidebar.row() row = sidebar.row()
row.template_list("PACKAGE_UL_repositories", "", prefs, "repositories", prefs, "active_repository") row.template_list("PACKAGE_UL_repositories", "", prefs, "repositories", prefs, "active_repository")
col = row.column(align=True) col = row.column(align=True)
col.operator(PACKAGE_OT_add_repository.bl_idname, text="", icon='ZOOMIN') col.operator(PACKAGE_OT_add_repository.bl_idname, text="", icon='ZOOMIN')
col.operator(PACKAGE_OT_remove_repository.bl_idname, text="", icon='ZOOMOUT') col.operator(PACKAGE_OT_remove_repository.bl_idname, text="", icon='ZOOMOUT')
sidebar.separator() sidebar.separator()
sidebar.operator(PACKAGE_OT_refresh_repositories.bl_idname) sidebar.operator(PACKAGE_OT_refresh_repositories.bl_idname)
sidebar.separator() sidebar.separator()
sidebar.label(text="Category") sidebar.label("Category")
sidebar.prop(wm, "addon_filter", text="") sidebar.prop(wm, "addon_filter", text="")
sidebar.separator()
sidebar.label("Support level")
sidebar.prop(wm, "addon_support")
top = pkgzone.row() top = pkgzone.row()
spl = top.split(.6) spl = top.split(.6)
spl.prop(wm, "package_search", text="", icon='VIEWZOOM') spl.prop(wm, "package_search", text="", icon='VIEWZOOM')
@@ -651,6 +672,29 @@ class USERPREF_PT_packages(bpy.types.Panel):
return True return True
return False 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: def match_category(blinfo) -> bool:
if filters['category'].lower() == 'all': if filters['category'].lower() == 'all':
return True return True
@@ -665,9 +709,11 @@ class USERPREF_PT_packages(bpy.types.Panel):
contains = [] contains = []
startswith = [] startswith = []
for pkgname, pkg in packages.items(): for pkgname, metapkg in packages.items():
blinfo = pkg.versions[0].bl_info blinfo = metapkg.versions[0].bl_info
if match_category(blinfo): if match_category(blinfo)\
and match_support(blinfo)\
and match_installstate(metapkg):
if len(filters['search']) == 0: if len(filters['search']) == 0:
startswith.append(pkgname) startswith.append(pkgname)
continue continue
@@ -837,9 +883,12 @@ class USERPREF_PT_packages(bpy.types.Panel):
center_message(pkgzone, "No packages found") center_message(pkgzone, "No packages found")
return return
wm = bpy.context.window_manager
filters = { filters = {
'category': bpy.context.window_manager.addon_filter, 'category': wm.addon_filter,
'search': bpy.context.window_manager.package_search, 'search': wm.package_search,
'support': wm.addon_support,
'installstate': wm.package_install_filter,
} }
USERPREF_PT_packages.displayed_packages = filtered_packages(filters, _packages) USERPREF_PT_packages.displayed_packages = filtered_packages(filters, _packages)