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:
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)