Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/include/UI_interface.h2
-rw-r--r--source/blender/editors/interface/interface_layout.c32
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c40
3 files changed, 68 insertions, 6 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 6a0b643fb84..f02c34c4085 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -2425,6 +2425,8 @@ void uiItemTabsEnumR_prop(uiLayout *layout,
struct bContext *C,
struct PointerRNA *ptr,
PropertyRNA *prop,
+ struct PointerRNA *ptr_highlight,
+ PropertyRNA *prop_highlight,
bool icon_only);
/* Only for testing, inspecting layouts. */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index e6b05c97c06..213917929e3 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -974,6 +974,8 @@ static void ui_item_enum_expand_tabs(uiLayout *layout,
uiBlock *block,
PointerRNA *ptr,
PropertyRNA *prop,
+ PointerRNA *ptr_highlight,
+ PropertyRNA *prop_highlight,
const char *uiname,
const int h,
const bool icon_only)
@@ -982,8 +984,26 @@ static void ui_item_enum_expand_tabs(uiLayout *layout,
ui_item_enum_expand_exec(layout, block, ptr, prop, uiname, h, UI_BTYPE_TAB, icon_only);
BLI_assert(last != block->buttons.last);
+
+ const bool use_custom_highlight = (prop_highlight != NULL);
+
+ int custom_highlight_flag = 0; /* Max of 32 tabs. */
+ if (use_custom_highlight) {
+ BLI_assert(prop_highlight != NULL);
+ BLI_assert(RNA_property_flag(prop_highlight) & PROP_ENUM_FLAG);
+ custom_highlight_flag = RNA_property_enum_get(ptr_highlight, prop_highlight);
+ }
+
+ int i = 0;
for (uiBut *tab = last ? last->next : block->buttons.first; tab; tab = tab->next) {
UI_but_drawflag_enable(tab, ui_but_align_opposite_to_area_align_get(CTX_wm_region(C)));
+
+ if (use_custom_highlight) {
+ if (!(custom_highlight_flag & (1 << i))) {
+ tab->flag |= UI_BUT_INACTIVE;
+ }
+ }
+ i++;
}
}
@@ -3574,13 +3594,19 @@ void uiItemMenuEnumR(
uiItemMenuEnumR_prop(layout, ptr, prop, name, icon);
}
-void uiItemTabsEnumR_prop(
- uiLayout *layout, bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool icon_only)
+void uiItemTabsEnumR_prop(uiLayout *layout,
+ bContext *C,
+ PointerRNA *ptr,
+ PropertyRNA *prop,
+ PointerRNA *ptr_highlight,
+ PropertyRNA *prop_highlight,
+ bool icon_only)
{
uiBlock *block = layout->root->block;
UI_block_layout_set_current(block, layout);
- ui_item_enum_expand_tabs(layout, C, block, ptr, prop, NULL, UI_UNIT_Y, icon_only);
+ ui_item_enum_expand_tabs(
+ layout, C, block, ptr, prop, ptr_highlight, prop_highlight, NULL, UI_UNIT_Y, icon_only);
}
/** \} */
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 8dfa54b95da..d5530e76296 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -216,8 +216,13 @@ static void rna_uiItemMenuEnumR(uiLayout *layout,
uiItemMenuEnumR_prop(layout, ptr, prop, name, icon);
}
-static void rna_uiItemTabsEnumR(
- uiLayout *layout, bContext *C, struct PointerRNA *ptr, const char *propname, bool icon_only)
+static void rna_uiItemTabsEnumR(uiLayout *layout,
+ bContext *C,
+ struct PointerRNA *ptr,
+ const char *propname,
+ struct PointerRNA *ptr_highlight,
+ const char *propname_highlight,
+ bool icon_only)
{
PropertyRNA *prop = RNA_struct_find_property(ptr, propname);
@@ -230,7 +235,31 @@ static void rna_uiItemTabsEnumR(
return;
}
- uiItemTabsEnumR_prop(layout, C, ptr, prop, icon_only);
+ /* Get the highlight property used to gray out some of the tabs. */
+ PropertyRNA *prop_highlight = NULL;
+ if (!RNA_pointer_is_null(ptr_highlight)) {
+ prop_highlight = RNA_struct_find_property(ptr_highlight, propname_highlight);
+ if (!prop_highlight) {
+ RNA_warning("property not found: %s.%s",
+ RNA_struct_identifier(ptr_highlight->type),
+ propname_highlight);
+ return;
+ }
+ if (RNA_property_type(prop_highlight) != PROP_ENUM) {
+ RNA_warning("property is not an enum: %s.%s",
+ RNA_struct_identifier(ptr_highlight->type),
+ propname_highlight);
+ return;
+ }
+ if (!(RNA_property_flag(prop_highlight) & PROP_ENUM_FLAG)) {
+ RNA_warning("property must be a bitfield enum: %s.%s",
+ RNA_struct_identifier(ptr_highlight->type),
+ propname_highlight);
+ return;
+ }
+ }
+
+ uiItemTabsEnumR_prop(layout, C, ptr, prop, ptr_highlight, prop_highlight, icon_only);
}
static void rna_uiItemEnumR_string(uiLayout *layout,
@@ -920,6 +949,11 @@ void RNA_api_ui_layout(StructRNA *srna)
func = RNA_def_function(srna, "prop_tabs_enum", "rna_uiItemTabsEnumR");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
api_ui_item_rna_common(func);
+ parm = RNA_def_pointer(
+ func, "data_highlight", "AnyType", "", "Data from which to take highlight property");
+ RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_RNAPTR);
+ parm = RNA_def_string(
+ func, "property_highlight", NULL, 0, "", "Identifier of highlight property in data");
RNA_def_boolean(func, "icon_only", false, "", "Draw only icons in tabs, no text");
func = RNA_def_function(srna, "prop_enum", "rna_uiItemEnumR_string");