[Bf-blender-cvs] [77136bd7b3a] temp-spreadsheet-editor-python-prototyping: initial python spreadsheet

Jacques Lucke noreply at git.blender.org
Fri Mar 5 12:55:05 CET 2021


Commit: 77136bd7b3a24290354a4a5cebbb0ca2cd59d5bd
Author: Jacques Lucke
Date:   Fri Mar 5 11:35:56 2021 +0100
Branches: temp-spreadsheet-editor-python-prototyping
https://developer.blender.org/rB77136bd7b3a24290354a4a5cebbb0ca2cd59d5bd

initial python spreadsheet

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

A	release/scripts/modules/bpy_spreadsheet.py
M	source/blender/editors/space_spreadsheet/CMakeLists.txt
M	source/blender/editors/space_spreadsheet/space_spreadsheet.cc
A	source/blender/editors/space_spreadsheet/spreadsheet_from_python.cc
A	source/blender/editors/space_spreadsheet/spreadsheet_from_python.hh

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

diff --git a/release/scripts/modules/bpy_spreadsheet.py b/release/scripts/modules/bpy_spreadsheet.py
new file mode 100644
index 00000000000..319d972eec9
--- /dev/null
+++ b/release/scripts/modules/bpy_spreadsheet.py
@@ -0,0 +1,44 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+import bpy
+
+class SpreadsheetDrawer:
+    def get_row_amount(self):
+        return 10
+
+    def get_column_amount(self):
+        return 3
+
+    def get_top_row_cell(self, column_index):
+        return "Column: " + str(column_index)
+
+    def get_left_column_cell(self, row_index):
+        return str(row_index + 100)
+
+    def get_content_cell(self, row_index, column_index):
+        return str(row_index * column_index)
+
+registered_drawers = {}
+
+def register_spreadsheet_drawer(spreadsheet_space: bpy.types.SpaceSpreadsheet, drawer: SpreadsheetDrawer):
+    registered_drawers[id(spreadsheet_space)] = drawer
+
+def get_spreadsheet_drawer(spreadsheet_space: bpy.types.SpaceSpreadsheet):
+    return SpreadsheetDrawer()
+    # return registered_drawers.get(id(spreadsheet_space))
diff --git a/source/blender/editors/space_spreadsheet/CMakeLists.txt b/source/blender/editors/space_spreadsheet/CMakeLists.txt
index e270ce9676c..9520bbd57a5 100644
--- a/source/blender/editors/space_spreadsheet/CMakeLists.txt
+++ b/source/blender/editors/space_spreadsheet/CMakeLists.txt
@@ -31,18 +31,25 @@ set(INC
   ../../../../intern/guardedalloc
 )
 
+set(INC_SYS
+  ${PYTHON_INCLUDE_DIRS}
+)
+
 set(SRC
   space_spreadsheet.cc
   spreadsheet_draw.cc
   spreadsheet_from_geometry.cc
+  spreadsheet_from_python.cc
   spreadsheet_ops.cc
 
   spreadsheet_draw.hh
   spreadsheet_from_geometry.hh
+  spreadsheet_from_python.hh
   spreadsheet_intern.hh
 )
 
 set(LIB
 )
 
+
 blender_add_lib(bf_editor_space_spreadsheet "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
diff --git a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
index cdbba2e6191..7c69924ac61 100644
--- a/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
+++ b/source/blender/editors/space_spreadsheet/space_spreadsheet.cc
@@ -43,6 +43,7 @@
 #include "bmesh.h"
 
 #include "spreadsheet_from_geometry.hh"
+#include "spreadsheet_from_python.hh"
 #include "spreadsheet_intern.hh"
 
 using namespace blender::ed::spreadsheet;
@@ -102,40 +103,12 @@ static void spreadsheet_main_region_init(wmWindowManager *wm, ARegion *region)
   WM_event_add_keymap_handler(&region->handlers, keymap);
 }
 
-static ID *get_used_id(const bContext *C)
-{
-  SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C);
-  if (sspreadsheet->pinned_id != nullptr) {
-    return sspreadsheet->pinned_id;
-  }
-  Object *active_object = CTX_data_active_object(C);
-  return (ID *)active_object;
-}
-
 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 {};
