Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2021-03-15 11:58:38 +0300
committerJacques Lucke <jacques@blender.org>2021-03-15 12:00:02 +0300
commitb617b44419613ae87d64b5d4692515750c83b417 (patch)
tree71375c9578ea7427e18e72d3c3f6004d43ef74eb /source/blender/editors/space_spreadsheet/space_spreadsheet.cc
parent2ca48b967894dc2be786e0db1b0ed1fa6abd5383 (diff)
Spreadsheet: add status bar
This implements the status bar as footer region in the spreadsheet editor. It shows the total number of rows and columns as well as how many rows are actually visible (based on the filter). The implementation stores the stats in a runtime struct during drawing and the status bar reads from that struct. Ref T86142. Differential Revision: https://developer.blender.org/D10693
Diffstat (limited to 'source/blender/editors/space_spreadsheet/space_spreadsheet.cc')
-rw-r--r--source/blender/editors/space_spreadsheet/space_spreadsheet.cc95
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);
}