[Bf-blender-cvs] [c62d1b54766] temp-spreadsheet-row-filter: Remember the last data type when a column is no longer visible
Hans Goudey
noreply at git.blender.org
Fri Apr 16 19:49:43 CEST 2021
Commit: c62d1b547666272390cb3e1c42699acbbd2bb4f5
Author: Hans Goudey
Date: Fri Apr 16 12:49:37 2021 -0500
Branches: temp-spreadsheet-row-filter
https://developer.blender.org/rBc62d1b547666272390cb3e1c42699acbbd2bb4f5
Remember the last data type when a column is no longer visible
===================================================================
M source/blender/blenkernel/intern/screen.c
M source/blender/editors/space_spreadsheet/space_spreadsheet.cc
M source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc
M source/blender/makesdna/DNA_space_types.h
===================================================================
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 3981f279448..a9ab2cc94df 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -1365,9 +1365,8 @@ static void write_area(BlendWriter *writer, ScrArea *area)
BLO_write_struct(writer, SpreadsheetColumn, column);
BLO_write_struct(writer, SpreadsheetColumnID, column->id);
BLO_write_string(writer, column->id->name);
- /* While the display name is runtime data, we write it here, otherwise the row filters
- * might not now there type on the first redraw, if the row filter region draws before the
- * main region. */
+ /* While the display name is technically runtime data, we write it here, otherwise the row
+ * filters might not now their type if their region draws before the main region. */
BLO_write_string(writer, column->display_name);
}
LISTBASE_FOREACH (SpreadsheetContext *, context, &sspreadsheet->context_path) {
@@ -1747,9 +1746,8 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area)
LISTBASE_FOREACH (SpreadsheetColumn *, column, &sspreadsheet->columns) {
BLO_read_data_address(reader, &column->id);
BLO_read_data_address(reader, &column->id->name);
- /* While the display name is runtime data, it is loaded here, otherwise the row filters
- * might not now there type on the first redraw, if the row filter region draws before the
- * main region. */
+ /* While the display name is technically runtime data, it is loaded here, otherwise the row
+ * filters might not now their type if their region draws before the main region. */
BLO_read_data_address(reader, &column->display_name);
}
diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
index a22057a2e50..82b42734611 100644
--- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
+++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
@@ -390,13 +390,12 @@ static void spreadsheet_main_region_draw(const bContext *C, ARegion *region)
std::unique_ptr<SpreadsheetDrawer> drawer = spreadsheet_drawer_from_layout(spreadsheet_layout);
draw_spreadsheet_in_region(C, region, *drawer);
- /* Tag footer for redraw, because the main region updates data for the footer. */
+ /* Tag other regions for redraw, because the main region updates data for them. */
ARegion *footer = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_FOOTER);
ED_region_tag_redraw(footer);
+ ARegion *sidebar = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_UI);
+ ED_region_tag_redraw(sidebar);
- // /* Tag the sidebar for redraw, because the main region updates data for it. */
- // ARegion *sidebar = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_UI);
- // ED_region_tag_redraw(sidebar);
// sspreadsheet->runtime->data_source = *data_source;
}
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc b/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc
index 3a3a226a4d4..59978975242 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc
@@ -91,15 +91,15 @@ static std::string value_string(const SpreadsheetRowFilter &row_filter,
return "";
}
-static eSpreadsheetColumnValueType column_data_type_from_id(const SpaceSpreadsheet &sspreadsheet,
- const StringRef column_name)
+static SpreadsheetColumn *lookup_visible_column_for_filter(const SpaceSpreadsheet &sspreadsheet,
+ const StringRef column_name)
{
LISTBASE_FOREACH (SpreadsheetColumn *, column, &sspreadsheet.columns) {
if (column->display_name == column_name) {
- return (eSpreadsheetColumnValueType)column->data_type;
+ return column;
}
}
- return SPREADSHEET_VALUE_TYPE_FLOAT;
+ return nullptr;
}
static void spreadsheet_filter_panel_draw_header(const bContext *C, Panel *panel)
@@ -112,8 +112,16 @@ static void spreadsheet_filter_panel_draw_header(const bContext *C, Panel *panel
const eSpreadsheetFilterOperation operation = (const eSpreadsheetFilterOperation)
filter->operation;
- const eSpreadsheetColumnValueType data_type = column_data_type_from_id(*sspreadsheet,
- column_name);
+ const SpreadsheetColumn *column = lookup_visible_column_for_filter(*sspreadsheet, column_name);
+ uiLayoutSetActive(layout, column != nullptr);
+ if (column != nullptr) {
+ /* Set the cache of the last data type in the row filter. Two notes:
+ * - Changing data during drawing can be dangerous and should be done with care.
+ * - We only need to do this once in the header, since it is always drawn. */
+ filter->last_data_type = column->data_type;
+ }
+ const eSpreadsheetColumnValueType data_type = static_cast<eSpreadsheetColumnValueType>(
+ filter->last_data_type);
uiLayout *row = uiLayoutRow(layout, true);
uiLayoutSetEmboss(row, UI_EMBOSS_NONE);
@@ -151,12 +159,13 @@ static void spreadsheet_filter_panel_draw(const bContext *C, Panel *panel)
const eSpreadsheetFilterOperation operation = (const eSpreadsheetFilterOperation)
filter->operation;
- const eSpreadsheetColumnValueType data_type = column_data_type_from_id(*sspreadsheet,
- column_name);
+ const SpreadsheetColumn *column = lookup_visible_column_for_filter(*sspreadsheet, column_name);
+ uiLayoutSetActive(layout, column != nullptr && filter->flag & SPREADSHEET_ROW_FILTER_ENABLED);
+ const eSpreadsheetColumnValueType data_type = static_cast<eSpreadsheetColumnValueType>(
+ filter->last_data_type);
uiLayoutSetPropSep(layout, true);
uiLayoutSetPropDecorate(layout, false);
- uiLayoutSetActive(layout, filter->flag & SPREADSHEET_ROW_FILTER_ENABLED);
uiItemR(layout, filter_ptr, "column_name", 0, IFACE_("Column"), ICON_NONE);
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index af53cdb9e7c..5906c37d74d 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -1968,7 +1968,15 @@ typedef struct SpreadsheetRowFilter {
/* eSpaceSpreadsheet_RowFilterFlag. */
uint8_t flag;
- char _pad0[2];
+ /**
+ * The data type of the last visible column with a corresponding display name. This is set at
+ * runtime, in order to "remember" the data type so the row filter can display the settings for
+ * the correct data type even if the data source is temporarily gone.
+ * #eSpreadsheetColumnValueType.
+ */
+ uint8_t last_data_type;
+
+ char _pad0[1];
int value_int;
float value_float;
More information about the Bf-blender-cvs
mailing list