Move 'all_packages' list out of the panel class

This is used for more than drawing, so it doesn't belong on the panel.
This commit is contained in:
Ellwood Zwovic
2017-07-24 14:17:43 -07:00
parent 6f8810f6d1
commit acad78f87c

View File

@@ -31,6 +31,9 @@ else:
import bpy import bpy
from collections import OrderedDict from collections import OrderedDict
# global list of all known packages, indexed by name
_packages = OrderedDict()
class ConsolidatedPackage: class ConsolidatedPackage:
""" """
Stores a grouping of different versions of the same package Stores a grouping of different versions of the same package
@@ -41,7 +44,6 @@ class ConsolidatedPackage:
def __init__(self, pkg=None): def __init__(self, pkg=None):
self.versions = [] self.versions = []
self.expanded = False self.expanded = False
self.installed = False
if pkg is not None: if pkg is not None:
self.add_version(pkg) self.add_version(pkg)
@@ -298,7 +300,7 @@ class PACKAGE_OT_uninstall(SubprocMixin, bpy.types.Operator):
install_path = pathlib.Path(bpy.utils.user_resource('SCRIPTS', 'addons', create=True)) install_path = pathlib.Path(bpy.utils.user_resource('SCRIPTS', 'addons', create=True))
# TODO: only drawing-related package data should be stored on the panel. Maybe move this to a global..? # TODO: only drawing-related package data should be stored on the panel. Maybe move this to a global..?
package = USERPREF_PT_packages.all_packages[self.package_name].get_latest_version() package = _packages[self.package_name].get_latest_version()
proc = multiprocessing.Process(target=subproc.uninstall, proc = multiprocessing.Process(target=subproc.uninstall,
args=(self.pipe_subproc, package, install_path)) args=(self.pipe_subproc, package, install_path))
@@ -332,8 +334,11 @@ def get_packages_from_disk(refresh=False) -> list:
def get_packages_from_repo() -> list: def get_packages_from_repo() -> list:
"""Get list of packages from cached repository lists (does not refresh them from server)""" """Get list of packages from cached repository lists (does not refresh them from server)"""
import pathlib import pathlib
storage_path = pathlib.Path(bpy.utils.user_resource('CONFIG', 'packages', create=True)) storage_path = pathlib.Path(bpy.utils.user_resource('CONFIG', 'packages', create=True)) / 'repo.json'
repo = subproc._load_repo(storage_path) try:
repo = bpkg.Repository.from_file(storage_path)
except FileNotFoundError:
return []
for pkg in repo.packages: for pkg in repo.packages:
pkg.repository = repo.name pkg.repository = repo.name
return repo.packages return repo.packages
@@ -348,7 +353,7 @@ class PACKAGE_OT_refresh_packages(bpy.types.Operator):
def execute(self, context): def execute(self, context):
installed_packages = get_packages_from_disk(refresh=True) installed_packages = get_packages_from_disk(refresh=True)
available_packages = get_packages_from_repo() available_packages = get_packages_from_repo()
USERPREF_PT_packages.all_packages = build_composite_packagelist(installed_packages, available_packages) _packages = build_composite_packagelist(installed_packages, available_packages)
context.area.tag_redraw() context.area.tag_redraw()
return {'FINISHED'} return {'FINISHED'}
@@ -422,7 +427,7 @@ class PACKAGE_OT_refresh_repositories(SubprocMixin, bpy.types.Operator):
for pkg in available_packages: for pkg in available_packages:
pkg.repository = result.repository.name pkg.repository = result.repository.name
USERPREF_PT_packages.all_packages = build_composite_packagelist(installed_packages, available_packages) _packages = build_composite_packagelist(installed_packages, available_packages)
USERPREF_PT_packages.available_packages = available_packages USERPREF_PT_packages.available_packages = available_packages
self.report({'INFO'}, 'Package list retrieved successfully') self.report({'INFO'}, 'Package list retrieved successfully')
@@ -522,7 +527,6 @@ class USERPREF_PT_packages(bpy.types.Panel):
log = logging.getLogger(__name__ + '.USERPREF_PT_packages') log = logging.getLogger(__name__ + '.USERPREF_PT_packages')
all_packages = OrderedDict()
available_packages = [] available_packages = []
installed_packages = [] installed_packages = []
displayed_packages = [] displayed_packages = []
@@ -731,35 +735,28 @@ class USERPREF_PT_packages(bpy.types.Panel):
row.alignment='CENTER' row.alignment='CENTER'
row.scale_y = 10 row.scale_y = 10
if len(USERPREF_PT_packages.all_packages) == 0: global _packages
center_message(pkgzone, "No packages found.")
if len(_packages) == 0:
# TODO: read repository and installed packages synchronously for now; # TODO: read repository and installed packages synchronously for now;
# can't run an operator from draw code to do async monitoring # can't run an operator from draw code to do async monitoring
installed_packages = get_packages_from_disk() installed_packages = get_packages_from_disk()
try: available_packages = get_packages_from_repo()
available_packages = get_packages_from_repo()
except FileNotFoundError:
center_message(pkgzone, "No repositories found")
return
all_packages = build_composite_packagelist(installed_packages, available_packages) _packages = build_composite_packagelist(installed_packages, available_packages)
if len(all_packages) == 0: if len(_packages) == 0:
center_message(pkgzone, "No packages found") center_message(pkgzone, "No packages found")
return return
USERPREF_PT_packages.all_packages = all_packages
filters = { filters = {
'category': bpy.context.window_manager.addon_filter, 'category': bpy.context.window_manager.addon_filter,
'search': bpy.context.window_manager.package_search, 'search': bpy.context.window_manager.package_search,
} }
USERPREF_PT_packages.displayed_packages = filtered_packages(filters, USERPREF_PT_packages.all_packages) USERPREF_PT_packages.displayed_packages = filtered_packages(filters, _packages)
for pkgname in USERPREF_PT_packages.displayed_packages: for pkgname in USERPREF_PT_packages.displayed_packages:
row = pkgzone.row() row = pkgzone.row()
draw_package(USERPREF_PT_packages.all_packages[pkgname], row) draw_package(_packages[pkgname], row)
class WM_OT_package_toggle_expand(bpy.types.Operator): class WM_OT_package_toggle_expand(bpy.types.Operator):
@@ -776,8 +773,9 @@ class WM_OT_package_toggle_expand(bpy.types.Operator):
) )
def invoke(self, context, event): def invoke(self, context, event):
global _packages
try: try:
pkg = USERPREF_PT_packages.all_packages[self.package_name] pkg = _packages[self.package_name]
except KeyError: except KeyError:
log.error("Couldn't find package '%s'", self.package_name) log.error("Couldn't find package '%s'", self.package_name)
return {'CANCELLED'} return {'CANCELLED'}
@@ -786,7 +784,7 @@ class WM_OT_package_toggle_expand(bpy.types.Operator):
if event.shift: if event.shift:
for pkgname in USERPREF_PT_packages.displayed_packages: for pkgname in USERPREF_PT_packages.displayed_packages:
if not pkgname == self.package_name: if not pkgname == self.package_name:
USERPREF_PT_packages.all_packages[pkgname].expanded = False _packages[pkgname].expanded = False
return {'FINISHED'} return {'FINISHED'}
@@ -837,7 +835,7 @@ def build_composite_packagelist(installed: list, available: list) -> OrderedDict
pkg.installed = True pkg.installed = True
if pkg.name in masterlist: if pkg.name in masterlist:
for masterpkg in masterlist[pkg.name]: for masterpkg in masterlist[pkg.name]:
log.debug("{} and {} equivilent? {}".format((pkg.name, pkg.version), (masterpkg.name, masterpkg.version), packages_are_equivilent(pkg, masterpkg))) # log.debug("{} and {} equivilent? {}".format((pkg.name, pkg.version), (masterpkg.name, masterpkg.version), packages_are_equivilent(pkg, masterpkg)))
if packages_are_equivilent(pkg, masterpkg): if packages_are_equivilent(pkg, masterpkg):
masterpkg.installed = True masterpkg.installed = True
masterpkg.installed_location = pkg.installed_location masterpkg.installed_location = pkg.installed_location