[Bf-blender-cvs] [474adc6f883] master: Refactor: Simplify spreadsheet handling of cell values

Hans Goudey noreply at git.blender.org
Wed Dec 15 16:34:39 CET 2021


Commit: 474adc6f883c2d5a854d7324364f7996044d83cb
Author: Hans Goudey
Date:   Wed Dec 15 09:34:13 2021 -0600
Branches: master
https://developer.blender.org/rB474adc6f883c2d5a854d7324364f7996044d83cb

Refactor: Simplify spreadsheet handling of cell values

Previously we used a `CellValue` class to hold the data for a cell,
and called a function to fill it whenever necessary. This is an
unnecessary complication when we have virtual generic arrays
and most data is already easily accessible that way anyway.
This patch removes `CellValue` and uses `fn::GVArray` to provide
access to data instead.

In the future, if rows have different types within a single column,
we can use a `GVArray` of `blender::Any` to interface with the drawing.

Along with that, the use of virtual arrays made it easy to do a
few other cleanups:
 - Use selection domain interpolations from rB5841f8656d95
   for the mesh selection filter.
 - Change the row filter to only calculate for necessary indices.

Differential Revision: https://developer.blender.org/D13478

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

M	source/blender/blenkernel/intern/geometry_component_instances.cc
M	source/blender/editors/space_spreadsheet/CMakeLists.txt
M	source/blender/editors/space_spreadsheet/space_spreadsheet.cc
D	source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh
M	source/blender/editors/space_spreadsheet/spreadsheet_column.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
M	source/blender/editors/space_spreadsheet/spreadsheet_layout.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_layout.hh
M	source/blender/editors/space_spreadsheet/spreadsheet_row_filter.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_row_filter.hh
M	source/blender/editors/space_spreadsheet/spreadsheet_row_filter_ui.cc
M	source/blender/functions/FN_generic_virtual_array.hh
M	source/blender/makesdna/DNA_space_types.h

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

diff --git a/source/blender/blenkernel/intern/geometry_component_instances.cc b/source/blender/blenkernel/intern/geometry_component_instances.cc
index 62d66f13e9f..93a7646fed0 100644
--- a/source/blender/blenkernel/intern/geometry_component_instances.cc
+++ b/source/blender/blenkernel/intern/geometry_component_instances.cc
@@ -31,6 +31,8 @@
 
 #include "attribute_access_intern.hh"
 
+#include "FN_cpp_type_make.hh"
+
 using blender::float4x4;
 using blender::Map;
 using blender::MutableSpan;
@@ -39,6 +41,8 @@ using blender::Span;
 using blender::VectorSet;
 using blender::fn::GSpan;
 
+MAKE_CPP_TYPE(InstanceReference, InstanceReference, CPPTypeFlags::None)
+
 /* -------------------------------------------------------------------- */
 /** \name Geometry Component Implementation
  * \{ */
diff --git a/source/blender/editors/space_spreadsheet/CMakeLists.txt b/source/blender/editors/space_spreadsheet/CMakeLists.txt
index 27446fe1a94..f1db8dedf1a 100644
--- a/source/blender/editors/space_spreadsheet/CMakeLists.txt
+++ b/source/blender/editors/space_spreadsheet/CMakeLists.txt
@@ -49,7 +49,6 @@ set(SRC
   spreadsheet_row_filter_ui.cc
 
   spreadsheet_cache.hh
-  spreadsheet_cell_value.hh
   spreadsheet_column.hh
   spreadsheet_column_values.hh
   spreadsheet_context.hh
diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
index 0cb4a52eb2f..61cc70830af 100644
--- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
+++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
@@ -323,6 +323,8 @@ static float get_default_column_width(const ColumnValues &values)
       return 8.0f;
     case SPREADSHEET_VALUE_TYPE_STRING:
       return 5.0f;
+    case SPREADSHEET_VALUE_TYPE_UNKNOWN:
+      return 2.0f;
   }
   return float_width;
 }
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh b/source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh
deleted file mode 100644
index c11b4a2b23d..00000000000
--- a/source/blender/editors/space_spreadsheet/spreadsheet_cell_value.hh
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include <optional>
-
-#include "BLI_color.hh"
-#include "BLI_float2.hh"
-#include "BLI_float3.hh"
-
-struct Collection;
-struct Object;
-
-namespace blender::ed::spreadsheet {
-
-struct ObjectCellValue {
-  const Object *object;
-};
-
-struct CollectionCellValue {
-  const Collection *collection;
-};
-
-struct GeometrySetCellValue {
-  const GeometrySet *geometry_set;
-};
-
-/**
- * This is a type that can hold the value of a cell in a spreadsheet. This type allows us to
- * decouple the drawing of individual cells from the code that generates the data to be displayed.
- */
-class CellValue {
- public:
-  /* The implementation just uses a bunch of `std::option` for now. Unfortunately, we cannot use
-   * `std::variant` yet, due to missing compiler support. This type can really be optimized more,
-   * but it does not really matter too much currently. */
-
-  std::optional<int> value_int;
-  std::optional<float> value_float;
-  std::optional<bool> value_bool;
-  std::optional<float2> value_float2;
-  std::optional<float3> value_float3;
-  std::optional<ColorGeometry4f> value_color;
-  std::optional<ObjectCellValue> value_object;
-  std::optional<CollectionCellValue> value_collection;
-  std::optional<GeometrySetCellValue> value_geometry_set;
-  std::optional<std::string> value_string;
-};
-
-}  // namespace blender::ed::spreadsheet
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_column.cc b/source/blender/editors/space_spreadsheet/spreadsheet_column.cc
index ee08c86b29f..7551593ef38 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_column.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_column.cc
@@ -18,14 +18,52 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_color.hh"
+#include "BLI_float2.hh"
+#include "BLI_float3.hh"
 #include "BLI_hash.hh"
 #include "BLI_string.h"
 #include "BLI_string_ref.hh"
 
