Basic filtering for package browser
This commit is contained in:
@@ -360,23 +360,60 @@ class USERPREF_PT_packages(bpy.types.Panel):
|
|||||||
spl_r = spl.row()
|
spl_r = spl.row()
|
||||||
spl_r.prop(context.window_manager, "package_install_filter", expand=True)
|
spl_r.prop(context.window_manager, "package_install_filter", expand=True)
|
||||||
|
|
||||||
|
#TODO: more advanced filter/sorting; sort matches which match the filter string from the start higher
|
||||||
|
#Also some caching of this would be nice, this only needs to be re-run when any of the filters change.
|
||||||
|
def filter_package(package):
|
||||||
|
"""Returns true if the given package matches all filters"""
|
||||||
|
filterstr = bpy.context.window_manager.package_search
|
||||||
|
category = bpy.context.window_manager.addon_filter
|
||||||
|
blinfo = package['bl_info']
|
||||||
|
|
||||||
|
def match_search() -> bool:
|
||||||
|
if len(filterstr) == 0:
|
||||||
|
return True
|
||||||
|
if blinfo['name'].lower().__contains__(filterstr.lower()):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def match_category() -> bool:
|
||||||
|
if category.upper() == 'ALL':
|
||||||
|
return True
|
||||||
|
if 'category' not in blinfo:
|
||||||
|
return True
|
||||||
|
if blinfo['category'].upper() == category.upper():
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
if match_search() and match_category():
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
def draw_package(package, layout):
|
def draw_package(package, layout):
|
||||||
|
"""Draws the given package"""
|
||||||
pkgbox = layout.box()
|
pkgbox = layout.box()
|
||||||
spl = pkgbox.split(.8)
|
spl = pkgbox.split(.8)
|
||||||
left = spl.column()
|
left = spl.column(align=True)
|
||||||
|
|
||||||
|
# for install/uninstall buttons
|
||||||
right = spl.row()
|
right = spl.row()
|
||||||
right.alignment = 'RIGHT'
|
right.alignment = 'RIGHT'
|
||||||
|
right.scale_y = 2
|
||||||
|
|
||||||
|
# for title & description
|
||||||
lr1 = left.row()
|
lr1 = left.row()
|
||||||
lr2 = left.row()
|
lr2 = left.row()
|
||||||
|
lr2.enabled = False #Give name more visual weight
|
||||||
|
|
||||||
lr1.label(text=pkg['bl_info'].get('name', "MISSING NAME"))
|
lr1.label(text=pkg['bl_info'].get('name', "MISSING NAME"))
|
||||||
lr2.label(text=pkg['bl_info'].get('description', "MISSING DESCRIPTION"))
|
lr2.label(text=pkg['bl_info'].get('description', "MISSING DESCRIPTION"))
|
||||||
lr2.enabled = False #Give name more visual weight
|
|
||||||
right.scale_y = 2
|
right.operator(BPKG_OT_install.bl_idname).package_url=""
|
||||||
right.operator(BPKG_OT_install.bl_idname).package_url="Asdf"
|
|
||||||
|
|
||||||
for pkg in repo['packages']:
|
for pkg in repo['packages']:
|
||||||
row = pkgzone.row()
|
if filter_package(pkg):
|
||||||
draw_package(pkg, row)
|
row = pkgzone.row()
|
||||||
|
draw_package(pkg, row)
|
||||||
|
|
||||||
|
|
||||||
class PackageManagerPreferences(bpy.types.AddonPreferences):
|
class PackageManagerPreferences(bpy.types.AddonPreferences):
|
||||||
|
Reference in New Issue
Block a user