[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