+#include "BKE_geometry_set.hh"
+
+#include "FN_cpp_type.hh"
+
 #include "spreadsheet_column.hh"
+#include "spreadsheet_column_values.hh"
 
 namespace blender::ed::spreadsheet {
 
+eSpreadsheetColumnValueType cpp_type_to_column_type(const fn::CPPType &type)
+{
+  if (type.is<bool>()) {
+    return SPREADSHEET_VALUE_TYPE_BOOL;
+  }
+  if (type.is<int>()) {
+    return SPREADSHEET_VALUE_TYPE_INT32;
+  }
+  if (type.is<float>()) {
+    return SPREADSHEET_VALUE_TYPE_FLOAT;
+  }
+  if (type.is<float2>()) {
+    return SPREADSHEET_VALUE_TYPE_FLOAT2;
+  }
+  if (type.is<float3>()) {
+    return SPREADSHEET_VALUE_TYPE_FLOAT3;
+  }
+  if (type.is<ColorGeometry4f>()) {
+    return SPREADSHEET_VALUE_TYPE_COLOR;
+  }
+  if (type.is<std::string>()) {
+    return SPREADSHEET_VALUE_TYPE_STRING;
+  }
+  if (type.is<InstanceReference>()) {
+    return SPREADSHEET_VALUE_TYPE_INSTANCES;
+  }
+
+  return SPREADSHEET_VALUE_TYPE_UNKNOWN;
+}
+
 SpreadsheetColumnID *spreadsheet_column_id_new()
 {
   SpreadsheetColumnID *column_id = (SpreadsheetColumnID *)MEM_callocN(sizeof(SpreadsheetColumnID),
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh b/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
index 877651d6530..83e3217e5c8 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
@@ -20,33 +20,36 @@
 
 #include "BLI_string_ref.hh"
 
-#include "spreadsheet_cell_value.hh"
+#include "FN_generic_virtual_array.hh"
 
 namespace blender::ed::spreadsheet {
 
+struct CellDrawParams;
+
+eSpreadsheetColumnValueType cpp_type_to_column_type(const fn::CPPType &type);
+
 /**
  * This represents a column in a spreadsheet. It has a name and provides a value for all the cells
  * in the column.
  */
-class ColumnValues {
+class ColumnValues final {
  protected:
-  eSpreadsheetColumnValueType type_;
   std::string name_;
-  int size_;
+
+  fn::GVArray data_;
 
  public:
-  ColumnValues(const eSpreadsheetColumnValueType type, std::string name, const int size)
-      : type_(type), name_(std::move(name)), size_(size)
+  ColumnValues(std::string name, fn::GVArray data) : name_(std::move(name)), data_(std::move(data))
   {
+    /* The array should not be empty. */
+    BLI_assert(data_);
   }
 
   virtual ~ColumnValues() = default;
 
-  virtual void get_value(int index, CellValue &r_cell_value) const = 0;
-
   eSpreadsheetColumnValueType type() const
   {
-    return type_;
+    return cpp_type_to_column_type(data_.type());
   }
 
   StringRefNull name() const
@@ -56,45 +59,16 @@ class ColumnValues {
 
   int size() const
   {
-    return size_;
+    return data_.size();
   }
 
-  /* The default width of newly created columns, in UI units. */
-  float default_width = 0.0f;
-};
-
-/* Utility class for the function below. */
-template<typename GetValueF> class LambdaColumnValues : public ColumnValues {
- private:
-  GetValueF get_value_;
-
- public:
-  LambdaColumnValues(const eSpreadsheetColumnValueType type,
-                     std::string name,
-                     int size,
-                     GetValueF get_value)
-      : ColumnValues(type, std::move(name), size), get_value_(std::move(get_value))
+  const fn::GVArray &data() const
   {
+    return data_;
   }
 
-  void get_value(int index, CellValue &r_cell_value) const final
-  {
-    get_value_(index, r_cell_value);
-  }
+  /* The default width of newly created columns, in UI units. */
+  float default_width = 0.0f;
 };
 
-/* Utility function that simplifies creating a spreadsheet column from a lambda function. */
-template<typename GetValueF>
-std::unique_ptr<ColumnValues> column_values_from_function(const eSpreadsheetColumnValueType type,
-                                                          std::string name,
-                                                          const int size,
-                                                          GetValueF get_value,
-                                                          const float default_width = 0.0f)
-{
-  std::unique_ptr<ColumnValues> column_values = std::make_unique<LambdaColumnValues<GetValueF>>(
-      type, std::move(name), size, std::move(get_value));
-  column_values->default_width = default_width;
-  return column_values;
-}
-
 }  // 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 173ef43bfb6..337a6037c42 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
@@ -14,6 +14,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
+#include "BLI_virtual_array.hh"
+
 #include "BKE_context.h"
 #include "BKE_editmesh.h"
 #include "BKE_lib_id.h"
@@ -51,30 +53,6 @@ using blender::fn::GField;
 
 namespace blender::ed::spreadsheet {
 
-static std::optional<eSpreadsheetColumnValueType> cpp_type_to_column_value_type(
-    const fn::CPPType &type)
-{
-  if (type.is<bool>()) {
-    return SPREADSHEET_VALUE_TYPE_BOOL;
-  }
-  if (type.is<int>()) {
-    return SPREADSHEET_VALUE_TYPE_INT32;
-  }
-  if (type.is<float>()) {
-    return SPREADSHEET_VALUE_TYPE_FLOAT;
-  }
-  if (type.is<float2>()) {
-    return SPREADS

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list