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
This commit is contained in:
parent
2ca48b9678
commit
b617b44419
Notes:
blender-bot
2023-02-14 06:42:53 +01:00
Referenced by commit96abe8a3e8
, Add versioning code removed in91561629cd
Referenced by issue #86142, Status bar for spreadsheet editor
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue