[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