[Bf-blender-cvs] [7680d4fc6af] temp-spreadsheet-row-filter: Add support for float2, float3, color, and instance columns

Hans Goudey noreply at git.blender.org
Tue May 18 19:14:18 CEST 2021


Commit: 7680d4fc6af571615ff8a31122a1bd026e51cd92
Author: Hans Goudey
Date:   Tue May 18 13:14:08 2021 -0400
Branches: temp-spreadsheet-row-filter
https://developer.blender.org/rB7680d4fc6af571615ff8a31122a1bd026e51cd92

Add support for float2, float3, color, and instance columns

===================================================================

M	source/blender/blenkernel/intern/screen.c
M	source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_row_filter.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_space.c

===================================================================

diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index a9ab2cc94df..265d90a8d68 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -1359,6 +1359,7 @@ static void write_area(BlendWriter *writer, ScrArea *area)
 
       LISTBASE_FOREACH (SpreadsheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
         BLO_write_struct(writer, SpreadsheetRowFilter, row_filter);
+        BLO_write_string(writer, row_filter->value_string);
       }
 
       LISTBASE_FOREACH (SpreadsheetColumn *, column, &sspreadsheet->columns) {
@@ -1740,8 +1741,12 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area)
     }
     else if (sl->spacetype == SPACE_SPREADSHEET) {
       SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl;
+
       sspreadsheet->runtime = NULL;
       BLO_read_list(reader, &sspreadsheet->row_filters);
+      LISTBASE_FOREACH (SpreadsheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
+        BLO_read_data_address(reader, &row_filter->value_string);
+      }
       BLO_read_list(reader, &sspreadsheet->columns);
       LISTBASE_FOREACH (SpreadsheetColumn *, column, &sspreadsheet->columns) {
         BLO_read_data_address(reader, &column->id);
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
index 3a4f1984a7a..792fdf56a20 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
@@ -121,7 +121,7 @@ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values(
     }
     case CD_PROP_COLOR: {
       return column_values_from_function(
-          SPREADSHEET_VALUE_TYPE_COLOR4F,
+          SPREADSHEET_VALUE_TYPE_COLOR,
           column_id.name,
           domain_size,
           [varray](int index, CellValue &r_cell_value) {
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_row_filter.cc b/source/blender/editors/space_spreadsheet/spreadsheet_row_filter.cc
index 3dbea7afae2..d656dfbb788 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_row_filter.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_row_filter.cc
@@ -18,6 +18,7 @@
 
 #include "BLI_listbase.h"
 
+#include "DNA_collection_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 
@@ -132,6 +133,98 @@ static void apply_row_filter(const SpreadsheetLayout &spreadsheet_layout,
         }
         break;
       }
+      case SPREADSHEET_VALUE_TYPE_FLOAT2: {
+        const float2 value = row_filter.value_float3;
+        switch (row_filter.operation) {
+          case SPREADSHEET_ROW_FILTER_EQUAL: {
+            const float threshold_squared = row_filter.threshold * row_filter.threshold;
+            apply_filter_operation(
+                values,
+                [value, threshold_squared](const CellValue &cell_value) -> bool {
+                  return float2::distance_squared(*cell_value.value_float2, value) <
+                         threshold_squared;
+                },
+                rows_included);
+            break;
+          }
+          case SPREADSHEET_ROW_FILTER_GREATER: {
+            apply_filter_operation(
+                values,
+                [value](const CellValue &cell_value) -> bool {
+                  return cell_value.value_float2->x > value.x &&
+                         cell_value.value_float2->y > value.y;
+                },
+                rows_included);
+            break;
+          }
+          case SPREADSHEET_ROW_FILTER_LESS: {
+            apply_filter_operation(
+                values,
+                [value](const CellValue &cell_value) -> bool {
+                  return cell_value.value_float2->x < value.x &&
+                         cell_value.value_float2->y < value.y;
+                },
+                rows_included);
+            break;
+          }
+        }
+        break;
+      }
+      case SPREADSHEET_VALUE_TYPE_FLOAT3: {
+        const float3 value = row_filter.value_float3;
+        switch (row_filter.operation) {
+          case SPREADSHEET_ROW_FILTER_EQUAL: {
+            const float threshold_squared = row_filter.threshold * row_filter.threshold;
+            apply_filter_operation(
+                values,
+                [value, threshold_squared](const CellValue &cell_value) -> bool {
+                  return float3::distance_squared(*cell_value.value_float3, value) <
+                         threshold_squared;
+                },
+                rows_included);
+            break;
+          }
+          case SPREADSHEET_ROW_FILTER_GREATER: {
+            apply_filter_operation(
+                values,
+                [value](const CellValue &cell_value) -> bool {
+                  return cell_value.value_float3->x > value.x &&
+                         cell_value.value_float3->y > value.y &&
+                         cell_value.value_float3->z > value.z;
+                },
+                rows_included);
+            break;
+          }
+          case SPREADSHEET_ROW_FILTER_LESS: {
+            apply_filter_operation(
+                values,
+                [value](const CellValue &cell_value) -> bool {
+                  return cell_value.value_float3->x < value.x &&
+                         cell_value.value_float3->y < value.y &&
+                         cell_value.value_float3->z < value.z;
+                },
+                rows_included);
+            break;
+          }
+        }
+        break;
+      }
+      case SPREADSHEET_VALUE_TYPE_COLOR: {
+        const Color4f value = row_filter.value_color;
+        switch (row_filter.operation) {
+          case SPREADSHEET_ROW_FILTER_EQUAL: {
+            const float threshold_squared = row_filter.threshold * row_filter.threshold;
+            apply_filter_operation(
+                values,
+                [value, threshold_squared](const CellValue &cell_value) -> bool {
+                  return len_squared_v4v4(value, *cell_value.value_color) < threshold_squared;
+                },
+                rows_included);
+            break;
+          }
+        }
+        break;
+      }
       case SPREADSHEET_VALUE_TYPE_BOOL: {
         const bool value = (row_filter.flag & SPREADSHEET_ROW_FILTER_BOOL_VALUE) != 0;
         apply_filter_operation(
@@ -142,6 +235,27 @@ static void apply_row_filter(const SpreadsheetLayout &spreadsheet_layout,
             rows_included);
         break;
       }
+      case SPREADSHEET_VALUE_TYPE_INSTANCES: {
+        const StringRef value = row_filter.value_string;
+        apply_filter_operation(
+            values,
+            [value](const CellValue &cell_value) -> bool {
+              const ID *id = nullptr;
+              if (cell_value.value_object) {
+                id = &cell_value.value_object->object->id;
+              }
+              else if (cell_value.value_collection) {
+                id = &cell_value.value_collection->collection->id;
+              }
+              if (id == nullptr) {
+                return false;
+              }
+
+              return value == id->name + 2;
+            },
+            rows_included);
+        break;
+      }
       default:
         break;
     }
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 b7e19f2022d..e272f5a9121 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc
@@ -52,7 +52,10 @@ static void filter_panel_id_fn(void *UNUSED(row_filter_v), char *r_name)
 static std::string operation_string(const eSpreadsheetColumnValueType data_type,
                                     const eSpreadsheetFilterOperation operation)
 {
-  if (data_type == SPREADSHEET_VALUE_TYPE_BOOL) {
+  if (ELEM(data_type,
+           SPREADSHEET_VALUE_TYPE_BOOL,
+           SPREADSHEET_VALUE_TYPE_INSTANCES,
+           SPREADSHEET_VALUE_TYPE_COLOR)) {
     return "==";
   }
 
@@ -80,12 +83,34 @@ static std::string value_string(const SpreadsheetRowFilter &row_filter,
       result << std::fixed << row_filter.value_float;
       return result.str();
     }
+    case SPREADSHEET_VALUE_TYPE_FLOAT2: {
+      std::ostringstream result;
+      result.precision(3);
+      result << std::fixed << "(" << row_filter.value_float2[0] << ", "
+             << row_filter.value_float2[1] << ")";
+      return result.str();
+    }
+    case SPREADSHEET_VALUE_TYPE_FLOAT3: {
+      std::ostringstream result;
+      result.precision(3);
+      result << std::fixed << "(" << row_filter.value_float3[0] << ", "
+             << row_filter.value_float3[1] << ", " << row_filter.value_float3[2] << ")";
+      return result.str();
+    }
     case SPREADSHEET_VALUE_TYPE_BOOL:
       return (row_filter.flag & SPREADSHEET_ROW_FILTER_BOOL_VALUE) ? IFACE_("True") :
                                                                      IFACE_("False");
     case SPREADSHEET_VALUE_TYPE_INSTANCES:
-      /* Not supported at the moment. */
+      if (row_filter.value_string != nullptr) {
+        return row_filter.value_string;
+      }
       return "";
+    case SPREADSHEET_VALUE_TYPE_COLOR:
+      std::ostringstream result;
+      result.precision(3);
+      result << std::fixed << "(" << row_filter.value_color[0] << ", " << row_filter.value_color[1]
+             << ", " << row_filter.value_color[2] << ", " << row_filter.value_color[3] << ")";
+      return result.str();
   }
   BLI_assert_unreachable();
   return "";
@@ -174,25 +199,41 @@ static void spreadsheet_filter_panel_draw(const bContext *C, Panel *panel)
 
   uiItemR(layout, filter_ptr, "column_name", 0, IFACE_("Column"), ICON_NONE);
 
-  if (data_type != SPREADSHEET_VALUE_TYPE_BOOL) {
-    uiItemR(layout, filter_ptr, "operation", 0, nullptr, ICON_NONE);
-  }
-
   switch (data_type) {
     case SPREADSHEET_VALUE_TYPE_INT32:
+      uiItemR(layout, filter_ptr, "operation", 0, nullptr, ICON_NONE);
       uiItemR(layo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list