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:
|
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)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user