35#define CELL_PADDING_X (0.15f * SPREADSHEET_WIDTH_UNIT)
41 auto format_element = [](
float value) {
43 return fmt::format(
"{:.3}", value);
45 return fmt::format(
"{:.6}", value);
50 std::array<std::array<std::string, 4>, 4> formatted_elements;
51 std::array<size_t, 4> column_widths = {};
54 formatted_elements[row_i][col_i] = format_element(t_matrix[row_i][col_i]);
55 column_widths[col_i] = std::max(column_widths[col_i],
56 formatted_elements[row_i][col_i].
length());
60 fmt::memory_buffer buf;
64 fmt::appender(buf),
"{:>{}}", formatted_elements[row_i][col_i], column_widths[col_i]);
66 fmt::format_to(fmt::appender(buf),
" ");
70 fmt::format_to(fmt::appender(buf),
"\n");
73 return fmt::to_string(buf);
82 : spreadsheet_layout_(spreadsheet_layout)
91 const StringRefNull name = spreadsheet_layout_.columns[column_index].values->name();
106 return *
static_cast<std::string *
>(arg);
108 MEM_new<std::string>(__func__,
name),
109 [](
void *arg) { MEM_delete(
static_cast<std::string *
>(arg)); });
117 const int real_index = spreadsheet_layout_.row_indices[row_index];
118 std::string index_str = std::to_string(real_index);
137 const int real_index = spreadsheet_layout_.row_indices[row_index];
138 const ColumnValues &column = *spreadsheet_layout_.columns[column_index].values;
139 if (real_index > column.
size()) {
146 data.get_to_uninitialized(real_index, buffer);
156 if (type.
is<
int>()) {
164 if (type.
is<int8_t>()) {
165 const int8_t value = *value_ptr.
get<int8_t>();
166 const std::string value_str = std::to_string(value);
198 if (type.
is<
float>()) {
199 const float value = *value_ptr.
get<
float>();
200 std::stringstream ss;
201 ss << std::fixed << std::setprecision(3) << value;
202 const std::string value_str = ss.str();
217 return fmt::format(
"{:f}", *((
float *)argN));
226 if (type.
is<
bool>()) {
227 const bool value = *value_ptr.
get<
bool>();
228 const int icon = value ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT;
289 if (type.
is<std::string>()) {
294 *value_ptr.
get<std::string>(),
331 std::get_if<nodes::BundleItemSocketValue>(&value.
value))
351 std::stringstream ss;
352 const float value = values[
i];
353 ss <<
" " << std::fixed << std::setprecision(3) << value;
354 const std::string value_str = ss.str();
360 params.xmin +
i * segment_width,
370 return fmt::format(
"{:f}", *((
float *)argN));
384 std::string value_str;
385 switch (display_hint) {
410 switch (display_hint) {
417 return fmt::format(
"{} {}", dst,
TIP_(
"bytes"));
427 return fmt::format(
"{}", *(
int64_t *)argN);
444 std::stringstream ss;
445 const int value = values[
i];
447 const std::string value_str = ss.str();
453 params.xmin +
i * segment_width,
462 return fmt::format(
"{}", *((
int *)argN));
478 std::stringstream ss;
479 const float value = values[
i];
480 ss <<
" " << std::fixed << std::setprecision(3) << value;
481 const std::string value_str = ss.str();
487 params.xmin +
i * segment_width,
503 return fmt::format(fmt::runtime(
TIP_(
"Byte Color (sRGB encoded):\n{} {} {} {}")),
550 return spreadsheet_layout_.columns[column_index].width;
557 const std::optional<int64_t> max_sample_size,
561 if (
const std::optional<T> value =
data.get_if_single()) {
563 return std::max(min_width,
BLF_width(fontid,
str.c_str(),
str.size()));
565 const int sample_size = max_sample_size.value_or(
data.size());
566 float width = min_width;
567 for (
const int i :
data.index_range().take_front(sample_size)) {
570 width = std::max(width, value_width);
580 auto get_min_width = [&](
const float min_width) {
581 return max_sample_size.has_value() ? min_width : 0.0f;
585 switch (column_type) {
597 data_.typed<int8_t>(),
598 [](
const int value) { return fmt::format(
"{}", value); });
606 [](
const int value) { return fmt::format(
"{}", value); });
614 char dst[BLI_STR_FORMAT_INT64_GROUPED_SIZE];
615 BLI_str_format_int64_grouped(dst, value);
616 return std::string(dst);
624 data_.typed<
float>(),
625 [](
const float value) { return fmt::format(
"{:.3f}", value); });
634 [](
const short2 value) { return fmt::format(
"{} {}", value.x, value.y); });
641 [](
const int2 value) { return fmt::format(
"{} {}", value.x, value.y); });
649 [](
const int3 value) { return fmt::format(
"{} {} {}", value.x, value.y, value.z); });
657 [](
const float2 value) { return fmt::format(
"{:.3f} {:.3f}", value.x, value.y); });
666 return fmt::format(
"{:.3f} {:.3f} {:.3f}", value.x, value.y, value.z);
677 "{:.3f} {:.3f} {:.3f} {:.3f}", value.r, value.g, value.b, value.a);
687 return fmt::format(
"{} {} {} {}", value.r, value.g, value.b, value.a);
698 "{:.3f} {:.3f} {:.3f} {:.3f}", value.x, value.y, value.z, value.w);
709 const StringRef name = value.name().is_empty() ? IFACE_(
"(Geometry)") :
715 if (
data_.type().is<std::string>()) {
719 data_.typed<std::string>(),
720 [](
const StringRef value) { return value; });
728 [](
const MStringProperty &value) { return StringRef(value.s, value.s_len); });
753 const float width_px = std::max(min_width_px,
754 padding_px + std::max(data_width_px, name_width_px));
761 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 BUFFER_FOR_CPP_TYPE_VALUE(type, variable_name)
#define BLI_STR_FORMAT_INT64_GROUPED_SIZE
#define BLI_STR_FORMAT_INT64_BYTE_UNIT_SIZE
void BLI_str_format_byte_unit(char dst[BLI_STR_FORMAT_INT64_BYTE_UNIT_SIZE], long long int bytes, bool base_10) ATTR_NONNULL(1)
size_t BLI_str_format_int64_grouped(char dst[BLI_STR_FORMAT_INT64_GROUPED_SIZE], int64_t num) ATTR_NONNULL(1)
#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_INT32_3D
@ SPREADSHEET_VALUE_TYPE_QUATERNION
@ SPREADSHEET_VALUE_TYPE_FLOAT4X4
@ SPREADSHEET_VALUE_TYPE_INT32
@ SPREADSHEET_VALUE_TYPE_BUNDLE_ITEM
@ SPREADSHEET_VALUE_TYPE_INT64
@ SPREADSHEET_VALUE_TYPE_FLOAT2
@ SPREADSHEET_VALUE_TYPE_COLOR
@ SPREADSHEET_VALUE_TYPE_INSTANCES
#define SPREADSHEET_WIDTH_UNIT
uiBut * uiDefIconTextBut(uiBlock *block, uiButTypeWithPointerType but_and_ptr_type, int retval, int icon, blender::StringRef str, int x, int y, short width, short height, void *poin, std::optional< blender::StringRef > tip)
void UI_but_func_tooltip_custom_set(uiBut *but, uiButToolTipCustomFunc func, void *arg, uiFreeArgFunc free_arg)
void UI_but_func_tooltip_set(uiBut *but, uiButToolTipFunc func, void *arg, uiFreeArgFunc free_arg)
void UI_tooltip_text_field_add(uiTooltipData &data, std::string text, std::string suffix, const uiTooltipStyle style, const uiTooltipColorID color_id, const bool is_pad=false)
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
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
void destruct(void *ptr) const
const CPPType * type() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
constexpr bool is_empty() const
constexpr bool is_empty() const
StringRefNull name() const
GPointer get_single_ptr() const
eSpreadsheetColumnValueType type() const
float fit_column_values_width_px(const std::optional< int64_t > &max_sample_size=std::nullopt) const
ColumnValueDisplayHint display_hint() 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_int(const CellDrawParams ¶ms, const int64_t value, const ColumnValueDisplayHint display_hint) const
void draw_byte_color(const CellDrawParams ¶ms, const ColorGeometry4b color) const
void draw_content_cell_value(const GPointer value_ptr, const CellDrawParams ¶ms, const ColumnValues &column) 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
uiBut * draw_undrawable(const CellDrawParams ¶ms) const
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)
BLI_INLINE ColorSceneLinear4f< Alpha > decode(const ColorSceneLinearByteEncoded4b< Alpha > &color)
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)
static std::string format_matrix_to_grid(const float4x4 &matrix)
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
VecBase< int32_t, 3 > int3
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
blender::VecBase< int16_t, 2 > short2
ColorSceneLinearByteEncoded4b< eAlpha::Premultiplied > ColorGeometry4b
Vector< ColumnLayout > columns
std::variant< BundleItemSocketValue, BundleItemInternalValue > value