Tool System: Utility to set the tool by name

Wrapper for the Python operator.
This commit is contained in:
Campbell Barton 2018-05-31 09:02:43 +02:00
parent fbd614f1fa
commit 81bf9a41e1
2 changed files with 39 additions and 7 deletions

View File

@ -51,6 +51,9 @@ struct bToolRef *WM_toolsystem_ref_find(struct WorkSpace *workspace, const bTool
bool WM_toolsystem_ref_ensure(
struct WorkSpace *workspace, const bToolKey *tkey,
struct bToolRef **r_tref);
struct bToolRef *WM_toolsystem_ref_set_by_name(
bContext *C, struct WorkSpace *workspace, const bToolKey *tkey,
const char *name, bool cycle);
struct bToolRef_Runtime *WM_toolsystem_runtime_from_context(struct bContext *C);
struct bToolRef_Runtime *WM_toolsystem_runtime_find(struct WorkSpace *workspace, const bToolKey *tkey);

View File

@ -461,23 +461,52 @@ static void toolsystem_refresh_screen_from_active_tool(
}
}
static void toolsystem_reinit_with_toolref(
bContext *C, WorkSpace *workspace, bToolRef *tref)
bToolRef *WM_toolsystem_ref_set_by_name(
bContext *C, WorkSpace *workspace, const bToolKey *tkey,
const char *name, bool cycle)
{
wmOperatorType *ot = WM_operatortype_find("WM_OT_tool_set_by_name", false);
/* On startup, Python operatores are not yet loaded. */
if (ot == NULL) {
return;
return NULL;
}
PointerRNA op_props;
WM_operator_properties_create_ptr(&op_props, ot);
RNA_string_set(&op_props, "name", tref->idname);
RNA_enum_set(&op_props, "space_type", tref->space_type);
RNA_string_set(&op_props, "name", name);
/* Will get from context if not set. */
bToolKey tkey_from_context;
if (tkey == NULL) {
Scene *scene = CTX_data_scene(C);
ScrArea *sa = CTX_wm_area(C);
WM_toolsystem_key_from_context(workspace, scene, sa, &tkey_from_context);
tkey = &tkey_from_context;
}
RNA_enum_set(&op_props, "space_type", tkey->space_type);
RNA_boolean_set(&op_props, "cycle", cycle);
WM_operator_name_call_ptr(C, ot, WM_OP_EXEC_DEFAULT, &op_props);
WM_operator_properties_free(&op_props);
Main *bmain = CTX_data_main(C);
toolsystem_refresh_screen_from_active_tool(bmain, workspace, tref);
bToolRef *tref = WM_toolsystem_ref_find(workspace, tkey);
if (tref) {
Main *bmain = CTX_data_main(C);
toolsystem_refresh_screen_from_active_tool(bmain, workspace, tref);
}
return (tref && STREQ(tref->idname, name)) ? tref : NULL;
}
static void toolsystem_reinit_with_toolref(
bContext *C, WorkSpace *workspace, bToolRef *tref)
{
bToolKey tkey = {
.space_type = tref->space_type,
.mode = tref->mode,
};
WM_toolsystem_ref_set_by_name(C, workspace, &tkey, tref->idname, false);
}
/**