[Bf-blender-cvs] [e0ef38f3ac0] temp-spreadsheet-editor: Spreadsheet: New spreadsheet editor (WIP).

Jacques Lucke noreply at git.blender.org
Mon Mar 1 13:50:38 CET 2021


Commit: e0ef38f3ac091af0096c674e45dff3e944a739b9
Author: Jacques Lucke
Date:   Mon Mar 1 13:48:35 2021 +0100
Branches: temp-spreadsheet-editor
https://developer.blender.org/rBe0ef38f3ac091af0096c674e45dff3e944a739b9

Spreadsheet: New spreadsheet editor (WIP).

Differential Revision: https://developer.blender.org/D10566

===================================================================

M	source/blender/editors/space_spreadsheet/CMakeLists.txt
M	source/blender/editors/space_spreadsheet/space_spreadsheet.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_draw.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_draw.hh
D	source/blender/editors/space_spreadsheet/spreadsheet_drawers.cc
D	source/blender/editors/space_spreadsheet/spreadsheet_drawers.hh
M	source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
M	source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.hh

===================================================================

diff --git a/source/blender/editors/space_spreadsheet/CMakeLists.txt b/source/blender/editors/space_spreadsheet/CMakeLists.txt
index f8485c5da2e..e270ce9676c 100644
--- a/source/blender/editors/space_spreadsheet/CMakeLists.txt
+++ b/source/blender/editors/space_spreadsheet/CMakeLists.txt
@@ -34,12 +34,10 @@ set(INC
 set(SRC
   space_spreadsheet.cc
   spreadsheet_draw.cc
-  spreadsheet_drawers.cc
   spreadsheet_from_geometry.cc
   spreadsheet_ops.cc
 
   spreadsheet_draw.hh
-  spreadsheet_drawers.hh
   spreadsheet_from_geometry.hh
   spreadsheet_intern.hh
 )
diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
index 32f16267e51..5884170cbf9 100644
--- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
+++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
@@ -127,109 +127,41 @@ static ID *get_used_id(const bContext *C)
   return (ID *)active_object;
 }
 
-static void gather_spreadsheet_data(const bContext *C,
-                                    SpreadsheetLayout &spreadsheet_layout,
-                                    ResourceCollector &resources)
-{
-  SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C);
+class FallbackSpreadsheetDrawer : public SpreadsheetDrawer {
+};
 
