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')
-rw-r--r--source/blender/blenkernel/intern/screen.c5
-rw-r--r--source/blender/blenloader/intern/versioning_290.c37
-rw-r--r--source/blender/editors/space_spreadsheet/space_spreadsheet.cc95
-rw-r--r--source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc4
-rw-r--r--source/blender/editors/space_spreadsheet/spreadsheet_intern.hh6
-rw-r--r--source/blender/makesdna/DNA_space_types.h5
-rw-r--r--source/blender/makesrna/intern/rna_space.c2
7 files changed, 149 insertions, 5 deletions
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 10a875e2c14..7e3b79a6706 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_intern.hh
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_intern.hh
@@ -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);
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 0febbe26596..9007d3b6cf4 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -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;
/** \} */
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 9e8e9030925..db36909d2f9 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -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);