1 # ##### BEGIN GPL LICENSE BLOCK #####
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.
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.
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.
17 # ##### END GPL LICENSE BLOCK #####
19 # PEP8 compliant (https://www.python.org/dev/peps/pep-0008)
22 "name": "Is key Free",
23 "author": "Antonio Vazquez (antonioya)",
26 "location": "Text Editor > Props Shelf (Ctrl/t > IsKeyFree Tools",
27 "description": "Find free shortcuts and inform of used keys",
28 "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6"
29 "/Py/Scripts/Development/IsKeyFree",
30 "category": "Development"}
33 from bpy
.props
import (
39 from bpy
.types
import (
46 # ------------------------------------------------------
47 # Class to find keymaps
48 # ------------------------------------------------------
60 # Verify if the key is used
62 def check(cls
, findkey
, ctrl
, alt
, shift
, oskey
):
73 cls
.lastfind
= cmd
+ findkey
.upper()
74 cls
.lastkey
= findkey
.upper()
79 wm
= bpy
.context
.window_manager
82 for context
, keyboardmap
in wm
.keyconfigs
.user
.keymaps
.items():
83 for myitem
in keyboardmap
.keymap_items
:
84 if myitem
.active
is True and myitem
.type == findkey
:
85 if ctrl
is True and myitem
.ctrl
is not True:
87 if alt
is True and myitem
.alt
is not True:
89 if shift
is True and myitem
.shift
is not True:
91 if oskey
is True and myitem
.oskey
is not True:
95 "Ctrl" if myitem
.ctrl
is True else "",
96 "Alt" if myitem
.alt
is True else "",
97 "Shift" if myitem
.shift
is True else "",
98 "OsKey" if myitem
.oskey
is True else "",
103 sortkeys
= sorted(mykeys
, key
=lambda key
: (key
[0], key
[1], key
[2], key
[3], key
[4], key
[5]))
121 cls
.mylist
.append([e
[0], cmd
])
126 return str(bpy
.context
.screen
.name
)
138 # return result of last search
143 # verify if key is valid
145 def isvalidkey(cls
, txt
):
147 "LEFTMOUSE", "MIDDLEMOUSE", "RIGHTMOUSE", "BUTTON4MOUSE", "BUTTON5MOUSE", "BUTTON6MOUSE",
149 "ACTIONMOUSE", "SELECTMOUSE", "MOUSEMOVE", "INBETWEEN_MOUSEMOVE", "TRACKPADPAN", "TRACKPADZOOM",
150 "MOUSEROTATE", "WHEELUPMOUSE", "WHEELDOWNMOUSE", "WHEELINMOUSE", "WHEELOUTMOUSE", "EVT_TWEAK_L",
151 "EVT_TWEAK_M", "EVT_TWEAK_R", "EVT_TWEAK_A", "EVT_TWEAK_S", "A", "B", "C", "D", "E", "F", "G", "H",
153 "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "ZERO", "ONE", "TWO",
154 "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "LEFT_CTRL", "LEFT_ALT", "LEFT_SHIFT",
156 "RIGHT_CTRL", "RIGHT_SHIFT", "OSKEY", "GRLESS", "ESC", "TAB", "RET", "SPACE", "LINE_FEED",
158 "DEL", "SEMI_COLON", "PERIOD", "COMMA", "QUOTE", "ACCENT_GRAVE", "MINUS", "SLASH", "BACK_SLASH",
160 "LEFT_BRACKET", "RIGHT_BRACKET", "LEFT_ARROW", "DOWN_ARROW", "RIGHT_ARROW", "UP_ARROW", "NUMPAD_2",
161 "NUMPAD_4", "NUMPAD_6", "NUMPAD_8", "NUMPAD_1", "NUMPAD_3", "NUMPAD_5", "NUMPAD_7", "NUMPAD_9",
162 "NUMPAD_PERIOD", "NUMPAD_SLASH", "NUMPAD_ASTERIX", "NUMPAD_0", "NUMPAD_MINUS", "NUMPAD_ENTER",
164 "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15",
166 "F18", "F19", "PAUSE", "INSERT", "HOME", "PAGE_UP", "PAGE_DOWN", "END", "MEDIA_PLAY", "MEDIA_STOP",
167 "MEDIA_FIRST", "MEDIA_LAST", "TEXTINPUT", "WINDOW_DEACTIVATE", "TIMER", "TIMER0", "TIMER1", "TIMER2",
168 "TIMER_JOBS", "TIMER_AUTOSAVE", "TIMER_REPORT", "TIMERREGION", "NDOF_MOTION", "NDOF_BUTTON_MENU",
169 "NDOF_BUTTON_FIT", "NDOF_BUTTON_TOP", "NDOF_BUTTON_BOTTOM", "NDOF_BUTTON_LEFT", "NDOF_BUTTON_RIGHT",
170 "NDOF_BUTTON_FRONT", "NDOF_BUTTON_BACK", "NDOF_BUTTON_ISO1", "NDOF_BUTTON_ISO2",
171 "NDOF_BUTTON_ROLL_CW",
172 "NDOF_BUTTON_ROLL_CCW", "NDOF_BUTTON_SPIN_CW", "NDOF_BUTTON_SPIN_CCW", "NDOF_BUTTON_TILT_CW",
173 "NDOF_BUTTON_TILT_CCW", "NDOF_BUTTON_ROTATE", "NDOF_BUTTON_PANZOOM", "NDOF_BUTTON_DOMINANT",
174 "NDOF_BUTTON_PLUS", "NDOF_BUTTON_MINUS", "NDOF_BUTTON_ESC", "NDOF_BUTTON_ALT", "NDOF_BUTTON_SHIFT",
175 "NDOF_BUTTON_CTRL", "NDOF_BUTTON_1", "NDOF_BUTTON_2", "NDOF_BUTTON_3", "NDOF_BUTTON_4",
177 "NDOF_BUTTON_6", "NDOF_BUTTON_7", "NDOF_BUTTON_8", "NDOF_BUTTON_9", "NDOF_BUTTON_10",
179 "NDOF_BUTTON_B", "NDOF_BUTTON_C"
188 mychecker
= MyChecker() # Global class handler
191 # ------------------------------------------------------
192 # Button: Class for search button
193 # ------------------------------------------------------
196 class RunActionCheck(Operator
):
197 bl_idname
= "iskeyfree.action_check"
199 bl_description
= "Verify if the selected shortcut is free"
201 # ------------------------------
203 # ------------------------------
204 # noinspection PyUnusedLocal
205 def execute(self
, context
):
206 scene
= context
.scene
.is_keyfree
207 txt
= scene
.data
.upper()
209 mychecker
.check(txt
, scene
.use_crtl
, scene
.use_alt
, scene
.use_shift
,
215 # ------------------------------------------------------
217 # ------------------------------------------------------
218 class UIControlPanel(Panel
):
219 bl_idname
= "DEVISKEYFREE_PT_ui"
220 bl_space_type
= "TEXT_EDITOR"
221 bl_region_type
= "UI"
222 bl_label
= "Is Key Free"
224 # noinspection PyUnusedLocal
225 def draw(self
, context
):
227 scene
= context
.scene
.is_keyfree
229 row
= layout
.row(align
=True)
230 row
.prop(scene
, "data")
231 row
.operator("iskeyfree.action_check", icon
="VIEWZOOM")
233 row
= layout
.row(align
=True)
234 row
.prop(scene
, "use_crtl", toggle
=True)
235 row
.prop(scene
, "use_alt", toggle
=True)
236 row
.prop(scene
, "use_shift", toggle
=True)
237 row
.prop(scene
, "use_oskey", toggle
=True)
240 row
.prop(scene
, "numpad")
243 mylist
= mychecker
.getlist()
248 cmd
= mychecker
.getlast()
251 row
.label("Current uses of " + str(cmd
), icon
="PARTICLE_DATA")
253 if oldcontext
!= e
[0]:
255 box
.label(e
[0], icon
="UNPINNED")
258 row
= box
.row(align
=True)
261 cmd
= mychecker
.getlast()
264 if mychecker
.isvalidkey(mychecker
.getlastkey()) is False:
265 box
.label(str(mychecker
.getlastkey()) + " looks not valid key", icon
="ERROR")
267 box
.label(str(cmd
) + " is free", icon
="FILE_TICK")
270 # ------------------------------------------------------
271 # Update key (special values) event handler
272 # ------------------------------------------------------
275 # noinspection PyUnusedLocal
276 def update_data(self
, context
):
277 scene
= context
.scene
.is_keyfree
278 if scene
.numpad
!= "NONE":
279 scene
.data
= scene
.numpad
282 class IskeyFreeProperties(PropertyGroup
):
283 data
= StringProperty(
284 name
="Key", maxlen
=32,
285 description
="Shortcut to verify"
287 use_crtl
= BoolProperty(
289 description
="Ctrl key used in shortcut",
292 use_alt
= BoolProperty(
294 description
="Alt key used in shortcut",
297 use_shift
= BoolProperty(
299 description
="Shift key used in shortcut",
302 use_oskey
= BoolProperty(
304 description
="Operating system key used in shortcut",
307 numpad
= EnumProperty(
308 items
=(('NONE', "Select key", ""),
309 ("LEFTMOUSE", "LEFTMOUSE", ""),
310 ("MIDDLEMOUSE", "MIDDLEMOUSE", ""),
311 ("RIGHTMOUSE", "RIGHTMOUSE", ""),
312 ("BUTTON4MOUSE", "BUTTON4MOUSE", ""),
313 ("BUTTON5MOUSE", "BUTTON5MOUSE", ""),
314 ("BUTTON6MOUSE", "BUTTON6MOUSE", ""),
315 ("BUTTON7MOUSE", "BUTTON7MOUSE", ""),
316 ("ACTIONMOUSE", "ACTIONMOUSE", ""),
317 ("SELECTMOUSE", "SELECTMOUSE", ""),
318 ("MOUSEMOVE", "MOUSEMOVE", ""),
319 ("INBETWEEN_MOUSEMOVE", "INBETWEEN_MOUSEMOVE", ""),
320 ("TRACKPADPAN", "TRACKPADPAN", ""),
321 ("TRACKPADZOOM", "TRACKPADZOOM", ""),
322 ("MOUSEROTATE", "MOUSEROTATE", ""),
323 ("WHEELUPMOUSE", "WHEELUPMOUSE", ""),
324 ("WHEELDOWNMOUSE", "WHEELDOWNMOUSE", ""),
325 ("WHEELINMOUSE", "WHEELINMOUSE", ""),
326 ("WHEELOUTMOUSE", "WHEELOUTMOUSE", ""),
327 ("EVT_TWEAK_L", "EVT_TWEAK_L", ""),
328 ("EVT_TWEAK_M", "EVT_TWEAK_M", ""),
329 ("EVT_TWEAK_R", "EVT_TWEAK_R", ""),
330 ("EVT_TWEAK_A", "EVT_TWEAK_A", ""),
331 ("EVT_TWEAK_S", "EVT_TWEAK_S", ""),
358 ("ZERO", "ZERO", ""),
361 ("THREE", "THREE", ""),
362 ("FOUR", "FOUR", ""),
363 ("FIVE", "FIVE", ""),
365 ("SEVEN", "SEVEN", ""),
366 ("EIGHT", "EIGHT", ""),
367 ("NINE", "NINE", ""),
368 ("LEFT_CTRL", "LEFT_CTRL", ""),
369 ("LEFT_ALT", "LEFT_ALT", ""),
370 ("LEFT_SHIFT", "LEFT_SHIFT", ""),
371 ("RIGHT_ALT", "RIGHT_ALT", ""),
372 ("RIGHT_CTRL", "RIGHT_CTRL", ""),
373 ("RIGHT_SHIFT", "RIGHT_SHIFT", ""),
374 ("OSKEY", "OSKEY", ""),
375 ("GRLESS", "GRLESS", ""),
379 ("SPACE", "SPACE", ""),
380 ("LINE_FEED", "LINE_FEED", ""),
381 ("BACK_SPACE", "BACK_SPACE", ""),
383 ("SEMI_COLON", "SEMI_COLON", ""),
384 ("PERIOD", "PERIOD", ""),
385 ("COMMA", "COMMA", ""),
386 ("QUOTE", "QUOTE", ""),
387 ("ACCENT_GRAVE", "ACCENT_GRAVE", ""),
388 ("MINUS", "MINUS", ""),
389 ("SLASH", "SLASH", ""),
390 ("BACK_SLASH", "BACK_SLASH", ""),
391 ("EQUAL", "EQUAL", ""),
392 ("LEFT_BRACKET", "LEFT_BRACKET", ""),
393 ("RIGHT_BRACKET", "RIGHT_BRACKET", ""),
394 ("LEFT_ARROW", "LEFT_ARROW", ""),
395 ("DOWN_ARROW", "DOWN_ARROW", ""),
396 ("RIGHT_ARROW", "RIGHT_ARROW", ""),
397 ("UP_ARROW", "UP_ARROW", ""),
398 ("NUMPAD_1", "NUMPAD_1", ""),
399 ("NUMPAD_2", "NUMPAD_2", ""),
400 ("NUMPAD_3", "NUMPAD_3", ""),
401 ("NUMPAD_4", "NUMPAD_4", ""),
402 ("NUMPAD_5", "NUMPAD_5", ""),
403 ("NUMPAD_6", "NUMPAD_6", ""),
404 ("NUMPAD_7", "NUMPAD_7", ""),
405 ("NUMPAD_8", "NUMPAD_8", ""),
406 ("NUMPAD_9", "NUMPAD_9", ""),
407 ("NUMPAD_0", "NUMPAD_0", ""),
408 ("NUMPAD_PERIOD", "NUMPAD_PERIOD", ""),
409 ("NUMPAD_SLASH", "NUMPAD_SLASH", ""),
410 ("NUMPAD_ASTERIX", "NUMPAD_ASTERIX", ""),
411 ("NUMPAD_MINUS", "NUMPAD_MINUS", ""),
412 ("NUMPAD_ENTER", "NUMPAD_ENTER", ""),
413 ("NUMPAD_PLUS", "NUMPAD_PLUS", ""),
433 ("PAUSE", "PAUSE", ""),
434 ("INSERT", "INSERT", ""),
435 ("HOME", "HOME", ""),
436 ("PAGE_UP", "PAGE_UP", ""),
437 ("PAGE_DOWN", "PAGE_DOWN", ""),
439 ("MEDIA_PLAY", "MEDIA_PLAY", ""),
440 ("MEDIA_STOP", "MEDIA_STOP", ""),
441 ("MEDIA_FIRST", "MEDIA_FIRST", ""),
442 ("MEDIA_LAST", "MEDIA_LAST", ""),
443 ("TEXTINPUT", "TEXTINPUT", ""),
444 ("WINDOW_DEACTIVATE", "WINDOW_DEACTIVATE", ""),
445 ("TIMER", "TIMER", ""),
446 ("TIMER0", "TIMER0", ""),
447 ("TIMER1", "TIMER1", ""),
448 ("TIMER2", "TIMER2", ""),
449 ("TIMER_JOBS", "TIMER_JOBS", ""),
450 ("TIMER_AUTOSAVE", "TIMER_AUTOSAVE", ""),
451 ("TIMER_REPORT", "TIMER_REPORT", ""),
452 ("TIMERREGION", "TIMERREGION", ""),
453 ("NDOF_MOTION", "NDOF_MOTION", ""),
454 ("NDOF_BUTTON_MENU", "NDOF_BUTTON_MENU", ""),
455 ("NDOF_BUTTON_FIT", "NDOF_BUTTON_FIT", ""),
456 ("NDOF_BUTTON_TOP", "NDOF_BUTTON_TOP", ""),
457 ("NDOF_BUTTON_BOTTOM", "NDOF_BUTTON_BOTTOM", ""),
458 ("NDOF_BUTTON_LEFT", "NDOF_BUTTON_LEFT", ""),
459 ("NDOF_BUTTON_RIGHT", "NDOF_BUTTON_RIGHT", ""),
460 ("NDOF_BUTTON_FRONT", "NDOF_BUTTON_FRONT", ""),
461 ("NDOF_BUTTON_BACK", "NDOF_BUTTON_BACK", ""),
462 ("NDOF_BUTTON_ISO1", "NDOF_BUTTON_ISO1", ""),
463 ("NDOF_BUTTON_ISO2", "NDOF_BUTTON_ISO2", ""),
464 ("NDOF_BUTTON_ROLL_CW", "NDOF_BUTTON_ROLL_CW", ""),
465 ("NDOF_BUTTON_ROLL_CCW", "NDOF_BUTTON_ROLL_CCW", ""),
466 ("NDOF_BUTTON_SPIN_CW", "NDOF_BUTTON_SPIN_CW", ""),
467 ("NDOF_BUTTON_SPIN_CCW", "NDOF_BUTTON_SPIN_CCW", ""),
468 ("NDOF_BUTTON_TILT_CW", "NDOF_BUTTON_TILT_CW", ""),
469 ("NDOF_BUTTON_TILT_CCW", "NDOF_BUTTON_TILT_CCW", ""),
470 ("NDOF_BUTTON_ROTATE", "NDOF_BUTTON_ROTATE", ""),
471 ("NDOF_BUTTON_PANZOOM", "NDOF_BUTTON_PANZOOM", ""),
472 ("NDOF_BUTTON_DOMINANT", "NDOF_BUTTON_DOMINANT", ""),
473 ("NDOF_BUTTON_PLUS", "NDOF_BUTTON_PLUS", ""),
474 ("NDOF_BUTTON_MINUS", "NDOF_BUTTON_MINUS", ""),
475 ("NDOF_BUTTON_ESC", "NDOF_BUTTON_ESC", ""),
476 ("NDOF_BUTTON_ALT", "NDOF_BUTTON_ALT", ""),
477 ("NDOF_BUTTON_SHIFT", "NDOF_BUTTON_SHIFT", ""),
478 ("NDOF_BUTTON_CTRL", "NDOF_BUTTON_CTRL", ""),
479 ("NDOF_BUTTON_1", "NDOF_BUTTON_1", ""),
480 ("NDOF_BUTTON_2", "NDOF_BUTTON_2", ""),
481 ("NDOF_BUTTON_3", "NDOF_BUTTON_3", ""),
482 ("NDOF_BUTTON_4", "NDOF_BUTTON_4", ""),
483 ("NDOF_BUTTON_5", "NDOF_BUTTON_5", ""),
484 ("NDOF_BUTTON_6", "NDOF_BUTTON_6", ""),
485 ("NDOF_BUTTON_7", "NDOF_BUTTON_7", ""),
486 ("NDOF_BUTTON_8", "NDOF_BUTTON_8", ""),
487 ("NDOF_BUTTON_9", "NDOF_BUTTON_9", ""),
488 ("NDOF_BUTTON_10", "NDOF_BUTTON_10", ""),
489 ("NDOF_BUTTON_A", "NDOF_BUTTON_A", ""),
490 ("NDOF_BUTTON_B", "NDOF_BUTTON_B", ""),
491 ("NDOF_BUTTON_C", "NDOF_BUTTON_C", "")
494 description
="Enter key code in find text",
499 # -----------------------------------------------------
501 # ------------------------------------------------------
504 bpy
.utils
.register_module(__name__
)
505 bpy
.types
.Scene
.is_keyfree
= PointerProperty(type=IskeyFreeProperties
)
509 bpy
.utils
.unregister_module(__name__
)
510 del bpy
.types
.Scene
.is_keyfree