+static std::unique_ptr<SpreadsheetDrawer> generate_spreadsheet_drawer(const bContext *C)
+{
   Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
   ID *used_id = get_used_id(C);
   if (used_id == nullptr) {
-    return;
+    return {};
   }
   const ID_Type id_type = GS(used_id->name);
   if (id_type != ID_OB) {
-    return;
+    return {};
   }
   Object *object_orig = (Object *)used_id;
   if (object_orig->type != OB_MESH) {
-    return;
+    return {};
   }
   Object *object_eval = DEG_get_evaluated_object(depsgraph, object_orig);
   if (object_eval == nullptr) {
-    return;
+    return {};
   }
 
-  const GeometryComponent *component = nullptr;
-  GeometrySet temporary_geometry_set;
-
-  if (object_eval->mode == OB_MODE_EDIT) {
-    Mesh *mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(object_eval, false);
-    if (mesh == nullptr) {
-      return;
-    }
-    BKE_mesh_wrapper_ensure_mdata(mesh);
-    MeshComponent &mesh_component =
-        temporary_geometry_set.get_component_for_write<MeshComponent>();
-    mesh_component.replace(mesh, GeometryOwnershipType::ReadOnly);
-    component = &mesh_component;
-  }
-  else {
-    const GeometrySet *geometry_set = object_eval->runtime.geometry_set_eval;
-    if (geometry_set != nullptr) {
-      component = geometry_set->get_component_for_read<MeshComponent>();
-    }
-  }
-  if (component == nullptr) {
-    return;
-  }
-
-  const AttributeDomain domain = ATTR_DOMAIN_POINT;
-  columns_from_geometry_attributes(*component, domain, resources, spreadsheet_layout);
-  const int row_amount = component->attribute_domain_size(domain);
-  spreadsheet_layout.row_index_digits = std::to_string(std::max(0, row_amount - 1)).size();
-
-  const bool show_only_selected = sspreadsheet->filter_flag & SPREADSHEET_FILTER_SELECTED_ONLY;
-  if (object_orig->mode == OB_MODE_EDIT && show_only_selected) {
-    Vector<int64_t> &visible_rows = resources.construct<Vector<int64_t>>("visible rows");
-    const MeshComponent *mesh_component = (const MeshComponent *)component;
-    const Mesh *mesh_eval = mesh_component->get_for_read();
-    Mesh *mesh_orig = (Mesh *)object_orig->data;
-    BMesh *bm = mesh_orig->edit_mesh->bm;
-    BM_mesh_elem_index_ensure(bm, BM_VERT);
-
-    int *orig_indices = (int *)CustomData_get_layer(&mesh_eval->vdata, CD_ORIGINDEX);
-    if (orig_indices != nullptr) {
-      for (const int i_eval : IndexRange(mesh_eval->totvert)) {
-        const int i_orig = orig_indices[i_eval];
-        if (i_orig >= 0 && i_orig < bm->totvert) {
-          BMVert *vert = bm->vtable[i_orig];
-          if (BM_elem_flag_test(vert, BM_ELEM_SELECT)) {
-            visible_rows.append(i_eval);
-          }
-        }
-      }
-    }
-    else if (mesh_eval->totvert == bm->totvert) {
-      for (const int i : IndexRange(mesh_eval->totvert)) {
-        BMVert *vert = bm->vtable[i];
-        if (BM_elem_flag_test(vert, BM_ELEM_SELECT)) {
-          visible_rows.append(i);
-        }
-      }
-    }
-    spreadsheet_layout.visible_rows = visible_rows.as_span();
-  }
-  else {
-    spreadsheet_layout.visible_rows = IndexRange(row_amount).as_span();
-  }
+  return spreadsheet_drawer_from_geometry_attributes(C, object_eval);
 }
 
 static void spreadsheet_main_region_draw(const bContext *C, ARegion *region)
 {
   ResourceCollector resources;
 
-  SpreadsheetLayout spreadsheet_layout;
-  gather_spreadsheet_data(C, spreadsheet_layout, resources);
-  const int fontid = UI_style_get()->widget.uifont_id;
-  spreadsheet_layout.index_column_width = spreadsheet_layout.row_index_digits *
-                                              BLF_width(fontid, "0", 1) +
-                                          UI_UNIT_X * 0.75;
-  spreadsheet_layout.row_height = UI_UNIT_Y;
-  spreadsheet_layout.header_row_height = 1.25 * UI_UNIT_Y;
-
-  draw_spreadsheet_in_region(C, region, spreadsheet_layout);
+  std::unique_ptr<SpreadsheetDrawer> drawer = generate_spreadsheet_drawer(C);
+  if (!drawer) {
+    drawer = std::make_unique<FallbackSpreadsheetDrawer>();
+  }
+  draw_spreadsheet_in_region(C, region, *drawer);
 }
 
 static void spreadsheet_main_region_listener(const wmRegionListenerParams *params)
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_draw.cc b/source/blender/editors/space_spreadsheet/spreadsheet_draw.cc
index 83021939655..ba51a904d55 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_draw.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_draw.cc
@@ -21,6 +21,7 @@
 #include "GPU_immediate.h"
 
 #include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
 
 #include "BLI_rect.h"
 
