[Bf-blender-cvs] [92aa3e75a6e] temp-spreadsheet-row-filter: Spreadsheet Editor: Row filters

Hans Goudey noreply at git.blender.org
Wed Apr 14 04:44:22 CEST 2021


Commit: 92aa3e75a6e0906937bcbcb32c020e197e56e5c1
Author: Hans Goudey
Date:   Mon Apr 12 14:24:29 2021 -0500
Branches: temp-spreadsheet-row-filter
https://developer.blender.org/rB92aa3e75a6e0906937bcbcb32c020e197e56e5c1

Spreadsheet Editor: Row filters

{F9930989 size=full}

This patch adds support for filtering out rows based on rules and values.
Filters will work for any attribute data source, they are a property of
the spreadsheet rather than of the attribute system.

**Further Questions**
* The popover is a test, it would be easy to move this to a sidebar, but I wanted to see
  what people thought about the popover.
* `SpreadSheetColumn` does not know about the " X" suffixes that are added to vector columns.
  This means the row filter cannot determine the correct data type for vector columns.
  Luckily the default of float works, but I'm not sure how to handle this properly.

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

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

M	release/scripts/startup/bl_ui/space_spreadsheet.py
M	source/blender/blenkernel/intern/screen.c
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_ops.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_row_filter.cc
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 7dbb4192045..94b5ca2d41a 100644
--- a/release/scripts/startup/bl_ui/space_spreadsheet.py
+++ b/release/scripts/startup/bl_ui/space_spreadsheet.py
@@ -18,27 +18,70 @@
 
 import bpy
 
-def draw_filter(layout, filter, index):
+def get_visible_column_data_type(columns, column_name):
+    for column in columns:
+        if column.id.name == column_name:
+            return column.data_type
+    return 'FLOAT' # Show float data type by default, arbitrary choice.
+
+def get_operation_string(operation):
+    if operation == 'EQUAL':
+        return "=="
+    elif operation == 'GREATER':
+        return  ">"
+    elif operation == 'LESS':
+        return "<"
+    return ""
+
+def get_value_string(filter, data_type):
+    if data_type == 'FLOAT':
+        return "%.3f" % filter.value_float
+    elif data_type == 'INT32':
+        return str(filter.value_int)
+    elif data_type == 'BOOLEAN':
+        return "True" if filter.value_boolean else "False"
+    return ""
+
+def get_filter_label_text(filter, column_name, operation, data_type):
+    if len(column_name) == 0:
+        return "Filter"
+
+    return "%s %s %s" % (column_name, 
+                         get_operation_string(operation), 
+                         get_value_string(filter, data_type))
+    
+
+def draw_filter(layout, filter, columns, index):
     box = layout.box()
 
+    column_name = filter.column_name
+    operation = filter.operation
+    data_type = get_visible_column_data_type(columns, column_name)
+    label_text = get_filter_label_text(filter, column_name, operation, data_type)
+
     row = box.row(align=True)
-    row.emboss = 'NONE'
-    row.prop(filter, "show_expanded", text="")
+    row.prop(filter, "show_expanded", text="", emboss=False)
     row.prop(filter, "enabled", text="")
-    row.label(text=filter.column_name if len(filter.column_name) > 0 else "Rule")
+    row.label(text=label_text)
     sub = row.row()
     sub.alignment = 'RIGHT'
     sub.emboss = 'NONE'
     sub.operator("spreadsheet.remove_rule", text="", icon='X').index = index
 
-
-    if filter.show_expanded:
-        box.prop(filter, "column_name", text="")
+    if not filter.show_expanded:
+        return
+    
+    box.prop(filter, "column_name", text="")
+    if data_type != 'BOOLEAN':
         box.prop(filter, "operation", text="")
 
+    if data_type == 'FLOAT':
         box.prop(filter, "value_float", text="Value")
+        if operation == 'EQUAL':
+            box.prop(filter, "threshold")
+    elif data_type == 'INT32':
         box.prop(filter, "value_int", text="Value")
-        box.prop(filter, "value_color", text="")
+    elif data_type == 'BOOLEAN':
         box.prop(filter, "value_boolean", text="Value")
 
 
@@ -62,7 +105,7 @@ class SPREADSHEET_PT_filter_rules(bpy.types.Panel):
 
         index = 0
         for filter in space.row_filters:
-            draw_filter(layout, filter, index)
+            draw_filter(layout, filter, space.columns, index)
             index += 1
 
 
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 1eaf76206b7..ca6b5de0079 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -1352,8 +1352,8 @@ static void write_area(BlendWriter *writer, ScrArea *area)
       BLO_write_struct(writer, SpaceSpreadsheet, sl);
       SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl;
 
