diff options
Diffstat (limited to 'source/blender/editors/space_spreadsheet/space_spreadsheet.cc')
-rw-r--r-- | source/blender/editors/space_spreadsheet/space_spreadsheet.cc | 95 |
1 files changed, 90 insertions, 5 deletions
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); } |