Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Toenne <lukas.toenne@googlemail.com>2013-08-28 10:36:54 +0400
committerLukas Toenne <lukas.toenne@googlemail.com>2013-08-28 10:36:54 +0400
commit771906bc09317e3dc77be2319b44bc59081eff93 (patch)
tree2b6386aa5cdadfd52bc3b036feee3b00b6c87793 /release/scripts/modules/addon_utils.py
parentf75711db7fd3565925880f8a2ea89088334c35bf (diff)
Fix for #36387, User Preferences "Addons" panel bogs down the whole interface.
The addons panel draw function calls addon_utils.modules() which in turn retrieves a list of fake modules from the script paths every time. This can become costly when network paths are included for addons. Solution is to put the scanning process into a dedicated "refresh" function and disable it in frequently called draw and filter functions, i.e. in these cases the cached addons_fake_modules list will be used instead. Note that this may lead to invalid addon lists if script paths are changed (which is not working 100% without restart anyway according to Campbell). For this there is now a "Refresh" operator button in the addons preferences. If necessary and feasible such forced refreshes can be added later too.
Diffstat (limited to 'release/scripts/modules/addon_utils.py')
-rw-r--r--release/scripts/modules/addon_utils.py11
1 files changed, 9 insertions, 2 deletions
diff --git a/release/scripts/modules/addon_utils.py b/release/scripts/modules/addon_utils.py
index 3aa4eef6392..2ac7d4c85aa 100644
--- a/release/scripts/modules/addon_utils.py
+++ b/release/scripts/modules/addon_utils.py
@@ -35,7 +35,6 @@ error_duplicates = False
error_encoding = False
addons_fake_modules = {}
-
def paths():
# RELEASE SCRIPTS: official scripts distributed in Blender releases
addon_paths = _bpy.utils.script_paths("addons")
@@ -51,7 +50,7 @@ def paths():
return addon_paths
-def modules(module_cache):
+def modules_refresh(module_cache=addons_fake_modules):
global error_duplicates
global error_encoding
import os
@@ -184,6 +183,11 @@ def modules(module_cache):
del module_cache[mod_stale]
del modules_stale
+
+def modules(module_cache=addons_fake_modules, refresh=True):
+ if refresh:
+ modules_refresh(module_cache)
+
mod_list = list(module_cache.values())
mod_list.sort(key=lambda mod: (mod.bl_info["category"],
mod.bl_info["name"],
@@ -370,6 +374,9 @@ def reset_all(reload_scripts=False):
"""
import sys
+ # initializes addons_fake_modules
+ modules_refresh()
+
# RELEASE SCRIPTS: official scripts distributed in Blender releases
paths_list = paths()