50 SpaceSpreadsheet *spreadsheet_space = MEM_cnew<SpaceSpreadsheet>(
"spreadsheet space");
57 ARegion *region = MEM_cnew<ARegion>(
"spreadsheet header");
65 ARegion *region = MEM_cnew<ARegion>(
"spreadsheet footer region");
73 ARegion *region = MEM_cnew<ARegion>(
"spreadsheet dataset region");
81 ARegion *region = MEM_cnew<ARegion>(
"spreadsheet right region");
90 ARegion *region = MEM_cnew<ARegion>(
"spreadsheet main region");
102 MEM_delete(sspreadsheet->
runtime);
117 if (sspreadsheet->
runtime ==
nullptr) {
118 sspreadsheet->
runtime = MEM_new<SpaceSpreadsheet_Runtime>(__func__);
126 if (sspreadsheet_old->
runtime) {
127 sspreadsheet_new->
runtime = MEM_new<SpaceSpreadsheet_Runtime>(__func__,
131 sspreadsheet_new->
runtime = MEM_new<SpaceSpreadsheet_Runtime>(__func__);
179 region->v2d.minzoom = region->v2d.maxzoom = 1.0f;
217 id_elem->
id = &ob->
id;
233 if (context_object ==
nullptr) {
235 sspreadsheet->
flag &= ~SPREADSHEET_FLAG_PINNED;
243 if (active_object != context_object) {
257 const std::optional<ViewerPathForGeometryNodesViewer> parsed_path =
259 if (parsed_path.has_value()) {
265 sspreadsheet->
flag &= ~SPREADSHEET_FLAG_PINNED;
269 sspreadsheet->
flag &= ~SPREADSHEET_FLAG_PINNED;
273 const std::optional<ViewerPathForGeometryNodesViewer> workspace_parsed_path =
275 if (workspace_parsed_path.has_value()) {
299 if (used_id ==
nullptr) {
303 if (id_type !=
ID_OB) {
320 if (object_eval ==
nullptr) {
341 if (values.default_width > 0.0f) {
342 return values.default_width;
344 static const float float_width = 3;
345 switch (values.type()) {
356 return 2.0f * float_width;
358 return 3.0f * float_width;
362 return 4.0f * float_width;
379 const float name_width =
BLF_width(fontid, name.data(), name.size());
380 return std::max<float>(name_width /
UI_UNIT_X + 1.0f, data_width);
392 return std::to_string(std::max(0, tot_rows - 1)).size() *
BLF_width(fontid,
"0", 1) +
400 std::unique_ptr<ColumnValues> values = data_source.
get_column_values(*column->id);
408 if (!used_ids.
add(*column->id)) {
420 if (used_ids.
add(column_id)) {
421 SpreadsheetColumnID *new_id = spreadsheet_column_id_copy(&column_id);
422 SpreadsheetColumn *new_column = spreadsheet_column_new(new_id);
424 BLI_addhead(&columns, new_column);
427 BLI_addtail(&columns, new_column);
437 sspreadsheet->
runtime->cache.set_all_unused();
442 data_source = std::make_unique<DataSource>();
451 std::unique_ptr<ColumnValues> values_ptr = data_source->get_column_values(*column->id);
456 spreadsheet_layout.
columns.append({values, width});
461 const int tot_rows = data_source->tot_rows();
464 *sspreadsheet, spreadsheet_layout, *data_source, scope);
466 sspreadsheet->
runtime->tot_columns = spreadsheet_layout.
columns.size();
467 sspreadsheet->
runtime->tot_rows = tot_rows;
480 sspreadsheet->
runtime->cache.remove_all_unused();
595 std::stringstream ss;
596 ss <<
IFACE_(
"Rows:") <<
" ";
600 ss << visible_rows_str <<
" / ";
604 ss << tot_rows_str <<
" | " <<
IFACE_(
"Columns:") <<
" " << runtime->
tot_columns;
605 std::string stats_str = ss.str();
615 region->winy - (region->winy -
UI_UNIT_Y) / 2.0f,
622 uiItemL(layout, stats_str.c_str(), ICON_NONE);
679 sspreadsheet->
runtime =
nullptr;
727 std::unique_ptr<SpaceType> st = std::make_unique<SpaceType>();
731 STRNCPY(st->name,
"Spreadsheet");
742 st->blend_read_after_liblink =
nullptr;
746 art = MEM_cnew<ARegionType>(
"spacetype spreadsheet region");
757 art = MEM_cnew<ARegionType>(
"spacetype spreadsheet header region");
771 art = MEM_cnew<ARegionType>(
"spacetype spreadsheet footer region");
785 art = MEM_cnew<ARegionType>(
"spacetype spreadsheet right region");
801 art = MEM_cnew<ARegionType>(
"spreadsheet dataset region");
WorkSpace * CTX_wm_workspace(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
SpaceSpreadsheet * CTX_wm_space_spreadsheet(const bContext *C)
void BKE_spacetype_register(std::unique_ptr< SpaceType > st)
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
void BKE_viewer_path_copy(ViewerPath *dst, const ViewerPath *src)
void BKE_viewer_path_id_remap(ViewerPath *viewer_path, const blender::bke::id::IDRemapper &mappings)
void BKE_viewer_path_foreach_id(LibraryForeachIDData *data, ViewerPath *viewer_path)
void BKE_viewer_path_clear(ViewerPath *viewer_path)
IDViewerPathElem * BKE_viewer_path_elem_new_id()
void BKE_viewer_path_blend_read_data(BlendDataReader *reader, ViewerPath *viewer_path)
bool BKE_viewer_path_equal(const ViewerPath *a, const ViewerPath *b, ViewerPathEqualFlag flag=ViewerPathEqualFlag(0))
void BKE_viewer_path_blend_write(BlendWriter *writer, const ViewerPath *viewer_path)
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)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
size_t BLI_str_format_int_grouped(char dst[BLI_STR_FORMAT_INT32_GROUPED_SIZE], int num) ATTR_NONNULL(1)
#define STRNCPY(dst, src)
#define BLI_STR_FORMAT_INT32_GROUPED_SIZE
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_string(BlendDataReader *reader, char **ptr_p)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
#define BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_read_struct_array(reader, struct_name, array_size, ptr_p)
#define BLO_read_struct(reader, struct_name, ptr_p)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
@ SPREADSHEET_FILTER_ENABLE
eSpaceSpreadsheet_ObjectEvalState
@ SPREADSHEET_OBJECT_EVAL_STATE_VIEWER_NODE
@ SPREADSHEET_OBJECT_EVAL_STATE_EVALUATED
@ SPREADSHEET_OBJECT_EVAL_STATE_ORIGINAL
@ 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
@ SPREADSHEET_FLAG_PINNED
@ V2D_SCROLL_HORIZONTAL_HIDE
@ V2D_SCROLL_VERTICAL_HIDE
@ VIEWER_PATH_ELEM_TYPE_ID
void ED_area_tag_redraw(ScrArea *area)
void ED_region_panels(const bContext *C, ARegion *region)
void ED_region_header(const bContext *C, ARegion *region)
void ED_region_header_init(ARegion *region)
void ED_region_panels_layout(const bContext *C, ARegion *region)
void ED_region_panels_init(wmWindowManager *wm, ARegion *region)
void ED_region_tag_redraw(ARegion *region)
void ED_region_panels_draw(const bContext *C, ARegion *region)
Read Guarded memory(de)allocation.
#define UI_SIDEBAR_PANEL_WIDTH
void uiItemL(uiLayout *layout, const char *name, int icon)
uiLayout * UI_block_layout(uiBlock *block, int dir, int type, int x, int y, int size, int em, int padding, const uiStyle *style)
const uiStyle * UI_style_get_dpi()
void uiLayoutSetAlignment(uiLayout *layout, char alignment)
uiBlock * UI_block_begin(const bContext *C, ARegion *region, std::string name, eUIEmbossType emboss)
const uiStyle * UI_style_get()
void uiItemSpacer(uiLayout *layout)
void UI_block_draw(const bContext *C, uiBlock *block)
void UI_panel_category_active_set_default(ARegion *region, const char *idname)
void UI_block_layout_resolve(uiBlock *block, int *r_x, int *r_y)
#define UI_DEFAULT_TEXT_POINTS
void UI_block_end(const bContext *C, uiBlock *block)
void UI_block_align_end(uiBlock *block)
void UI_ThemeClearColor(int colorid)
void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
#define ND_SPACE_SPREADSHEET
T * add(std::unique_ptr< T > resource)
virtual void foreach_default_column_ids(FunctionRef< void(const SpreadsheetColumnID &, bool is_extra)>) const
virtual std::unique_ptr< ColumnValues > get_column_values(const SpreadsheetColumnID &) const
const Depsgraph * depsgraph
void *(* MEM_dupallocN)(const void *vmemh)
static void spreadsheet_header_region_free(ARegion *)
static void spreadsheet_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
static void spreadsheet_free(SpaceLink *sl)
void spreadsheet_operatortypes()
static void spreadsheet_header_region_init(wmWindowManager *, ARegion *region)
IndexMask spreadsheet_filter_rows(const SpaceSpreadsheet &sspreadsheet, const SpreadsheetLayout &spreadsheet_layout, const DataSource &data_source, ResourceScope &scope)
void draw_spreadsheet_in_region(const bContext *C, ARegion *region, const SpreadsheetDrawer &drawer)
SpreadsheetRowFilter * spreadsheet_row_filter_copy(const SpreadsheetRowFilter *src_row_filter)
static void spreadsheet_footer_region_free(ARegion *)
static void spreadsheet_right_region_free(ARegion *)
static SpaceLink * spreadsheet_create(const ScrArea *, const Scene *)
static void spreadsheet_sidebar_init(wmWindowManager *wm, ARegion *region)
static void spreadsheet_keymap(wmKeyConfig *keyconf)
static float get_column_width(const ColumnValues &values)
static void spreadsheet_init(wmWindowManager *, ScrArea *area)
static std::unique_ptr< DataSource > get_data_source(const bContext *C)
std::unique_ptr< DataSource > data_source_from_geometry(const bContext *C, Object *object_eval)
static SpaceLink * spreadsheet_duplicate(SpaceLink *sl)
static void spreadsheet_main_region_draw(const bContext *C, ARegion *region)
static void spreadsheet_main_region_init(wmWindowManager *wm, ARegion *region)
static void spreadsheet_footer_region_draw(const bContext *C, ARegion *region)
static float get_default_column_width(const ColumnValues &values)
Object * spreadsheet_get_object_eval(const SpaceSpreadsheet *sspreadsheet, const Depsgraph *depsgraph)
ID * get_current_id(const SpaceSpreadsheet *sspreadsheet)
void spreadsheet_column_free(SpreadsheetColumn *column)
static void spreadsheet_footer_region_init(wmWindowManager *, ARegion *region)
static void spreadsheet_footer_region_listener(const wmRegionListenerParams *)
std::unique_ptr< SpreadsheetDrawer > spreadsheet_drawer_from_layout(const SpreadsheetLayout &spreadsheet_layout)
static void view_active_object(const bContext *C, SpaceSpreadsheet *sspreadsheet)
static void spreadsheet_dataset_region_listener(const wmRegionListenerParams *params)
static void spreadsheet_blend_read_data(BlendDataReader *reader, SpaceLink *sl)
static void spreadsheet_header_region_draw(const bContext *C, ARegion *region)
static int get_index_column_width(const int tot_rows)
void spreadsheet_row_filter_free(SpreadsheetRowFilter *row_filter)
static void spreadsheet_blend_write(BlendWriter *writer, SpaceLink *sl)
static void update_visible_columns(ListBase &columns, DataSource &data_source)
static void spreadsheet_update_context(const bContext *C)
void spreadsheet_column_assign_runtime_data(SpreadsheetColumn *column, const eSpreadsheetColumnValueType data_type, const StringRefNull display_name)
void spreadsheet_data_set_region_panels_register(ARegionType ®ion_type)
static float get_column_width_in_pixels(const ColumnValues &values)
static void spreadsheet_header_region_listener(const wmRegionListenerParams *params)
void register_spacetype()
static void spreadsheet_dataset_region_draw(const bContext *C, ARegion *region)
void register_row_filter_panels(ARegionType ®ion_type)
SpreadsheetColumn * spreadsheet_column_copy(const SpreadsheetColumn *src_column)
static void spreadsheet_id_remap(ScrArea *, SpaceLink *slink, const blender::bke::id::IDRemapper &mappings)
static void spreadsheet_main_region_listener(const wmRegionListenerParams *params)
static void spreadsheet_right_region_listener(const wmRegionListenerParams *)
Object * parse_object_only(const ViewerPath &viewer_path)
std::optional< ViewerPathForGeometryNodesViewer > parse_geometry_nodes_viewer(const ViewerPath &viewer_path)
bool exists_geometry_nodes_viewer(const ViewerPathForGeometryNodesViewer &parsed_viewer_path)
void(* listener)(const wmRegionListenerParams *params)
void(* draw)(const bContext *C, ARegion *region)
void(* layout)(const bContext *C, ARegion *region)
void(* init)(wmWindowManager *wm, ARegion *region)
SpreadsheetInstanceID * instance_ids
uint8_t object_eval_state
SpaceSpreadsheet_Runtime * runtime
Vector< ColumnLayout > columns
struct wmKeyConfig * defaultconf
wmEventHandler_Keymap * WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)