Implement more filter methods
Add filtering by support level and installed/update-able
This commit is contained in:
@@ -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)
|
||||
|
||||
|
Reference in New Issue
Block a user