-  }
-  const ID_Type id_type = GS(used_id->name);
-  if (id_type != ID_OB) {
-    return {};
-  }
-  Object *object_orig = (Object *)used_id;
-  if (object_orig->type != OB_MESH) {
-    return {};
-  }
-  Object *object_eval = DEG_get_evaluated_object(depsgraph, object_orig);
-  if (object_eval == nullptr) {
-    return {};
-  }
-
-  return spreadsheet_drawer_from_geometry_attributes(C, object_eval);
+  return spreadsheet_drawer_from_python(C);
 }
 
 static void spreadsheet_main_region_draw(const bContext *C, ARegion *region)
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_from_python.cc b/source/blender/editors/space_spreadsheet/spreadsheet_from_python.cc
new file mode 100644
index 00000000000..d4d615ad108
--- /dev/null
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_from_python.cc
@@ -0,0 +1,145 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <Python.h>
+
+#include "RNA_access.h"
+
+#include "DNA_space_types.h"
+
+#include "BKE_context.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "../../python/intern/bpy_rna.h"
+
+#include "spreadsheet_from_python.hh"
+
+namespace blender::ed::spreadsheet {
+
+class PythonSpreadsheetDrawer : public SpreadsheetDrawer {
+ private:
+  PyObject *py_drawer_;
+
+ public:
+  PythonSpreadsheetDrawer(PyObject *py_drawer) : py_drawer_(py_drawer)
+  {
+    BLI_assert(py_drawer_ != nullptr);
+    BLI_assert(py_drawer_ != Py_None);
+    Py_INCREF(py_drawer_);
+
+    PyObject *py_column_amount = PyObject_CallMethod(py_drawer_, "get_column_amount", "");
+    this->tot_columns = PyLong_AsLong(py_column_amount);
+    Py_DECREF(py_column_amount);
+
+    PyObject *py_row_amount = PyObject_CallMethod(py_drawer_, "get_row_amount", "");
+    this->tot_rows = PyLong_AsLong(py_row_amount);
+    Py_DecRef(py_row_amount);
+  }
+
+  ~PythonSpreadsheetDrawer() override
+  {
+    PyGILState_STATE gilstate = PyGILState_Ensure();
+    Py_DECREF(py_drawer_);
+    PyGILState_Release(gilstate);
+  }
+
+  void draw_top_row_cell(int column_index, const CellDrawParams &params) const override
+  {
+    PyGILState_STATE gilstate = PyGILState_Ensure();
+    PyObject *py_cell_content = PyObject_CallMethod(
+        py_drawer_, "get_top_row_cell", "i", column_index);
+    this->draw_cell_content(params, py_cell_content);
+    Py_DecRef(py_cell_content);
+    PyGILState_Release(gilstate);
+  }
+
+  void draw_left_column_cell(int row_index, const CellDrawParams &params) const override
+  {
+    PyGILState_STATE gilstate = PyGILState_Ensure();
+    PyObject *py_cell_content = PyObject_CallMethod(
+        py_drawer_, "get_left_column_cell", "i", row_index);
+    this->draw_cell_content(params, py_cell_content);
+    Py_DecRef(py_cell_content);
+    PyGILState_Release(gilstate);
+  }
+
+  void draw_content_cell(int row_index,
+                         int column_index,
+                         const CellDrawParams &params) const override
+  {
+    PyGILState_STATE gilstate = PyGILState_Ensure();
+    PyObject *py_cell_content = PyObject_CallMethod(
+        py_drawer_, "get_content_cell", "ii", row_index, column_index);
+    this->draw_cell_content(params, py_cell_content);
+    Py_DecRef(py_cell_content);
+    PyGILState_Release(gilstate);
+  }
+
+ private:
+  void draw_cell_content(const CellDrawParams &params, PyObject *py_cell_content) const
+  {
+    if (py_cell_content == nullptr) {
+      return;
+    }
+    if (py_cell_content == Py_None) {
+      return;
+    }
+    if (PyUnicode_Check(py_cell_content)) {
+      const char *str = PyUnicode_AsUTF8(py_cell_content);
+      uiDefIconTextBut(params.block,
+                       UI_BTYPE_LABEL,
+                       0,
+                       ICON_NONE,
+                       str,
+                       params.xmin,
+                       params.ymin,
+                       params.width,
+                       params.height,
+                       nullptr,
+                       0,
+                       0,
+                       0,
+                       0,
+                       nullptr);
+    }
+  }
+};
+
+std::unique_ptr<SpreadsheetDrawer> spreadsheet_drawer_from_python(const bContext *C)
+{
+  SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C);
+  PointerRNA sspreadsheet_rna;
+  RNA_pointer_create(nullptr, &RNA_SpaceSpreadsheet, sspreadsheet, &sspreadsheet_rna);
+
+  std::unique_ptr<SpreadsheetDrawer> drawer;
+
+  PyGILState_STATE gilstate = PyGILState_Ensure();
+  PyObject *py_module = PyImport_ImportModule("bpy_spreadsheet");
+  PyObject *py_get_drawer_func = PyObject_GetAttrString(py_module, "get_spreadsheet_drawer");
+  PyObject *py_sspreadsheet = pyrna_struct_CreatePyObject(&sspreadsheet_rna);
+  PyObject *py_drawer = PyObject_CallFunction(py_get_drawer_func, "O", py_sspreadsheet);
+  if (py_drawer != Py_None) {
+    drawer = std::make_unique<PythonSpreadsheetDrawer>(py_drawer);
+  }
+  Py_DECREF(py_drawer);
+  Py_DECREF(py_sspreadsheet);
+  PyGILState_Release(gilstate);
+  return drawer;
+}
+
+}  // namespace blender::ed::spreadsheet
diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_from_python.hh b/source/blender/editors/space_spreadsheet/spreadsheet_from_python.hh
new file mode 100644
index 00000000000..3af09cbfa98
--- /dev/null
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_from_python.hh
@@ -0,0 +1,27 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list