Blender V4.3
spreadsheet_dataset_draw.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include <fmt/format.h>
6
7#include "BLI_string.h"
8
10#include "DNA_curves_types.h"
11#include "DNA_mesh_types.h"
13#include "DNA_space_types.h"
15
16#include "BKE_context.hh"
17#include "BKE_curves.hh"
19#include "BKE_grease_pencil.hh"
20#include "BKE_instances.hh"
21#include "BKE_volume.hh"
22
23#include "RNA_access.hh"
24#include "RNA_prototypes.hh"
25
26#include "UI_interface.hh"
27#include "UI_tree_view.hh"
28
29#include "WM_api.hh"
30#include "WM_types.hh"
31
32#include "BLT_translation.hh"
33
34#include "ED_outliner.hh"
35
38#include "spreadsheet_intern.hh"
39
41
42class GeometryDataSetTreeView;
43class GeometryInstancesTreeView;
44
47 std::optional<int> layer_index;
48 std::optional<bke::AttrDomain> domain;
49};
50
52{
53 /* Using the tree row button instead of a separate right aligned button gives padding
54 * to the right side of the number, which it didn't have with the button. */
55 UI_but_hint_drawstr_set(reinterpret_cast<uiBut *>(view_item.view_item_button()), str.c_str());
56}
57
58static void draw_count(ui::AbstractTreeViewItem &view_item, const int count)
59{
61 BLI_str_format_decimal_unit(element_count, count);
62 draw_row_suffix(view_item, element_count);
63}
64
66{
67 switch (domain) {
69 return IFACE_("Vertex");
71 return IFACE_("Edge");
73 return IFACE_("Face");
75 return IFACE_("Face Corner");
76 default:
78 return "";
79 }
80}
81
83{
84 switch (domain) {
86 return IFACE_("Control Point");
88 return IFACE_("Spline");
89 default:
91 return "";
92 }
93}
94
96{
97 switch (domain) {
99 return ICON_VERTEXSEL;
101 return ICON_EDGESEL;
103 return ICON_FACESEL;
105 return ICON_FACE_CORNER;
106 default:
108 return ICON_NONE;
109 }
110}
111
113{
114 switch (domain) {
116 return ICON_CURVE_BEZCIRCLE;
118 return ICON_CURVE_PATH;
119 default:
121 return ICON_NONE;
122 }
123}
124
126 public:
128
129 void get_parent_instance_ids(Vector<SpreadsheetInstanceID> &r_instance_ids) const;
130
131 void on_activate(bContext &C) override;
132
133 std::optional<bool> should_be_active() const override;
134};
135
137 public:
139 {
140 label_ = geometry.name.empty() ? IFACE_("(Geometry)") : geometry.name;
141 }
142
143 void build_row(uiLayout &row) override
144 {
145 uiItemL(&row, label_.c_str(), ICON_GEOMETRY_SET);
146 }
147};
148
150 private:
151 const bke::InstanceReference &reference_;
152 int reference_index_;
153 int user_count_;
154
155 public:
157 : reference_(instances.references()[reference_index]), reference_index_(reference_index)
158 {
159 label_ = std::to_string(reference_index);
160 user_count_ = instances.reference_user_counts()[reference_index];
161 }
162
163 void build_row(uiLayout &row) override
164 {
165 const int icon = get_instance_reference_icon(reference_);
166 StringRefNull name = reference_.name();
167 if (name.is_empty()) {
168 name = IFACE_("(Geometry)");
169 }
170 uiItemL(&row, name.c_str(), icon);
171 draw_count(*this, user_count_);
172 }
173
174 int reference_index() const
175 {
176 return reference_index_;
177 }
178};
179
181 private:
182 bke::GeometrySet root_geometry_set_;
183 SpaceSpreadsheet &sspreadsheet_;
184 bScreen &screen_;
185
187
188 public:
190 : root_geometry_set_(std::move(geometry_set)),
191 sspreadsheet_(*CTX_wm_space_spreadsheet(&C)),
192 screen_(*CTX_wm_screen(&C))
193 {
194 }
195
196 void build_tree() override
197 {
198 auto &root_item = this->add_tree_item<RootGeometryViewItem>(root_geometry_set_);
199 root_item.uncollapse_by_default();
200 if (const bke::Instances *instances = root_geometry_set_.get_instances()) {
201 this->build_tree_for_instances(root_item, *instances);
202 }
203 }
204
206 {
207 const Span<bke::InstanceReference> references = instances.references();
208 for (const int reference_i : references.index_range()) {
209 auto &reference_item = parent.add_tree_item<InstanceReferenceViewItem>(instances,
210 reference_i);
211 const bke::InstanceReference &reference = references[reference_i];
212 bke::GeometrySet reference_geometry;
213 reference.to_geometry_set(reference_geometry);
214 if (const bke::Instances *child_instances = reference_geometry.get_instances()) {
215 this->build_tree_for_instances(reference_item, *child_instances);
216 }
217 }
218 }
219};
220
222 public:
224
225 void on_activate(bContext &C) override;
226
227 std::optional<bool> should_be_active() const override;
228
230 virtual std::optional<GeometryDataIdentifier> get_geometry_data_id() const
231 {
232 return std::nullopt;
233 }
234};
235
237 public:
239 {
240 label_ = IFACE_("Mesh");
241 }
242
243 void build_row(uiLayout &row) override
244 {
245 uiItemL(&row, label_.c_str(), ICON_MESH_DATA);
246 }
247};
248
250 private:
251 const Mesh *mesh_;
252 bke::AttrDomain domain_;
253
254 public:
255 MeshDomainViewItem(const Mesh *mesh, const bke::AttrDomain domain) : mesh_(mesh), domain_(domain)
256 {
258 }
259
260 std::optional<GeometryDataIdentifier> get_geometry_data_id() const override
261 {
262 return GeometryDataIdentifier{bke::GeometryComponent::Type::Mesh, std::nullopt, domain_};
263 }
264
265 void build_row(uiLayout &row) override
266 {
267 const BIFIconID icon = mesh_domain_to_icon(domain_);
268 uiItemL(&row, label_.c_str(), icon);
269
270 const int count = mesh_ ? mesh_->attributes().domain_size(domain_) : 0;
271 draw_count(*this, count);
272 }
273};
274
276 public:
278 {
279 label_ = IFACE_("Curve");
280 }
281
282 void build_row(uiLayout &row) override
283 {
284 uiItemL(&row, label_.c_str(), ICON_CURVE_DATA);
285 }
286};
287
289 private:
290 const Curves *curves_;
291 bke::AttrDomain domain_;
292
293 public:
294 CurvesDomainViewItem(const Curves *curves, const bke::AttrDomain domain)
295 : curves_(curves), domain_(domain)
296 {
298 }
299
300 std::optional<GeometryDataIdentifier> get_geometry_data_id() const override
301 {
302 return GeometryDataIdentifier{bke::GeometryComponent::Type::Curve, std::nullopt, domain_};
303 }
304
305 void build_row(uiLayout &row) override
306 {
307 const BIFIconID icon = curves_domain_to_icon(domain_);
308 uiItemL(&row, label_.c_str(), icon);
309
310 const int count = curves_ ? curves_->geometry.wrap().attributes().domain_size(domain_) : 0;
311 draw_count(*this, count);
312 }
313};
314
316 public:
318 {
319 label_ = IFACE_("Grease Pencil");
320 }
321
322 void build_row(uiLayout &row) override
323 {
324 uiItemL(&row, label_.c_str(), ICON_OUTLINER_DATA_GREASEPENCIL);
325 }
326};
327
329 private:
330 const GreasePencil *grease_pencil_;
331
332 public:
333 GreasePencilLayersViewItem(const GreasePencil *grease_pencil) : grease_pencil_(grease_pencil)
334 {
335 label_ = IFACE_("Layer");
336 }
337
338 std::optional<GeometryDataIdentifier> get_geometry_data_id() const override
339 {
342 }
343
344 void build_row(uiLayout &row) override
345 {
346 const int count = grease_pencil_ ? grease_pencil_->layers().size() : 0;
347 uiItemL(&row, label_.c_str(), ICON_OUTLINER_DATA_GP_LAYER);
348 draw_count(*this, count);
349 }
350};
351
353 private:
354 const bke::greasepencil::Layer &layer_;
355
356 public:
357 GreasePencilLayerViewItem(const GreasePencil &grease_pencil, const int layer_index)
358 : layer_(grease_pencil.layer(layer_index))
359 {
360 label_ = std::to_string(layer_index);
361 }
362
363 void build_row(uiLayout &row) override
364 {
365 StringRefNull name = layer_.name();
366 if (name.is_empty()) {
367 name = IFACE_("(Layer)");
368 }
369 uiItemL(&row, name.c_str(), ICON_CURVE_DATA);
370 }
371};
372
374 private:
375 const GreasePencil &grease_pencil_;
376 int layer_index_;
377 bke::AttrDomain domain_;
378
379 public:
381 const int layer_index,
382 const bke::AttrDomain domain)
383 : grease_pencil_(grease_pencil), layer_index_(layer_index), domain_(domain)
384 {
386 }
387
388 std::optional<GeometryDataIdentifier> get_geometry_data_id() const override
389 {
391 bke::GeometryComponent::Type::GreasePencil, layer_index_, domain_};
392 }
393
394 void build_row(uiLayout &row) override
395 {
396 const BIFIconID icon = curves_domain_to_icon(domain_);
397 uiItemL(&row, label_.c_str(), icon);
398
399 const bke::greasepencil::Drawing *drawing = grease_pencil_.get_eval_drawing(
400 grease_pencil_.layer(layer_index_));
401 const int count = drawing ? drawing->strokes().attributes().domain_size(domain_) : 0;
402 draw_count(*this, count);
403 }
404};
405
407 public:
409 {
410 label_ = IFACE_("Point Cloud");
411 }
412
413 void build_row(uiLayout &row) override
414 {
415 uiItemL(&row, label_.c_str(), ICON_POINTCLOUD_DATA);
416 }
417};
418
420 private:
421 const PointCloud *pointcloud_;
422
423 public:
424 PointsViewItem(const PointCloud *pointcloud) : pointcloud_(pointcloud)
425 {
426 label_ = IFACE_("Point");
427 }
428
429 std::optional<GeometryDataIdentifier> get_geometry_data_id() const override
430 {
433 }
434
435 void build_row(uiLayout &row) override
436 {
437 uiItemL(&row, label_.c_str(), ICON_POINTCLOUD_POINT);
438 const int count = pointcloud_ ? pointcloud_->totpoint : 0;
439 draw_count(*this, count);
440 }
441};
442
444 private:
445 const Volume *volume_;
446
447 public:
448 VolumeGridsViewItem(const Volume *volume) : volume_(volume)
449 {
450 label_ = IFACE_("Volume Grids");
451 }
452
453 std::optional<GeometryDataIdentifier> get_geometry_data_id() const override
454 {
456 bke::GeometryComponent::Type::Volume, std::nullopt, std::nullopt};
457 }
458
459 void build_row(uiLayout &row) override
460 {
461 uiItemL(&row, label_.c_str(), ICON_VOLUME_DATA);
462 const int count = volume_ ? BKE_volume_num_grids(volume_) : 0;
463 draw_count(*this, count);
464 }
465};
466
468 private:
469 const bke::Instances *instances_;
470
471 public:
472 InstancesViewItem(const bke::Instances *instances) : instances_(instances)
473 {
474 label_ = IFACE_("Instances");
475 }
476
477 std::optional<GeometryDataIdentifier> get_geometry_data_id() const override
478 {
481 }
482
483 void build_row(uiLayout &row) override
484 {
485 uiItemL(&row, label_.c_str(), ICON_EMPTY_AXIS);
486 const int count = instances_ ? instances_->instances_num() : 0;
487 draw_count(*this, count);
488 }
489};
490
492 private:
493 bke::GeometrySet geometry_set_;
494 SpaceSpreadsheet &sspreadsheet_;
495 bScreen &screen_;
496
497 friend class DataSetViewItem;
498
499 public:
501 : geometry_set_(std::move(geometry_set)),
502 sspreadsheet_(*CTX_wm_space_spreadsheet(&C)),
503 screen_(*CTX_wm_screen(&C))
504 {
505 }
506
507 void build_tree() override
508 {
509 this->build_tree_for_geometry(geometry_set_, *this);
510 }
511
513 {
514 const Mesh *mesh = geometry.get_mesh();
515 this->build_tree_for_mesh(mesh, parent);
516
517 const Curves *curves = geometry.get_curves();
518 this->build_tree_for_curves(curves, parent);
519
520 const GreasePencil *grease_pencil = geometry.get_grease_pencil();
521 this->build_tree_for_grease_pencil(grease_pencil, parent);
522
523 const PointCloud *pointcloud = geometry.get_pointcloud();
524 this->build_tree_for_pointcloud(pointcloud, parent);
525
526 const Volume *volume = geometry.get_volume();
527 this->build_tree_for_volume(volume, parent);
528
529 const bke::Instances *instances = geometry.get_instances();
530 this->build_tree_for_instances(instances, parent);
531 }
532
542
544 {
545 auto &curves_item = parent.add_tree_item<CurvesViewItem>();
546 curves_item.uncollapse_by_default();
547 curves_item.add_tree_item<CurvesDomainViewItem>(curves, bke::AttrDomain::Point);
549 }
550
553 {
554 auto &grease_pencil_item = parent.add_tree_item<GreasePencilViewItem>();
555 grease_pencil_item.uncollapse_by_default();
556 auto &layers_item = grease_pencil_item.add_tree_item<GreasePencilLayersViewItem>(
557 grease_pencil);
558 if (!grease_pencil) {
559 return;
560 }
561 const Span<const bke::greasepencil::Layer *> layers = grease_pencil->layers();
562 for (const int layer_i : layers.index_range()) {
563 auto &layer_item = layers_item.add_tree_item<GreasePencilLayerViewItem>(*grease_pencil,
564 layer_i);
566 *grease_pencil, layer_i, bke::AttrDomain::Point);
568 *grease_pencil, layer_i, bke::AttrDomain::Curve);
569 }
570 }
571
573 {
574 auto &pointcloud_item = parent.add_tree_item<PointCloudViewItem>();
575 pointcloud_item.uncollapse_by_default();
576 pointcloud_item.add_tree_item<PointsViewItem>(pointcloud);
577 }
578
580 {
581 parent.add_tree_item<VolumeGridsViewItem>(volume);
582 }
583
585 {
586 parent.add_tree_item<InstancesViewItem>(instances);
587 }
588};
589
591{
592 return static_cast<GeometryDataSetTreeView &>(this->get_tree_view());
593}
594
599
601 Vector<SpreadsheetInstanceID> &r_instance_ids) const
602{
603 if (auto *reference_item = dynamic_cast<const InstanceReferenceViewItem *>(this)) {
604 r_instance_ids.append({reference_item->reference_index()});
605 }
606 this->foreach_parent([&](const ui::AbstractTreeViewItem &item) {
607 if (auto *reference_item = dynamic_cast<const InstanceReferenceViewItem *>(&item)) {
608 r_instance_ids.append({reference_item->reference_index()});
609 }
610 });
611 std::reverse(r_instance_ids.begin(), r_instance_ids.end());
612}
613
615{
616 GeometryInstancesTreeView &tree_view = this->get_tree();
617 SpaceSpreadsheet &sspreadsheet = tree_view.sspreadsheet_;
618
620 this->get_parent_instance_ids(instance_ids);
621 if (sspreadsheet.instance_ids_num != instance_ids.size()) {
622 return false;
623 }
624 for (const int i : instance_ids.index_range()) {
625 const SpreadsheetInstanceID &a = sspreadsheet.instance_ids[i];
626 const SpreadsheetInstanceID &b = instance_ids[i];
627 if (a.reference_index != b.reference_index) {
628 return false;
629 }
630 }
631 return true;
632}
633
635{
637 this->get_parent_instance_ids(instance_ids);
638
639 SpaceSpreadsheet &sspreadsheet = *CTX_wm_space_spreadsheet(&C);
640
641 MEM_SAFE_FREE(sspreadsheet.instance_ids);
642 sspreadsheet.instance_ids = MEM_cnew_array<SpreadsheetInstanceID>(instance_ids.size(), __func__);
643 sspreadsheet.instance_ids_num = instance_ids.size();
644 initialized_copy_n(instance_ids.data(), instance_ids.size(), sspreadsheet.instance_ids);
645
647}
648
650{
651 std::optional<GeometryDataIdentifier> data_id = this->get_geometry_data_id();
652 if (!data_id) {
653 this->foreach_item_recursive([&](const ui::AbstractTreeViewItem &item) {
654 if (data_id) {
655 return;
656 }
657 if (auto *data_set_view_item = dynamic_cast<const DataSetViewItem *>(&item)) {
658 data_id = data_set_view_item->get_geometry_data_id();
659 }
660 });
661 if (!data_id) {
662 return;
663 }
664 }
665
666 bScreen &screen = *CTX_wm_screen(&C);
667 SpaceSpreadsheet &sspreadsheet = *CTX_wm_space_spreadsheet(&C);
668
669 sspreadsheet.geometry_component_type = uint8_t(data_id->component_type);
670 if (data_id->domain) {
671 sspreadsheet.attribute_domain = uint8_t(*data_id->domain);
672 }
673 if (data_id->layer_index) {
674 sspreadsheet.active_layer_index = *data_id->layer_index;
675 }
676 PointerRNA ptr = RNA_pointer_create(&screen.id, &RNA_SpaceSpreadsheet, &sspreadsheet);
677 /* These updates also make sure that the attribute domain is set properly based on the
678 * component type. */
679 RNA_property_update(&C, &ptr, RNA_struct_find_property(&ptr, "attribute_domain"));
680 RNA_property_update(&C, &ptr, RNA_struct_find_property(&ptr, "geometry_component_type"));
681}
682
683std::optional<bool> DataSetViewItem::should_be_active() const
684{
685 GeometryDataSetTreeView &tree_view = this->get_tree();
686 SpaceSpreadsheet &sspreadsheet = tree_view.sspreadsheet_;
687
688 const std::optional<GeometryDataIdentifier> data_id = this->get_geometry_data_id();
689 if (!data_id) {
690 return false;
691 }
693 data_id->component_type)
694 {
695 return false;
696 }
697 if (data_id->domain) {
698 if (bke::AttrDomain(sspreadsheet.attribute_domain) != data_id->domain) {
699 return false;
700 }
701 }
702 if (data_id->layer_index) {
703 if (sspreadsheet.active_layer_index != *data_id->layer_index) {
704 return false;
705 }
706 }
707 return true;
708}
709
711{
712 const SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C);
714 if (!object) {
715 return;
716 }
717 uiLayout *layout = panel->layout;
718
719 uiBlock *block = uiLayoutGetBlock(layout);
720
721 UI_block_layout_set_current(block, layout);
722 const bke::GeometrySet root_geometry = spreadsheet_get_display_geometry_set(sspreadsheet,
723 object);
724
725 if (uiLayout *panel = uiLayoutPanel(C, layout, "instance tree", false, IFACE_("Geometry"))) {
727 *block,
728 "Instances Tree View",
729 std::make_unique<GeometryInstancesTreeView>(root_geometry, *C));
730 tree_view->set_context_menu_title("Instance");
731 ui::TreeViewBuilder::build_tree_view(*tree_view, *panel, {}, false);
732 }
733 if (uiLayout *panel = uiLayoutPanel(
734 C, layout, "geometry_domain_tree_view", false, IFACE_("Domain")))
735 {
737 root_geometry, {sspreadsheet->instance_ids, sspreadsheet->instance_ids_num});
739 *block,
740 "Data Set Tree View",
741 std::make_unique<GeometryDataSetTreeView>(std::move(instance_geometry), *C));
742 tree_view->set_context_menu_title("Domain");
743 ui::TreeViewBuilder::build_tree_view(*tree_view, *panel, {}, false);
744 }
745}
746
747} // namespace blender::ed::spreadsheet
bScreen * CTX_wm_screen(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
SpaceSpreadsheet * CTX_wm_space_spreadsheet(const bContext *C)
Low-level operations for curves.
Low-level operations for grease pencil.
Volume data-block.
int BKE_volume_num_grids(const Volume *volume)
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
#define BLI_STR_FORMAT_INT32_DECIMAL_UNIT_SIZE
Definition BLI_string.h:34
void BLI_str_format_decimal_unit(char dst[BLI_STR_FORMAT_INT32_DECIMAL_UNIT_SIZE], int number_to_format) ATTR_NONNULL(1)
Definition string.c:1255
#define IFACE_(msgid)
Object groups, one object can be in many groups at once.
#define MEM_SAFE_FREE(v)
blender::ui::AbstractGridView * UI_block_add_view(uiBlock &block, blender::StringRef idname, std::unique_ptr< blender::ui::AbstractGridView > grid_view)
void uiItemL(uiLayout *layout, const char *name, int icon)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
PanelLayout uiLayoutPanel(const bContext *C, uiLayout *layout, const char *idname, bool default_closed)
void UI_but_hint_drawstr_set(uiBut *but, const char *string)
void UI_block_layout_set_current(uiBlock *block, uiLayout *layout)
int BIFIconID
#define ND_SPACE_SPREADSHEET
Definition WM_types.hh:507
#define NC_SPACE
Definition WM_types.hh:359
AttributeSet attributes
constexpr IndexRange index_range() const
Definition BLI_span.hh:402
int64_t size() const
void append(const T &value)
IndexRange index_range() const
int domain_size(const AttrDomain domain) const
StringRefNull name() const
Definition instances.cc:111
int instances_num() const
Definition instances.cc:390
const bke::CurvesGeometry & strokes() const
CurvesDomainViewItem(const Curves *curves, const bke::AttrDomain domain)
std::optional< GeometryDataIdentifier > get_geometry_data_id() const override
virtual std::optional< GeometryDataIdentifier > get_geometry_data_id() const
std::optional< bool > should_be_active() const override
void build_tree_for_pointcloud(const PointCloud *pointcloud, ui::TreeViewItemContainer &parent)
void build_tree_for_grease_pencil(const GreasePencil *grease_pencil, ui::TreeViewItemContainer &parent)
GeometryDataSetTreeView(bke::GeometrySet geometry_set, const bContext &C)
void build_tree_for_instances(const bke::Instances *instances, ui::TreeViewItemContainer &parent)
void build_tree_for_curves(const Curves *curves, ui::TreeViewItemContainer &parent)
void build_tree_for_volume(const Volume *volume, ui::TreeViewItemContainer &parent)
void build_tree_for_mesh(const Mesh *mesh, ui::TreeViewItemContainer &parent)
void build_tree_for_geometry(const bke::GeometrySet &geometry, ui::TreeViewItemContainer &parent)
GeometryInstancesTreeView(bke::GeometrySet geometry_set, const bContext &C)
void build_tree_for_instances(ui::TreeViewItemContainer &parent, const bke::Instances &instances)
GreasePencilLayerCurvesDomainViewItem(const GreasePencil &grease_pencil, const int layer_index, const bke::AttrDomain domain)
std::optional< GeometryDataIdentifier > get_geometry_data_id() const override
GreasePencilLayerViewItem(const GreasePencil &grease_pencil, const int layer_index)
std::optional< GeometryDataIdentifier > get_geometry_data_id() const override
InstanceReferenceViewItem(const bke::Instances &instances, const int reference_index)
void get_parent_instance_ids(Vector< SpreadsheetInstanceID > &r_instance_ids) const
std::optional< bool > should_be_active() const override
std::optional< GeometryDataIdentifier > get_geometry_data_id() const override
std::optional< GeometryDataIdentifier > get_geometry_data_id() const override
MeshDomainViewItem(const Mesh *mesh, const bke::AttrDomain domain)
std::optional< GeometryDataIdentifier > get_geometry_data_id() const override
std::optional< GeometryDataIdentifier > get_geometry_data_id() const override
Abstract base class for defining a customizable tree-view item.
AbstractTreeView & get_tree_view() const
Definition tree_view.cc:565
uiButViewItem * view_item_button() const
void set_context_menu_title(const std::string &title)
static void build_tree_view(AbstractTreeView &tree_view, uiLayout &layout, std::optional< StringRef > search_string={}, bool add_box=true)
Definition tree_view.cc:918
ItemT & add_tree_item(Args &&...args)
void foreach_item_recursive(ItemIterFn iter_fn, IterOptions options=IterOptions::None) const
Definition tree_view.cc:69
void foreach_parent(ItemIterFn iter_fn) const
Definition tree_view.cc:89
local_group_size(16, 16) .push_constant(Type b
#define str(s)
int count
static StringRefNull mesh_domain_to_label(const bke::AttrDomain domain)
static void draw_count(ui::AbstractTreeViewItem &view_item, const int count)
void spreadsheet_data_set_panel_draw(const bContext *C, Panel *panel)
static StringRefNull curves_domain_to_label(const bke::AttrDomain domain)
bke::GeometrySet get_geometry_set_for_instance_ids(const bke::GeometrySet &root_geometry, const Span< SpreadsheetInstanceID > instance_ids)
bke::GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspreadsheet, Object *object_eval)
static void draw_row_suffix(ui::AbstractTreeViewItem &view_item, const StringRefNull str)
int get_instance_reference_icon(const bke::InstanceReference &reference)
Object * spreadsheet_get_object_eval(const SpaceSpreadsheet *sspreadsheet, const Depsgraph *depsgraph)
static BIFIconID curves_domain_to_icon(const bke::AttrDomain domain)
static BIFIconID mesh_domain_to_icon(const bke::AttrDomain domain)
void initialized_copy_n(const T *src, int64_t n, T *dst)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
unsigned char uint8_t
Definition stdint.h:78
CurvesGeometry geometry
struct uiLayout * layout
SpreadsheetInstanceID * instance_ids
uint8_t geometry_component_type
const Instances * get_instances() const
void WM_main_add_notifier(uint type, void *reference)
PointerRNA * ptr
Definition wm_files.cc:4126