forked from bartvdbraak/blender
771906bc09
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.
148 lines
4.4 KiB
Python
148 lines
4.4 KiB
Python
# ##### BEGIN GPL LICENSE BLOCK #####
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# ##### END GPL LICENSE BLOCK #####
|
|
|
|
# <pep8 compliant>
|
|
|
|
# note, properties_animviz is a helper module only.
|
|
|
|
if "bpy" in locals():
|
|
from imp import reload as _reload
|
|
for val in _modules_loaded.values():
|
|
_reload(val)
|
|
_modules = [
|
|
"properties_animviz",
|
|
"properties_constraint",
|
|
"properties_data_armature",
|
|
"properties_data_bone",
|
|
"properties_data_camera",
|
|
"properties_data_curve",
|
|
"properties_data_empty",
|
|
"properties_data_lamp",
|
|
"properties_data_lattice",
|
|
"properties_data_mesh",
|
|
"properties_data_metaball",
|
|
"properties_data_modifier",
|
|
"properties_data_speaker",
|
|
"properties_game",
|
|
"properties_mask_common",
|
|
"properties_material",
|
|
"properties_object",
|
|
"properties_particle",
|
|
"properties_physics_cloth",
|
|
"properties_physics_common",
|
|
"properties_physics_dynamicpaint",
|
|
"properties_physics_field",
|
|
"properties_physics_fluid",
|
|
"properties_physics_rigidbody",
|
|
"properties_physics_rigidbody_constraint",
|
|
"properties_physics_smoke",
|
|
"properties_physics_softbody",
|
|
"properties_render",
|
|
"properties_render_layer",
|
|
"properties_scene",
|
|
"properties_texture",
|
|
"properties_world",
|
|
"space_clip",
|
|
"space_console",
|
|
"space_dopesheet",
|
|
"space_filebrowser",
|
|
"space_graph",
|
|
"space_image",
|
|
"space_info",
|
|
"space_logic",
|
|
"space_nla",
|
|
"space_node",
|
|
"space_outliner",
|
|
"space_properties",
|
|
"space_sequencer",
|
|
"space_text",
|
|
"space_time",
|
|
"space_userpref",
|
|
"space_view3d",
|
|
"space_view3d_toolbar",
|
|
]
|
|
|
|
import bpy
|
|
|
|
if bpy.app.build_options.freestyle:
|
|
_modules.append("properties_freestyle")
|
|
__import__(name=__name__, fromlist=_modules)
|
|
_namespace = globals()
|
|
_modules_loaded = {name: _namespace[name] for name in _modules if name != 'bpy'}
|
|
del _namespace
|
|
|
|
|
|
def register():
|
|
bpy.utils.register_module(__name__)
|
|
|
|
# space_userprefs.py
|
|
from bpy.props import StringProperty, EnumProperty
|
|
from bpy.types import WindowManager
|
|
|
|
def addon_filter_items(self, context):
|
|
import addon_utils
|
|
|
|
items = [('All', "All", "All Addons"),
|
|
('User', "User", "All Addons Installed by User"),
|
|
('Enabled', "Enabled", "All Enabled Addons"),
|
|
('Disabled', "Disabled", "All Disabled Addons"),
|
|
]
|
|
|
|
items_unique = set()
|
|
|
|
for mod in addon_utils.modules(refresh=False):
|
|
info = addon_utils.module_bl_info(mod)
|
|
items_unique.add(info["category"])
|
|
|
|
items.extend([(cat, cat, "") for cat in sorted(items_unique)])
|
|
return items
|
|
|
|
WindowManager.addon_search = StringProperty(
|
|
name="Search",
|
|
description="Search within the selected filter",
|
|
)
|
|
WindowManager.addon_filter = EnumProperty(
|
|
items=addon_filter_items,
|
|
name="Category",
|
|
description="Filter addons by category",
|
|
)
|
|
|
|
WindowManager.addon_support = EnumProperty(
|
|
items=[('OFFICIAL', "Official", "Officially supported"),
|
|
('COMMUNITY', "Community", "Maintained by community developers"),
|
|
('TESTING', "Testing", "Newly contributed scripts (excluded from release builds)")
|
|
],
|
|
name="Support",
|
|
description="Display support level",
|
|
default={'OFFICIAL', 'COMMUNITY'},
|
|
options={'ENUM_FLAG'},
|
|
)
|
|
# done...
|
|
|
|
|
|
def unregister():
|
|
bpy.utils.unregister_module(__name__)
|
|
|
|
|
|
# Define a default UIList, when a list does not need any custom drawing...
|
|
# Keep in sync with its #defined name in UI_interface.h
|
|
class UI_UL_list(bpy.types.UIList):
|
|
pass
|
|
|
|
bpy.utils.register_class(UI_UL_list)
|