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:
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);
}