Tool System: split UI label from tool identifiers

Prepare for exposing tool registration to the Python API.

- Generated tools can use their own prefix so naming collisions
  won't happen between hard coded & generated tools.
- Add-on authors can use the add-on name as a prefix.

Currently the names match, renaming will happen next.
This commit is contained in:
2019-03-15 12:45:41 +11:00
parent 388ff003e2
commit 3400fe3ece
14 changed files with 340 additions and 212 deletions

View File

@@ -59,7 +59,7 @@ def generate(context, space_type):
for item in ToolSelectPanelHelper._tools_flatten(cls.tools_from_context(context)) for item in ToolSelectPanelHelper._tools_flatten(cls.tools_from_context(context))
if item is not None if item is not None
] ]
items_all_text = {item_container[0].text for item_container in items_all} items_all_id = {item_container[0].idname for item_container in items_all}
# Press the toolbar popup key again to set the default tool, # Press the toolbar popup key again to set the default tool,
# this is useful because the select box tool is useful as a way # this is useful because the select box tool is useful as a way
@@ -70,7 +70,7 @@ def generate(context, space_type):
# TODO: support other tools for modes which don't use this tool. # TODO: support other tools for modes which don't use this tool.
tap_reset_tool = "Cursor" tap_reset_tool = "Cursor"
# Check the tool is available in the current context. # Check the tool is available in the current context.
if tap_reset_tool not in items_all_text: if tap_reset_tool not in items_all_id:
use_tap_reset = False use_tap_reset = False
from bl_operators.wm import use_toolbar_release_hack from bl_operators.wm import use_toolbar_release_hack
@@ -102,13 +102,13 @@ def generate(context, space_type):
for kmi_src in keymap_src.keymap_items: for kmi_src in keymap_src.keymap_items:
# Skip tools that aren't currently shown. # Skip tools that aren't currently shown.
if ( if (
(kmi_src.idname == "wm.tool_set_by_name") and (kmi_src.idname == "wm.tool_set_by_id") and
(kmi_src.properties.name not in items_all_text) (kmi_src.properties.name not in items_all_id)
): ):
continue continue
keymap.keymap_items.new_from_item(kmi_src) keymap.keymap_items.new_from_item(kmi_src)
del keymap_src del keymap_src
del items_all_text del items_all_id
kmi_unique_args = set() kmi_unique_args = set()
@@ -122,7 +122,7 @@ def generate(context, space_type):
cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type) cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
if use_hack_properties: if use_hack_properties:
kmi_hack = keymap.keymap_items.new("wm.tool_set_by_name", 'NONE', 'PRESS') kmi_hack = keymap.keymap_items.new("wm.tool_set_by_id", 'NONE', 'PRESS')
kmi_hack_properties = kmi_hack.properties kmi_hack_properties = kmi_hack.properties
kmi_hack.active = False kmi_hack.active = False
@@ -148,9 +148,9 @@ def generate(context, space_type):
# First check for direct assignment, if this tool already has a key, no need to add a new one. # First check for direct assignment, if this tool already has a key, no need to add a new one.
kmi_hack_properties.name = tap_reset_tool kmi_hack_properties.name = tap_reset_tool
kmi_found = wm.keyconfigs.find_item_from_operator( kmi_found = wm.keyconfigs.find_item_from_operator(
idname="wm.tool_set_by_name", idname="wm.tool_set_by_id",
context='INVOKE_REGION_WIN', context='INVOKE_REGION_WIN',
# properties={"name": item.text}, # properties={"name": item.idname},
properties=kmi_hack_properties, properties=kmi_hack_properties,
include={'KEYBOARD'}, include={'KEYBOARD'},
)[1] )[1]
@@ -165,7 +165,7 @@ def generate(context, space_type):
items_all[:] = [ items_all[:] = [
item_container item_container
for item_container in items_all for item_container in items_all
if item_container[0].text != tap_reset_tool if item_container[0].idname != tap_reset_tool
] ]
# ----------------------- # -----------------------
@@ -179,11 +179,11 @@ def generate(context, space_type):
# Only check the first item in the tools key-map (a little arbitrary). # Only check the first item in the tools key-map (a little arbitrary).
if use_hack_properties: if use_hack_properties:
# First check for direct assignment. # First check for direct assignment.
kmi_hack_properties.name = item.text kmi_hack_properties.name = item.idname
kmi_found = wm.keyconfigs.find_item_from_operator( kmi_found = wm.keyconfigs.find_item_from_operator(
idname="wm.tool_set_by_name", idname="wm.tool_set_by_id",
context='INVOKE_REGION_WIN', context='INVOKE_REGION_WIN',
# properties={"name": item.text}, # properties={"name": item.idname},
properties=kmi_hack_properties, properties=kmi_hack_properties,
include={'KEYBOARD'}, include={'KEYBOARD'},
)[1] )[1]
@@ -229,7 +229,7 @@ def generate(context, space_type):
elif item.keymap is not None: elif item.keymap is not None:
km = keyconf_user.keymaps.get(item.keymap[0]) km = keyconf_user.keymaps.get(item.keymap[0])
if km is None: if km is None:
print("Keymap", repr(item.keymap[0]), "not found for tool", item.text) print("Keymap", repr(item.keymap[0]), "not found for tool", item.idname)
kmi_found = None kmi_found = None
else: else:
kmi_first = km.keymap_items kmi_first = km.keymap_items
@@ -274,12 +274,12 @@ def generate(context, space_type):
if ( if (
(len(kmi_found_type) == 1) or (len(kmi_found_type) == 1) or
# When a tool is being activated instead of running an operator, just copy the shortcut. # When a tool is being activated instead of running an operator, just copy the shortcut.
(kmi_found.idname in {"wm.tool_set_by_name", "WM_OT_tool_set_by_name"}) (kmi_found.idname in {"wm.tool_set_by_id", "WM_OT_tool_set_by_id"})
): ):
kmi_args = {"type": kmi_found_type, **modifier_keywords_from_item(kmi_found)} kmi_args = {"type": kmi_found_type, **modifier_keywords_from_item(kmi_found)}
if kmi_unique_or_pass(kmi_args): if kmi_unique_or_pass(kmi_args):
kmi = keymap.keymap_items.new(idname="wm.tool_set_by_name", value='PRESS', **kmi_args) kmi = keymap.keymap_items.new(idname="wm.tool_set_by_id", value='PRESS', **kmi_args)
kmi.properties.name = item.text kmi.properties.name = item.idname
item_container[2] = kmi item_container[2] = kmi
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
@@ -310,8 +310,8 @@ def generate(context, space_type):
kmi_args = {"type": kmi_found_type, **modifier_keywords_from_item(kmi_found)} kmi_args = {"type": kmi_found_type, **modifier_keywords_from_item(kmi_found)}
del kmi_args["key_modifier"] del kmi_args["key_modifier"]
if kmi_unique_or_pass(kmi_args): if kmi_unique_or_pass(kmi_args):
kmi = keymap.keymap_items.new(idname="wm.tool_set_by_name", value='PRESS', **kmi_args) kmi = keymap.keymap_items.new(idname="wm.tool_set_by_id", value='PRESS', **kmi_args)
kmi.properties.name = item.text kmi.properties.name = item.idname
item_container[2] = kmi item_container[2] = kmi
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
@@ -331,16 +331,16 @@ def generate(context, space_type):
item, kmi_found, kmi_exist = item_container item, kmi_found, kmi_exist = item_container
if kmi_exist: if kmi_exist:
continue continue
kmi_type = item.text[0].upper() kmi_type = item.label[0].upper()
kmi_tuple = kmi_type_alpha_args_tuple.get(kmi_type) kmi_tuple = kmi_type_alpha_args_tuple.get(kmi_type)
if kmi_tuple and kmi_tuple not in kmi_unique_args: if kmi_tuple and kmi_tuple not in kmi_unique_args:
kmi_unique_args.add(kmi_tuple) kmi_unique_args.add(kmi_tuple)
kmi = keymap.keymap_items.new( kmi = keymap.keymap_items.new(
idname="wm.tool_set_by_name", idname="wm.tool_set_by_id",
value='PRESS', value='PRESS',
**kmi_type_alpha_args[kmi_type], **kmi_type_alpha_args[kmi_type],
) )
kmi.properties.name = item.text kmi.properties.name = item.idname
item_container[2] = kmi item_container[2] = kmi
del kmi_type_alpha_char, kmi_type_alpha_args, kmi_type_alpha_args_tuple del kmi_type_alpha_char, kmi_type_alpha_args, kmi_type_alpha_args_tuple
@@ -388,8 +388,8 @@ def generate(context, space_type):
break break
if kmi_args is not None: if kmi_args is not None:
kmi = keymap.keymap_items.new(idname="wm.tool_set_by_name", value='PRESS', **kmi_args) kmi = keymap.keymap_items.new(idname="wm.tool_set_by_id", value='PRESS', **kmi_args)
kmi.properties.name = item.text kmi.properties.name = item.idname
item_container[2] = kmi item_container[2] = kmi
kmi_unique_args.add(kmi_tuple) kmi_unique_args.add(kmi_tuple)
@@ -398,8 +398,8 @@ def generate(context, space_type):
kmi_args["type"] = key kmi_args["type"] = key
kmi_tuple = dict_as_tuple(kmi_args) kmi_tuple = dict_as_tuple(kmi_args)
if not kmi_tuple in kmi_unique_args: if not kmi_tuple in kmi_unique_args:
kmi = keymap.keymap_items.new(idname="wm.tool_set_by_name", value='PRESS', **kmi_args) kmi = keymap.keymap_items.new(idname="wm.tool_set_by_id", value='PRESS', **kmi_args)
kmi.properties.name = item.text kmi.properties.name = item.idname
kmi_unique_args.add(kmi_tuple) kmi_unique_args.add(kmi_tuple)
@@ -426,7 +426,7 @@ def generate(context, space_type):
del kmi_toolbar_tuple del kmi_toolbar_tuple
kmi = keymap.keymap_items.new( kmi = keymap.keymap_items.new(
"wm.tool_set_by_name", "wm.tool_set_by_id",
value='PRESS' if use_toolbar_release_hack else 'DOUBLE_CLICK', value='PRESS' if use_toolbar_release_hack else 'DOUBLE_CLICK',
**kmi_toolbar_args_available, **kmi_toolbar_args_available,
) )
@@ -445,7 +445,7 @@ def generate(context, space_type):
# ... or pass through to let the toolbar know we're released. # ... or pass through to let the toolbar know we're released.
# Let the operator know we're released. # Let the operator know we're released.
kmi = keymap.keymap_items.new( kmi = keymap.keymap_items.new(
"wm.tool_set_by_name", "wm.tool_set_by_id",
type=kmi_toolbar_type, type=kmi_toolbar_type,
value='RELEASE', value='RELEASE',
any=True, any=True,

View File

@@ -143,11 +143,11 @@ def op_panel(menu, kmi_args, kmi_data=()):
def op_tool(tool, kmi_args): def op_tool(tool, kmi_args):
return ("wm.tool_set_by_name", kmi_args, {"properties": [("name", tool)]}) return ("wm.tool_set_by_id", kmi_args, {"properties": [("name", tool)]})
def op_tool_cycle(tool, kmi_args): def op_tool_cycle(tool, kmi_args):
return ("wm.tool_set_by_name", kmi_args, {"properties": [("name", tool), ("cycle", True)]}) return ("wm.tool_set_by_id", kmi_args, {"properties": [("name", tool), ("cycle", True)]})
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View File

@@ -1486,14 +1486,14 @@ class WM_OT_owner_disable(Operator):
class WM_OT_tool_set_by_name(Operator): class WM_OT_tool_set_by_id(Operator):
"""Set the tool by name (for keymaps)""" """Set the tool by name (for keymaps)"""
bl_idname = "wm.tool_set_by_name" bl_idname = "wm.tool_set_by_id"
bl_label = "Set Tool By Name" bl_label = "Set Tool By Name"
name: StringProperty( name: StringProperty(
name="Text", name="Identifier",
description="Display name of the tool", description="Identifier of the tool",
) )
cycle: BoolProperty( cycle: BoolProperty(
name="Cycle", name="Cycle",
@@ -1518,8 +1518,8 @@ class WM_OT_tool_set_by_name(Operator):
def execute(self, context): def execute(self, context):
from bl_ui.space_toolsystem_common import ( from bl_ui.space_toolsystem_common import (
activate_by_name, activate_by_id,
activate_by_name_or_cycle, activate_by_id_or_cycle,
) )
if self.properties.is_property_set("space_type"): if self.properties.is_property_set("space_type"):
@@ -1527,7 +1527,7 @@ class WM_OT_tool_set_by_name(Operator):
else: else:
space_type = context.space_data.type space_type = context.space_data.type
fn = activate_by_name_or_cycle if self.cycle else activate_by_name fn = activate_by_id_or_cycle if self.cycle else activate_by_id
if fn(context, space_type, self.name): if fn(context, space_type, self.name):
return {'FINISHED'} return {'FINISHED'}
else: else:
@@ -1800,7 +1800,7 @@ classes = (
WM_OT_owner_disable, WM_OT_owner_disable,
WM_OT_owner_enable, WM_OT_owner_enable,
WM_OT_url_open, WM_OT_url_open,
WM_OT_tool_set_by_name, WM_OT_tool_set_by_id,
WM_OT_toolbar, WM_OT_toolbar,
WM_MT_splash, WM_MT_splash,
) )

View File

@@ -25,10 +25,10 @@ from bpy.types import (
__all__ = ( __all__ = (
"ToolDef", "ToolDef",
"ToolSelectPanelHelper", "ToolSelectPanelHelper",
"activate_by_name", "activate_by_id",
"activate_by_name_or_cycle", "activate_by_id_or_cycle",
"description_from_name", "description_from_id",
"keymap_from_name", "keymap_from_id",
) )
# Support reloading icons. # Support reloading icons.
@@ -62,8 +62,10 @@ from collections import namedtuple
ToolDef = namedtuple( ToolDef = namedtuple(
"ToolDef", "ToolDef",
( (
# Unique tool name (withing space & mode context).
"idname",
# The name to display in the interface. # The name to display in the interface.
"text", "label",
# Description (for tooltip), when not set, use the description of 'operator', # Description (for tooltip), when not set, use the description of 'operator',
# may be a string or a 'function(context, item, keymap) -> string'. # may be a string or a 'function(context, item, keymap) -> string'.
"description", "description",
@@ -250,10 +252,10 @@ class ToolSelectPanelHelper:
cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type) cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
if cls is not None: if cls is not None:
tool_active = ToolSelectPanelHelper._tool_active_from_context(context, space_type, mode) tool_active = ToolSelectPanelHelper._tool_active_from_context(context, space_type, mode)
tool_active_text = getattr(tool_active, "name", None) tool_active_id = getattr(tool_active, "idname", None)
for item in ToolSelectPanelHelper._tools_flatten(cls.tools_from_context(context, mode)): for item in ToolSelectPanelHelper._tools_flatten(cls.tools_from_context(context, mode)):
if item is not None: if item is not None:
if item.text == tool_active_text: if item.idname == tool_active_id:
if with_icon: if with_icon:
icon_value = ToolSelectPanelHelper._icon_value_from_icon_handle(item.icon) icon_value = ToolSelectPanelHelper._icon_value_from_icon_handle(item.icon)
else: else:
@@ -262,7 +264,7 @@ class ToolSelectPanelHelper:
return None, None, 0 return None, None, 0
@staticmethod @staticmethod
def _tool_get_by_name(context, space_type, text): def _tool_get_by_id(context, space_type, idname):
""" """
Return the active Python tool definition and index (if in sub-group, else -1). Return the active Python tool definition and index (if in sub-group, else -1).
""" """
@@ -270,7 +272,7 @@ class ToolSelectPanelHelper:
if cls is not None: if cls is not None:
for item, index in ToolSelectPanelHelper._tools_flatten_with_tool_index(cls.tools_from_context(context)): for item, index in ToolSelectPanelHelper._tools_flatten_with_tool_index(cls.tools_from_context(context)):
if item is not None: if item is not None:
if item.text == text: if item.idname == idname:
return (cls, item, index) return (cls, item, index)
return None, None, -1 return None, None, -1
@@ -303,12 +305,12 @@ class ToolSelectPanelHelper:
return None return None
@staticmethod @staticmethod
def _tool_text_from_button(context): def _tool_identifier_from_button(context):
return context.button_operator.name return context.button_operator.name
@classmethod @classmethod
def _km_action_simple(cls, kc, context_descr, text, keymap_fn): def _km_action_simple(cls, kc, context_descr, idname, keymap_fn):
km_idname = f"{cls.keymap_prefix:s} {context_descr:s}, {text:s}" km_idname = f"{cls.keymap_prefix:s} {context_descr:s}, {idname:s}"
km = kc.keymaps.get(km_idname) km = kc.keymaps.get(km_idname)
if km is None: if km is None:
km = kc.keymaps.new(km_idname, space_type=cls.bl_space_type, region_type='WINDOW', tool=True) km = kc.keymaps.new(km_idname, space_type=cls.bl_space_type, region_type='WINDOW', tool=True)
@@ -353,7 +355,7 @@ class ToolSelectPanelHelper:
for item in cls._tools_flatten_with_keymap(tools): for item in cls._tools_flatten_with_keymap(tools):
keymap_data = item.keymap keymap_data = item.keymap
if callable(keymap_data[0]): if callable(keymap_data[0]):
cls._km_action_simple(kc, context_descr, item.text, keymap_data) cls._km_action_simple(kc, context_descr, item.idname, keymap_data)
@classmethod @classmethod
def keymap_ui_hierarchy(cls, context_mode): def keymap_ui_hierarchy(cls, context_mode):
@@ -472,9 +474,9 @@ class ToolSelectPanelHelper:
# - ability to click and hold to expose sub-tools. # - ability to click and hold to expose sub-tools.
space_type = context.space_data.type space_type = context.space_data.type
tool_active_text = getattr( tool_active_id = getattr(
ToolSelectPanelHelper._tool_active_from_context(context, space_type), ToolSelectPanelHelper._tool_active_from_context(context, space_type),
"name", None, "idname", None,
) )
if detect_layout: if detect_layout:
@@ -497,7 +499,7 @@ class ToolSelectPanelHelper:
for i, sub_item in enumerate(item): for i, sub_item in enumerate(item):
if sub_item is None: if sub_item is None:
continue continue
is_active = (sub_item.text == tool_active_text) is_active = (sub_item.idname == tool_active_id)
if is_active: if is_active:
index = i index = i
break break
@@ -505,9 +507,9 @@ class ToolSelectPanelHelper:
if is_active: if is_active:
# not ideal, write this every time :S # not ideal, write this every time :S
cls._tool_group_active[item[0].text] = index cls._tool_group_active[item[0].idname] = index
else: else:
index = cls._tool_group_active.get(item[0].text, 0) index = cls._tool_group_active.get(item[0].idname, 0)
item = item[index] item = item[index]
use_menu = True use_menu = True
@@ -515,26 +517,26 @@ class ToolSelectPanelHelper:
index = -1 index = -1
use_menu = False use_menu = False
is_active = (item.text == tool_active_text) is_active = (item.idname == tool_active_id)
icon_value = ToolSelectPanelHelper._icon_value_from_icon_handle(item.icon) icon_value = ToolSelectPanelHelper._icon_value_from_icon_handle(item.icon)
sub = ui_gen.send(False) sub = ui_gen.send(False)
if use_menu: if use_menu:
sub.operator_menu_hold( sub.operator_menu_hold(
"wm.tool_set_by_name", "wm.tool_set_by_id",
text=item.text if show_text else "", text=item.label if show_text else "",
depress=is_active, depress=is_active,
menu="WM_MT_toolsystem_submenu", menu="WM_MT_toolsystem_submenu",
icon_value=icon_value, icon_value=icon_value,
).name = item.text ).name = item.idname
else: else:
sub.operator( sub.operator(
"wm.tool_set_by_name", "wm.tool_set_by_id",
text=item.text if show_text else "", text=item.label if show_text else "",
depress=is_active, depress=is_active,
icon_value=icon_value, icon_value=icon_value,
).name = item.text ).name = item.idname
# Signal to finish any remaining layout edits. # Signal to finish any remaining layout edits.
ui_gen.send(None) ui_gen.send(None)
@@ -564,7 +566,7 @@ class ToolSelectPanelHelper:
return None return None
# Note: we could show 'item.text' here but it makes the layout jitter when switching tools. # Note: we could show 'item.text' here but it makes the layout jitter when switching tools.
# Add some spacing since the icon is currently assuming regular small icon size. # Add some spacing since the icon is currently assuming regular small icon size.
layout.label(text=" " + item.text if show_tool_name else " ", icon_value=icon_value) layout.label(text=" " + item.label if show_tool_name else " ", icon_value=icon_value)
draw_settings = item.draw_settings draw_settings = item.draw_settings
if draw_settings is not None: if draw_settings is not None:
draw_settings(context, layout, tool) draw_settings(context, layout, tool)
@@ -581,11 +583,11 @@ class WM_MT_toolsystem_submenu(Menu):
# Lookup the tool definitions based on the space-type. # Lookup the tool definitions based on the space-type.
cls = ToolSelectPanelHelper._tool_class_from_space_type(context.space_data.type) cls = ToolSelectPanelHelper._tool_class_from_space_type(context.space_data.type)
if cls is not None: if cls is not None:
button_text = ToolSelectPanelHelper._tool_text_from_button(context) button_identifier = ToolSelectPanelHelper._tool_identifier_from_button(context)
for item_group in cls.tools_from_context(context): for item_group in cls.tools_from_context(context):
if type(item_group) is tuple: if type(item_group) is tuple:
for sub_item in item_group: for sub_item in item_group:
if (sub_item is not None) and (sub_item.text == button_text): if (sub_item is not None) and (sub_item.idname == button_identifier):
return cls, item_group return cls, item_group
return None, None return None, None
@@ -605,16 +607,16 @@ class WM_MT_toolsystem_submenu(Menu):
continue continue
icon_value = ToolSelectPanelHelper._icon_value_from_icon_handle(item.icon) icon_value = ToolSelectPanelHelper._icon_value_from_icon_handle(item.icon)
layout.operator( layout.operator(
"wm.tool_set_by_name", "wm.tool_set_by_id",
text=item.text, text=item.label,
icon_value=icon_value, icon_value=icon_value,
).name = item.text ).name = item.idname
def _activate_by_item(context, space_type, item, index): def _activate_by_item(context, space_type, item, index):
tool = ToolSelectPanelHelper._tool_active_from_context(context, space_type, create=True) tool = ToolSelectPanelHelper._tool_active_from_context(context, space_type, create=True)
tool.setup( tool.setup(
name=item.text, idname=item.idname,
keymap=item.keymap[0] if item.keymap is not None else "", keymap=item.keymap[0] if item.keymap is not None else "",
cursor=item.cursor or 'DEFAULT', cursor=item.cursor or 'DEFAULT',
gizmo_group=item.widget or "", gizmo_group=item.widget or "",
@@ -639,52 +641,52 @@ def _activate_by_item(context, space_type, item, index):
_activate_by_item._cursor_draw_handle = {} _activate_by_item._cursor_draw_handle = {}
def activate_by_name(context, space_type, text): def activate_by_id(context, space_type, text):
_cls, item, index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text) _cls, item, index = ToolSelectPanelHelper._tool_get_by_id(context, space_type, text)
if item is None: if item is None:
return False return False
_activate_by_item(context, space_type, item, index) _activate_by_item(context, space_type, item, index)
return True return True
def activate_by_name_or_cycle(context, space_type, text, offset=1): def activate_by_id_or_cycle(context, space_type, idname, offset=1):
# Only cycle when the active tool is activated again. # Only cycle when the active tool is activated again.
cls, item, _index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text) cls, item, _index = ToolSelectPanelHelper._tool_get_by_id(context, space_type, idname)
if item is None: if item is None:
return False return False
tool_active = ToolSelectPanelHelper._tool_active_from_context(context, space_type) tool_active = ToolSelectPanelHelper._tool_active_from_context(context, space_type)
text_active = getattr(tool_active, "name", None) id_active = getattr(tool_active, "idname", None)
text_current = "" id_current = ""
for item_group in cls.tools_from_context(context): for item_group in cls.tools_from_context(context):
if type(item_group) is tuple: if type(item_group) is tuple:
index_current = cls._tool_group_active.get(item_group[0].text, 0) index_current = cls._tool_group_active.get(item_group[0].idname, 0)
for sub_item in item_group: for sub_item in item_group:
if sub_item.text == text: if sub_item.idname == idname:
text_current = item_group[index_current].text id_current = item_group[index_current].idname
break break
if text_current: if id_current:
break break
if text_current == "": if id_current == "":
return activate_by_name(context, space_type, text) return activate_by_id(context, space_type, idname)
if text_active != text_current: if id_active != id_current:
return activate_by_name(context, space_type, text_current) return activate_by_id(context, space_type, id_current)
index_found = (tool_active.index + offset) % len(item_group) index_found = (tool_active.index + offset) % len(item_group)
cls._tool_group_active[item_group[0].text] = index_found cls._tool_group_active[item_group[0].idname] = index_found
item_found = item_group[index_found] item_found = item_group[index_found]
_activate_by_item(context, space_type, item_found, index_found) _activate_by_item(context, space_type, item_found, index_found)
return True return True
def description_from_name(context, space_type, text, *, use_operator=True): def description_from_id(context, space_type, idname, *, use_operator=True):
# Used directly for tooltips. # Used directly for tooltips.
_cls, item, _index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text) _cls, item, _index = ToolSelectPanelHelper._tool_get_by_id(context, space_type, idname)
if item is None: if item is None:
return False return False
@@ -714,9 +716,15 @@ def description_from_name(context, space_type, text, *, use_operator=True):
return "" return ""
def keymap_from_name(context, space_type, text): def item_from_id(context, space_type, idname):
# Used directly for tooltips. # Used directly for tooltips.
_cls, item, _index = ToolSelectPanelHelper._tool_get_by_name(context, space_type, text) _cls, item, _index = ToolSelectPanelHelper._tool_get_by_id(context, space_type, idname)
return item
def keymap_from_id(context, space_type, idname):
# Used directly for tooltips.
_cls, item, _index = ToolSelectPanelHelper._tool_get_by_id(context, space_type, idname)
if item is None: if item is None:
return False return False

View File

@@ -47,13 +47,14 @@ def generate_from_enum_ex(
tool_defs = [] tool_defs = []
for enum in type.bl_rna.properties[attr].enum_items_static: for enum in type.bl_rna.properties[attr].enum_items_static:
name = enum.name name = enum.name
identifier = enum.identifier idname = enum.identifier
tool_defs.append( tool_defs.append(
ToolDef.from_dict( ToolDef.from_dict(
dict( dict(
text=name, idname=name,
icon=icon_prefix + identifier.lower(), label=name,
data_block=identifier, icon=icon_prefix + idname.lower(),
data_block=idname,
**tooldef_keywords, **tooldef_keywords,
) )
) )
@@ -85,7 +86,8 @@ class _defs_view3d_generic:
layout.prop(props, "use_depth") layout.prop(props, "use_depth")
layout.prop(props, "orientation") layout.prop(props, "orientation")
return dict( return dict(
text="Cursor", idname="Cursor",
label="Cursor",
description=( description=(
"Set the cursor location, drag to transform" "Set the cursor location, drag to transform"
), ),
@@ -97,7 +99,8 @@ class _defs_view3d_generic:
@ToolDef.from_fn @ToolDef.from_fn
def cursor_click(): def cursor_click():
return dict( return dict(
text="None", idname="None",
label="None",
icon="ops.generic.cursor", icon="ops.generic.cursor",
keymap=(), keymap=(),
) )
@@ -123,7 +126,8 @@ class _defs_view3d_generic:
kmi_to_string_or_none(kmi_remove), kmi_to_string_or_none(kmi_remove),
) )
return dict( return dict(
text="Measure", idname="Measure",
label="Measure",
description=description, description=description,
icon="ops.view3d.ruler", icon="ops.view3d.ruler",
widget="VIEW3D_GGT_ruler", widget="VIEW3D_GGT_ruler",
@@ -175,7 +179,8 @@ class _defs_annotate:
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common) @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
def scribble(*, draw_settings): def scribble(*, draw_settings):
return dict( return dict(
text="Annotate", idname="Annotate",
label="Annotate",
icon="ops.gpencil.draw", icon="ops.gpencil.draw",
cursor='PAINT_BRUSH', cursor='PAINT_BRUSH',
keymap="Generic Tool: Annotate", keymap="Generic Tool: Annotate",
@@ -185,7 +190,8 @@ class _defs_annotate:
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common) @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
def line(*, draw_settings): def line(*, draw_settings):
return dict( return dict(
text="Annotate Line", idname="Annotate Line",
label="Annotate Line",
icon="ops.gpencil.draw.line", icon="ops.gpencil.draw.line",
cursor='CROSSHAIR', cursor='CROSSHAIR',
keymap="Generic Tool: Annotate Line", keymap="Generic Tool: Annotate Line",
@@ -195,7 +201,8 @@ class _defs_annotate:
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common) @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
def poly(*, draw_settings): def poly(*, draw_settings):
return dict( return dict(
text="Annotate Polygon", idname="Annotate Polygon",
label="Annotate Polygon",
icon="ops.gpencil.draw.poly", icon="ops.gpencil.draw.poly",
cursor='CROSSHAIR', cursor='CROSSHAIR',
keymap="Generic Tool: Annotate Polygon", keymap="Generic Tool: Annotate Polygon",
@@ -209,7 +216,8 @@ class _defs_annotate:
prefs = context.preferences prefs = context.preferences
layout.prop(prefs.edit, "grease_pencil_eraser_radius", text="Radius") layout.prop(prefs.edit, "grease_pencil_eraser_radius", text="Radius")
return dict( return dict(
text="Annotate Eraser", idname="Annotate Eraser",
label="Annotate Eraser",
icon="ops.gpencil.draw.eraser", icon="ops.gpencil.draw.eraser",
cursor='CROSSHAIR', # XXX: Always show brush circle when enabled cursor='CROSSHAIR', # XXX: Always show brush circle when enabled
keymap="Generic Tool: Annotate Eraser", keymap="Generic Tool: Annotate Eraser",
@@ -224,7 +232,8 @@ class _defs_transform:
def draw_settings(context, layout, tool): def draw_settings(context, layout, tool):
_template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 1) _template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 1)
return dict( return dict(
text="Move", idname="Move",
label="Move",
# cursor='SCROLL_XY', # cursor='SCROLL_XY',
icon="ops.transform.translate", icon="ops.transform.translate",
widget="TRANSFORM_GGT_gizmo", widget="TRANSFORM_GGT_gizmo",
@@ -238,7 +247,8 @@ class _defs_transform:
def draw_settings(context, layout, tool): def draw_settings(context, layout, tool):
_template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 2) _template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 2)
return dict( return dict(
text="Rotate", idname="Rotate",
label="Rotate",
# cursor='SCROLL_XY', # cursor='SCROLL_XY',
icon="ops.transform.rotate", icon="ops.transform.rotate",
widget="TRANSFORM_GGT_gizmo", widget="TRANSFORM_GGT_gizmo",
@@ -252,7 +262,8 @@ class _defs_transform:
def draw_settings(context, layout, tool): def draw_settings(context, layout, tool):
_template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 3) _template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 3)
return dict( return dict(
text="Scale", idname="Scale",
label="Scale",
# cursor='SCROLL_XY', # cursor='SCROLL_XY',
icon="ops.transform.resize", icon="ops.transform.resize",
widget="TRANSFORM_GGT_gizmo", widget="TRANSFORM_GGT_gizmo",
@@ -266,7 +277,8 @@ class _defs_transform:
def draw_settings(context, layout, tool): def draw_settings(context, layout, tool):
_template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 3) _template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 3)
return dict( return dict(
text="Scale Cage", idname="Scale Cage",
label="Scale Cage",
icon="ops.transform.resize.cage", icon="ops.transform.resize.cage",
widget="VIEW3D_GGT_xform_cage", widget="VIEW3D_GGT_xform_cage",
operator="transform.resize", operator="transform.resize",
@@ -287,7 +299,8 @@ class _defs_transform:
_template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 1) _template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 1)
return dict( return dict(
text="Transform", idname="Transform",
label="Transform",
description=( description=(
"Supports any combination of grab, rotate & scale at once" "Supports any combination of grab, rotate & scale at once"
), ),
@@ -305,7 +318,8 @@ class _defs_view3d_select:
def draw_settings(context, layout, tool): def draw_settings(context, layout, tool):
pass pass
return dict( return dict(
text="Select", idname="Select",
label="Select",
icon="ops.generic.select", icon="ops.generic.select",
widget=None, widget=None,
keymap="3D View Tool: Select", keymap="3D View Tool: Select",
@@ -318,7 +332,8 @@ class _defs_view3d_select:
props = tool.operator_properties("view3d.select_box") props = tool.operator_properties("view3d.select_box")
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
return dict( return dict(
text="Select Box", idname="Select Box",
label="Select Box",
icon="ops.generic.select_box", icon="ops.generic.select_box",
widget=None, widget=None,
keymap="3D View Tool: Select Box", keymap="3D View Tool: Select Box",
@@ -331,7 +346,8 @@ class _defs_view3d_select:
props = tool.operator_properties("view3d.select_lasso") props = tool.operator_properties("view3d.select_lasso")
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
return dict( return dict(
text="Select Lasso", idname="Select Lasso",
label="Select Lasso",
icon="ops.generic.select_lasso", icon="ops.generic.select_lasso",
widget=None, widget=None,
keymap="3D View Tool: Select Lasso", keymap="3D View Tool: Select Lasso",
@@ -352,7 +368,8 @@ class _defs_view3d_select:
draw_circle_2d(xy, (1.0,) * 4, radius, 32) draw_circle_2d(xy, (1.0,) * 4, radius, 32)
return dict( return dict(
text="Select Circle", idname="Select Circle",
label="Select Circle",
icon="ops.generic.select_circle", icon="ops.generic.select_circle",
widget=None, widget=None,
keymap="3D View Tool: Select Circle", keymap="3D View Tool: Select Circle",
@@ -370,7 +387,8 @@ class _defs_edit_armature:
@ToolDef.from_fn @ToolDef.from_fn
def roll(): def roll():
return dict( return dict(
text="Roll", idname="Roll",
label="Roll",
icon="ops.armature.bone.roll", icon="ops.armature.bone.roll",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -379,7 +397,8 @@ class _defs_edit_armature:
@ToolDef.from_fn @ToolDef.from_fn
def bone_envelope(): def bone_envelope():
return dict( return dict(
text="Bone Envelope", idname="Bone Envelope",
label="Bone Envelope",
icon="ops.transform.bone_envelope", icon="ops.transform.bone_envelope",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -388,7 +407,8 @@ class _defs_edit_armature:
@ToolDef.from_fn @ToolDef.from_fn
def bone_size(): def bone_size():
return dict( return dict(
text="Bone Size", idname="Bone Size",
label="Bone Size",
icon="ops.transform.bone_size", icon="ops.transform.bone_size",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -397,7 +417,8 @@ class _defs_edit_armature:
@ToolDef.from_fn @ToolDef.from_fn
def extrude(): def extrude():
return dict( return dict(
text="Extrude", idname="Extrude",
label="Extrude",
icon="ops.armature.extrude_move", icon="ops.armature.extrude_move",
widget="VIEW3D_GGT_xform_extrude", widget="VIEW3D_GGT_xform_extrude",
keymap=(), keymap=(),
@@ -407,7 +428,8 @@ class _defs_edit_armature:
@ToolDef.from_fn @ToolDef.from_fn
def extrude_cursor(): def extrude_cursor():
return dict( return dict(
text="Extrude to Cursor", idname="Extrude to Cursor",
label="Extrude to Cursor",
icon="ops.armature.extrude_cursor", icon="ops.armature.extrude_cursor",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -419,7 +441,8 @@ class _defs_edit_mesh:
@ToolDef.from_fn @ToolDef.from_fn
def cube_add(): def cube_add():
return dict( return dict(
text="Add Cube", idname="Add Cube",
label="Add Cube",
icon="ops.mesh.primitive_cube_add_gizmo", icon="ops.mesh.primitive_cube_add_gizmo",
description=( description=(
"Add cube to mesh interactively" "Add cube to mesh interactively"
@@ -436,7 +459,8 @@ class _defs_edit_mesh:
layout.prop(props_macro, "use_fill") layout.prop(props_macro, "use_fill")
return dict( return dict(
text="Rip Region", idname="Rip Region",
label="Rip Region",
icon="ops.mesh.rip", icon="ops.mesh.rip",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -446,7 +470,8 @@ class _defs_edit_mesh:
@ToolDef.from_fn @ToolDef.from_fn
def rip_edge(): def rip_edge():
return dict( return dict(
text="Rip Edge", idname="Rip Edge",
label="Rip Edge",
icon="ops.mesh.rip_edge", icon="ops.mesh.rip_edge",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -455,7 +480,8 @@ class _defs_edit_mesh:
@ToolDef.from_fn @ToolDef.from_fn
def poly_build(): def poly_build():
return dict( return dict(
text="Poly Build", idname="Poly Build",
label="Poly Build",
icon="ops.mesh.polybuild_hover", icon="ops.mesh.polybuild_hover",
widget="VIEW3D_GGT_mesh_preselect_elem", widget="VIEW3D_GGT_mesh_preselect_elem",
keymap=(), keymap=(),
@@ -468,7 +494,8 @@ class _defs_edit_mesh:
layout.prop(props, "correct_uv") layout.prop(props, "correct_uv")
return dict( return dict(
text="Edge Slide", idname="Edge Slide",
label="Edge Slide",
icon="ops.transform.edge_slide", icon="ops.transform.edge_slide",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -482,7 +509,8 @@ class _defs_edit_mesh:
layout.prop(props, "correct_uv") layout.prop(props, "correct_uv")
return dict( return dict(
text="Vertex Slide", idname="Vertex Slide",
label="Vertex Slide",
icon="ops.transform.vert_slide", icon="ops.transform.vert_slide",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -498,7 +526,8 @@ class _defs_edit_mesh:
layout.prop(props, "axis") layout.prop(props, "axis")
return dict( return dict(
text="Spin", idname="Spin",
label="Spin",
icon="ops.mesh.spin", icon="ops.mesh.spin",
widget="MESH_GGT_spin", widget="MESH_GGT_spin",
keymap=(), keymap=(),
@@ -514,7 +543,8 @@ class _defs_edit_mesh:
layout.prop(props, "axis") layout.prop(props, "axis")
return dict( return dict(
text="Spin Duplicates", idname="Spin Duplicates",
label="Spin Duplicates",
icon="ops.mesh.spin.duplicate", icon="ops.mesh.spin.duplicate",
widget="MESH_GGT_spin", widget="MESH_GGT_spin",
keymap=(), keymap=(),
@@ -531,7 +561,8 @@ class _defs_edit_mesh:
layout.prop(props, "use_relative_offset") layout.prop(props, "use_relative_offset")
return dict( return dict(
text="Inset Faces", idname="Inset Faces",
label="Inset Faces",
icon="ops.mesh.inset", icon="ops.mesh.inset",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -548,7 +579,8 @@ class _defs_edit_mesh:
layout.prop(props, "vertex_only") layout.prop(props, "vertex_only")
return dict( return dict(
text="Bevel", idname="Bevel",
label="Bevel",
icon="ops.mesh.bevel", icon="ops.mesh.bevel",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -558,7 +590,8 @@ class _defs_edit_mesh:
@ToolDef.from_fn @ToolDef.from_fn
def extrude(): def extrude():
return dict( return dict(
text="Extrude Region", idname="Extrude Region",
label="Extrude Region",
# The operator description isn't useful in this case, give our own. # The operator description isn't useful in this case, give our own.
description=( description=(
"Extrude freely or along an axis" "Extrude freely or along an axis"
@@ -578,7 +611,8 @@ class _defs_edit_mesh:
props_macro = props.TRANSFORM_OT_shrink_fatten props_macro = props.TRANSFORM_OT_shrink_fatten
layout.prop(props_macro, "use_even_offset") layout.prop(props_macro, "use_even_offset")
return dict( return dict(
text="Extrude Along Normals", idname="Extrude Along Normals",
label="Extrude Along Normals",
icon="ops.mesh.extrude_region_shrink_fatten", icon="ops.mesh.extrude_region_shrink_fatten",
widget=None, widget=None,
operator="mesh.extrude_region_shrink_fatten", operator="mesh.extrude_region_shrink_fatten",
@@ -589,7 +623,8 @@ class _defs_edit_mesh:
@ToolDef.from_fn @ToolDef.from_fn
def extrude_individual(): def extrude_individual():
return dict( return dict(
text="Extrude Individual", idname="Extrude Individual",
label="Extrude Individual",
icon="ops.mesh.extrude_faces_move", icon="ops.mesh.extrude_faces_move",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -602,7 +637,8 @@ class _defs_edit_mesh:
layout.prop(props, "rotate_source") layout.prop(props, "rotate_source")
return dict( return dict(
text="Extrude to Cursor", idname="Extrude to Cursor",
label="Extrude to Cursor",
icon="ops.mesh.dupli_extrude_cursor", icon="ops.mesh.dupli_extrude_cursor",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -620,7 +656,8 @@ class _defs_edit_mesh:
layout.prop(props_macro, "correct_uv") layout.prop(props_macro, "correct_uv")
return dict( return dict(
text="Loop Cut", idname="Loop Cut",
label="Loop Cut",
icon="ops.mesh.loopcut_slide", icon="ops.mesh.loopcut_slide",
widget="VIEW3D_GGT_mesh_preselect_edgering", widget="VIEW3D_GGT_mesh_preselect_edgering",
keymap=(), keymap=(),
@@ -630,7 +667,8 @@ class _defs_edit_mesh:
@ToolDef.from_fn @ToolDef.from_fn
def offset_edge_loops_slide(): def offset_edge_loops_slide():
return dict( return dict(
text="Offset Edge Loop Cut", idname="Offset Edge Loop Cut",
label="Offset Edge Loop Cut",
icon="ops.mesh.offset_edge_loops_slide", icon="ops.mesh.offset_edge_loops_slide",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -642,7 +680,8 @@ class _defs_edit_mesh:
props = tool.operator_properties("mesh.vertices_smooth") props = tool.operator_properties("mesh.vertices_smooth")
layout.prop(props, "repeat") layout.prop(props, "repeat")
return dict( return dict(
text="Smooth", idname="Smooth",
label="Smooth",
icon="ops.mesh.vertices_smooth", icon="ops.mesh.vertices_smooth",
widget="WM_GGT_value_operator_redo", widget="WM_GGT_value_operator_redo",
keymap=(), keymap=(),
@@ -657,7 +696,8 @@ class _defs_edit_mesh:
layout.prop(props, "normal") layout.prop(props, "normal")
layout.prop(props, "seed") layout.prop(props, "seed")
return dict( return dict(
text="Randomize", idname="Randomize",
label="Randomize",
icon="ops.transform.vertex_random", icon="ops.transform.vertex_random",
widget="WM_GGT_value_operator_redo", widget="WM_GGT_value_operator_redo",
keymap=(), keymap=(),
@@ -672,7 +712,8 @@ class _defs_edit_mesh:
layout.prop(props, "shear_axis", expand=True) layout.prop(props, "shear_axis", expand=True)
_template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 2) _template_widget.TRANSFORM_GGT_gizmo.draw_settings_with_index(context, layout, 2)
return dict( return dict(
text="Shear", idname="Shear",
label="Shear",
icon="ops.transform.shear", icon="ops.transform.shear",
widget="VIEW3D_GGT_xform_shear", widget="VIEW3D_GGT_xform_shear",
keymap=(), keymap=(),
@@ -682,7 +723,8 @@ class _defs_edit_mesh:
@ToolDef.from_fn @ToolDef.from_fn
def tosphere(): def tosphere():
return dict( return dict(
text="To Sphere", idname="To Sphere",
label="To Sphere",
icon="ops.transform.tosphere", icon="ops.transform.tosphere",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -695,7 +737,8 @@ class _defs_edit_mesh:
layout.prop(props, "use_even_offset") layout.prop(props, "use_even_offset")
return dict( return dict(
text="Shrink/Fatten", idname="Shrink/Fatten",
label="Shrink/Fatten",
icon="ops.transform.shrink_fatten", icon="ops.transform.shrink_fatten",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -705,7 +748,8 @@ class _defs_edit_mesh:
@ToolDef.from_fn @ToolDef.from_fn
def push_pull(): def push_pull():
return dict( return dict(
text="Push/Pull", idname="Push/Pull",
label="Push/Pull",
icon="ops.transform.push_pull", icon="ops.transform.push_pull",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -719,7 +763,8 @@ class _defs_edit_mesh:
layout.prop(props, "only_selected") layout.prop(props, "only_selected")
return dict( return dict(
text="Knife", idname="Knife",
label="Knife",
icon="ops.mesh.knife_tool", icon="ops.mesh.knife_tool",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -735,7 +780,8 @@ class _defs_edit_mesh:
layout.prop(props, "clear_outer") layout.prop(props, "clear_outer")
layout.prop(props, "threshold") layout.prop(props, "threshold")
return dict( return dict(
text="Bisect", idname="Bisect",
label="Bisect",
icon="ops.mesh.bisect", icon="ops.mesh.bisect",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -766,7 +812,8 @@ class _defs_edit_curve:
col.prop(cps, "corner_angle") col.prop(cps, "corner_angle")
return dict( return dict(
text="Draw", idname="Draw",
label="Draw",
cursor='PAINT_BRUSH', cursor='PAINT_BRUSH',
icon="ops.curve.draw", icon="ops.curve.draw",
widget=None, widget=None,
@@ -777,7 +824,8 @@ class _defs_edit_curve:
@ToolDef.from_fn @ToolDef.from_fn
def extrude(): def extrude():
return dict( return dict(
text="Extrude", idname="Extrude",
label="Extrude",
icon="ops.curve.extrude_move", icon="ops.curve.extrude_move",
widget="VIEW3D_GGT_xform_extrude", widget="VIEW3D_GGT_xform_extrude",
keymap=(), keymap=(),
@@ -787,7 +835,8 @@ class _defs_edit_curve:
@ToolDef.from_fn @ToolDef.from_fn
def extrude_cursor(): def extrude_cursor():
return dict( return dict(
text="Extrude Cursor", idname="Extrude Cursor",
label="Extrude Cursor",
icon="ops.curve.extrude_cursor", icon="ops.curve.extrude_cursor",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -796,7 +845,8 @@ class _defs_edit_curve:
@ToolDef.from_fn @ToolDef.from_fn
def tilt(): def tilt():
return dict( return dict(
text="Tilt", idname="Tilt",
label="Tilt",
icon="ops.transform.tilt", icon="ops.transform.tilt",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -805,7 +855,8 @@ class _defs_edit_curve:
@ToolDef.from_fn @ToolDef.from_fn
def curve_radius(): def curve_radius():
return dict( return dict(
text="Radius", idname="Radius",
label="Radius",
description=( description=(
"Expand or contract the radius of the selected curve points" "Expand or contract the radius of the selected curve points"
), ),
@@ -822,7 +873,8 @@ class _defs_edit_curve:
layout.prop(props, "normal") layout.prop(props, "normal")
layout.prop(props, "seed") layout.prop(props, "seed")
return dict( return dict(
text="Randomize", idname="Randomize",
label="Randomize",
icon="ops.curve.vertex_random", icon="ops.curve.vertex_random",
widget="WM_GGT_value_operator_redo", widget="WM_GGT_value_operator_redo",
keymap=(), keymap=(),
@@ -835,7 +887,8 @@ class _defs_pose:
@ToolDef.from_fn @ToolDef.from_fn
def breakdown(): def breakdown():
return dict( return dict(
text="Breakdowner", idname="Breakdowner",
label="Breakdowner",
icon="ops.pose.breakdowner", icon="ops.pose.breakdowner",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -844,7 +897,8 @@ class _defs_pose:
@ToolDef.from_fn @ToolDef.from_fn
def push(): def push():
return dict( return dict(
text="Push", idname="Push",
label="Push",
icon="ops.pose.push", icon="ops.pose.push",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -853,7 +907,8 @@ class _defs_pose:
@ToolDef.from_fn @ToolDef.from_fn
def relax(): def relax():
return dict( return dict(
text="Relax", idname="Relax",
label="Relax",
icon="ops.pose.relax", icon="ops.pose.relax",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -886,7 +941,8 @@ class _defs_sculpt:
@ToolDef.from_fn @ToolDef.from_fn
def hide_border(): def hide_border():
return dict( return dict(
text="Box Hide", idname="Box Hide",
label="Box Hide",
icon="ops.sculpt.border_hide", icon="ops.sculpt.border_hide",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -895,7 +951,8 @@ class _defs_sculpt:
@ToolDef.from_fn @ToolDef.from_fn
def mask_border(): def mask_border():
return dict( return dict(
text="Box Mask", idname="Box Mask",
label="Box Mask",
icon="ops.sculpt.border_mask", icon="ops.sculpt.border_mask",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -960,7 +1017,8 @@ class _defs_weight_paint:
@ToolDef.from_fn @ToolDef.from_fn
def sample_weight(): def sample_weight():
return dict( return dict(
text="Sample Weight", idname="Sample Weight",
label="Sample Weight",
icon="ops.paint.weight_sample", icon="ops.paint.weight_sample",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -969,7 +1027,8 @@ class _defs_weight_paint:
@ToolDef.from_fn @ToolDef.from_fn
def sample_weight_group(): def sample_weight_group():
return dict( return dict(
text="Sample Vertex Group", idname="Sample Vertex Group",
label="Sample Vertex Group",
icon="ops.paint.weight_sample_group", icon="ops.paint.weight_sample_group",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -987,7 +1046,8 @@ class _defs_weight_paint:
layout.prop(props, "type") layout.prop(props, "type")
return dict( return dict(
text="Gradient", idname="Gradient",
label="Gradient",
icon="ops.paint.weight_gradient", icon="ops.paint.weight_gradient",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1009,7 +1069,8 @@ class _defs_image_generic:
@ToolDef.from_fn @ToolDef.from_fn
def cursor(): def cursor():
return dict( return dict(
text="Cursor", idname="Cursor",
label="Cursor",
description=( description=(
"Set the cursor location, drag to transform" "Set the cursor location, drag to transform"
), ),
@@ -1025,7 +1086,8 @@ class _defs_image_generic:
props = tool.operator_properties("image.sample") props = tool.operator_properties("image.sample")
layout.prop(props, "size") layout.prop(props, "size")
return dict( return dict(
text="Sample", idname="Sample",
label="Sample",
description=( description=(
"Sample pixel values under the cursor" "Sample pixel values under the cursor"
), ),
@@ -1040,7 +1102,8 @@ class _defs_image_uv_transform:
@ToolDef.from_fn @ToolDef.from_fn
def transform(): def transform():
return dict( return dict(
text="Transform", idname="Transform",
label="Transform",
description=( description=(
"Supports any combination of grab, rotate & scale at once" "Supports any combination of grab, rotate & scale at once"
), ),
@@ -1057,7 +1120,8 @@ class _defs_image_uv_select:
def draw_settings(context, layout, tool): def draw_settings(context, layout, tool):
pass pass
return dict( return dict(
text="Select", idname="Select",
label="Select",
icon="ops.generic.select", icon="ops.generic.select",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1070,7 +1134,8 @@ class _defs_image_uv_select:
props = tool.operator_properties("uv.select_box") props = tool.operator_properties("uv.select_box")
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
return dict( return dict(
text="Select Box", idname="Select Box",
label="Select Box",
icon="ops.generic.select_box", icon="ops.generic.select_box",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1083,7 +1148,8 @@ class _defs_image_uv_select:
props = tool.operator_properties("uv.select_lasso") props = tool.operator_properties("uv.select_lasso")
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
return dict( return dict(
text="Select Lasso", idname="Select Lasso",
label="Select Lasso",
icon="ops.generic.select_lasso", icon="ops.generic.select_lasso",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1097,7 +1163,8 @@ class _defs_image_uv_select:
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
layout.prop(props, "radius") layout.prop(props, "radius")
return dict( return dict(
text="Select Circle", idname="Select Circle",
label="Select Circle",
icon="ops.generic.select_circle", icon="ops.generic.select_circle",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1134,7 +1201,8 @@ class _defs_gpencil_paint:
@ToolDef.from_fn @ToolDef.from_fn
def cutter(): def cutter():
return dict( return dict(
text="Cutter", idname="Cutter",
label="Cutter",
icon="ops.gpencil.stroke_cutter", icon="ops.gpencil.stroke_cutter",
cursor='KNIFE', cursor='KNIFE',
widget=None, widget=None,
@@ -1144,7 +1212,8 @@ class _defs_gpencil_paint:
@ToolDef.from_fn @ToolDef.from_fn
def line(): def line():
return dict( return dict(
text="Line", idname="Line",
label="Line",
icon="ops.gpencil.primitive_line", icon="ops.gpencil.primitive_line",
cursor='CROSSHAIR', cursor='CROSSHAIR',
widget=None, widget=None,
@@ -1154,7 +1223,8 @@ class _defs_gpencil_paint:
@ToolDef.from_fn @ToolDef.from_fn
def box(): def box():
return dict( return dict(
text="Box", idname="Box",
label="Box",
icon="ops.gpencil.primitive_box", icon="ops.gpencil.primitive_box",
cursor='CROSSHAIR', cursor='CROSSHAIR',
widget=None, widget=None,
@@ -1164,7 +1234,8 @@ class _defs_gpencil_paint:
@ToolDef.from_fn @ToolDef.from_fn
def circle(): def circle():
return dict( return dict(
text="Circle", idname="Circle",
label="Circle",
icon="ops.gpencil.primitive_circle", icon="ops.gpencil.primitive_circle",
cursor='CROSSHAIR', cursor='CROSSHAIR',
widget=None, widget=None,
@@ -1174,7 +1245,8 @@ class _defs_gpencil_paint:
@ToolDef.from_fn @ToolDef.from_fn
def arc(): def arc():
return dict( return dict(
text="Arc", idname="Arc",
label="Arc",
icon="ops.gpencil.primitive_arc", icon="ops.gpencil.primitive_arc",
cursor='CROSSHAIR', cursor='CROSSHAIR',
widget=None, widget=None,
@@ -1184,7 +1256,8 @@ class _defs_gpencil_paint:
@ToolDef.from_fn @ToolDef.from_fn
def curve(): def curve():
return dict( return dict(
text="Curve", idname="Curve",
label="Curve",
icon="ops.gpencil.primitive_curve", icon="ops.gpencil.primitive_curve",
cursor='CROSSHAIR', cursor='CROSSHAIR',
widget=None, widget=None,
@@ -1196,7 +1269,8 @@ class _defs_gpencil_edit:
@ToolDef.from_fn @ToolDef.from_fn
def bend(): def bend():
return dict( return dict(
text="Bend", idname="Bend",
label="Bend",
icon="ops.gpencil.edit_bend", icon="ops.gpencil.edit_bend",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1207,7 +1281,8 @@ class _defs_gpencil_edit:
def draw_settings(context, layout, tool): def draw_settings(context, layout, tool):
layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold")
return dict( return dict(
text="Select", idname="Select",
label="Select",
icon="ops.generic.select", icon="ops.generic.select",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1221,7 +1296,8 @@ class _defs_gpencil_edit:
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold")
return dict( return dict(
text="Select Box", idname="Select Box",
label="Select Box",
icon="ops.generic.select_box", icon="ops.generic.select_box",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1235,7 +1311,8 @@ class _defs_gpencil_edit:
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold")
return dict( return dict(
text="Select Lasso", idname="Select Lasso",
label="Select Lasso",
icon="ops.generic.select_lasso", icon="ops.generic.select_lasso",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1250,7 +1327,8 @@ class _defs_gpencil_edit:
layout.prop(props, "radius") layout.prop(props, "radius")
layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold")
return dict( return dict(
text="Select Circle", idname="Select Circle",
label="Select Circle",
icon="ops.generic.select_circle", icon="ops.generic.select_circle",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1260,7 +1338,8 @@ class _defs_gpencil_edit:
@ToolDef.from_fn @ToolDef.from_fn
def radius(): def radius():
return dict( return dict(
text="Radius", idname="Radius",
label="Radius",
description=( description=(
"Expand or contract the radius of the selected points" "Expand or contract the radius of the selected points"
), ),
@@ -1273,7 +1352,8 @@ class _defs_gpencil_edit:
@ToolDef.from_fn @ToolDef.from_fn
def shear(): def shear():
return dict( return dict(
text="Shear", idname="Shear",
label="Shear",
icon="ops.gpencil.edit_shear", icon="ops.gpencil.edit_shear",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1282,7 +1362,8 @@ class _defs_gpencil_edit:
@ToolDef.from_fn @ToolDef.from_fn
def tosphere(): def tosphere():
return dict( return dict(
text="To Sphere", idname="To Sphere",
label="To Sphere",
icon="ops.transform.tosphere", icon="ops.transform.tosphere",
widget=None, widget=None,
keymap=(), keymap=(),
@@ -1291,7 +1372,8 @@ class _defs_gpencil_edit:
@ToolDef.from_fn @ToolDef.from_fn
def extrude(): def extrude():
return dict( return dict(
text="Extrude", idname="Extrude",
label="Extrude",
icon="ops.gpencil.extrude_move", icon="ops.gpencil.extrude_move",
widget="VIEW3D_GGT_xform_extrude", widget="VIEW3D_GGT_xform_extrude",
keymap=(), keymap=(),
@@ -1330,7 +1412,8 @@ class _defs_node_select:
def draw_settings(context, layout, tool): def draw_settings(context, layout, tool):
pass pass
return dict( return dict(
text="Select", idname="Select",
label="Select",
icon="ops.generic.select", icon="ops.generic.select",
widget=None, widget=None,
keymap="Node Tool: Select", keymap="Node Tool: Select",
@@ -1344,7 +1427,8 @@ class _defs_node_select:
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
pass pass
return dict( return dict(
text="Select Box", idname="Select Box",
label="Select Box",
icon="ops.generic.select_box", icon="ops.generic.select_box",
widget=None, widget=None,
keymap="Node Tool: Select Box", keymap="Node Tool: Select Box",
@@ -1357,7 +1441,8 @@ class _defs_node_select:
props = tool.operator_properties("node.select_lasso") props = tool.operator_properties("node.select_lasso")
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
return dict( return dict(
text="Select Lasso", idname="Select Lasso",
label="Select Lasso",
icon="ops.generic.select_lasso", icon="ops.generic.select_lasso",
widget=None, widget=None,
keymap="Node Tool: Select Lasso", keymap="Node Tool: Select Lasso",
@@ -1371,7 +1456,8 @@ class _defs_node_select:
layout.prop(props, "mode", expand=True) layout.prop(props, "mode", expand=True)
layout.prop(props, "radius") layout.prop(props, "radius")
return dict( return dict(
text="Select Circle", idname="Select Circle",
label="Select Circle",
icon="ops.generic.select_circle", icon="ops.generic.select_circle",
widget=None, widget=None,
keymap="Node Tool: Select Circle", keymap="Node Tool: Select Circle",
@@ -1384,7 +1470,8 @@ class _defs_node_edit:
@ToolDef.from_fn @ToolDef.from_fn
def links_cut(): def links_cut():
return dict( return dict(
text="Links Cut", idname="Links Cut",
label="Links Cut",
icon="ops.node.links_cut", icon="ops.node.links_cut",
widget=None, widget=None,
keymap="Node Tool: Links Cut", keymap="Node Tool: Links Cut",

View File

@@ -295,9 +295,10 @@ class _draw_left_context_mode:
return return
is_paint = True is_paint = True
if tool.name in {"Line", "Box", "Circle", "Arc", "Curve"}: # FIXME: tools must use their own UI drawing!
if tool.idname in {"Line", "Box", "Circle", "Arc", "Curve"}:
is_paint = False is_paint = False
elif tool.name == "Cutter": elif tool.idname == "Cutter":
row = layout.row(align=True) row = layout.row(align=True)
row.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") row.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold")
return return
@@ -349,7 +350,8 @@ class _draw_left_context_mode:
) )
brush_basic_gpencil_paint_settings(layout, context, brush, compact=True) brush_basic_gpencil_paint_settings(layout, context, brush, compact=True)
if tool.name in {"Arc", "Curve", "Line", "Box", "Circle"}: # FIXME: tools must use their own UI drawing!
if tool.idname in {"Arc", "Curve", "Line", "Box", "Circle"}:
settings = context.tool_settings.gpencil_sculpt settings = context.tool_settings.gpencil_sculpt
row = layout.row(align=True) row = layout.row(align=True)
row.prop(settings, "use_thickness_curve", text="", icon='CURVE_DATA') row.prop(settings, "use_thickness_curve", text="", icon='CURVE_DATA')

View File

@@ -255,7 +255,9 @@ class VIEW3D_HT_header(Header):
) )
if object_mode == 'PAINT_GPENCIL': if object_mode == 'PAINT_GPENCIL':
if context.workspace.tools.from_space_view3d_mode(object_mode).name == "Draw": # FIXME: this is bad practice!
# Tool options are to be displayed in the topbar.
if context.workspace.tools.from_space_view3d_mode(object_mode).idname == "Draw":
settings = tool_settings.gpencil_sculpt.guide settings = tool_settings.gpencil_sculpt.guide
row = layout.row(align=True) row = layout.row(align=True)
row.prop(settings, "use_guide", text="", icon='GRID') row.prop(settings, "use_guide", text="", icon='GRID')

View File

@@ -83,7 +83,7 @@ bool UI_but_is_tool(const uiBut *but)
if (but->optype != NULL) { if (but->optype != NULL) {
static wmOperatorType *ot = NULL; static wmOperatorType *ot = NULL;
if (ot == NULL) { if (ot == NULL) {
ot = WM_operatortype_find("WM_OT_tool_set_by_name", false); ot = WM_operatortype_find("WM_OT_tool_set_by_id", false);
} }
if (but->optype == ot) { if (but->optype == ot) {
return true; return true;

View File

@@ -364,7 +364,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
return NULL; return NULL;
} }
if (!STREQ(but->optype->idname, "WM_OT_tool_set_by_name")) { if (!STREQ(but->optype->idname, "WM_OT_tool_set_by_id")) {
return NULL; return NULL;
} }
@@ -373,9 +373,9 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
return NULL; return NULL;
} }
char tool_name[MAX_NAME]; char tool_id[MAX_NAME];
RNA_string_get(but->opptr, "name", tool_name); RNA_string_get(but->opptr, "name", tool_id);
BLI_assert(tool_name[0] != '\0'); BLI_assert(tool_id[0] != '\0');
/* We have a tool, now extract the info. */ /* We have a tool, now extract the info. */
uiTooltipData *data = MEM_callocN(sizeof(uiTooltipData), "uiTooltipData"); uiTooltipData *data = MEM_callocN(sizeof(uiTooltipData), "uiTooltipData");
@@ -387,13 +387,43 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
/* Title (when icon-only). */ /* Title (when icon-only). */
if (but->drawstr[0] == '\0') { if (but->drawstr[0] == '\0') {
uiTooltipField *field = text_field_add( const char *expr_imports[] = {"bpy", "bl_ui", NULL};
data, &(uiTooltipFormat){ char expr[256];
.style = UI_TIP_STYLE_NORMAL, SNPRINTF(
.color_id = UI_TIP_LC_MAIN, expr,
.is_pad = true, "bl_ui.space_toolsystem_common.item_from_id("
}); "bpy.context, "
field->text = BLI_strdup(tool_name); "bpy.context.space_data.type, "
"'%s').label",
tool_id);
char *expr_result = NULL;
bool is_error = false;
if (BPY_execute_string_as_string(C, expr_imports, expr, true, &expr_result)) {
if (STREQ(expr_result, "")) {
MEM_freeN(expr_result);
expr_result = NULL;
}
}
else {
/* Note, this is an exceptional case, we could even remove it
* however there have been reports of tooltips failing, so keep it for now. */
expr_result = BLI_strdup("Internal error!");
is_error = true;
}
if (expr_result != NULL) {
uiTooltipField *field = text_field_add(
data, &(uiTooltipFormat){
.style = UI_TIP_STYLE_NORMAL,
.color_id = UI_TIP_LC_MAIN,
.is_pad = true,
});
field->text = expr_result;
if (UNLIKELY(is_error)) {
field->format.color_id = UI_TIP_LC_ALERT;
}
}
} }
/* Tip. */ /* Tip. */
@@ -402,11 +432,11 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
char expr[256]; char expr[256];
SNPRINTF( SNPRINTF(
expr, expr,
"bl_ui.space_toolsystem_common.description_from_name(" "bl_ui.space_toolsystem_common.description_from_id("
"bpy.context, " "bpy.context, "
"bpy.context.space_data.type, " "bpy.context.space_data.type, "
"'%s') + '.'", "'%s') + '.'",
tool_name); tool_id);
char *expr_result = NULL; char *expr_result = NULL;
bool is_error = false; bool is_error = false;
@@ -461,7 +491,7 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
const char *tool_attr = BKE_paint_get_tool_prop_id_from_paintmode(paint_mode); const char *tool_attr = BKE_paint_get_tool_prop_id_from_paintmode(paint_mode);
if (tool_attr != NULL) { if (tool_attr != NULL) {
const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode); const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode);
const int i = RNA_enum_from_name(items, tool_name); const int i = RNA_enum_from_name(items, tool_id);
if (i != -1) { if (i != -1) {
wmOperatorType *ot = WM_operatortype_find("paint.brush_select", true); wmOperatorType *ot = WM_operatortype_find("paint.brush_select", true);
PointerRNA op_props; PointerRNA op_props;
@@ -504,9 +534,9 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
wmKeyMap *keymap = (wmKeyMap *)expr_result; wmKeyMap *keymap = (wmKeyMap *)expr_result;
for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) { for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
if (STREQ(kmi->idname, but->optype->idname)) { if (STREQ(kmi->idname, but->optype->idname)) {
char tool_name_test[MAX_NAME]; char tool_id_test[MAX_NAME];
RNA_string_get(kmi->ptr, "name", tool_name_test); RNA_string_get(kmi->ptr, "name", tool_id_test);
if (STREQ(tool_name, tool_name_test)) { if (STREQ(tool_id, tool_id_test)) {
char buf[128]; char buf[128];
WM_keymap_item_to_string(kmi, false, buf, sizeof(buf)); WM_keymap_item_to_string(kmi, false, buf, sizeof(buf));
shortcut = BLI_sprintfN("%s, %s", shortcut_toolbar, buf); shortcut = BLI_sprintfN("%s, %s", shortcut_toolbar, buf);
@@ -543,12 +573,12 @@ static uiTooltipData *ui_tooltip_data_from_tool(bContext *C, uiBut *but, bool is
SNPRINTF( SNPRINTF(
expr, expr,
"getattr(" "getattr("
"bl_ui.space_toolsystem_common.keymap_from_name(" "bl_ui.space_toolsystem_common.keymap_from_id("
"bpy.context, " "bpy.context, "
"bpy.context.space_data.type, " "bpy.context.space_data.type, "
"'%s'), " "'%s'), "
"'as_pointer', lambda: 0)()", "'as_pointer', lambda: 0)()",
tool_name); tool_id);
intptr_t expr_result = 0; intptr_t expr_result = 0;
if (BPY_execute_string_as_intptr(C, expr_imports, expr, true, &expr_result)) { if (BPY_execute_string_as_intptr(C, expr_imports, expr, true, &expr_result)) {

View File

@@ -234,9 +234,8 @@ static void rna_def_workspace_tool(BlenderRNA *brna)
RNA_def_struct_clear_flag(srna, STRUCT_UNDO); RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Work Space Tool", ""); RNA_def_struct_ui_text(srna, "Work Space Tool", "");
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); prop = RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "idname"); RNA_def_property_ui_text(prop, "Identifier", "");
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_name_property(srna, prop); RNA_def_struct_name_property(srna, prop);
prop = RNA_def_property(srna, "index", PROP_INT, PROP_NONE); prop = RNA_def_property(srna, "index", PROP_INT, PROP_NONE);

View File

@@ -133,7 +133,7 @@ void RNA_api_workspace_tool(StructRNA *srna)
RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_CONTEXT); RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_CONTEXT);
RNA_def_function_ui_description(func, "Set the tool settings"); RNA_def_function_ui_description(func, "Set the tool settings");
parm = RNA_def_string(func, "name", NULL, KMAP_MAX_NAME, "Name", ""); parm = RNA_def_string(func, "idname", NULL, MAX_NAME, "Identifier", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
/* 'bToolRef_Runtime' */ /* 'bToolRef_Runtime' */

View File

@@ -54,7 +54,7 @@ struct bToolRef *WM_toolsystem_ref_find(struct WorkSpace *workspace, const bTool
bool WM_toolsystem_ref_ensure( bool WM_toolsystem_ref_ensure(
struct WorkSpace *workspace, const bToolKey *tkey, struct WorkSpace *workspace, const bToolKey *tkey,
struct bToolRef **r_tref); struct bToolRef **r_tref);
struct bToolRef *WM_toolsystem_ref_set_by_name( struct bToolRef *WM_toolsystem_ref_set_by_id(
struct bContext *C, struct WorkSpace *workspace, const bToolKey *tkey, struct bContext *C, struct WorkSpace *workspace, const bToolKey *tkey,
const char *name, bool cycle); const char *name, bool cycle);

View File

@@ -69,7 +69,7 @@ wmKeyMapItem *WM_keymap_add_panel(wmKeyMap *keymap, const char *idname, int type
/* tool wrapper for WM_keymap_add_item */ /* tool wrapper for WM_keymap_add_item */
wmKeyMapItem *WM_keymap_add_tool(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier) wmKeyMapItem *WM_keymap_add_tool(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
{ {
wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_tool_set_by_name", type, val, modifier, keymodifier); wmKeyMapItem *kmi = WM_keymap_add_item(keymap, "WM_OT_tool_set_by_id", type, val, modifier, keymodifier);
RNA_string_set(kmi->ptr, "name", idname); RNA_string_set(kmi->ptr, "name", idname);
return kmi; return kmi;
} }
@@ -169,7 +169,7 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
if (STRPREFIX(opname, "WM_OT") || if (STRPREFIX(opname, "WM_OT") ||
STRPREFIX(opname, "ED_OT_undo")) STRPREFIX(opname, "ED_OT_undo"))
{ {
if (STREQ(opname, "WM_OT_tool_set_by_name")) { if (STREQ(opname, "WM_OT_tool_set_by_id")) {
km = WM_keymap_guess_from_context(C); km = WM_keymap_guess_from_context(C);
} }

View File

@@ -728,11 +728,11 @@ static void toolsystem_refresh_screen_from_active_tool(
} }
} }
bToolRef *WM_toolsystem_ref_set_by_name( bToolRef *WM_toolsystem_ref_set_by_id(
bContext *C, WorkSpace *workspace, const bToolKey *tkey, bContext *C, WorkSpace *workspace, const bToolKey *tkey,
const char *name, bool cycle) const char *name, bool cycle)
{ {
wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_name", false); wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_id", false);
/* On startup, Python operatores are not yet loaded. */ /* On startup, Python operatores are not yet loaded. */
if (ot == NULL) { if (ot == NULL) {
return NULL; return NULL;
@@ -775,7 +775,7 @@ static void toolsystem_reinit_with_toolref(
.space_type = tref->space_type, .space_type = tref->space_type,
.mode = tref->mode, .mode = tref->mode,
}; };
WM_toolsystem_ref_set_by_name(C, workspace, &tkey, tref->idname, false); WM_toolsystem_ref_set_by_id(C, workspace, &tkey, tref->idname, false);
} }
static const char *toolsystem_default_tool(const bToolKey *tkey) static const char *toolsystem_default_tool(const bToolKey *tkey)