[Bf-blender-cvs] [d09deb31471] temp-spreadsheet-row-filter: Implement basic UI and structures for row filters
Hans Goudey
noreply at git.blender.org
Tue Mar 30 23:55:54 CEST 2021
Commit: d09deb31471d4bcdfd0507de837df8878b90c078
Author: Hans Goudey
Date: Tue Mar 30 16:55:02 2021 -0500
Branches: temp-spreadsheet-row-filter
https://developer.blender.org/rBd09deb31471d4bcdfd0507de837df8878b90c078
Implement basic UI and structures for row filters
===================================================================
M release/scripts/startup/bl_ui/space_spreadsheet.py
M source/blender/blenkernel/intern/screen.c
M source/blender/editors/include/ED_screen.h
M source/blender/editors/screen/screen_ops.c
M source/blender/editors/space_spreadsheet/space_spreadsheet.cc
M source/blender/editors/space_spreadsheet/spreadsheet_ops.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 188eddbcce3..95e19d97cfd 100644
--- a/release/scripts/startup/bl_ui/space_spreadsheet.py
+++ b/release/scripts/startup/bl_ui/space_spreadsheet.py
@@ -18,6 +18,77 @@
import bpy
+def draw_filter(layout, filter, index):
+ box = layout.box()
+
+ row = box.row(align=True)
+ row.emboss = 'NONE'
+ row.prop(filter, "show_expanded", text="")
+ row.prop(filter, "enabled", text="")
+ row.label(text=filter.column_name if len(filter.column_name) > 0 else "Rule")
+ 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="")
+ 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")
+
+class SPREADSHEET_PT_filter_rules(bpy.types.Panel):
+ bl_space_type = 'SPREADSHEET'
+ bl_region_type = 'HEADER'
+ bl_label = "Filters"
+ bl_parent_id = 'SPREADSHEET_PT_filter'
+
+ def draw_header(self, context):
+ layout = self.layout
+ layout.label(text="Filters")
+ sub = layout.row()
+ sub.alignment = 'RIGHT'
+ sub.emboss = 'NONE'
+ sub.operator("spreadsheet.add_rule", text="", icon='ADD')
+
+ def draw(self, context):
+ layout = self.layout
+ space = context.space_data
+
+ index = 0
+ for filter in space.row_filters:
+ draw_filter(layout, filter, index)
+ index += 1
+
+
+class SPREADSHEET_PT_filter(bpy.types.Panel):
+ bl_space_type = 'SPREADSHEET'
+ bl_region_type = 'HEADER'
+ bl_label = "Filter"
+
+ def draw(self, context):
+ layout = self.layout
+ space = context.space_data
+
+ pinned_id = space.pinned_id
+ used_id = pinned_id if pinned_id else context.active_object
+
+ if isinstance(used_id, bpy.types.Object) and used_id.mode == 'EDIT':
+ layout.prop(space, "show_only_selected", text="Selected Only")
+
class SPREADSHEET_HT_header(bpy.types.Header):
bl_space_type = 'SPREADSHEET'
@@ -44,12 +115,15 @@ class SPREADSHEET_HT_header(bpy.types.Header):
layout.separator_spacer()
- if isinstance(used_id, bpy.types.Object) and used_id.mode == 'EDIT':
- layout.prop(space, "show_only_selected", text="Selected Only")
+ row = layout.row(align=True)
+ row.prop(space, "use_filter", toggle=True, icon='FILTER', icon_only=True)
+ row.popover("SPREADSHEET_PT_filter", text="")
classes = (
SPREADSHEET_HT_header,
+ SPREADSHEET_PT_filter,
+ SPREADSHEET_PT_filter_rules,
)
if __name__ == "__main__": # Only for live edit.
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 1766ac5b85f..89d5ed2fcd9 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -1350,6 +1350,7 @@ static void write_area(BlendWriter *writer, ScrArea *area)
}
else if (sl->spacetype == SPACE_SPREADSHEET) {
BLO_write_struct(writer, SpaceSpreadsheet, sl);
+ /* TODO: Write rules. */
}
}
}
@@ -1703,7 +1704,7 @@ 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;
}
}
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index b3205acb8ee..039f2dd2e30 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -318,6 +318,7 @@ bool ED_operator_animview_active(struct bContext *C);
bool ED_operator_outliner_active(struct bContext *C);
bool ED_operator_outliner_active_no_editobject(struct bContext *C);
bool ED_operator_file_active(struct bContext *C);
+bool ED_operator_spreadsheet_active(struct bContext *C);
bool ED_operator_action_active(struct bContext *C);
bool ED_operator_buttons_active(struct bContext *C);
bool ED_operator_node_active(struct bContext *C);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 797c3bcf132..adc61e5ffd4 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -271,6 +271,11 @@ bool ED_operator_file_active(bContext *C)
return ed_spacetype_test(C, SPACE_FILE);
}
+bool ED_operator_spreadsheet_active(bContext *C)
+{
+ return ed_spacetype_test(C, SPACE_SPREADSHEET);
+}
+
bool ED_operator_action_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_ACTION);
diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
index 0f7709b464e..1fc601b7d6c 100644
--- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
+++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
@@ -55,6 +55,8 @@ static SpaceLink *spreadsheet_create(const ScrArea *UNUSED(area), const Scene *U
"spreadsheet space");
spreadsheet_space->spacetype = SPACE_SPREADSHEET;
+ spreadsheet_space->filter_flag = SPREADSHEET_FILTER_ENABLE;
+
{
/* Header. */
ARegion *region = (ARegion *)MEM_callocN(sizeof(ARegion), "spreadsheet header");
@@ -84,6 +86,11 @@ static SpaceLink *spreadsheet_create(const ScrArea *UNUSED(area), const Scene *U
static void spreadsheet_free(SpaceLink *sl)
{
SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl;
+
+ LISTBASE_FOREACH_MUTABLE (SpreadSheetRowFilter *, row_filter, &sspreadsheet->row_filters) {
+ MEM_freeN(row_filter);
+ }
+
MEM_SAFE_FREE(sspreadsheet->runtime);
}
@@ -102,6 +109,11 @@ static SpaceLink *spreadsheet_duplicate(SpaceLink *sl)
SpaceSpreadsheet *sspreadsheet_new = (SpaceSpreadsheet *)MEM_dupallocN(sspreadsheet_old);
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) {
+ BLI_addtail(&sspreadsheet_new->row_filters, MEM_dupallocN(row_filter));
+ }
+
return (SpaceLink *)sspreadsheet_new;
}
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_ops.cc b/source/blender/editors/space_spreadsheet/spreadsheet_ops.cc
index 770bd207e8d..78a5be00345 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_ops.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_ops.cc
@@ -14,8 +14,93 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include "BLI_listbase.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "ED_screen.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
#include "spreadsheet_intern.hh"
+static int row_filter_add_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ SpaceSpreadsheet *spreadsheet_space = CTX_wm_space_spreadsheet(C);
+
+ SpreadSheetRowFilter *row_filter = (SpreadSheetRowFilter *)MEM_callocN(
+ sizeof(SpreadSheetRowFilter), __func__);
+
+ row_filter->value_color[0] = 1.0f;
+ row_filter->value_color[1] = 1.0f;
+ row_filter->value_color[2] = 1.0f;
+ row_filter->value_color[3] = 1.0f;
+ row_filter->flag = (SPREADSHEET_ROW_FILTER_UI_EXPAND | SPREADSHEET_ROW_FILTER_ENABLED);
+
+ BLI_addtail(&spreadsheet_space->row_filters, row_filter);
+
+ ED_region_tag_redraw(CTX_wm_region(C));
+
+ // WM_event_add_notifier(C, NC_SPACE | ND..., );
+
+ return OPERATOR_FINISHED;
+}
+
+static void SPREADSHEET_OT_add_rule(wmOperatorType *ot)
+{
+ ot->name = "Add Row Filter";
+ ot->description = "Add a filter to remove rows from the displayed data";
+ ot->idname = "SPREADSHEET_OT_add_rule";
+
+ ot->exec = row_filter_add_exec;
+ ot->poll = ED_operator_spreadsheet_active;
+
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+static int row_filter_remove_exec(bContext *C, wmOperator *op)
+{
+ SpaceSpreadsheet *spreadsheet_space = CTX_wm_space_spreadsheet(C);
+
+ const int index = RNA_int_get(op->ptr, "index");
+
+ SpreadSheetRowFilter *row_filter = (SpreadSheetRowFilter *)BLI_findlink(
+ &spreadsheet_space->row_filters, index);
+ if (row_filter == nullptr) {
+ return OPERATOR_CANCELLED;
+ }
+
+ BLI_remlink(&spreadsheet_space->row_filters, row_filter);
+
+ ED_region_tag_redraw(CTX_wm_region(C));
+
+ // WM_event_add_notifier(C, NC_SPACE | ND..., );
+
+ return OPERATOR_FINISHED;
+}
+
+static void SPREADSHEET_OT_remove_rule(wmOperatorType *ot)
+{
+ ot->name = "Remove Row Filter";
+ ot->description = "Remove a row filter from the rules";
+ ot->idname = "SPREADSHEET_OT_remove_rule";
+
+ ot->exec = row_filter_remove_exec;
+ ot->poll = ED_operator_spreadsheet_active;
+
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "", 0, INT_MAX);
+}
+
void spreadsheet_operatortypes()
{
+ WM_operatortype_append(SPREADSHEET_OT_add_rule);
+ WM_operatortype_append(SPREADSHEET_OT_remove_rule);
}
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index c170e711756..546cbfda230 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -1873,2
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list