From 8eb099d4e15e78362788046a1b46b4a8c999d4e9 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 19 Nov 2021 15:44:23 +0100 Subject: [PATCH] Gui: add MDIViewPy.cast_to_base and implement in Python wrappers for sub-classes of MDIView --- src/Gui/MDIViewPy.cpp | 26 +++++++++++++++++++++ src/Gui/MDIViewPy.h | 7 +++++- src/Gui/View3DPy.cpp | 7 ++++++ src/Gui/View3DPy.h | 1 + src/Mod/Spreadsheet/Gui/SpreadsheetView.cpp | 6 +++++ src/Mod/Spreadsheet/Gui/SpreadsheetView.h | 1 + 6 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/Gui/MDIViewPy.cpp b/src/Gui/MDIViewPy.cpp index 33ec535da1..b2005957bc 100644 --- a/src/Gui/MDIViewPy.cpp +++ b/src/Gui/MDIViewPy.cpp @@ -53,6 +53,7 @@ void MDIViewPy::init_type() behaviors().supportRepr(); behaviors().supportGetattr(); behaviors().supportSetattr(); + behaviors().set_tp_new(extension_object_new); add_varargs_method("message",&MDIViewPy::sendMessage,"deprecated: use sendMessage"); add_varargs_method("sendMessage",&MDIViewPy::sendMessage,"sendMessage(str)"); @@ -60,6 +61,26 @@ void MDIViewPy::init_type() add_varargs_method("fitAll",&MDIViewPy::fitAll,"fitAll()"); add_varargs_method("setActiveObject", &MDIViewPy::setActiveObject, "setActiveObject(name,object,subname=None)\nadd or set a new active object"); add_varargs_method("getActiveObject", &MDIViewPy::getActiveObject, "getActiveObject(name,resolve=True)\nreturns the active object for the given type"); + add_varargs_method("cast_to_base", &MDIViewPy::cast_to_base, "cast_to_base() cast to MDIView class"); +} + +PyObject *MDIViewPy::extension_object_new(struct _typeobject * /*type*/, PyObject * /*args*/, PyObject * /*kwds*/) +{ + return new MDIViewPy(nullptr); +} + +Py::Object MDIViewPy::type() +{ + return Py::Object( reinterpret_cast( behaviors().type_object() ) ); +} + +Py::ExtensionObject MDIViewPy::create(MDIView *mdi) +{ + Py::Callable class_type(type()); + Py::Tuple arg; + auto inst = Py::ExtensionObject(class_type.apply(arg, Py::Dict())); + inst.extensionObject()->_view = mdi; + return inst; } MDIViewPy::MDIViewPy(MDIView *mdi) @@ -198,3 +219,8 @@ Py::Object MDIViewPy::getActiveObject(const Py::Tuple& args) Py::asObject(parent->getPyObject()), Py::String(subname.c_str())); } + +Py::Object MDIViewPy::cast_to_base(const Py::Tuple&) +{ + return Py::Object(this); +} diff --git a/src/Gui/MDIViewPy.h b/src/Gui/MDIViewPy.h index 469bdca6f3..aee3897ff3 100644 --- a/src/Gui/MDIViewPy.h +++ b/src/Gui/MDIViewPy.h @@ -35,7 +35,11 @@ class MDIView; class GuiExport MDIViewPy : public Py::PythonExtension { public: - static void init_type(void); // announce properties and methods + static void init_type(); // announce properties and methods + static PyObject *extension_object_new( PyTypeObject *subtype, PyObject * /*args*/, PyObject * /*kwds*/ ); + + static Py::Object type(); + static Py::ExtensionObject create(MDIView *mdi); MDIViewPy(MDIView *mdi); ~MDIViewPy(); @@ -47,6 +51,7 @@ public: Py::Object fitAll(const Py::Tuple&); Py::Object setActiveObject(const Py::Tuple&); Py::Object getActiveObject(const Py::Tuple&); + Py::Object cast_to_base(const Py::Tuple&); MDIView* getMDIViewPtr() {return _view.data();} diff --git a/src/Gui/View3DPy.cpp b/src/Gui/View3DPy.cpp index 0576eae5da..469a365588 100644 --- a/src/Gui/View3DPy.cpp +++ b/src/Gui/View3DPy.cpp @@ -52,6 +52,7 @@ #include "View3DViewerPy.h" #include "ActiveObjectList.h" #include "PythonWrapper.h" +#include "MDIViewPy.h" #include @@ -208,6 +209,7 @@ void View3DInventorPy::init_type() "hasClippingPlane(): check whether this clipping plane is active"); add_varargs_method("graphicsView",&View3DInventorPy::graphicsView, "graphicsView(): Access this view as QGraphicsView"); + add_varargs_method("cast_to_base", &View3DInventorPy::cast_to_base, "cast_to_base() cast to MDIView class"); } View3DInventorPy::View3DInventorPy(View3DInventor *vi) @@ -2633,3 +2635,8 @@ Py::Object View3DInventorPy::graphicsView(const Py::Tuple& args) wrap.loadWidgetsModule(); return wrap.fromQWidget(_view->getViewer(), "QGraphicsView"); } + +Py::Object View3DInventorPy::cast_to_base(const Py::Tuple&) +{ + return Gui::MDIViewPy::create(_view); +} diff --git a/src/Gui/View3DPy.h b/src/Gui/View3DPy.h index d84c073c34..9bc057bfb4 100644 --- a/src/Gui/View3DPy.h +++ b/src/Gui/View3DPy.h @@ -135,6 +135,7 @@ public: Py::Object toggleClippingPlane(const Py::Tuple& args, const Py::Dict &); Py::Object hasClippingPlane(const Py::Tuple& args); Py::Object graphicsView(const Py::Tuple& args); + Py::Object cast_to_base(const Py::Tuple&); View3DInventor* getView3DIventorPtr() {return _view;} diff --git a/src/Mod/Spreadsheet/Gui/SpreadsheetView.cpp b/src/Mod/Spreadsheet/Gui/SpreadsheetView.cpp index 3895df45ca..2f8fc28dcd 100644 --- a/src/Mod/Spreadsheet/Gui/SpreadsheetView.cpp +++ b/src/Mod/Spreadsheet/Gui/SpreadsheetView.cpp @@ -471,6 +471,7 @@ void SheetViewPy::init_type() behaviors().supportSetattr(); add_varargs_method("getSheet", &SheetViewPy::getSheet, "getSheet()"); + add_varargs_method("cast_to_base", &SheetViewPy::cast_to_base, "cast_to_base() cast to MDIView class"); behaviors().readyType(); } @@ -531,4 +532,9 @@ Py::Object SheetViewPy::getSheet(const Py::Tuple& args) return Py::asObject(new Spreadsheet::SheetPy(getSheetViewPtr()->getSheet())); } +Py::Object SheetViewPy::cast_to_base(const Py::Tuple&) +{ + return Gui::MDIViewPy::create(base.getMDIViewPtr()); +} + #include "moc_SpreadsheetView.cpp" diff --git a/src/Mod/Spreadsheet/Gui/SpreadsheetView.h b/src/Mod/Spreadsheet/Gui/SpreadsheetView.h index 03691eace0..803cb4060d 100644 --- a/src/Mod/Spreadsheet/Gui/SpreadsheetView.h +++ b/src/Mod/Spreadsheet/Gui/SpreadsheetView.h @@ -130,6 +130,7 @@ public: Py::Object repr(); Py::Object getattr(const char *); Py::Object getSheet(const Py::Tuple&); + Py::Object cast_to_base(const Py::Tuple&); SheetView* getSheetViewPtr();