[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