-      LISTBASE_FOREACH (SpreadSheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
-        BLO_write_struct(writer, SpreadSheetRowFilter, row_filter);
+      LISTBASE_FOREACH (SpreadsheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
+        BLO_write_struct(writer, SpreadsheetRowFilter, row_filter);
         BLO_write_string(writer, row_filter->column_name);
       }
 
@@ -1715,7 +1715,7 @@ static void direct_link_area(BlendDataReader *reader, ScrArea *area)
       sspreadsheet->runtime = NULL;
 
       BLO_read_list(reader, &sspreadsheet->row_filters);
-      LISTBASE_FOREACH (SpreadSheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
+      LISTBASE_FOREACH (SpreadsheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
         BLO_read_data_address(reader, &row_filter->column_name);
       }
 
diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
index 89a206fd7fc..1ace910373f 100644
--- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
+++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
@@ -92,7 +92,7 @@ static void spreadsheet_free(SpaceLink *sl)
 
   MEM_SAFE_FREE(sspreadsheet->runtime);
 
-  LISTBASE_FOREACH_MUTABLE (SpreadSheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
+  LISTBASE_FOREACH_MUTABLE (SpreadsheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
     MEM_SAFE_FREE(row_filter->column_name);
     MEM_freeN(row_filter);
   }
@@ -122,8 +122,8 @@ static SpaceLink *spreadsheet_duplicate(SpaceLink *sl)
   sspreadsheet_new->runtime = (SpaceSpreadsheet_Runtime *)MEM_dupallocN(sspreadsheet_old->runtime);
 
   BLI_listbase_clear(&sspreadsheet_new->row_filters);
-  LISTBASE_FOREACH (const SpreadSheetRowFilter *, row_filter, &sspreadsheet_old->row_filters) {
-    SpreadSheetRowFilter *new_filter = (SpreadSheetRowFilter *)MEM_dupallocN(row_filter);
+  LISTBASE_FOREACH (const SpreadsheetRowFilter *, row_filter, &sspreadsheet_old->row_filters) {
+    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);
   }
@@ -229,6 +229,10 @@ static void update_visible_columns(ListBase &columns, DataSource &data_source)
       if (used_ids.add(column_id)) {
         SpreadsheetColumnID *new_id = spreadsheet_column_id_copy(&column_id);
         SpreadsheetColumn *new_column = spreadsheet_column_new(new_id);
+
+        /* Copy the current data type to the column storage for convenience. */
+        new_column->data_type = values->type();
+
         BLI_addtail(&columns, new_column);
       }
     }
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh b/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
index 5aae311e40b..6e9dfcad81e 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_column_values.hh
@@ -16,31 +16,26 @@
 
 #pragma once
 
+#include "DNA_space_types.h"
+
 #include "BLI_string_ref.hh"
 
 #include "spreadsheet_cell_value.hh"
 
 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_;
+  SpreadSheetColumnValueType type_;
   std::string name_;
   int size_;
 
  public:
-  ColumnValues(const ColumnValueType type, std::string name, const int size)
+  ColumnValues(const SpreadSheetColumnValueType type, std::string name, const int size)
       : type_(type), name_(std::move(name)), size_(size)
   {
   }
@@ -49,7 +44,7 @@ class ColumnValues {
 
   virtual void get_value(int index, CellValue &r_cell_value) const = 0;
 
-  ColumnValueType type() const
+  SpreadSheetColumnValueType type() const
   {
     return type_;
   }
@@ -74,7 +69,10 @@ template<typename GetValueF> class LambdaColumnValues : public ColumnValues {
   GetValueF get_value_;
 
  public:
-  LambdaColumnValues(const ColumnValueType type, std::string name, int size, GetValueF get_value)
+  LambdaColumnValues(const SpreadSheetColumnValueType type,
+                     std::string name,
+                     int size,
+                     GetValueF get_value)
       : ColumnValues(type, std::move(name), size), get_value_(std::move(get_value))
   {
   }
@@ -87,7 +85,7 @@ 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(const ColumnValueType type,
+std::unique_ptr<ColumnValues> column_values_from_function(const SpreadSheetColumnValueType type,
                                                           std::string name,
                                                           int size,
                                                           GetValueF get_value)
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 ddb01402b10..89e25111db0 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
@@ -87,7 +87,7 @@ 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(ColumnValueType::Float,
+      return column_values_from_function(SPREADSHEET_VALUE_TYPE_FLOAT,
                                          column_id.name,
                                          domain_size,
                                          [attribute](int index, CellValue &r_cell_value) {
@@ -96,7 +96,7 @@ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values(
                                            r_cell_value.value_float = value;
                                          });
     case CD_PROP_INT32:
-      return column_values_from_function(ColumnValueType::Int32,
+      return column_values_from_function(SPREADSHEET_VALUE_TYPE_INT32,
                                          column_id.name,
                                          domain_size,
                                          [attribute](int index

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list