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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user