37 : spreadsheet_layout_(spreadsheet_layout)
46 const StringRefNull name = spreadsheet_layout_.columns[column_index].values->name();
63 return *
static_cast<std::string *
>(arg);
65 MEM_new<std::string>(__func__, name),
66 [](
void *arg) { MEM_delete(
static_cast<std::string *
>(arg)); });
74 const int real_index = spreadsheet_layout_.row_indices[row_index];
75 std::string index_str = std::to_string(real_index);
96 const int real_index = spreadsheet_layout_.row_indices[row_index];
97 const ColumnValues &column = *spreadsheet_layout_.columns[column_index].values;
98 if (real_index > column.
size()) {
104 if (
data.type().is<
int>()) {
105 const int value =
data.get<
int>(real_index);
106 const std::string value_str = std::to_string(value);
123 return fmt::format(
"{}", *((
int *)argN));
131 if (
data.type().is<int8_t>()) {
132 const int8_t value =
data.get<int8_t>(real_index);
133 const std::string value_str = std::to_string(value);
159 else if (
data.type().is<
float>()) {
160 const float value =
data.get<
float>(real_index);
161 std::stringstream ss;
162 ss << std::fixed << std::setprecision(3) << value;
163 const std::string value_str = ss.str();
180 return fmt::format(
"{:f}", *((
float *)argN));
188 else if (
data.type().is<
bool>()) {
189 const bool value =
data.get<
bool>(real_index);
190 const int icon = value ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT;
247 else if (
data.type().is<std::string>()) {
252 data.get<std::string>(real_index),
264 data.get_to_uninitialized(real_index, prop);
293 const float segment_width = float(
params.width) / values.
size();
295 std::stringstream ss;
296 const float value = values[
i];
297 ss <<
" " << std::fixed << std::setprecision(3) << value;
298 const std::string value_str = ss.str();
304 params.xmin +
i * segment_width,
316 return fmt::format(
"{:f}", *((
float *)argN));
329 const float segment_width = float(
params.width) / values.
size();
331 std::stringstream ss;
332 const int value = values[
i];
334 const std::string value_str = ss.str();
340 params.xmin +
i * segment_width,
351 return fmt::format(
"{}", *((
int *)argN));
365 const float segment_width = float(
params.width) / values.
size();
367 std::stringstream ss;
368 const float value = values[
i];
369 ss <<
" " << std::fixed << std::setprecision(3) << value;
370 const std::string value_str = ss.str();
376 params.xmin +
i * segment_width,
394 return fmt::format(fmt::runtime(
TIP_(
"Byte Color (sRGB encoded):\n{} {} {} {}")),
427 std::stringstream ss;
428 ss << value[0] <<
",\n";
429 ss << value[1] <<
",\n";
430 ss << value[2] <<
",\n";
440 return spreadsheet_layout_.columns[column_index].width;
447 const std::optional<int64_t> max_sample_size,
451 if (
const std::optional<T> value =
data.get_if_single()) {
453 return std::max(min_width,
BLF_width(fontid,
str.c_str(),
str.size()));
455 const int sample_size = max_sample_size.value_or(
data.size());
456 float width = min_width;
457 for (
const int i :
data.index_range().take_front(sample_size)) {
460 width = std::max(width, value_width);
470 auto get_min_width = [&](
const float min_width) {
471 return max_sample_size.has_value() ? min_width : 0.0f;
475 switch (column_type) {
487 data_.typed<int8_t>(),
488 [](
const int value) { return fmt::format(
"{}", value); });
496 [](
const int value) { return fmt::format(
"{}", value); });
503 data_.typed<
float>(),
504 [](
const float value) { return fmt::format(
"{:.3f}", value); });
512 [](
const int2 value) { return fmt::format(
"{} {}", value.x, value.y); });
520 [](
const float2 value) { return fmt::format(
"{:.3f} {:.3f}", value.x, value.y); });
529 return fmt::format(
"{:.3f} {:.3f} {:.3f}", value.x, value.y, value.z);
540 "{:.3f} {:.3f} {:.3f} {:.3f}", value.r, value.g, value.b, value.a);
550 return fmt::format(
"{} {} {} {}", value.r, value.g, value.b, value.a);
561 "{:.3f} {:.3f} {:.3f} {:.3f}", value.x, value.y, value.z, value.w);
572 const StringRef name = value.name().is_empty() ? IFACE_(
"(Geometry)") :
578 if (
data_.type().is<std::string>()) {
582 data_.typed<std::string>(),
583 [](
const StringRef value) { return value; });
591 [](
const MStringProperty &value) { return StringRef(value.s, value.s_len); });
613 const float width_px = std::max(min_width_px,
614 padding_px + std::max(data_width_px, name_width_px));
621 return std::make_unique<SpreadsheetLayoutDrawer>(spreadsheet_layout);
void BLF_size(int fontid, float size)
float BLF_width(int fontid, const char *str, size_t str_len, ResultBLF *r_info=nullptr) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2)
#define POINTER_AS_UINT(i)
#define POINTER_FROM_UINT(i)
eSpreadsheetColumnValueType
@ SPREADSHEET_VALUE_TYPE_INT8
@ SPREADSHEET_VALUE_TYPE_FLOAT
@ SPREADSHEET_VALUE_TYPE_INT32_2D
@ SPREADSHEET_VALUE_TYPE_BYTE_COLOR
@ SPREADSHEET_VALUE_TYPE_UNKNOWN
@ SPREADSHEET_VALUE_TYPE_FLOAT3
@ SPREADSHEET_VALUE_TYPE_BOOL
@ SPREADSHEET_VALUE_TYPE_STRING
@ SPREADSHEET_VALUE_TYPE_QUATERNION
@ SPREADSHEET_VALUE_TYPE_FLOAT4X4
@ SPREADSHEET_VALUE_TYPE_INT32
@ SPREADSHEET_VALUE_TYPE_FLOAT2
@ SPREADSHEET_VALUE_TYPE_COLOR
@ SPREADSHEET_VALUE_TYPE_INSTANCES
#define SPREADSHEET_WIDTH_UNIT
uiBut * uiDefIconTextBut(uiBlock *block, int type, int retval, int icon, blender::StringRef str, int x, int y, short width, short height, void *poin, float min, float max, std::optional< blender::StringRef > tip)
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *arg, uiFreeArgFunc free_arg)
void UI_but_drawflag_enable(uiBut *but, int flag)
void UI_but_drawflag_disable(uiBut *but, int flag)
#define UI_DEFAULT_TEXT_POINTS
BMesh const char void * data
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
constexpr bool is_empty() const
StringRefNull name() const
eSpreadsheetColumnValueType type() const
float fit_column_values_width_px(const std::optional< int64_t > &max_sample_size=std::nullopt) const
float fit_column_width_px(const std::optional< int64_t > &max_sample_size=std::nullopt) const
const GVArray & data() const
void draw_top_row_cell(int column_index, const CellDrawParams ¶ms) const final
void draw_byte_color(const CellDrawParams ¶ms, const ColorGeometry4b color) const
void draw_left_column_cell(int row_index, const CellDrawParams ¶ms) const final
void draw_int_vector(const CellDrawParams ¶ms, const Span< int > values) const
void draw_content_cell(int row_index, int column_index, const CellDrawParams ¶ms) const final
int column_width(int column_index) const final
void draw_float_vector(const CellDrawParams ¶ms, const Span< float > values) const
void draw_float4x4(const CellDrawParams ¶ms, const float4x4 &value) const
SpreadsheetLayoutDrawer(const SpreadsheetLayout &spreadsheet_layout)
static const char * to_string(const Interpolation &interp)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
static float estimate_max_column_width(const float min_width, const int fontid, const std::optional< int64_t > max_sample_size, const VArray< T > &data, FunctionRef< std::string(const T &)> to_string)
int get_instance_reference_icon(const bke::InstanceReference &reference)
std::unique_ptr< SpreadsheetDrawer > spreadsheet_drawer_from_layout(const SpreadsheetLayout &spreadsheet_layout)
QuaternionBase< float > Quaternion
MatBase< T, NumCol, NumRow > transpose(const MatBase< T, NumRow, NumCol > &mat)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
blender::VecBase< int16_t, 2 > short2
ColorSceneLinearByteEncoded4b< eAlpha::Premultiplied > ColorGeometry4b
Vector< ColumnLayout > columns