[Bf-blender-cvs] [47ed4da9e97] temp-spreadsheet-row-filter: Geometry Nodes: Working spreadsheet row filtering

Hans Goudey noreply at git.blender.org
Sat Apr 10 01:03:26 CEST 2021


Commit: 47ed4da9e977dd1379f15e49c4b5208a09298eab
Author: Hans Goudey
Date:   Fri Apr 9 18:03:19 2021 -0500
Branches: temp-spreadsheet-row-filter
https://developer.blender.org/rB47ed4da9e977dd1379f15e49c4b5208a09298eab

Geometry Nodes: Working spreadsheet row filtering

Now there is only some UI work left

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

M	release/scripts/startup/bl_ui/space_spreadsheet.py
M	source/blender/blenkernel/intern/screen.c
M	source/blender/editors/space_spreadsheet/CMakeLists.txt
M	source/blender/editors/space_spreadsheet/space_spreadsheet.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
M	source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.hh
A	source/blender/editors/space_spreadsheet/spreadsheet_row_filter.cc
A	source/blender/editors/space_spreadsheet/spreadsheet_row_filter.hh
M	source/blender/makesdna/DNA_space_types.h
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_ui/space_spreadsheet.py b/release/scripts/startup/bl_ui/space_spreadsheet.py
index 95e19d97cfd..7dbb4192045 100644
--- a/release/scripts/startup/bl_ui/space_spreadsheet.py
+++ b/release/scripts/startup/bl_ui/space_spreadsheet.py
@@ -34,21 +34,13 @@ def draw_filter(layout, filter, index):
 
     if filter.show_expanded:
         box.prop(filter, "column_name", text="")
-        box.prop(filter, "data_type", text="")
         box.prop(filter, "operation", text="")
 
-        if filter.data_type == 'FLOAT':
-            box.prop(filter, "value_float", text="Value")
-        elif filter.data_type == 'INT':
-            box.prop(filter, "value_int", text="Value")
-        elif filter.data_type == 'FLOAT_VECTOR':
-            box.prop(filter, "value_vector", text="")
-        elif filter.data_type == 'FLOAT_COLOR':
-            box.prop(filter, "value_color", text="")
-        elif filter.data_type == 'BOOLEAN':
-            box.prop(filter, "value_boolean", text="Value")
-        elif filter.data_type == 'BOOLEAN':
-            box.prop(filter, "value_vector_2d", text="Value")
+        box.prop(filter, "value_float", text="Value")
+        box.prop(filter, "value_int", text="Value")
+        box.prop(filter, "value_color", text="")
+        box.prop(filter, "value_boolean", text="Value")
+
 
 class SPREADSHEET_PT_filter_rules(bpy.types.Panel):
     bl_space_type = 'SPREADSHEET'
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index e76fdb715a8..1eaf76206b7 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -1350,10 +1350,13 @@ static void write_area(BlendWriter *writer, ScrArea *area)
     }
     else if (sl->spacetype == SPACE_SPREADSHEET) {
       BLO_write_struct(writer, SpaceSpreadsheet, sl);
+      SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl;
 
-      /* TODO: Write rules. */
+      LISTBASE_FOREACH (SpreadSheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
+        BLO_write_struct(writer, SpreadSheetRowFilter, row_filter);
+        BLO_write_string(writer, row_filter->column_name);
+      }
 
-      SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl;
       LISTBASE_FOREACH (SpreadsheetColumn *, column, &sspreadsheet->columns) {
         BLO_write_struct(writer, SpreadsheetColumn, column);
         BLO_write_struct(writer, SpreadsheetColumnID, column->id);
@@ -1709,9 +1712,13 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area)
     }
     else if (sl->spacetype == SPACE_SPREADSHEET) {
       SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl;
-      /* TODO: Read rules. */
       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->column_name);
+      }
+
       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/CMakeLists.txt b/source/blender/editors/space_spreadsheet/CMakeLists.txt
