Code cleanup: unused python vars & imports
[blender.git] / release / scripts / startup / bl_ui / __init__.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 # note, properties_animviz is a helper module only.
22
23 if "bpy" in locals():
24     from imp import reload as _reload
25     for val in _modules_loaded.values():
26         _reload(val)
27 _modules = [
28     "properties_animviz",
29     "properties_constraint",
30     "properties_data_armature",
31     "properties_data_bone",
32     "properties_data_camera",
33     "properties_data_curve",
34     "properties_data_empty",
35     "properties_data_lamp",
36     "properties_data_lattice",
37     "properties_data_mesh",
38     "properties_data_metaball",
39     "properties_data_modifier",
40     "properties_data_speaker",
41     "properties_game",
42     "properties_mask_common",
43     "properties_material",
44     "properties_object",
45     "properties_paint_common",
46     "properties_grease_pencil_common",
47     "properties_particle",
48     "properties_physics_cloth",
49     "properties_physics_common",
50     "properties_physics_dynamicpaint",
51     "properties_physics_field",
52     "properties_physics_fluid",
53     "properties_physics_rigidbody",
54     "properties_physics_rigidbody_constraint",
55     "properties_physics_smoke",
56     "properties_physics_softbody",
57     "properties_render",
58     "properties_render_layer",
59     "properties_scene",
60     "properties_texture",
61     "properties_world",
62     "space_clip",
63     "space_console",
64     "space_dopesheet",
65     "space_filebrowser",
66     "space_graph",
67     "space_image",
68     "space_info",
69     "space_logic",
70     "space_nla",
71     "space_node",
72     "space_outliner",
73     "space_properties",
74     "space_sequencer",
75     "space_text",
76     "space_time",
77     "space_userpref",
78     "space_view3d",
79     "space_view3d_toolbar",
80 ]
81
82 import bpy
83
84 if bpy.app.build_options.freestyle:
85     _modules.append("properties_freestyle")
86 __import__(name=__name__, fromlist=_modules)
87 _namespace = globals()
88 _modules_loaded = {name: _namespace[name] for name in _modules if name != 'bpy'}
89 del _namespace
90
91
92 def register():
93     bpy.utils.register_module(__name__)
94
95     # space_userprefs.py
96     from bpy.props import StringProperty, EnumProperty
97     from bpy.types import WindowManager
98
99     def addon_filter_items(self, context):
100         import addon_utils
101
102         items = [('All', "All", "All Addons"),
103                  ('User', "User", "All Addons Installed by User"),
104                  ('Enabled', "Enabled", "All Enabled Addons"),
105                  ('Disabled', "Disabled", "All Disabled Addons"),
106                  ]
107
108         items_unique = set()
109
110         for mod in addon_utils.modules(refresh=False):
111             info = addon_utils.module_bl_info(mod)
112             items_unique.add(info["category"])
113
114         items.extend([(cat, cat, "") for cat in sorted(items_unique)])
115         return items
116
117     WindowManager.addon_search = StringProperty(
118             name="Search",
119             description="Search within the selected filter",
120             )
121     WindowManager.addon_filter = EnumProperty(
122             items=addon_filter_items,
123             name="Category",
124             description="Filter addons by category",
125             )
126
127     WindowManager.addon_support = EnumProperty(
128             items=[('OFFICIAL', "Official", "Officially supported"),
129                    ('COMMUNITY', "Community", "Maintained by community developers"),
130                    ('TESTING', "Testing", "Newly contributed scripts (excluded from release builds)")
131                    ],
132             name="Support",
133             description="Display support level",
134             default={'OFFICIAL', 'COMMUNITY'},
135             options={'ENUM_FLAG'},
136             )
137     # done...
138
139
140 def unregister():
141     bpy.utils.unregister_module(__name__)
142
143
144 # Define a default UIList, when a list does not need any custom drawing...
145 # Keep in sync with its #defined name in UI_interface.h
146 class UI_UL_list(bpy.types.UIList):
147     # These are common filtering or ordering operations (same as the default C ones!).
148     @staticmethod
149     def filter_items_by_name(pattern, bitflag, items, propname="name", flags=None, reverse=False):
150         """
151         Set FILTER_ITEM for items which name matches filter_name one (case-insensitive).
152         pattern is the filtering pattern.
153         propname is the name of the string property to use for filtering.
154         flags must be a list of integers the same length as items, or None!
155         return a list of flags (based on given flags if not None),
156         or an empty list if no flags were given and no filtering has been done.
157         """
158         import fnmatch
159
160         if not pattern or not items:  # Empty pattern or list = no filtering!
161             return flags or []
162
163         if flags is None:
164             flags = [0] * len(items)
165
166         # Implicitly add heading/trailing wildcards.
167         pattern = "*" + pattern + "*"
168
169         for i, item in enumerate(items):
170             name = getattr(item, propname, None)
171             # This is similar to a logical xor
172             if bool(name and fnmatch.fnmatchcase(name, pattern)) is not bool(reverse):
173                 flags[i] |= bitflag
174         return flags
175
176     @staticmethod
177     def sort_items_helper(sort_data, key, reverse=False):
178         """
179         Common sorting utility. Returns a neworder list mapping org_idx -> new_idx.
180         sort_data must be an (unordered) list of tuples [(org_idx, ...), (org_idx, ...), ...].
181         key must be the same kind of callable you would use for sorted() builtin function.
182         reverse will reverse the sorting!
183         """
184         sort_data.sort(key=key, reverse=reverse)
185         neworder = [None] * len(sort_data)
186         for newidx, (orgidx, *_) in enumerate(sort_data):
187             neworder[orgidx] = newidx
188         return neworder
189
190     @classmethod
191     def sort_items_by_name(cls, items, propname="name"):
192         """
193         Re-order items using their names (case-insensitive).
194         propname is the name of the string property to use for sorting.
195         return a list mapping org_idx -> new_idx,
196                or an empty list if no sorting has been done.
197         """
198         _sort = [(idx, getattr(it, propname, "")) for idx, it in enumerate(items)]
199         return cls.sort_items_helper(_sort, lambda e: e[1].lower())
200
201
202 bpy.utils.register_class(UI_UL_list)