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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to