[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