@@ -28,35 +29,61 @@
 
 namespace blender::ed::spreadsheet {
 
+SpreadsheetDrawer::SpreadsheetDrawer()
+{
+  left_column_width = UI_UNIT_X * 2;
+  top_row_height = UI_UNIT_Y * 1.25;
+  row_height = UI_UNIT_Y;
+}
+
+SpreadsheetDrawer::~SpreadsheetDrawer() = default;
+
+void SpreadsheetDrawer::draw_top_row_cell(int UNUSED(column_index),
+                                          const CellDrawParams &UNUSED(params)) const
+{
+}
+
+void SpreadsheetDrawer::draw_left_column_cell(int UNUSED(row_index),
+                                              const CellDrawParams &UNUSED(params)) const
+{
+}
+
+void SpreadsheetDrawer::draw_content_cell(int UNUSED(row_index),
+                                          int UNUSED(column_index),
+                                          const CellDrawParams &UNUSED(params)) const
+{
+}
+
+int SpreadsheetDrawer::column_width(int UNUSED(column_index)) const
+{
+  return 5 * UI_UNIT_X;
+}
+
 static void draw_index_column_background(const uint pos,
                                          const ARegion *region,
-                                         const SpreadsheetLayout &spreadsheet_layout)
+                                         const SpreadsheetDrawer &drawer)
 {
   immUniformThemeColorShade(TH_BACK, 11);
-  immRecti(pos,
-           0,
-           region->winy - spreadsheet_layout.header_row_height,
-           spreadsheet_layout.index_column_width,
-           0);
+  immRecti(pos, 0, region->winy - drawer.top_row_height, drawer.left_column_width, 0);
 }
 
 static void draw_alternating_row_overlay(const uint pos,
                                          const int scroll_offset_y,
                                          const ARegion *region,
-                                         const SpreadsheetLayout &spreadsheet_layout)
+                                         const SpreadsheetDrawer &drawer)
 {
   immUniformThemeColor(TH_ROW_ALTERNATE);
   GPU_blend(GPU_BLEND_ALPHA);
-  const int row_pair_height = spreadsheet_layout.row_height * 2;
-  const int row_top_y = region->winy - spreadsheet_layout.header_row_height -
-                        scroll_offset_y % row_pair_height;
+  BLI_assert(drawer.row_height > 0);
+  const int row_pair_height = drawer.row_height * 2;
+  const int row_top_y = region->winy - drawer.top_row_height - scroll_offset_y % row_pair_height;
   for (const int i : IndexRange(region->winy / row_pair_height + 1)) {
     int x_left = 0;
     int x_right = region->winx;
-    int y_top = row_top_y - i * row_pair_height - spreadsheet_layout.row_height;
-    int y_bottom = y_top - spreadsheet_layout.row_height;
-    y_top = std::min(y_top, region->winy - spreadsheet_layout.header_row_height);
-    y_bottom = std::min(y_bottom, region->winy - spreadsheet_layout.header_row_height);
+    int y_top = row_top_y - i * row_pair_height - drawer.row_height;
+    int y_bottom = y_top - drawer.row_height;
+    y_top = std::min(y_top, region->winy - drawer.top_row_height);
+    y_bottom = std::min(y_bottom, region->winy - drawer.top_row_height);
     immRecti(pos, x_left, y_top, x_right, y_bottom);
   }
   GPU_blend(GPU_BLEND_NONE);
@@ -64,36 +91,35 @@ static void draw_alternating_row_overlay(const uint pos,
 
 static void draw_header_row_background(const uint pos,
                                        const ARegion *region,
-                                       const SpreadsheetLayout &spreadsheet_layout)
+                                       const SpreadsheetDrawer &drawer)
 {
   immUniformThemeColorShade(TH_BACK, 11);
-  immRecti(
-      pos, 0, region->winy, region->winx, region->winy - spreadsheet_layout.header_row_height);
+  immRecti(pos, 0, region->winy, region->winx, region->winy - drawer.top_row_height);
 }
 
 static void draw_separator_lines(const uint pos,
                                  const int scroll_offset_x,
                                  const ARegion *region,
-                                 const SpreadsheetLayout &spreadsheet_layout)
+                                 const SpreadsheetDrawer &drawer)
 {
   immUniformThemeColorShade(TH_BACK, -11);
 
-  immBeginAtMost(GPU_PRIM_LINES, spreadsheet_layout.columns.size() * 2 + 4);
+  immBeginAtMost(GPU_PRIM_LINES, drawer.tot_columns * 2 + 4);
 
   /* Index column line. */
-  immVertex2i(pos,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list