ac773e21d94d765f845104cfe1299dd61cc14acd
[blender.git] / release / scripts / presets / keyconfig / blender.py
1 import os
2 import bpy
3 from bpy.props import (
4     BoolProperty,
5     EnumProperty,
6 )
7
8 dirname, filename = os.path.split(__file__)
9 idname = os.path.splitext(filename)[0]
10
11 def update_fn(_self, _context):
12     load()
13
14
15 class Prefs(bpy.types.KeyConfigPreferences):
16     bl_idname = idname
17
18     select_mouse: EnumProperty(
19         name="Select Mouse",
20         items=(
21             ('LEFT', "Left",
22              "Use left mouse button for selection. "
23              "The standard behavior that works well for mouse, trackpad and tablet devices"),
24             ('RIGHT', "Right",
25              "Use right mouse button for selection, and left mouse button for actions. "
26              "This works well primarily for keyboard and mouse devices"),
27         ),
28         description=(
29             "Mouse button used for selection"
30         ),
31         default='LEFT',
32         update=update_fn,
33     )
34     spacebar_action: EnumProperty(
35         name="Spacebar Action",
36         items=(
37             ('PLAY', "Play",
38              "Toggle animation playback "
39              "('Shift-Space' for Tools)",
40              1),
41             ('TOOL', "Tools",
42              "Open the popup tool-bar\n"
43              "When 'Space' is held and used as a modifier:\n"
44              "\u2022 Pressing the tools binding key switches to it immediately.\n"
45              "\u2022 Dragging the cursor over a tool and releasing activates it (like a pie menu).\n"
46              "For Play use 'Shift-Space'",
47              0),
48             ('SEARCH', "Search",
49              "Open the operator search popup",
50              2),
51         ),
52         description=(
53             "Action when 'Space' is pressed"
54         ),
55         default='PLAY',
56         update=update_fn,
57     )
58     use_select_all_toggle: BoolProperty(
59         name="Select All Toggles",
60         description=(
61             "Causes select-all ('A' key) to de-select in the case a selection exists"
62         ),
63         default=False,
64         update=update_fn,
65     )
66
67     gizmo_action: EnumProperty(
68         name="Activate Gizmo",
69         items=(
70             ('PRESS', "Press", "Press causes immediate activation, preventing click being passed to the tool"),
71             ('DRAG', "Drag", "Drag allows click events to pass through to the tool, adding a small delay"),
72         ),
73         description="Activation event for gizmos that support drag motion",
74         update=update_fn,
75     )
76
77     # 3D View
78     use_v3d_tab_menu: BoolProperty(
79         name="Tab for Pie Menu",
80         description=(
81             "Causes tab to open pie menu (swaps 'Tab' / 'Ctrl-Tab')"
82         ),
83         default=False,
84         update=update_fn,
85     )
86     use_v3d_shade_ex_pie: BoolProperty(
87         name="Extra Shading Pie Menu Items",
88         description=(
89             "Show additional options in the shading menu ('Z')"
90         ),
91         default=False,
92         update=update_fn,
93     )
94     v3d_tilde_action: EnumProperty(
95         name="Tilde Action",
96         items=(
97             ('VIEW', "Navigate",
98              "View operations (useful for keyboards without a numpad)",
99              0),
100             ('GIZMO', "Gizmos",
101              "Control transform gizmos",
102              1),
103         ),
104         description=(
105             "Action when 'Tilde' is pressed"
106         ),
107         default='VIEW',
108         update=update_fn,
109     )
110
111     # Developer note, this is an experemental option.
112     use_pie_click_drag: BoolProperty(
113         name="Pie Menu on Drag",
114         description=(
115             "Activate some pie menus on drag,\n"
116             "allowing the tapping the same key to have a secondary action.\n"
117             "\n"
118              "\u2022 Tapping Tab in the 3D view toggles edit-mode, drag for mode menu.\n"
119              "\u2022 Tapping Z in the 3D view toggles wireframe, drag for draw modes.\n"
120              "\u2022 Tapping Tilde in the 3D view for first person navigation, drag for view axes"
121         ),
122         default=False,
123         update=update_fn,
124     )
125
126     def draw(self, layout):
127         is_select_left = (self.select_mouse == 'LEFT')
128
129         split = layout.split()
130         col = split.column(align=True)
131         col.label(text="Select With:")
132         col.row().prop(self, "select_mouse", expand=True)
133
134         if is_select_left:
135             col.label(text="Activate Gizmo:")
136             col.row().prop(self, "gizmo_action", expand=True)
137         else:
138             col.label()
139             col.label()
140
141         col.prop(self, "use_select_all_toggle")
142
143         col = split.column(align=True)
144         col.label(text="Spacebar Action:")
145         col.row().prop(self, "spacebar_action", expand=True)
146
147         layout.label(text="3D View:")
148         split = layout.split()
149         col = split.column()
150         col.prop(self, "use_v3d_tab_menu")
151         col.prop(self, "use_pie_click_drag")
152         col = split.column()
153         col.label(text="Tilde Action:")
154         col.row().prop(self, "v3d_tilde_action", expand=True)
155         col.prop(self, "use_v3d_shade_ex_pie")
156
157
158 blender_default = bpy.utils.execfile(os.path.join(dirname, "keymap_data", "blender_default.py"))
159
160
161 def load():
162     from sys import platform
163     from bpy import context
164     from bl_keymap_utils.io import keyconfig_init_from_data
165
166     prefs = context.preferences
167     kc = context.window_manager.keyconfigs.new(idname)
168     kc_prefs = kc.preferences
169
170     keyconfig_data = blender_default.generate_keymaps(
171         blender_default.Params(
172             select_mouse=kc_prefs.select_mouse,
173             use_mouse_emulate_3_button=prefs.inputs.use_mouse_emulate_3_button,
174             spacebar_action=kc_prefs.spacebar_action,
175             v3d_tilde_action=kc_prefs.v3d_tilde_action,
176             use_select_all_toggle=kc_prefs.use_select_all_toggle,
177             use_v3d_tab_menu=kc_prefs.use_v3d_tab_menu,
178             use_v3d_shade_ex_pie=kc_prefs.use_v3d_shade_ex_pie,
179             use_gizmo_drag=(
180                 kc_prefs.select_mouse == 'LEFT' and
181                 kc_prefs.gizmo_action == 'DRAG'
182             ),
183             use_pie_click_drag=kc_prefs.use_pie_click_drag,
184         ),
185     )
186
187     if platform == 'darwin':
188         from bl_keymap_utils.platform_helpers import keyconfig_data_oskey_from_ctrl_for_macos
189         keyconfig_data = keyconfig_data_oskey_from_ctrl_for_macos(keyconfig_data)
190
191     keyconfig_init_from_data(kc, keyconfig_data)
192
193
194 if __name__ == "__main__":
195     bpy.utils.register_class(Prefs)
196     load()