[Bf-blender-cvs] [b617b444196] master: Spreadsheet: add status bar

Jacques Lucke noreply at git.blender.org
Mon Mar 15 10:00:59 CET 2021


Commit: b617b44419613ae87d64b5d4692515750c83b417
Author: Jacques Lucke
Date:   Mon Mar 15 09:58:38 2021 +0100
Branches: master
https://developer.blender.org/rBb617b44419613ae87d64b5d4692515750c83b417

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

===================================================================

M	source/blender/blenkernel/intern/screen.c
M	source/blender/blenloader/intern/versioning_290.c
M	source/blender/editors/space_spreadsheet/space_spreadsheet.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_intern.hh
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_space.c

===================================================================

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 10a

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list