Merging r57989 through r58072 from trunk into soc-2013-depsgraph_mt
This commit is contained in:
@@ -24,6 +24,8 @@
|
||||
from freestyle import AdjacencyIterator, ChainingIterator, ExternalContourUP1D, Nature, TVertex
|
||||
from freestyle import ContextFunctions as CF
|
||||
|
||||
import bpy
|
||||
|
||||
## the natural chaining iterator
|
||||
## It follows the edges of same nature following the topology of
|
||||
## objects with preseance on silhouettes, then borders,
|
||||
@@ -212,7 +214,7 @@ class pySketchyChainSilhouetteIterator(ChainingIterator):
|
||||
visitNext = 1
|
||||
break
|
||||
if visitNext != 0:
|
||||
break
|
||||
break
|
||||
count = count+1
|
||||
winner = ve
|
||||
it.increment()
|
||||
@@ -238,14 +240,22 @@ class pySketchyChainingIterator(ChainingIterator):
|
||||
self._timeStamp = CF.get_time_stamp()+self._nRounds
|
||||
def traverse(self, iter):
|
||||
winner = None
|
||||
found = False
|
||||
it = AdjacencyIterator(iter)
|
||||
while not it.is_end:
|
||||
ve = it.object
|
||||
if ve.id == self.current_edge.id:
|
||||
found = True
|
||||
it.increment()
|
||||
continue
|
||||
winner = ve
|
||||
it.increment()
|
||||
if not found:
|
||||
# This is a fatal error condition: self.current_edge must be found
|
||||
# among the edges seen by the AdjacencyIterator [bug #35695].
|
||||
if bpy.app.debug_freestyle:
|
||||
print('pySketchyChainingIterator: current edge not found')
|
||||
return None
|
||||
if winner is None:
|
||||
winner = self.current_edge
|
||||
if winner.chaining_time_stamp == self._timeStamp:
|
||||
|
||||
@@ -32,7 +32,7 @@ from freestyle import BackboneStretcherShader, BezierCurveShader, BinaryPredicat
|
||||
FalseBP1D, FalseUP1D, GuidingLinesShader, Interface0DIterator, Nature, Noise, Normal2DF0D, Operators, \
|
||||
PolygonalizationShader, QuantitativeInvisibilityF1D, QuantitativeInvisibilityUP1D, SamplingShader, \
|
||||
SpatialNoiseShader, StrokeAttribute, StrokeShader, TipRemoverShader, TrueBP1D, TrueUP1D, UnaryPredicate0D, \
|
||||
UnaryPredicate1D, VertexOrientation2DF0D, WithinImageBoundaryUP1D
|
||||
UnaryPredicate1D, VertexOrientation2DF0D, WithinImageBoundaryUP1D, ContextFunctions
|
||||
from Functions0D import CurveMaterialF0D
|
||||
from PredicatesU1D import pyNatureUP1D
|
||||
from logical_operators import AndUP1D, NotUP1D, OrUP1D
|
||||
@@ -1046,17 +1046,7 @@ def process(layer_name, lineset_name):
|
||||
selection_criteria.append(upred)
|
||||
# prepare selection criteria by image border
|
||||
if lineset.select_by_image_border:
|
||||
fac = scene.render.resolution_percentage / 100.0
|
||||
w = scene.render.resolution_x * fac
|
||||
h = scene.render.resolution_y * fac
|
||||
if scene.render.use_border:
|
||||
xmin = scene.render.border_min_x * w
|
||||
xmax = scene.render.border_max_x * w
|
||||
ymin = scene.render.border_min_y * h
|
||||
ymax = scene.render.border_max_y * h
|
||||
else:
|
||||
xmin, xmax = 0.0, float(w)
|
||||
ymin, ymax = 0.0, float(h)
|
||||
xmin, ymin, xmax, ymax = ContextFunctions.get_border()
|
||||
upred = WithinImageBoundaryUP1D(xmin, ymin, xmax, ymax)
|
||||
selection_criteria.append(upred)
|
||||
# select feature edges
|
||||
|
||||
@@ -31,6 +31,7 @@ def bake_action(frame_start,
|
||||
only_selected=False,
|
||||
do_pose=True,
|
||||
do_object=True,
|
||||
do_visual_keying=True,
|
||||
do_constraint_clear=False,
|
||||
do_parents_clear=False,
|
||||
do_clean=False,
|
||||
@@ -53,7 +54,9 @@ def bake_action(frame_start,
|
||||
:type do_pose: bool
|
||||
:arg do_object: Bake objects.
|
||||
:type do_object: bool
|
||||
:arg do_constraint_clear: Remove constraints (and do 'visual keying').
|
||||
:arg do_visual_keying: Use the final transformations for baking ('visual keying')
|
||||
:type do_visual_keying: bool
|
||||
:arg do_constraint_clear: Remove constraints after baking.
|
||||
:type do_constraint_clear: bool
|
||||
:arg do_parents_clear: Unparent after baking objects.
|
||||
:type do_parents_clear: bool
|
||||
@@ -83,14 +86,14 @@ def bake_action(frame_start,
|
||||
if do_parents_clear:
|
||||
def obj_frame_info(obj, do_visual_keying):
|
||||
parent = obj.parent
|
||||
matrix = obj.matrix_local if do_visual_keying else obj.matrix_basis
|
||||
matrix = obj.matrix_local if do_visual_keying else obj.matrix_local
|
||||
if parent:
|
||||
return parent.matrix_world * matrix
|
||||
else:
|
||||
return matrix.copy()
|
||||
else:
|
||||
def obj_frame_info(obj, do_visual_keying):
|
||||
return obj.matrix_local.copy() if do_visual_keying else obj.matrix_basis.copy()
|
||||
return obj.matrix_local.copy() if do_visual_keying else obj.matrix_local.copy()
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Setup the Context
|
||||
@@ -118,10 +121,11 @@ def bake_action(frame_start,
|
||||
|
||||
for f in frame_range:
|
||||
scene.frame_set(f)
|
||||
scene.update()
|
||||
if do_pose:
|
||||
pose_info.append(pose_frame_info(obj, do_constraint_clear))
|
||||
pose_info.append(pose_frame_info(obj, do_visual_keying))
|
||||
if do_object:
|
||||
obj_info.append(obj_frame_info(obj, do_constraint_clear))
|
||||
obj_info.append(obj_frame_info(obj, do_visual_keying))
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Create action
|
||||
|
||||
@@ -190,6 +190,11 @@ class BakeAction(Operator):
|
||||
description="Only key selected object/bones",
|
||||
default=True,
|
||||
)
|
||||
visual_keying = BoolProperty(
|
||||
name="Visual Keying",
|
||||
description="Keyframe from the final transformations (with constraints applied)",
|
||||
default=False,
|
||||
)
|
||||
clear_constraints = BoolProperty(
|
||||
name="Clear Constraints",
|
||||
description="Remove all constraints from keyed object/bones, and do 'visual' keying",
|
||||
@@ -220,6 +225,7 @@ class BakeAction(Operator):
|
||||
only_selected=self.only_selected,
|
||||
do_pose='POSE' in self.bake_types,
|
||||
do_object='OBJECT' in self.bake_types,
|
||||
do_visual_keying=self.visual_keying,
|
||||
do_constraint_clear=self.clear_constraints,
|
||||
do_parents_clear=self.clear_parents,
|
||||
do_clean=True,
|
||||
|
||||
@@ -471,24 +471,6 @@ class WM_OT_context_cycle_array(Operator):
|
||||
return operator_path_undo_return(context, data_path)
|
||||
|
||||
|
||||
class WM_MT_context_menu_enum(Menu):
|
||||
bl_label = ""
|
||||
data_path = "" # BAD DESIGN, set from operator below.
|
||||
|
||||
def draw(self, context):
|
||||
data_path = self.data_path
|
||||
value = context_path_validate(context, data_path)
|
||||
if value is Ellipsis:
|
||||
return {'PASS_THROUGH'}
|
||||
base_path, prop_string = data_path.rsplit(".", 1)
|
||||
value_base = context_path_validate(context, base_path)
|
||||
prop = value_base.bl_rna.properties[prop_string]
|
||||
|
||||
layout = self.layout
|
||||
layout.label(prop.name, icon=prop.icon)
|
||||
layout.prop(value_base, prop_string, expand=True)
|
||||
|
||||
|
||||
class WM_OT_context_menu_enum(Operator):
|
||||
bl_idname = "wm.context_menu_enum"
|
||||
bl_label = "Context Enum Menu"
|
||||
@@ -497,8 +479,21 @@ class WM_OT_context_menu_enum(Operator):
|
||||
|
||||
def execute(self, context):
|
||||
data_path = self.data_path
|
||||
WM_MT_context_menu_enum.data_path = data_path
|
||||
bpy.ops.wm.call_menu(name="WM_MT_context_menu_enum")
|
||||
value = context_path_validate(context, data_path)
|
||||
|
||||
if value is Ellipsis:
|
||||
return {'PASS_THROUGH'}
|
||||
|
||||
base_path, prop_string = data_path.rsplit(".", 1)
|
||||
value_base = context_path_validate(context, base_path)
|
||||
prop = value_base.bl_rna.properties[prop_string]
|
||||
|
||||
def draw_cb(self, context):
|
||||
layout = self.layout
|
||||
layout.prop(value_base, prop_string, expand=True)
|
||||
|
||||
context.window_manager.popup_menu(draw_func=draw_cb, title=prop.name, icon=prop.icon)
|
||||
|
||||
return {'PASS_THROUGH'}
|
||||
|
||||
|
||||
|
||||
@@ -72,7 +72,6 @@ _modules = [
|
||||
"space_sequencer",
|
||||
"space_text",
|
||||
"space_time",
|
||||
"space_userpref_keymap",
|
||||
"space_userpref",
|
||||
"space_view3d",
|
||||
"space_view3d_toolbar",
|
||||
|
||||
@@ -33,7 +33,7 @@ class MESH_MT_vertex_group_specials(Menu):
|
||||
layout.operator("object.vertex_group_copy", icon='COPY_ID')
|
||||
layout.operator("object.vertex_group_copy_to_linked", icon='LINK_AREA')
|
||||
layout.operator("object.vertex_group_copy_to_selected", icon='LINK_AREA')
|
||||
layout.operator("object.vertex_group_mirror", icon='ARROW_LEFTRIGHT')
|
||||
layout.operator("object.vertex_group_mirror", icon='ARROW_LEFTRIGHT').use_topology = False
|
||||
layout.operator("object.vertex_group_mirror", text="Mirror Vertex Group (Topology)", icon='ARROW_LEFTRIGHT').use_topology = True
|
||||
layout.operator("object.vertex_group_remove_from", icon='X', text="Remove from All Groups").use_all_groups = True
|
||||
layout.operator("object.vertex_group_remove_from", icon='X', text="Clear Active Group").use_all_verts = True
|
||||
@@ -53,7 +53,7 @@ class MESH_MT_shape_key_specials(Menu):
|
||||
|
||||
layout.operator("object.shape_key_transfer", icon='COPY_ID') # icon is not ideal
|
||||
layout.operator("object.join_shapes", icon='COPY_ID') # icon is not ideal
|
||||
layout.operator("object.shape_key_mirror", icon='ARROW_LEFTRIGHT')
|
||||
layout.operator("object.shape_key_mirror", icon='ARROW_LEFTRIGHT').use_topology = False
|
||||
layout.operator("object.shape_key_mirror", text="Mirror Shape Key (Topology)", icon='ARROW_LEFTRIGHT').use_topology = True
|
||||
layout.operator("object.shape_key_add", icon='ZOOMIN', text="New Shape From Mix").from_mix = True
|
||||
layout.operator("object.shape_key_remove", icon='X', text="Delete All Shapes").all = True
|
||||
|
||||
@@ -917,9 +917,6 @@ class USERPREF_PT_file(Panel):
|
||||
col.prop(system, "author", text="")
|
||||
|
||||
|
||||
from bl_ui.space_userpref_keymap import InputKeyMapPanel
|
||||
|
||||
|
||||
class USERPREF_MT_ndof_settings(Menu):
|
||||
# accessed from the window key-bindings in C (only)
|
||||
bl_label = "3D Mouse Settings"
|
||||
@@ -960,9 +957,25 @@ class USERPREF_MT_ndof_settings(Menu):
|
||||
layout.prop(input_prefs, "ndof_lock_horizon", icon='NDOF_DOM')
|
||||
|
||||
|
||||
class USERPREF_PT_input(Panel, InputKeyMapPanel):
|
||||
class USERPREF_MT_keyconfigs(Menu):
|
||||
bl_label = "KeyPresets"
|
||||
preset_subdir = "keyconfig"
|
||||
preset_operator = "wm.keyconfig_activate"
|
||||
|
||||
def draw(self, context):
|
||||
props = self.layout.operator("wm.context_set_value", text="Blender (default)")
|
||||
props.data_path = "window_manager.keyconfigs.active"
|
||||
props.value = "context.window_manager.keyconfigs.default"
|
||||
|
||||
# now draw the presets
|
||||
Menu.draw_preset(self, context)
|
||||
|
||||
|
||||
class USERPREF_PT_input(Panel):
|
||||
bl_space_type = 'USER_PREFERENCES'
|
||||
bl_label = "Input"
|
||||
bl_region_type = 'WINDOW'
|
||||
bl_options = {'HIDE_HEADER'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
@@ -1039,6 +1052,8 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel):
|
||||
row.separator()
|
||||
|
||||
def draw(self, context):
|
||||
from bl_ui.space_userpref_keymap import draw_keymaps
|
||||
|
||||
layout = self.layout
|
||||
|
||||
#import time
|
||||
@@ -1055,7 +1070,7 @@ class USERPREF_PT_input(Panel, InputKeyMapPanel):
|
||||
self.draw_input_prefs(inputs, split)
|
||||
|
||||
# Keymap Settings
|
||||
self.draw_keymaps(context, split)
|
||||
draw_keymaps(context, split)
|
||||
|
||||
#print("runtime", time.time() - start)
|
||||
|
||||
|
||||
@@ -17,375 +17,368 @@
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
|
||||
__all__ = (
|
||||
"draw_entry",
|
||||
"draw_km",
|
||||
"draw_kmi",
|
||||
"draw_filtered",
|
||||
"draw_hierarchy",
|
||||
"draw_keymaps",
|
||||
)
|
||||
|
||||
|
||||
import bpy
|
||||
from bpy.types import Menu
|
||||
from bpy.app.translations import pgettext_iface as iface_
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
|
||||
|
||||
class USERPREF_MT_keyconfigs(Menu):
|
||||
bl_label = "KeyPresets"
|
||||
preset_subdir = "keyconfig"
|
||||
preset_operator = "wm.keyconfig_activate"
|
||||
def _indented_layout(layout, level):
|
||||
indentpx = 16
|
||||
if level == 0:
|
||||
level = 0.0001 # Tweak so that a percentage of 0 won't split by half
|
||||
indent = level * indentpx / bpy.context.region.width
|
||||
|
||||
def draw(self, context):
|
||||
props = self.layout.operator("wm.context_set_value", text="Blender (default)")
|
||||
props.data_path = "window_manager.keyconfigs.active"
|
||||
props.value = "context.window_manager.keyconfigs.default"
|
||||
|
||||
# now draw the presets
|
||||
Menu.draw_preset(self, context)
|
||||
split = layout.split(percentage=indent)
|
||||
col = split.column()
|
||||
col = split.column()
|
||||
return col
|
||||
|
||||
|
||||
class InputKeyMapPanel:
|
||||
bl_space_type = 'USER_PREFERENCES'
|
||||
bl_label = "Input"
|
||||
bl_region_type = 'WINDOW'
|
||||
bl_options = {'HIDE_HEADER'}
|
||||
def draw_entry(display_keymaps, entry, col, level=0):
|
||||
idname, spaceid, regionid, children = entry
|
||||
|
||||
def draw_entry(self, display_keymaps, entry, col, level=0):
|
||||
idname, spaceid, regionid, children = entry
|
||||
for km, kc in display_keymaps:
|
||||
if km.name == idname and km.space_type == spaceid and km.region_type == regionid:
|
||||
draw_km(display_keymaps, kc, km, children, col, level)
|
||||
|
||||
for km, kc in display_keymaps:
|
||||
if km.name == idname and km.space_type == spaceid and km.region_type == regionid:
|
||||
self.draw_km(display_keymaps, kc, km, children, col, level)
|
||||
|
||||
'''
|
||||
'''
|
||||
km = kc.keymaps.find(idname, space_type=spaceid, region_type=regionid)
|
||||
if not km:
|
||||
kc = defkc
|
||||
km = kc.keymaps.find(idname, space_type=spaceid, region_type=regionid)
|
||||
if not km:
|
||||
kc = defkc
|
||||
km = kc.keymaps.find(idname, space_type=spaceid, region_type=regionid)
|
||||
|
||||
if km:
|
||||
self.draw_km(kc, km, children, col, level)
|
||||
'''
|
||||
if km:
|
||||
draw_km(kc, km, children, col, level)
|
||||
'''
|
||||
|
||||
def indented_layout(self, layout, level):
|
||||
indentpx = 16
|
||||
if level == 0:
|
||||
level = 0.0001 # Tweak so that a percentage of 0 won't split by half
|
||||
indent = level * indentpx / bpy.context.region.width
|
||||
|
||||
split = layout.split(percentage=indent)
|
||||
col = split.column()
|
||||
col = split.column()
|
||||
return col
|
||||
def draw_km(display_keymaps, kc, km, children, layout, level):
|
||||
km = km.active()
|
||||
|
||||
def draw_km(self, display_keymaps, kc, km, children, layout, level):
|
||||
km = km.active()
|
||||
layout.context_pointer_set("keymap", km)
|
||||
|
||||
layout.context_pointer_set("keymap", km)
|
||||
col = _indented_layout(layout, level)
|
||||
|
||||
col = self.indented_layout(layout, level)
|
||||
row = col.row()
|
||||
row.prop(km, "show_expanded_children", text="", emboss=False)
|
||||
row.label(text=km.name, text_ctxt=i18n_contexts.id_windowmanager)
|
||||
|
||||
row = col.row()
|
||||
row.prop(km, "show_expanded_children", text="", emboss=False)
|
||||
row.label(text=km.name, text_ctxt=i18n_contexts.id_windowmanager)
|
||||
row.label()
|
||||
row.label()
|
||||
|
||||
row.label()
|
||||
if km.is_modal:
|
||||
row.label(text="", icon='LINKED')
|
||||
if km.is_user_modified:
|
||||
row.operator("wm.keymap_restore", text="Restore")
|
||||
else:
|
||||
row.label()
|
||||
|
||||
if km.is_modal:
|
||||
row.label(text="", icon='LINKED')
|
||||
if km.is_user_modified:
|
||||
row.operator("wm.keymap_restore", text="Restore")
|
||||
if km.show_expanded_children:
|
||||
if children:
|
||||
# Put the Parent key map's entries in a 'global' sub-category
|
||||
# equal in hierarchy to the other children categories
|
||||
subcol = _indented_layout(col, level + 1)
|
||||
subrow = subcol.row()
|
||||
subrow.prop(km, "show_expanded_items", text="", emboss=False)
|
||||
subrow.label(text=iface_("%s (Global)") % km.name, translate=False)
|
||||
else:
|
||||
row.label()
|
||||
km.show_expanded_items = True
|
||||
|
||||
if km.show_expanded_children:
|
||||
if children:
|
||||
# Put the Parent key map's entries in a 'global' sub-category
|
||||
# equal in hierarchy to the other children categories
|
||||
subcol = self.indented_layout(col, level + 1)
|
||||
subrow = subcol.row()
|
||||
subrow.prop(km, "show_expanded_items", text="", emboss=False)
|
||||
subrow.label(text=iface_("%s (Global)") % km.name, translate=False)
|
||||
else:
|
||||
km.show_expanded_items = True
|
||||
# Key Map items
|
||||
if km.show_expanded_items:
|
||||
for kmi in km.keymap_items:
|
||||
draw_kmi(display_keymaps, kc, km, kmi, col, level + 1)
|
||||
|
||||
# Key Map items
|
||||
if km.show_expanded_items:
|
||||
for kmi in km.keymap_items:
|
||||
self.draw_kmi(display_keymaps, kc, km, kmi, col, level + 1)
|
||||
|
||||
# "Add New" at end of keymap item list
|
||||
col = self.indented_layout(col, level + 1)
|
||||
subcol = col.split(percentage=0.2).column()
|
||||
subcol.operator("wm.keyitem_add", text="Add New", text_ctxt=i18n_contexts.id_windowmanager,
|
||||
icon='ZOOMIN')
|
||||
|
||||
col.separator()
|
||||
|
||||
# Child key maps
|
||||
if children:
|
||||
subcol = col.column()
|
||||
row = subcol.row()
|
||||
|
||||
for entry in children:
|
||||
self.draw_entry(display_keymaps, entry, col, level + 1)
|
||||
|
||||
def draw_kmi(self, display_keymaps, kc, km, kmi, layout, level):
|
||||
map_type = kmi.map_type
|
||||
|
||||
col = self.indented_layout(layout, level)
|
||||
|
||||
if kmi.show_expanded:
|
||||
col = col.column(align=True)
|
||||
box = col.box()
|
||||
else:
|
||||
box = col.column()
|
||||
|
||||
split = box.split(percentage=0.05)
|
||||
|
||||
# header bar
|
||||
row = split.row()
|
||||
row.prop(kmi, "show_expanded", text="", emboss=False)
|
||||
|
||||
row = split.row()
|
||||
row.prop(kmi, "active", text="", emboss=False)
|
||||
|
||||
if km.is_modal:
|
||||
row.prop(kmi, "propvalue", text="")
|
||||
else:
|
||||
row.label(text=kmi.name)
|
||||
|
||||
row = split.row()
|
||||
row.prop(kmi, "map_type", text="")
|
||||
if map_type == 'KEYBOARD':
|
||||
row.prop(kmi, "type", text="", full_event=True)
|
||||
elif map_type == 'MOUSE':
|
||||
row.prop(kmi, "type", text="", full_event=True)
|
||||
elif map_type == 'NDOF':
|
||||
row.prop(kmi, "type", text="", full_event=True)
|
||||
elif map_type == 'TWEAK':
|
||||
subrow = row.row()
|
||||
subrow.prop(kmi, "type", text="")
|
||||
subrow.prop(kmi, "value", text="")
|
||||
elif map_type == 'TIMER':
|
||||
row.prop(kmi, "type", text="")
|
||||
else:
|
||||
row.label()
|
||||
|
||||
if (not kmi.is_user_defined) and kmi.is_user_modified:
|
||||
row.operator("wm.keyitem_restore", text="", icon='BACK').item_id = kmi.id
|
||||
else:
|
||||
row.operator("wm.keyitem_remove", text="", icon='X').item_id = kmi.id
|
||||
|
||||
# Expanded, additional event settings
|
||||
if kmi.show_expanded:
|
||||
box = col.box()
|
||||
|
||||
split = box.split(percentage=0.4)
|
||||
sub = split.row()
|
||||
|
||||
if km.is_modal:
|
||||
sub.prop(kmi, "propvalue", text="")
|
||||
else:
|
||||
# One day...
|
||||
#~ sub.prop_search(kmi, "idname", bpy.context.window_manager, "operators_all", text="")
|
||||
sub.prop(kmi, "idname", text="")
|
||||
|
||||
if map_type not in {'TEXTINPUT', 'TIMER'}:
|
||||
sub = split.column()
|
||||
subrow = sub.row(align=True)
|
||||
|
||||
if map_type == 'KEYBOARD':
|
||||
subrow.prop(kmi, "type", text="", event=True)
|
||||
subrow.prop(kmi, "value", text="")
|
||||
elif map_type in {'MOUSE', 'NDOF'}:
|
||||
subrow.prop(kmi, "type", text="")
|
||||
subrow.prop(kmi, "value", text="")
|
||||
|
||||
subrow = sub.row()
|
||||
subrow.scale_x = 0.75
|
||||
subrow.prop(kmi, "any")
|
||||
subrow.prop(kmi, "shift")
|
||||
subrow.prop(kmi, "ctrl")
|
||||
subrow.prop(kmi, "alt")
|
||||
subrow.prop(kmi, "oskey", text="Cmd")
|
||||
subrow.prop(kmi, "key_modifier", text="", event=True)
|
||||
|
||||
# Operator properties
|
||||
box.template_keymap_item_properties(kmi)
|
||||
|
||||
# Modal key maps attached to this operator
|
||||
if not km.is_modal:
|
||||
kmm = kc.keymaps.find_modal(kmi.idname)
|
||||
if kmm:
|
||||
self.draw_km(display_keymaps, kc, kmm, None, layout, level + 1)
|
||||
layout.context_pointer_set("keymap", km)
|
||||
|
||||
_EVENT_TYPES = set()
|
||||
_EVENT_TYPE_MAP = {}
|
||||
|
||||
def draw_filtered(self, display_keymaps, filter_type, filter_text, layout):
|
||||
|
||||
if filter_type == 'NAME':
|
||||
def filter_func(kmi):
|
||||
return (filter_text in kmi.idname.lower() or
|
||||
filter_text in kmi.name.lower())
|
||||
else:
|
||||
if not self._EVENT_TYPES:
|
||||
enum = bpy.types.Event.bl_rna.properties["type"].enum_items
|
||||
self._EVENT_TYPES.update(enum.keys())
|
||||
self._EVENT_TYPE_MAP.update({item.name.replace(" ", "_").upper(): key for key, item in enum.items()})
|
||||
|
||||
del enum
|
||||
self._EVENT_TYPE_MAP.update({
|
||||
"`": 'ACCENT_GRAVE',
|
||||
"*": 'NUMPAD_ASTERIX',
|
||||
"/": 'NUMPAD_SLASH',
|
||||
"RMB": 'RIGHTMOUSE',
|
||||
"LMB": 'LEFTMOUSE',
|
||||
"MMB": 'MIDDLEMOUSE',
|
||||
})
|
||||
self._EVENT_TYPE_MAP.update({
|
||||
"%d" % i: "NUMPAD_%d" % i for i in range(9)
|
||||
})
|
||||
# done with once off init
|
||||
|
||||
filter_text_split = filter_text.strip()
|
||||
filter_text_split = filter_text.split()
|
||||
|
||||
# Modifier {kmi.attribute: name} mapping
|
||||
key_mod = {
|
||||
"ctrl": "ctrl",
|
||||
"alt": "alt",
|
||||
"shift": "shift",
|
||||
"cmd": "oskey",
|
||||
"oskey": "oskey",
|
||||
"any": "any",
|
||||
}
|
||||
# KeyMapItem like dict, use for comparing against
|
||||
# attr: state
|
||||
kmi_test_dict = {}
|
||||
|
||||
# initialize? - so if a if a kmi has a MOD assigned it wont show up.
|
||||
#~ for kv in key_mod.values():
|
||||
#~ kmi_test_dict[kv] = False
|
||||
|
||||
# altname: attr
|
||||
for kk, kv in key_mod.items():
|
||||
if kk in filter_text_split:
|
||||
filter_text_split.remove(kk)
|
||||
kmi_test_dict[kv] = True
|
||||
# whats left should be the event type
|
||||
if len(filter_text_split) > 1:
|
||||
return False
|
||||
elif filter_text_split:
|
||||
kmi_type = filter_text_split[0].upper()
|
||||
|
||||
if kmi_type not in self._EVENT_TYPES:
|
||||
# replacement table
|
||||
kmi_type_test = self._EVENT_TYPE_MAP.get(kmi_type)
|
||||
if kmi_type_test is None:
|
||||
# print("Unknown Type:", kmi_type)
|
||||
|
||||
# Partial match
|
||||
for k, v in self._EVENT_TYPE_MAP.items():
|
||||
if kmi_type in k:
|
||||
kmi_type_test = v
|
||||
break
|
||||
if kmi_type in v:
|
||||
kmi_type_test = v
|
||||
break
|
||||
|
||||
if kmi_type_test is None:
|
||||
return False
|
||||
|
||||
kmi_type = kmi_type_test
|
||||
del kmi_type_test
|
||||
|
||||
kmi_test_dict["type"] = kmi_type
|
||||
|
||||
# main filter func, runs many times
|
||||
def filter_func(kmi):
|
||||
for kk, ki in kmi_test_dict.items():
|
||||
if getattr(kmi, kk) != ki:
|
||||
return False
|
||||
return True
|
||||
|
||||
for km, kc in display_keymaps:
|
||||
km = km.active()
|
||||
layout.context_pointer_set("keymap", km)
|
||||
|
||||
filtered_items = [kmi for kmi in km.keymap_items if filter_func(kmi)]
|
||||
|
||||
if filtered_items:
|
||||
col = layout.column()
|
||||
|
||||
row = col.row()
|
||||
row.label(text=km.name, icon='DOT')
|
||||
|
||||
row.label()
|
||||
row.label()
|
||||
|
||||
if km.is_user_modified:
|
||||
row.operator("wm.keymap_restore", text="Restore")
|
||||
else:
|
||||
row.label()
|
||||
|
||||
for kmi in filtered_items:
|
||||
self.draw_kmi(display_keymaps, kc, km, kmi, col, 1)
|
||||
|
||||
# "Add New" at end of keymap item list
|
||||
col = self.indented_layout(layout, 1)
|
||||
subcol = col.split(percentage=0.2).column()
|
||||
subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN')
|
||||
return True
|
||||
|
||||
def draw_hierarchy(self, display_keymaps, layout):
|
||||
from bpy_extras import keyconfig_utils
|
||||
for entry in keyconfig_utils.KM_HIERARCHY:
|
||||
self.draw_entry(display_keymaps, entry, layout)
|
||||
|
||||
def draw_keymaps(self, context, layout):
|
||||
from bpy_extras import keyconfig_utils
|
||||
|
||||
wm = context.window_manager
|
||||
kc = wm.keyconfigs.user
|
||||
spref = context.space_data
|
||||
|
||||
col = layout.column()
|
||||
sub = col.column()
|
||||
|
||||
subsplit = sub.split()
|
||||
subcol = subsplit.column()
|
||||
|
||||
row = subcol.row(align=True)
|
||||
|
||||
#~ row.prop_search(wm.keyconfigs, "active", wm, "keyconfigs", text="Key Config:")
|
||||
text = bpy.path.display_name(wm.keyconfigs.active.name)
|
||||
if not text:
|
||||
text = "Blender (default)"
|
||||
row.menu("USERPREF_MT_keyconfigs", text=text)
|
||||
row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMIN')
|
||||
row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMOUT').remove_active = True
|
||||
|
||||
#~ layout.context_pointer_set("keyconfig", wm.keyconfigs.active)
|
||||
#~ row.operator("wm.keyconfig_remove", text="", icon='X')
|
||||
row.separator()
|
||||
rowsub = row.split(align=True, percentage=0.33)
|
||||
# postpone drawing into rowsub, so we can set alert!
|
||||
# "Add New" at end of keymap item list
|
||||
col = _indented_layout(col, level + 1)
|
||||
subcol = col.split(percentage=0.2).column()
|
||||
subcol.operator("wm.keyitem_add", text="Add New", text_ctxt=i18n_contexts.id_windowmanager,
|
||||
icon='ZOOMIN')
|
||||
|
||||
col.separator()
|
||||
display_keymaps = keyconfig_utils.keyconfig_merge(kc, kc)
|
||||
filter_type = spref.filter_type
|
||||
filter_text = spref.filter_text.strip()
|
||||
if filter_text:
|
||||
filter_text = filter_text.lower()
|
||||
ok = self.draw_filtered(display_keymaps, filter_type, filter_text, col)
|
||||
|
||||
# Child key maps
|
||||
if children:
|
||||
subcol = col.column()
|
||||
row = subcol.row()
|
||||
|
||||
for entry in children:
|
||||
draw_entry(display_keymaps, entry, col, level + 1)
|
||||
|
||||
|
||||
def draw_kmi(display_keymaps, kc, km, kmi, layout, level):
|
||||
map_type = kmi.map_type
|
||||
|
||||
col = _indented_layout(layout, level)
|
||||
|
||||
if kmi.show_expanded:
|
||||
col = col.column(align=True)
|
||||
box = col.box()
|
||||
else:
|
||||
box = col.column()
|
||||
|
||||
split = box.split(percentage=0.05)
|
||||
|
||||
# header bar
|
||||
row = split.row()
|
||||
row.prop(kmi, "show_expanded", text="", emboss=False)
|
||||
|
||||
row = split.row()
|
||||
row.prop(kmi, "active", text="", emboss=False)
|
||||
|
||||
if km.is_modal:
|
||||
row.prop(kmi, "propvalue", text="")
|
||||
else:
|
||||
row.label(text=kmi.name)
|
||||
|
||||
row = split.row()
|
||||
row.prop(kmi, "map_type", text="")
|
||||
if map_type == 'KEYBOARD':
|
||||
row.prop(kmi, "type", text="", full_event=True)
|
||||
elif map_type == 'MOUSE':
|
||||
row.prop(kmi, "type", text="", full_event=True)
|
||||
elif map_type == 'NDOF':
|
||||
row.prop(kmi, "type", text="", full_event=True)
|
||||
elif map_type == 'TWEAK':
|
||||
subrow = row.row()
|
||||
subrow.prop(kmi, "type", text="")
|
||||
subrow.prop(kmi, "value", text="")
|
||||
elif map_type == 'TIMER':
|
||||
row.prop(kmi, "type", text="")
|
||||
else:
|
||||
row.label()
|
||||
|
||||
if (not kmi.is_user_defined) and kmi.is_user_modified:
|
||||
row.operator("wm.keyitem_restore", text="", icon='BACK').item_id = kmi.id
|
||||
else:
|
||||
row.operator("wm.keyitem_remove", text="", icon='X').item_id = kmi.id
|
||||
|
||||
# Expanded, additional event settings
|
||||
if kmi.show_expanded:
|
||||
box = col.box()
|
||||
|
||||
split = box.split(percentage=0.4)
|
||||
sub = split.row()
|
||||
|
||||
if km.is_modal:
|
||||
sub.prop(kmi, "propvalue", text="")
|
||||
else:
|
||||
self.draw_hierarchy(display_keymaps, col)
|
||||
ok = True
|
||||
# One day...
|
||||
#~ sub.prop_search(kmi, "idname", bpy.context.window_manager, "operators_all", text="")
|
||||
sub.prop(kmi, "idname", text="")
|
||||
|
||||
# go back and fill in rowsub
|
||||
rowsub.prop(spref, "filter_type", text="")
|
||||
rowsubsub = rowsub.row(align=True)
|
||||
if not ok:
|
||||
rowsubsub.alert = True
|
||||
rowsubsub.prop(spref, "filter_text", text="", icon='VIEWZOOM')
|
||||
if map_type not in {'TEXTINPUT', 'TIMER'}:
|
||||
sub = split.column()
|
||||
subrow = sub.row(align=True)
|
||||
|
||||
if map_type == 'KEYBOARD':
|
||||
subrow.prop(kmi, "type", text="", event=True)
|
||||
subrow.prop(kmi, "value", text="")
|
||||
elif map_type in {'MOUSE', 'NDOF'}:
|
||||
subrow.prop(kmi, "type", text="")
|
||||
subrow.prop(kmi, "value", text="")
|
||||
|
||||
subrow = sub.row()
|
||||
subrow.scale_x = 0.75
|
||||
subrow.prop(kmi, "any")
|
||||
subrow.prop(kmi, "shift")
|
||||
subrow.prop(kmi, "ctrl")
|
||||
subrow.prop(kmi, "alt")
|
||||
subrow.prop(kmi, "oskey", text="Cmd")
|
||||
subrow.prop(kmi, "key_modifier", text="", event=True)
|
||||
|
||||
# Operator properties
|
||||
box.template_keymap_item_properties(kmi)
|
||||
|
||||
# Modal key maps attached to this operator
|
||||
if not km.is_modal:
|
||||
kmm = kc.keymaps.find_modal(kmi.idname)
|
||||
if kmm:
|
||||
draw_km(display_keymaps, kc, kmm, None, layout, level + 1)
|
||||
layout.context_pointer_set("keymap", km)
|
||||
|
||||
_EVENT_TYPES = set()
|
||||
_EVENT_TYPE_MAP = {}
|
||||
|
||||
|
||||
if __name__ == "__main__": # only for live edit.
|
||||
bpy.utils.register_module(__name__)
|
||||
def draw_filtered(display_keymaps, filter_type, filter_text, layout):
|
||||
|
||||
if filter_type == 'NAME':
|
||||
def filter_func(kmi):
|
||||
return (filter_text in kmi.idname.lower() or
|
||||
filter_text in kmi.name.lower())
|
||||
else:
|
||||
if not _EVENT_TYPES:
|
||||
enum = bpy.types.Event.bl_rna.properties["type"].enum_items
|
||||
_EVENT_TYPES.update(enum.keys())
|
||||
_EVENT_TYPE_MAP.update({item.name.replace(" ", "_").upper(): key
|
||||
for key, item in enum.items()})
|
||||
|
||||
del enum
|
||||
_EVENT_TYPE_MAP.update({
|
||||
"`": 'ACCENT_GRAVE',
|
||||
"*": 'NUMPAD_ASTERIX',
|
||||
"/": 'NUMPAD_SLASH',
|
||||
"RMB": 'RIGHTMOUSE',
|
||||
"LMB": 'LEFTMOUSE',
|
||||
"MMB": 'MIDDLEMOUSE',
|
||||
})
|
||||
_EVENT_TYPE_MAP.update({
|
||||
"%d" % i: "NUMPAD_%d" % i for i in range(9)
|
||||
})
|
||||
# done with once off init
|
||||
|
||||
filter_text_split = filter_text.strip()
|
||||
filter_text_split = filter_text.split()
|
||||
|
||||
# Modifier {kmi.attribute: name} mapping
|
||||
key_mod = {
|
||||
"ctrl": "ctrl",
|
||||
"alt": "alt",
|
||||
"shift": "shift",
|
||||
"cmd": "oskey",
|
||||
"oskey": "oskey",
|
||||
"any": "any",
|
||||
}
|
||||
# KeyMapItem like dict, use for comparing against
|
||||
# attr: state
|
||||
kmi_test_dict = {}
|
||||
|
||||
# initialize? - so if a if a kmi has a MOD assigned it wont show up.
|
||||
#~ for kv in key_mod.values():
|
||||
#~ kmi_test_dict[kv] = False
|
||||
|
||||
# altname: attr
|
||||
for kk, kv in key_mod.items():
|
||||
if kk in filter_text_split:
|
||||
filter_text_split.remove(kk)
|
||||
kmi_test_dict[kv] = True
|
||||
# whats left should be the event type
|
||||
if len(filter_text_split) > 1:
|
||||
return False
|
||||
elif filter_text_split:
|
||||
kmi_type = filter_text_split[0].upper()
|
||||
|
||||
if kmi_type not in _EVENT_TYPES:
|
||||
# replacement table
|
||||
kmi_type_test = _EVENT_TYPE_MAP.get(kmi_type)
|
||||
if kmi_type_test is None:
|
||||
# print("Unknown Type:", kmi_type)
|
||||
|
||||
# Partial match
|
||||
for k, v in _EVENT_TYPE_MAP.items():
|
||||
if kmi_type in k:
|
||||
kmi_type_test = v
|
||||
break
|
||||
if kmi_type in v:
|
||||
kmi_type_test = v
|
||||
break
|
||||
|
||||
if kmi_type_test is None:
|
||||
return False
|
||||
|
||||
kmi_type = kmi_type_test
|
||||
del kmi_type_test
|
||||
|
||||
kmi_test_dict["type"] = kmi_type
|
||||
|
||||
# main filter func, runs many times
|
||||
def filter_func(kmi):
|
||||
for kk, ki in kmi_test_dict.items():
|
||||
if getattr(kmi, kk) != ki:
|
||||
return False
|
||||
return True
|
||||
|
||||
for km, kc in display_keymaps:
|
||||
km = km.active()
|
||||
layout.context_pointer_set("keymap", km)
|
||||
|
||||
filtered_items = [kmi for kmi in km.keymap_items if filter_func(kmi)]
|
||||
|
||||
if filtered_items:
|
||||
col = layout.column()
|
||||
|
||||
row = col.row()
|
||||
row.label(text=km.name, icon='DOT')
|
||||
|
||||
row.label()
|
||||
row.label()
|
||||
|
||||
if km.is_user_modified:
|
||||
row.operator("wm.keymap_restore", text="Restore")
|
||||
else:
|
||||
row.label()
|
||||
|
||||
for kmi in filtered_items:
|
||||
draw_kmi(display_keymaps, kc, km, kmi, col, 1)
|
||||
|
||||
# "Add New" at end of keymap item list
|
||||
col = _indented_layout(layout, 1)
|
||||
subcol = col.split(percentage=0.2).column()
|
||||
subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN')
|
||||
return True
|
||||
|
||||
|
||||
def draw_hierarchy(display_keymaps, layout):
|
||||
from bpy_extras import keyconfig_utils
|
||||
for entry in keyconfig_utils.KM_HIERARCHY:
|
||||
draw_entry(display_keymaps, entry, layout)
|
||||
|
||||
|
||||
def draw_keymaps(context, layout):
|
||||
from bpy_extras import keyconfig_utils
|
||||
|
||||
wm = context.window_manager
|
||||
kc = wm.keyconfigs.user
|
||||
spref = context.space_data
|
||||
|
||||
col = layout.column()
|
||||
sub = col.column()
|
||||
|
||||
subsplit = sub.split()
|
||||
subcol = subsplit.column()
|
||||
|
||||
row = subcol.row(align=True)
|
||||
|
||||
#~ row.prop_search(wm.keyconfigs, "active", wm, "keyconfigs", text="Key Config:")
|
||||
text = bpy.path.display_name(wm.keyconfigs.active.name)
|
||||
if not text:
|
||||
text = "Blender (default)"
|
||||
row.menu("USERPREF_MT_keyconfigs", text=text)
|
||||
row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMIN')
|
||||
row.operator("wm.keyconfig_preset_add", text="", icon='ZOOMOUT').remove_active = True
|
||||
|
||||
#~ layout.context_pointer_set("keyconfig", wm.keyconfigs.active)
|
||||
#~ row.operator("wm.keyconfig_remove", text="", icon='X')
|
||||
row.separator()
|
||||
rowsub = row.split(align=True, percentage=0.33)
|
||||
# postpone drawing into rowsub, so we can set alert!
|
||||
|
||||
col.separator()
|
||||
display_keymaps = keyconfig_utils.keyconfig_merge(kc, kc)
|
||||
filter_type = spref.filter_type
|
||||
filter_text = spref.filter_text.strip()
|
||||
if filter_text:
|
||||
filter_text = filter_text.lower()
|
||||
ok = draw_filtered(display_keymaps, filter_type, filter_text, col)
|
||||
else:
|
||||
draw_hierarchy(display_keymaps, col)
|
||||
ok = True
|
||||
|
||||
# go back and fill in rowsub
|
||||
rowsub.prop(spref, "filter_type", text="")
|
||||
rowsubsub = rowsub.row(align=True)
|
||||
if not ok:
|
||||
rowsubsub.alert = True
|
||||
rowsubsub.prop(spref, "filter_text", text="", icon='VIEWZOOM')
|
||||
|
||||
@@ -617,8 +617,8 @@ class VIEW3D_MT_select_edit_mesh(Menu):
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.operator("mesh.select_less", text="Less")
|
||||
layout.operator("mesh.select_more", text="More")
|
||||
layout.operator("mesh.select_less", text="Less")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user