Blender  V3.3
spreadsheet_dataset_draw.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include "DNA_space_types.h"
5 
6 #include "BKE_context.h"
7 #include "BKE_volume.h"
8 
9 #include "RNA_access.h"
10 #include "RNA_prototypes.h"
11 
12 #include "UI_interface.h"
13 #include "UI_interface.hh"
14 #include "UI_tree_view.hh"
15 
16 #include "WM_types.h"
17 
18 #include "BLT_translation.h"
19 
21 #include "spreadsheet_draw.hh"
22 #include "spreadsheet_intern.hh"
23 
24 namespace blender::ed::spreadsheet {
25 
26 class GeometryDataSetTreeView;
27 
29  GeometryComponentType component_type_;
30  std::optional<eAttrDomain> domain_;
31  BIFIconID icon_;
32 
33  public:
36  BIFIconID icon);
38  eAttrDomain domain,
40  BIFIconID icon);
41 
42  void on_activate() override;
43 
44  void build_row(uiLayout &row) override;
45 
46  protected:
47  std::optional<bool> should_be_active() const override;
48  bool supports_collapsing() const override;
49 
50  private:
51  GeometryDataSetTreeView &get_tree() const;
52  std::optional<int> count() const;
53 };
54 
56  GeometrySet geometry_set_;
57  const bContext &C_;
58  SpaceSpreadsheet &sspreadsheet_;
59  bScreen &screen_;
60 
62 
63  public:
65  : geometry_set_(std::move(geometry_set)),
66  C_(C),
67  sspreadsheet_(*CTX_wm_space_spreadsheet(&C)),
68  screen_(*CTX_wm_screen(&C))
69  {
70  }
71 
72  void build_tree() override
73  {
74  GeometryDataSetTreeViewItem &mesh = this->add_tree_item<GeometryDataSetTreeViewItem>(
75  GEO_COMPONENT_TYPE_MESH, IFACE_("Mesh"), ICON_MESH_DATA);
76  mesh.add_tree_item<GeometryDataSetTreeViewItem>(
77  GEO_COMPONENT_TYPE_MESH, ATTR_DOMAIN_POINT, IFACE_("Vertex"), ICON_VERTEXSEL);
78  mesh.add_tree_item<GeometryDataSetTreeViewItem>(
79  GEO_COMPONENT_TYPE_MESH, ATTR_DOMAIN_EDGE, IFACE_("Edge"), ICON_EDGESEL);
80  mesh.add_tree_item<GeometryDataSetTreeViewItem>(
81  GEO_COMPONENT_TYPE_MESH, ATTR_DOMAIN_FACE, IFACE_("Face"), ICON_FACESEL);
82  mesh.add_tree_item<GeometryDataSetTreeViewItem>(
83  GEO_COMPONENT_TYPE_MESH, ATTR_DOMAIN_CORNER, IFACE_("Face Corner"), ICON_NODE_CORNER);
84 
85  GeometryDataSetTreeViewItem &curve = this->add_tree_item<GeometryDataSetTreeViewItem>(
86  GEO_COMPONENT_TYPE_CURVE, IFACE_("Curve"), ICON_CURVE_DATA);
89  IFACE_("Control Point"),
90  ICON_CURVE_BEZCIRCLE);
91  curve.add_tree_item<GeometryDataSetTreeViewItem>(
92  GEO_COMPONENT_TYPE_CURVE, ATTR_DOMAIN_CURVE, IFACE_("Spline"), ICON_CURVE_PATH);
93 
94  GeometryDataSetTreeViewItem &pointcloud = this->add_tree_item<GeometryDataSetTreeViewItem>(
95  GEO_COMPONENT_TYPE_POINT_CLOUD, IFACE_("Point Cloud"), ICON_POINTCLOUD_DATA);
96  pointcloud.add_tree_item<GeometryDataSetTreeViewItem>(
97  GEO_COMPONENT_TYPE_POINT_CLOUD, ATTR_DOMAIN_POINT, IFACE_("Point"), ICON_PARTICLE_POINT);
98 
99  this->add_tree_item<GeometryDataSetTreeViewItem>(
100  GEO_COMPONENT_TYPE_VOLUME, IFACE_("Volume Grids"), ICON_VOLUME_DATA);
101 
102  this->add_tree_item<GeometryDataSetTreeViewItem>(
103  GEO_COMPONENT_TYPE_INSTANCES, ATTR_DOMAIN_INSTANCE, IFACE_("Instances"), ICON_EMPTY_AXIS);
104  }
105 };
106 
109  BIFIconID icon)
110  : component_type_(component_type), domain_(std::nullopt), icon_(icon)
111 {
112  label_ = label;
113  this->set_collapsed(false);
114 }
116  eAttrDomain domain,
118  BIFIconID icon)
119  : component_type_(component_type), domain_(domain), icon_(icon)
120 {
121  label_ = label;
122 }
123 
125 {
126  GeometryDataSetTreeView &tree_view = this->get_tree();
127  bContext &C = const_cast<bContext &>(tree_view.C_);
128  SpaceSpreadsheet &sspreadsheet = tree_view.sspreadsheet_;
129  tree_view.sspreadsheet_.geometry_component_type = component_type_;
130  if (domain_) {
131  tree_view.sspreadsheet_.attribute_domain = *domain_;
132  }
133  PointerRNA ptr;
134  RNA_pointer_create(&tree_view.screen_.id, &RNA_SpaceSpreadsheet, &sspreadsheet, &ptr);
135  RNA_property_update(&C, &ptr, RNA_struct_find_property(&ptr, "attribute_domain"));
136  RNA_property_update(&C, &ptr, RNA_struct_find_property(&ptr, "geometry_component_type"));
137 }
138 
140 {
141  uiItemL(&row, label_.c_str(), icon_);
142 
143  if (const std::optional<int> count = this->count()) {
144  /* Using the tree row button instead of a separate right aligned button gives padding
145  * to the right side of the number, which it didn't have with the button. */
146  char element_count[7];
147  BLI_str_format_decimal_unit(element_count, *count);
148  UI_but_hint_drawstr_set((uiBut *)this->view_item_button(), element_count);
149  }
150 }
151 
153 {
154  GeometryDataSetTreeView &tree_view = this->get_tree();
155  SpaceSpreadsheet &sspreadsheet = tree_view.sspreadsheet_;
156 
157  if (component_type_ == GEO_COMPONENT_TYPE_VOLUME) {
158  return sspreadsheet.geometry_component_type == component_type_;
159  }
160 
161  if (!domain_) {
162  return false;
163  }
164 
165  return sspreadsheet.geometry_component_type == component_type_ &&
166  sspreadsheet.attribute_domain == *domain_;
167 }
168 
170 {
171  return false;
172 }
173 
174 GeometryDataSetTreeView &GeometryDataSetTreeViewItem::get_tree() const
175 {
176  return static_cast<GeometryDataSetTreeView &>(this->get_tree_view());
177 }
178 
179 std::optional<int> GeometryDataSetTreeViewItem::count() const
180 {
181  GeometryDataSetTreeView &tree_view = this->get_tree();
182  GeometrySet &geometry = tree_view.geometry_set_;
183 
184  /* Special case for volumes since there is no grid domain. */
185  if (component_type_ == GEO_COMPONENT_TYPE_VOLUME) {
186  if (const Volume *volume = geometry.get_volume_for_read()) {
187  return BKE_volume_num_grids(volume);
188  }
189  return 0;
190  }
191 
192  if (!domain_) {
193  return std::nullopt;
194  }
195 
196  if (const GeometryComponent *component = geometry.get_component_for_read(component_type_)) {
197  return component->attribute_domain_size(*domain_);
198  }
199 
200  return 0;
201 }
202 
204 {
205  const SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C);
207  if (!object) {
208  return;
209  }
210  uiLayout *layout = panel->layout;
211 
212  uiBlock *block = uiLayoutGetBlock(layout);
213 
214  UI_block_layout_set_current(block, layout);
215 
217  *block,
218  "Data Set Tree View",
219  std::make_unique<GeometryDataSetTreeView>(
220  spreadsheet_get_display_geometry_set(sspreadsheet, object), *C));
221 
222  ui::TreeViewBuilder builder(*block);
223  builder.build_tree_view(*tree_view);
224 }
225 
226 } // namespace blender::ed::spreadsheet
eAttrDomain
Definition: BKE_attribute.h:25
@ ATTR_DOMAIN_CURVE
Definition: BKE_attribute.h:31
@ ATTR_DOMAIN_INSTANCE
Definition: BKE_attribute.h:32
@ ATTR_DOMAIN_POINT
Definition: BKE_attribute.h:27
@ ATTR_DOMAIN_FACE
Definition: BKE_attribute.h:29
@ ATTR_DOMAIN_CORNER
Definition: BKE_attribute.h:30
@ ATTR_DOMAIN_EDGE
Definition: BKE_attribute.h:28
struct SpaceSpreadsheet * CTX_wm_space_spreadsheet(const bContext *C)
Definition: context.c:941
struct bScreen * CTX_wm_screen(const bContext *C)
Definition: context.c:733
struct Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Definition: context.c:1505
GeometryComponentType
@ GEO_COMPONENT_TYPE_MESH
@ GEO_COMPONENT_TYPE_POINT_CLOUD
@ GEO_COMPONENT_TYPE_INSTANCES
@ GEO_COMPONENT_TYPE_CURVE
@ GEO_COMPONENT_TYPE_VOLUME
Volume data-block.
int BKE_volume_num_grids(const struct Volume *volume)
void BLI_str_format_decimal_unit(char dst[7], int number_to_format) ATTR_NONNULL()
Definition: string.c:1158
#define IFACE_(msgid)
static uint8 component(Color32 c, uint i)
Definition: ColorBlock.cpp:108
#define C
Definition: RandGen.cpp:25
uiBlock * uiLayoutGetBlock(uiLayout *layout)
void uiItemL(uiLayout *layout, const char *name, int icon)
void UI_but_hint_drawstr_set(uiBut *but, const char *string)
Definition: interface.cc:6443
void UI_block_layout_set_current(uiBlock *block, uiLayout *layout)
blender::ui::AbstractGridView * UI_block_add_view(uiBlock &block, blender::StringRef idname, std::unique_ptr< blender::ui::AbstractGridView > grid_view)
BIFIconID
Definition: UI_resources.h:18
GeometryDataSetTreeViewItem(GeometryComponentType component_type, StringRef label, BIFIconID icon)
GeometryDataSetTreeView(GeometrySet geometry_set, const bContext &C)
Abstract base class for defining a customizable tree-view item.
uiButViewItem * view_item_button()
Definition: tree_view.cc:383
AbstractTreeView & get_tree_view() const
Definition: tree_view.cc:276
void set_collapsed(bool collapsed)
Definition: tree_view.cc:341
void build_tree_view(AbstractTreeView &tree_view)
Definition: tree_view.cc:497
const char * label
Curve curve
int count
GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspreadsheet, Object *object_eval)
void spreadsheet_data_set_panel_draw(const bContext *C, Panel *panel)
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
Definition: rna_access.c:136
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:717
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
Definition: rna_access.c:2138
Object * spreadsheet_get_object_eval(const SpaceSpreadsheet *sspreadsheet, const Depsgraph *depsgraph)
const Volume * get_volume_for_read() const
const GeometryComponent * get_component_for_read(GeometryComponentType component_type) const
struct uiLayout * layout
uint8_t geometry_component_type
PointerRNA * ptr
Definition: wm_files.c:3480