diff options
Diffstat (limited to 'source/blender')
7 files changed, 149 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index fd7f1acb456..1766ac5b85f 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -1701,6 +1701,11 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area) sclip->scopes.track_preview = NULL; sclip->scopes.ok = 0; } + else if (sl->spacetype == SPACE_SPREADSHEET) { + SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl; + + sspreadsheet->runtime = NULL; + } } BLI_listbase_clear(&area->actionzones); diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c index 8cf840f665b..05762c479ff 100644 --- a/source/blender/blenloader/intern/versioning_290.c +++ b/source/blender/blenloader/intern/versioning_290.c @@ -796,6 +796,26 @@ static void version_node_join_geometry_for_multi_input_socket(bNodeTree *ntree) } } +static ARegion *do_versions_add_region_if_not_found(ListBase *regionbase, + int region_type, + const char *name, + int link_after_region_type) +{ + ARegion *link_after_region = NULL; + LISTBASE_FOREACH (ARegion *, region, regionbase) { + if (region->regiontype == region_type) { + return NULL; + } + if (region->regiontype == link_after_region_type) { + link_after_region = region; + } + } + ARegion *new_region = MEM_callocN(sizeof(ARegion), name); + new_region->regiontype = region_type; + BLI_insertlinkafter(regionbase, link_after_region, new_region); + return new_region; +} + /* NOLINTNEXTLINE: readability-function-size */ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) { @@ -1832,5 +1852,22 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain) */ { /* Keep this block, even when empty. */ + + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { + if (sl->spacetype == SPACE_SPREADSHEET) { + ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase : + &sl->regionbase; + ARegion *new_footer = do_versions_add_region_if_not_found( + regionbase, RGN_TYPE_FOOTER, "footer for spreadsheet", RGN_TYPE_HEADER); + if (new_footer != NULL) { + new_footer->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_TOP : + RGN_ALIGN_BOTTOM; + } + } + } + } + } } } diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc index 8ab1baaaea3..e3ab87583ce 100644 --- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc +++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc @@ -29,6 +29,7 @@ #include "MEM_guardedalloc.h" +#include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -53,7 +54,7 @@ static SpaceLink *spreadsheet_create(const ScrArea *UNUSED(area), const Scene *U spreadsheet_space->spacetype = SPACE_SPREADSHEET; { - /* header */ + /* Header. */ ARegion *region = (ARegion *)MEM_callocN(sizeof(ARegion), "spreadsheet header"); BLI_addtail(&spreadsheet_space->regionbase, region); region->regiontype = RGN_TYPE_HEADER; @@ -61,7 +62,15 @@ static SpaceLink *spreadsheet_create(const ScrArea *UNUSED(area), const Scene *U } { - /* main window */ + /* Footer. */ + ARegion *region = (ARegion *)MEM_callocN(sizeof(ARegion), "spreadsheet footer region"); + BLI_addtail(&spreadsheet_space->regionbase, region); + region->regiontype = RGN_TYPE_FOOTER; + region->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_TOP : RGN_ALIGN_BOTTOM; + } + + { + /* Main window. */ ARegion *region = (ARegion *)MEM_callocN(sizeof(ARegion), "spreadsheet main region"); BLI_addtail(&spreadsheet_space->regionbase, region); region->regiontype = RGN_TYPE_WINDOW; @@ -70,17 +79,28 @@ static SpaceLink *spreadsheet_create(const ScrArea *UNUSED(area), const Scene *U return (SpaceLink *)spreadsheet_space; } -static void spreadsheet_free(SpaceLink *UNUSED(sl)) +static void spreadsheet_free(SpaceLink *sl) { + SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl; + MEM_SAFE_FREE(sspreadsheet->runtime); } -static void spreadsheet_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(area)) +static void spreadsheet_init(wmWindowManager *UNUSED(wm), ScrArea *area) { + SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)area->spacedata.first; + if (sspreadsheet->runtime == nullptr) { + sspreadsheet->runtime = (SpaceSpreadsheet_Runtime *)MEM_callocN( + sizeof(SpaceSpreadsheet_Runtime), __func__); + } } static SpaceLink *spreadsheet_duplicate(SpaceLink *sl) { - return (SpaceLink *)MEM_dupallocN(sl); + const SpaceSpreadsheet *sspreadsheet_old = (SpaceSpreadsheet *)sl; + SpaceSpreadsheet *sspreadsheet_new = (SpaceSpreadsheet *)MEM_dupallocN(sspreadsheet_old); + sspreadsheet_new->runtime = (SpaceSpreadsheet_Runtime *)MEM_dupallocN(sspreadsheet_old->runtime); + + return (SpaceLink *)sspreadsheet_new; } static void spreadsheet_keymap(wmKeyConfig *UNUSED(keyconf)) @@ -139,11 +159,19 @@ static std::unique_ptr<SpreadsheetDrawer> generate_spreadsheet_drawer(const bCon static void spreadsheet_main_region_draw(const bContext *C, ARegion *region) { + SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C); std::unique_ptr<SpreadsheetDrawer> drawer = generate_spreadsheet_drawer(C); if (!drawer) { + sspreadsheet->runtime->visible_rows = 0; + sspreadsheet->runtime->tot_columns = 0; + sspreadsheet->runtime->tot_rows = 0; drawer = std::make_unique<FallbackSpreadsheetDrawer>(); } draw_spreadsheet_in_region(C, region, *drawer); + + /* Tag footer for redraw, because the main region updates data for the footer. */ + ARegion *footer = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_FOOTER); + ED_region_tag_redraw(footer); } static void spreadsheet_main_region_listener(const wmRegionListenerParams *params) @@ -227,6 +255,50 @@ static void spreadsheet_header_region_listener(const wmRegionListenerParams *par } } +static void spreadsheet_footer_region_init(wmWindowManager *UNUSED(wm), ARegion *region) +{ + ED_region_header_init(region); +} + +static void spreadsheet_footer_region_draw(const bContext *C, ARegion *region) +{ + SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C); + SpaceSpreadsheet_Runtime *runtime = sspreadsheet->runtime; + std::stringstream ss; + ss << "Rows: " << runtime->visible_rows << " / " << runtime->tot_rows + << " | Columns: " << runtime->tot_columns; + std::string stats_str = ss.str(); + + UI_ThemeClearColor(TH_BACK); + + uiBlock *block = UI_block_begin(C, region, __func__, UI_EMBOSS); + const uiStyle *style = UI_style_get_dpi(); + uiLayout *layout = UI_block_layout(block, + UI_LAYOUT_HORIZONTAL, + UI_LAYOUT_HEADER, + UI_HEADER_OFFSET, + region->winy - (region->winy - UI_UNIT_Y) / 2.0f, + region->sizex, + 1, + 0, + style); + uiItemSpacer(layout); + uiLayoutSetAlignment(layout, UI_LAYOUT_ALIGN_RIGHT); + uiItemL(layout, stats_str.c_str(), ICON_NONE); + UI_block_layout_resolve(block, nullptr, nullptr); + UI_block_align_end(block); + UI_block_end(C, block); + UI_block_draw(C, block); +} + +static void spreadsheet_footer_region_free(ARegion *UNUSED(region)) +{ +} + +static void spreadsheet_footer_region_listener(const wmRegionListenerParams *UNUSED(params)) +{ +} + void ED_spacetype_spreadsheet(void) { SpaceType *st = (SpaceType *)MEM_callocN(sizeof(SpaceType), "spacetype spreadsheet"); @@ -265,5 +337,18 @@ void ED_spacetype_spreadsheet(void) art->listener = spreadsheet_header_region_listener; BLI_addhead(&st->regiontypes, art); + /* regions: footer */ + art = (ARegionType *)MEM_callocN(sizeof(ARegionType), "spacetype spreadsheet footer region"); + art->regionid = RGN_TYPE_FOOTER; + art->prefsizey = HEADERY; + art->keymapflag = 0; + art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_HEADER; + + art->init = spreadsheet_footer_region_init; + art->draw = spreadsheet_footer_region_draw; + art->free = spreadsheet_footer_region_free; + art->listener = spreadsheet_footer_region_listener; + BLI_addhead(&st->regiontypes, art); + BKE_spacetype_register(st); } diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc index 35dc9d62aa3..0cb937628f5 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc @@ -37,6 +37,7 @@ #include "bmesh.h" #include "spreadsheet_from_geometry.hh" +#include "spreadsheet_intern.hh" namespace blender::ed::spreadsheet { @@ -521,6 +522,9 @@ std::unique_ptr<SpreadsheetDrawer> spreadsheet_drawer_from_geometry_attributes(c } const int domain_size = component->attribute_domain_size(domain); + sspreadsheet->runtime->tot_rows = domain_size; + sspreadsheet->runtime->visible_rows = visible_rows.size(); + sspreadsheet->runtime->tot_columns = columns.size(); return std::make_unique<GeometryAttributeSpreadsheetDrawer>( std::move(resources), std::move(columns), visible_rows, domain_size); } diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_intern.hh b/source/blender/editors/space_spreadsheet/spreadsheet_intern.hh index 10a875e2c14..7e3b79a6706 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_intern.hh +++ b/source/blender/editors/space_spreadsheet/spreadsheet_intern.hh @@ -16,4 +16,10 @@ #pragma once +typedef struct SpaceSpreadsheet_Runtime { + int visible_rows; + int tot_rows; + int tot_columns; +} SpaceSpreadsheet_Runtime; + void spreadsheet_operatortypes(void); diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 0febbe26596..9007d3b6cf4 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -69,6 +69,9 @@ typedef struct SpaceNode_Runtime SpaceNode_Runtime; /* Defined in `file_intern.h`. */ typedef struct SpaceFile_Runtime SpaceFile_Runtime; +/* Defined in `spreadsheet_intern.hh`. */ +typedef struct SpaceSpreadsheet_Runtime SpaceSpreadsheet_Runtime; + /* -------------------------------------------------------------------- */ /** \name SpaceLink (Base) * \{ */ @@ -1864,6 +1867,8 @@ typedef struct SpaceSpreadsheet { uint8_t attribute_domain; char _pad1[5]; + + SpaceSpreadsheet_Runtime *runtime; } SpaceSpreadsheet; /** \} */ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 9e8e9030925..db36909d2f9 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -7257,6 +7257,8 @@ static void rna_def_space_spreadsheet(BlenderRNA *brna) srna = RNA_def_struct(brna, "SpaceSpreadsheet", "Space"); RNA_def_struct_ui_text(srna, "Space Spreadsheet", "Spreadsheet space data"); + rna_def_space_generic_show_region_toggles(srna, (1 << RGN_TYPE_FOOTER)); + prop = RNA_def_property(srna, "pinned_id", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceSpreadsheet_pinned_id_set", NULL, NULL); |