Spreadsheet: Support operations for filtering colors

Support choosing an operation when filtering colors,
like the other types.

Differential Revision: https://developer.blender.org/D15191
This commit is contained in:
Angel Bueno
2022-06-23 12:16:18 -05:00
committed by Hans Goudey
parent 9b775ebad7
commit 792bf82f11
2 changed files with 73 additions and 19 deletions

View File

@@ -195,25 +195,75 @@ static void apply_row_filter(const SpreadsheetRowFilter &row_filter,
}
else if (column_data.type().is<ColorGeometry4f>()) {
const ColorGeometry4f value = row_filter.value_color;
const float threshold_sq = pow2f(row_filter.threshold);
apply_filter_operation(
column_data.typed<ColorGeometry4f>(),
[&](const ColorGeometry4f cell) { return len_squared_v4v4(cell, value) <= threshold_sq; },
prev_mask,
new_indices);
switch (row_filter.operation) {
case SPREADSHEET_ROW_FILTER_EQUAL: {
const float threshold_sq = pow2f(row_filter.threshold);
apply_filter_operation(
column_data.typed<ColorGeometry4f>(),
[&](const ColorGeometry4f cell) { return len_squared_v4v4(cell, value) <= threshold_sq; },
prev_mask,
new_indices);
break;
}
case SPREADSHEET_ROW_FILTER_GREATER: {
apply_filter_operation(
column_data.typed<ColorGeometry4f>(),
[&](const ColorGeometry4f cell) {
return cell.r > value.r && cell.g > value.g && cell.b > value.b && cell.a > value.a;
},
prev_mask,
new_indices);
break;
}
case SPREADSHEET_ROW_FILTER_LESS: {
apply_filter_operation(
column_data.typed<ColorGeometry4f>(),
[&](const ColorGeometry4f cell) {
return cell.r < value.r && cell.g < value.g && cell.b < value.b && cell.a < value.a;
},
prev_mask,
new_indices);
break;
}
}
}
else if (column_data.type().is<ColorGeometry4b>()) {
const ColorGeometry4b value = row_filter.value_byte_color;
const float4 value_floats = {(float)value.r, (float)value.g, (float)value.b, (float)value.a};
const float threshold_sq = pow2f(row_filter.threshold);
apply_filter_operation(
column_data.typed<ColorGeometry4b>(),
[&](const ColorGeometry4b cell) {
const float4 cell_floats = {(float)cell.r, (float)cell.g, (float)cell.b, (float)cell.a};
return len_squared_v4v4(value_floats, cell_floats) <= threshold_sq;
},
switch (row_filter.operation) {
case SPREADSHEET_ROW_FILTER_EQUAL: {
const float4 value_floats = {(float)value.r, (float)value.g, (float)value.b, (float)value.a};
const float threshold_sq = pow2f(row_filter.threshold);
apply_filter_operation(
column_data.typed<ColorGeometry4b>(),
[&](const ColorGeometry4b cell) {
const float4 cell_floats = {(float)cell.r, (float)cell.g, (float)cell.b, (float)cell.a};
return len_squared_v4v4(value_floats, cell_floats) <= threshold_sq;
},
prev_mask,
new_indices);
break;
}
case SPREADSHEET_ROW_FILTER_GREATER: {
apply_filter_operation(
column_data.typed<ColorGeometry4b>(),
[&](const ColorGeometry4b cell) {
return cell.r > value.r && cell.g > value.g && cell.b > value.b && cell.a > value.a;
},
prev_mask,
new_indices);
break;
}
case SPREADSHEET_ROW_FILTER_LESS: {
apply_filter_operation(
column_data.typed<ColorGeometry4b>(),
[&](const ColorGeometry4b cell) {
return cell.r < value.r && cell.g < value.g && cell.b < value.b && cell.a < value.a;
},
prev_mask,
new_indices);
break;
}
}
}
else if (column_data.type().is<InstanceReference>()) {
const StringRef value = row_filter.value_string;

View File

@@ -41,9 +41,7 @@ static std::string operation_string(const eSpreadsheetColumnValueType data_type,
{
if (ELEM(data_type,
SPREADSHEET_VALUE_TYPE_BOOL,
SPREADSHEET_VALUE_TYPE_INSTANCES,
SPREADSHEET_VALUE_TYPE_COLOR,
SPREADSHEET_VALUE_TYPE_BYTE_COLOR)) {
SPREADSHEET_VALUE_TYPE_INSTANCES)) {
return "=";
}
@@ -237,15 +235,21 @@ static void spreadsheet_filter_panel_draw(const bContext *C, Panel *panel)
uiItemR(layout, filter_ptr, "value_string", 0, IFACE_("Value"), ICON_NONE);
break;
case SPREADSHEET_VALUE_TYPE_COLOR:
uiItemR(layout, filter_ptr, "operation", 0, nullptr, ICON_NONE);
uiItemR(layout, filter_ptr, "value_color", 0, IFACE_("Value"), ICON_NONE);
uiItemR(layout, filter_ptr, "threshold", 0, nullptr, ICON_NONE);
if (operation == SPREADSHEET_ROW_FILTER_EQUAL) {
uiItemR(layout, filter_ptr, "threshold", 0, nullptr, ICON_NONE);
}
break;
case SPREADSHEET_VALUE_TYPE_STRING:
uiItemR(layout, filter_ptr, "value_string", 0, IFACE_("Value"), ICON_NONE);
break;
case SPREADSHEET_VALUE_TYPE_BYTE_COLOR:
uiItemR(layout, filter_ptr, "operation", 0, nullptr, ICON_NONE);
uiItemR(layout, filter_ptr, "value_byte_color", 0, IFACE_("Value"), ICON_NONE);
uiItemR(layout, filter_ptr, "threshold", 0, nullptr, ICON_NONE);
if (operation == SPREADSHEET_ROW_FILTER_EQUAL) {
uiItemR(layout, filter_ptr, "threshold", 0, nullptr, ICON_NONE);
}
break;
case SPREADSHEET_VALUE_TYPE_UNKNOWN:
uiItemL(layout, IFACE_("Unknown column type"), ICON_ERROR);