index 5aa708b10c0..9b0ba21d360 100644
--- a/source/blender/editors/space_spreadsheet/CMakeLists.txt
+++ b/source/blender/editors/space_spreadsheet/CMakeLists.txt
@@ -39,6 +39,7 @@ set(SRC
   spreadsheet_draw.cc
   spreadsheet_layout.cc
   spreadsheet_ops.cc
+  spreadsheet_row_filter.cc
 
   spreadsheet_cell_value.hh
   spreadsheet_column.hh
@@ -48,6 +49,7 @@ set(SRC
   spreadsheet_draw.hh
   spreadsheet_intern.hh
   spreadsheet_layout.hh
+  spreadsheet_row_filter.hh
 )
 
 set(LIB
diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
index 52ea60a811d..89a206fd7fc 100644
--- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
+++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
@@ -47,6 +47,7 @@
 #include "spreadsheet_data_source_geometry.hh"
 #include "spreadsheet_intern.hh"
 #include "spreadsheet_layout.hh"
+#include "spreadsheet_row_filter.hh"
 
 using namespace blender;
 using namespace blender::ed::spreadsheet;
@@ -89,12 +90,13 @@ static void spreadsheet_free(SpaceLink *sl)
 {
   SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl;
 
+  MEM_SAFE_FREE(sspreadsheet->runtime);
+
   LISTBASE_FOREACH_MUTABLE (SpreadSheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
+    MEM_SAFE_FREE(row_filter->column_name);
     MEM_freeN(row_filter);
   }
 
-  MEM_SAFE_FREE(sspreadsheet->runtime);
-
   LISTBASE_FOREACH_MUTABLE (SpreadsheetColumn *, column, &sspreadsheet->columns) {
     spreadsheet_column_free(column);
   }
@@ -121,7 +123,9 @@ static SpaceLink *spreadsheet_duplicate(SpaceLink *sl)
 
   BLI_listbase_clear(&sspreadsheet_new->row_filters);
   LISTBASE_FOREACH (const SpreadSheetRowFilter *, row_filter, &sspreadsheet_old->row_filters) {
-    BLI_addtail(&sspreadsheet_new->row_filters, MEM_dupallocN(row_filter));
+    SpreadSheetRowFilter *new_filter = (SpreadSheetRowFilter *)MEM_dupallocN(row_filter);
+    new_filter->column_name = (char *)MEM_dupallocN(row_filter->column_name);
+    BLI_addtail(&sspreadsheet_new->row_filters, new_filter);
   }
   BLI_listbase_clear(&sspreadsheet_new->columns);
   LISTBASE_FOREACH (SpreadsheetColumn *, src_column, &sspreadsheet_old->columns) {
@@ -256,20 +260,8 @@ static void spreadsheet_main_region_draw(const bContext *C, ARegion *region)
 
   const int tot_rows = data_source->tot_rows();
   spreadsheet_layout.index_column_width = get_index_column_width(tot_rows);
-  spreadsheet_layout.row_indices = IndexRange(tot_rows).as_span();
-
-  if (const GeometryDataSource *geometry_data_source = dynamic_cast<const GeometryDataSource *>(
-          data_source.get())) {
-    Object *object_eval = geometry_data_source->object_eval();
-    Object *object_orig = DEG_get_original_object(object_eval);
-    if (object_orig->type == OB_MESH) {
-      if (object_orig->mode == OB_MODE_EDIT) {
-        if (sspreadsheet->filter_flag & SPREADSHEET_FILTER_SELECTED_ONLY) {
-          spreadsheet_layout.row_indices = geometry_data_source->get_selected_element_indices();
-        }
-      }
-    }
-  }
+  spreadsheet_layout.row_indices = spreadsheet_filter_rows(
+      *sspreadsheet, spreadsheet_layout, *data_source.get(), scope);
 
   sspreadsheet->runtime->tot_columns = spreadsheet_layout.columns.size();
   sspreadsheet->runtime->tot_rows = tot_rows;
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh b/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
index 58a2776e0fc..5aae311e40b 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
@@ -22,17 +22,26 @@
 
 namespace blender::ed::spreadsheet {
 
+enum class ColumnValueType {
+  Int32,
+  Float,
+  Bool,
+  Instances,
+};
+
 /**
  * This represents a column in a spreadsheet. It has a name and provides a value for all the cells
  * in the column.
  */
 class ColumnValues {
  protected:
+  ColumnValueType type_;
   std::string name_;
   int size_;
 
  public:
-  ColumnValues(std::string name, const int size) : name_(std::move(name)), size_(size)
+  ColumnValues(const ColumnValueType type, std::string name, const int size)
+      : type_(type), name_(std::move(name)), size_(size)
   {
   }
 
@@ -40,6 +49,11 @@ class ColumnValues {
 
   virtual void get_value(int index, CellValue &r_cell_value) const = 0;
 
+  ColumnValueType type() const
+  {
+    return type_;
+  }
+
   StringRefNull name() const
   {
     return name_;
@@ -60,8 +74,8 @@ template<typename GetValueF> class LambdaColumnValues : public ColumnValues {
   GetValueF get_value_;
 
  public:
-  LambdaColumnValues(std::string name, int size, GetValueF get_value)
-      : ColumnValues(std::move(name), size), get_value_(std::move(get_value))
+  LambdaColumnValues(const ColumnValueType type, std::string name, int size, GetValueF get_value)
+      : ColumnValues(type, std::move(name), size), get_value_(std::move(get_value))
   {
   }
 
@@ -73,12 +87,13 @@ template<typename GetValueF> class LambdaColumnValues : public ColumnValues {
 
 /* Utility function that simplifies creating a spreadsheet column from a lambda function. */
 template<typename GetValueF>
-std::unique_ptr<ColumnValues> column_values_from_function(std::string name,
+std::unique_ptr<ColumnValues> column_values_from_function(const ColumnValueType type,
+                                                          std::string name,
                                                           int size,
                                                           GetValueF get_value)
 {
   return std::make_unique<LambdaColumnValues<GetValueF>>(
-      std::move(name), size, std::move(get_value));
+      type, std::move(name), size, std::move(get_value));
 }
 
 }  // namespace blender::ed::spreadsheet
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 337e1e68f1a..ddb01402b10 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
@@ -87,26 +87,32 @@ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values(
   int domain_size = attribute->size();
   switch (attribute->custom_data_type()) {
     case CD_PROP_FLOAT:
-      return column_values_from_function(
-          column_id.name, domain_size, [attribute](int index, CellValue &r_cell_value) {
-            float value;
-            attribute->get(index, &value);
-            r_cell_value.value_float = value;
-          });
+      return column_values_from_function(ColumnValueType::Float,
+                                         column_id.name,
+                                         domain_size,
+                                         [attribute](int index, CellValue &r_ce

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list