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.h8
-rw-r--r--source/blender/editors/interface/interface_utils.c24
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.cc124
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.hh2
-rw-r--r--source/blender/editors/space_outliner/outliner_select.cc2
-rw-r--r--source/blender/editors/space_outliner/outliner_utils.cc6
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_overrides.cc9
-rw-r--r--source/blender/editors/space_outliner/tree/tree_element_overrides.hh12
8 files changed, 144 insertions, 43 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 060c9dc33d6..a223eac3000 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -1610,6 +1610,14 @@ uiBut *uiDefAutoButR(uiBlock *block,
int y,
int width,
int height);
+void uiDefAutoButsArrayR(uiBlock *block,
+ PointerRNA *ptr,
+ PropertyRNA *prop,
+ const int icon,
+ const int x,
+ const int y,
+ const int tot_width,
+ const int height);
/**
* \a check_prop callback filters functions to avoid drawing certain properties,
* in cases where PROP_HIDDEN flag can't be used for a property.
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 814bd956096..728d42a9353 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -320,6 +320,7 @@ uiBut *uiDefAutoButR(uiBlock *block,
-1,
-1,
NULL);
+ ui_but_add_search(but, ptr, prop, NULL, NULL);
break;
}
case PROP_COLLECTION: {
@@ -338,6 +339,29 @@ uiBut *uiDefAutoButR(uiBlock *block,
return but;
}
+void uiDefAutoButsArrayR(uiBlock *block,
+ PointerRNA *ptr,
+ PropertyRNA *prop,
+ const int icon,
+ const int x,
+ const int y,
+ const int tot_width,
+ const int height)
+{
+ const int len = RNA_property_array_length(ptr, prop);
+ if (len == 0) {
+ return;
+ }
+
+ const int item_width = tot_width / len;
+
+ UI_block_align_begin(block);
+ for (int i = 0; i < len; i++) {
+ uiDefAutoButR(block, ptr, prop, i, "", icon, x + i * item_width, y, item_width, height);
+ }
+ UI_block_align_end(block);
+}
+
eAutoPropButsReturn uiDefAutoButsRNA(uiLayout *layout,
PointerRNA *ptr,
bool (*check_prop)(PointerRNA *ptr,
diff --git a/source/blender/editors/space_outliner/outliner_draw.cc b/source/blender/editors/space_outliner/outliner_draw.cc
index 4ef0bbbcde8..a50dde68d28 100644
--- a/source/blender/editors/space_outliner/outliner_draw.cc
+++ b/source/blender/editors/space_outliner/outliner_draw.cc
@@ -1082,7 +1082,7 @@ static void outliner_draw_restrictbuts(uiBlock *block,
}
BLI_assert((restrict_column_offset * UI_UNIT_X + V2D_SCROLL_WIDTH) ==
- outliner_restrict_columns_width(space_outliner));
+ outliner_right_columns_width(space_outliner));
/* Create buttons. */
uiBut *bt;
@@ -1779,11 +1779,65 @@ static void outliner_draw_userbuts(uiBlock *block,
}
}
-static bool outliner_draw_overrides_buts(uiBlock *block,
- ARegion *region,
- SpaceOutliner *space_outliner,
- ListBase *lb,
- const bool is_open)
+static void outliner_draw_overrides_rna_buts(uiBlock *block,
+ const ARegion *region,
+ const SpaceOutliner *space_outliner,
+ const ListBase *lb,
+ const int x)
+{
+ LISTBASE_FOREACH (const TreeElement *, te, lb) {
+ const TreeStoreElem *tselem = TREESTORE(te);
+ if (TSELEM_OPEN(tselem, space_outliner)) {
+ outliner_draw_overrides_rna_buts(block, region, space_outliner, &te->subtree, x);
+ }
+
+ if (!outliner_is_element_in_view(te, &region->v2d)) {
+ continue;
+ }
+ if (tselem->type != TSE_LIBRARY_OVERRIDE) {
+ continue;
+ }
+
+ TreeElementOverridesProperty &override_elem = *tree_element_cast<TreeElementOverridesProperty>(
+ te);
+
+ PointerRNA *ptr = &override_elem.override_rna_ptr;
+ PropertyRNA *prop = &override_elem.override_rna_prop;
+ const PropertyType prop_type = RNA_property_type(prop);
+
+ const float pad_x = 1 * UI_DPI_FAC;
+ const float max_width = OL_RNA_COL_SIZEX - 2 * pad_x;
+ const float height = UI_UNIT_Y - U.pixelsize;
+
+ uiBut *auto_but = uiDefAutoButR(block,
+ ptr,
+ prop,
+ -1,
+ (prop_type == PROP_ENUM) ? nullptr : "",
+ ICON_NONE,
+ x + pad_x,
+ te->ys,
+ max_width,
+ height);
+ /* Added the button successfully, nothing else to do. Otherwise, cases for multiple buttons
+ * need to be handled. */
+ if (auto_but) {
+ continue;
+ }
+
+ if (!auto_but) {
+ /* TODO what if the array is longer, and doesn't fit nicely? What about multi-dimension
+ * arrays? */
+ uiDefAutoButsArrayR(block, ptr, prop, ICON_NONE, x, te->ys, max_width, height);
+ }
+ }
+}
+
+static bool outliner_draw_overrides_warning_buts(uiBlock *block,
+ ARegion *region,
+ SpaceOutliner *space_outliner,
+ ListBase *lb,
+ const bool is_open)
{
bool any_item_has_warnings = false;
@@ -1829,7 +1883,7 @@ static bool outliner_draw_overrides_buts(uiBlock *block,
break;
}
- const bool any_child_has_warnings = outliner_draw_overrides_buts(
+ const bool any_child_has_warnings = outliner_draw_overrides_warning_buts(
block,
region,
space_outliner,
@@ -1863,28 +1917,20 @@ static bool outliner_draw_overrides_buts(uiBlock *block,
return any_item_has_warnings;
}
-static void outliner_draw_rnacols(ARegion *region, int sizex)
+static void outliner_draw_separator(ARegion *region, const int x)
{
View2D *v2d = &region->v2d;
- float miny = v2d->cur.ymin;
- if (miny < v2d->tot.ymin) {
- miny = v2d->tot.ymin;
- }
-
GPU_line_width(1.0f);
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
immUniformThemeColorShadeAlpha(TH_BACK, -15, -200);
- immBegin(GPU_PRIM_LINES, 4);
-
- immVertex2f(pos, sizex, v2d->cur.ymax);
- immVertex2f(pos, sizex, miny);
+ immBegin(GPU_PRIM_LINES, 2);
- immVertex2f(pos, sizex + OL_RNA_COL_SIZEX, v2d->cur.ymax);
- immVertex2f(pos, sizex + OL_RNA_COL_SIZEX, miny);
+ immVertex2f(pos, x, v2d->cur.ymax);
+ immVertex2f(pos, x, v2d->cur.ymin);
immEnd();
@@ -3637,7 +3683,7 @@ static void outliner_draw_tree(bContext *C,
const TreeViewContext *tvc,
ARegion *region,
SpaceOutliner *space_outliner,
- const float restrict_column_width,
+ const float right_column_width,
const bool use_mode_column,
const bool use_warning_column,
TreeElement **te_edit)
@@ -3672,8 +3718,8 @@ static void outliner_draw_tree(bContext *C,
/* Set scissor so tree elements or lines can't overlap restriction icons. */
int scissor[4] = {0};
- if (restrict_column_width > 0.0f) {
- int mask_x = BLI_rcti_size_x(&region->v2d.mask) - (int)restrict_column_width + 1;
+ if (right_column_width > 0.0f) {
+ int mask_x = BLI_rcti_size_x(&region->v2d.mask) - (int)right_column_width + 1;
CLAMP_MIN(mask_x, 0);
GPU_scissor_get(scissor);
@@ -3699,11 +3745,11 @@ static void outliner_draw_tree(bContext *C,
(te->flag & TE_DRAGGING) != 0,
startx,
&starty,
- restrict_column_width,
+ right_column_width,
te_edit);
}
- if (restrict_column_width > 0.0f) {
+ if (right_column_width > 0.0f) {
/* Reset scissor. */
GPU_scissor(UNPACK4(scissor));
}
@@ -3754,21 +3800,21 @@ static int outliner_data_api_buttons_start_x(int max_tree_width)
static int outliner_width(SpaceOutliner *space_outliner,
int max_tree_width,
- float restrict_column_width)
+ float right_column_width)
{
if (space_outliner->outlinevis == SO_DATA_API) {
return outliner_data_api_buttons_start_x(max_tree_width) + OL_RNA_COL_SIZEX + 10 * UI_DPI_FAC;
}
- return max_tree_width + restrict_column_width;
+ return max_tree_width + right_column_width;
}
static void outliner_update_viewable_area(ARegion *region,
SpaceOutliner *space_outliner,
int tree_width,
int tree_height,
- float restrict_column_width)
+ float right_column_width)
{
- int sizex = outliner_width(space_outliner, tree_width, restrict_column_width);
+ int sizex = outliner_width(space_outliner, tree_width, right_column_width);
int sizey = tree_height;
/* Extend size to allow for horizontal scrollbar and extra offset. */
@@ -3829,7 +3875,7 @@ void draw_outliner(const bContext *C)
space_outliner->runtime->tree_display->hasWarnings();
/* Draw outliner stuff (background, hierarchy lines and names). */
- const float restrict_column_width = outliner_restrict_columns_width(space_outliner);
+ const float right_column_width = outliner_right_columns_width(space_outliner);
outliner_back(region);
block = UI_block_begin(C, region, __func__, UI_EMBOSS);
outliner_draw_tree((bContext *)C,
@@ -3837,7 +3883,7 @@ void draw_outliner(const bContext *C)
&tvc,
region,
space_outliner,
- restrict_column_width,
+ right_column_width,
use_mode_column,
use_warning_column,
&te_edit);
@@ -3852,7 +3898,8 @@ void draw_outliner(const bContext *C)
if (space_outliner->outlinevis == SO_DATA_API) {
int buttons_start_x = outliner_data_api_buttons_start_x(tree_width);
/* draw rna buttons */
- outliner_draw_rnacols(region, buttons_start_x);
+ outliner_draw_separator(region, buttons_start_x);
+ outliner_draw_separator(region, buttons_start_x + OL_RNA_COL_SIZEX);
UI_block_emboss_set(block, UI_EMBOSS);
outliner_draw_rnabuts(block, region, space_outliner, buttons_start_x, &space_outliner->tree);
@@ -3864,9 +3911,16 @@ void draw_outliner(const bContext *C)
}
else if (space_outliner->outlinevis == SO_OVERRIDES_LIBRARY) {
/* Draw overrides status columns. */
- outliner_draw_overrides_buts(block, region, space_outliner, &space_outliner->tree, true);
+ outliner_draw_overrides_warning_buts(
+ block, region, space_outliner, &space_outliner->tree, true);
+
+ UI_block_emboss_set(block, UI_EMBOSS);
+ const int x = region->v2d.cur.xmax - OL_RNA_COL_SIZEX;
+ outliner_draw_separator(region, x);
+ outliner_draw_overrides_rna_buts(block, region, space_outliner, &space_outliner->tree, x);
+ UI_block_emboss_set(block, UI_EMBOSS_NONE_OR_STATUS);
}
- else if (restrict_column_width > 0.0f) {
+ else if (right_column_width > 0.0f) {
/* draw restriction columns */
RestrictPropertiesActive props_active;
memset(&props_active, 1, sizeof(RestrictPropertiesActive));
@@ -3893,7 +3947,7 @@ void draw_outliner(const bContext *C)
/* Draw edit buttons if necessary. */
if (te_edit) {
- outliner_buttons(C, block, region, restrict_column_width, te_edit);
+ outliner_buttons(C, block, region, right_column_width, te_edit);
}
UI_block_end(C, block);
@@ -3901,7 +3955,7 @@ void draw_outliner(const bContext *C)
/* Update total viewable region. */
outliner_update_viewable_area(
- region, space_outliner, tree_width, tree_height, restrict_column_width);
+ region, space_outliner, tree_width, tree_height, right_column_width);
}
/** \} */
diff --git a/source/blender/editors/space_outliner/outliner_intern.hh b/source/blender/editors/space_outliner/outliner_intern.hh
index a9bdcc56787..7970841b4fd 100644
--- a/source/blender/editors/space_outliner/outliner_intern.hh
+++ b/source/blender/editors/space_outliner/outliner_intern.hh
@@ -638,7 +638,7 @@ bool outliner_tree_traverse(const SpaceOutliner *space_outliner,
int filter_tselem_flag,
TreeTraversalFunc func,
void *customdata);
-float outliner_restrict_columns_width(const struct SpaceOutliner *space_outliner);
+float outliner_right_columns_width(const struct SpaceOutliner *space_outliner);
/**
* Find first tree element in tree with matching tree-store flag.
*/
diff --git a/source/blender/editors/space_outliner/outliner_select.cc b/source/blender/editors/space_outliner/outliner_select.cc
index a583eb0364f..a202ded6deb 100644
--- a/source/blender/editors/space_outliner/outliner_select.cc
+++ b/source/blender/editors/space_outliner/outliner_select.cc
@@ -1551,7 +1551,7 @@ static bool outliner_is_co_within_restrict_columns(const SpaceOutliner *space_ou
const ARegion *region,
float view_co_x)
{
- return (view_co_x > region->v2d.cur.xmax - outliner_restrict_columns_width(space_outliner));
+ return (view_co_x > region->v2d.cur.xmax - outliner_right_columns_width(space_outliner));
}
bool outliner_is_co_within_mode_column(SpaceOutliner *space_outliner, const float view_mval[2])
diff --git a/source/blender/editors/space_outliner/outliner_utils.cc b/source/blender/editors/space_outliner/outliner_utils.cc
index 556f87617f6..ed5a2108d3c 100644
--- a/source/blender/editors/space_outliner/outliner_utils.cc
+++ b/source/blender/editors/space_outliner/outliner_utils.cc
@@ -314,7 +314,7 @@ bool outliner_tree_traverse(const SpaceOutliner *space_outliner,
return true;
}
-float outliner_restrict_columns_width(const SpaceOutliner *space_outliner)
+float outliner_right_columns_width(const SpaceOutliner *space_outliner)
{
int num_columns = 0;
@@ -322,8 +322,10 @@ float outliner_restrict_columns_width(const SpaceOutliner *space_outliner)
case SO_DATA_API:
case SO_SEQUENCE:
case SO_LIBRARIES:
- case SO_OVERRIDES_LIBRARY:
return 0.0f;
+ case SO_OVERRIDES_LIBRARY:
+ num_columns = OL_RNA_COL_SIZEX / UI_UNIT_X;
+ break;
case SO_ID_ORPHANS:
num_columns = 3;
break;
diff --git a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc
index 64c390d29b3..857f5577e59 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc
+++ b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc
@@ -73,7 +73,8 @@ void TreeElementOverridesBase::expand(SpaceOutliner &space_outliner) const
}
}
- TreeElementOverridesData data = {id, *override_prop, is_rna_path_valid};
+ TreeElementOverridesData data = {
+ id, *override_prop, override_rna_ptr, *override_rna_prop, is_rna_path_valid};
outliner_add_element(
&space_outliner, &legacy_te_.subtree, &data, &legacy_te_, TSE_LIBRARY_OVERRIDE, index++);
}
@@ -81,11 +82,13 @@ void TreeElementOverridesBase::expand(SpaceOutliner &space_outliner) const
TreeElementOverridesProperty::TreeElementOverridesProperty(TreeElement &legacy_te,
TreeElementOverridesData &override_data)
- : AbstractTreeElement(legacy_te), override_prop_(override_data.override_property)
+ : AbstractTreeElement(legacy_te),
+ override_rna_ptr(override_data.override_rna_ptr),
+ override_rna_prop(override_data.override_rna_prop)
{
BLI_assert(legacy_te.store_elem->type == TSE_LIBRARY_OVERRIDE);
- legacy_te.name = override_prop_.rna_path;
+ legacy_te.name = override_data.override_property.rna_path;
/* Abusing this for now, better way to do it is also pending current refactor of the whole tree
* code to use C++. */
legacy_te.directdata = POINTER_FROM_UINT(override_data.is_rna_path_valid);
diff --git a/source/blender/editors/space_outliner/tree/tree_element_overrides.hh b/source/blender/editors/space_outliner/tree/tree_element_overrides.hh
index 1987efcf6f6..a2d1409f193 100644
--- a/source/blender/editors/space_outliner/tree/tree_element_overrides.hh
+++ b/source/blender/editors/space_outliner/tree/tree_element_overrides.hh
@@ -6,13 +6,21 @@
#pragma once
+#include "RNA_types.h"
+
#include "tree_element.hh"
+struct ID;
+struct IDOverrideLibraryProperty;
+
namespace blender::ed::outliner {
struct TreeElementOverridesData {
ID &id;
IDOverrideLibraryProperty &override_property;
+ PointerRNA &override_rna_ptr;
+ PropertyRNA &override_rna_prop;
+
bool is_rna_path_valid;
};
@@ -27,7 +35,9 @@ class TreeElementOverridesBase final : public AbstractTreeElement {
};
class TreeElementOverridesProperty final : public AbstractTreeElement {
- IDOverrideLibraryProperty &override_prop_;
+ public:
+ PointerRNA override_rna_ptr;
+ PropertyRNA &override_rna_prop;
public:
TreeElementOverridesProperty(TreeElement &legacy_te, TreeElementOverridesData &override_data);