diff --git a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp index 8b276dbf5e..a0fc4b5b39 100644 --- a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp +++ b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp @@ -118,6 +118,7 @@ PyMOD_INIT_FUNC(SpreadsheetGui) CreateSpreadsheetCommands(); SpreadsheetGui::ViewProviderSheet::init(); + SpreadsheetGui::ViewProviderSheetPython::init(); SpreadsheetGui::Workbench::init(); SpreadsheetGui::SheetView::init(); diff --git a/src/Mod/Spreadsheet/Gui/CMakeLists.txt b/src/Mod/Spreadsheet/Gui/CMakeLists.txt index fbfde0a87d..61ff766fa2 100644 --- a/src/Mod/Spreadsheet/Gui/CMakeLists.txt +++ b/src/Mod/Spreadsheet/Gui/CMakeLists.txt @@ -9,10 +9,12 @@ include_directories( ) generate_from_xml(SpreadsheetViewPy) +generate_from_xml(ViewProviderSpreadsheetPy) # The XML files set(SpreadsheetGui_XML_SRCS SpreadsheetViewPy.xml + ViewProviderSpreadsheetPy.xml ) set(SpreadsheetGui_LIBS @@ -71,6 +73,7 @@ SET(SpreadsheetGui_SRCS LineEdit.cpp ViewProviderSpreadsheet.cpp ViewProviderSpreadsheet.h + ViewProviderSpreadsheetPyImp.cpp Resources/Spreadsheet.qrc SpreadsheetView.cpp SpreadsheetView.h diff --git a/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheet.cpp b/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheet.cpp index d78143413d..c5cd42a055 100644 --- a/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheet.cpp +++ b/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheet.cpp @@ -36,6 +36,7 @@ #include "ViewProviderSpreadsheet.h" #include "SpreadsheetView.h" +#include "ViewProviderSpreadsheetPy.h" #include #include @@ -181,3 +182,23 @@ void ViewProviderSheet::updateData(const App::Property* prop) if (view) view->updateCell(prop); } + +PyObject *ViewProviderSheet::getPyObject() +{ + if (PythonObject.is(Py::_None())){ + // ref counter is set to 1 + PythonObject = Py::Object(new ViewProviderSpreadsheetPy(this), true); + } + return Py::new_reference_to(PythonObject); +} + +// Python feature ----------------------------------------------------------------------- + +namespace Gui { +/// @cond DOXERR +PROPERTY_SOURCE_TEMPLATE(SpreadsheetGui::ViewProviderSheetPython, SpreadsheetGui::ViewProviderSheet) +/// @endcond + +// explicit template instantiation +template class SpreadsheetGuiExport ViewProviderPythonFeatureT; +} diff --git a/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheet.h b/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheet.h index 9602254d9a..571d41955f 100644 --- a/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheet.h +++ b/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheet.h @@ -26,6 +26,7 @@ #define SPREADSHEET_ViewProviderImagePlane_H #include +#include #include namespace Spreadsheet { @@ -67,13 +68,21 @@ public: virtual Gui::MDIView *getMDIView() const override; + inline SheetView* getView() const { return view; } + + PyObject *getPyObject(); + protected: SheetView* showSpreadsheetView(); void updateData(const App::Property *prop) override; private: QPointer view; + + Py::Object PythonObject; }; +typedef Gui::ViewProviderPythonFeatureT ViewProviderSheetPython; + } //namespace Spreadsheet diff --git a/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheetPy.xml b/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheetPy.xml new file mode 100644 index 0000000000..51c7b591f4 --- /dev/null +++ b/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheetPy.xml @@ -0,0 +1,29 @@ + + + + + + ViewProviderSheet class + + + + returns a list with the selected ranges of cells + + + + + returns a list with the selected cells + + + + diff --git a/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheetPyImp.cpp b/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheetPyImp.cpp new file mode 100644 index 0000000000..fb94ca46f7 --- /dev/null +++ b/src/Mod/Spreadsheet/Gui/ViewProviderSpreadsheetPyImp.cpp @@ -0,0 +1,61 @@ +#include "PreCompiled.h" + +#include "ViewProviderSpreadsheetPy.h" +#include "ViewProviderSpreadsheetPy.cpp" + +#include "SpreadsheetView.h" + +using namespace SpreadsheetGui; + +#if PY_MAJOR_VERSION >= 2 +#define PyString_FromString PyUnicode_FromString +#endif + +// returns a string which represents the object e.g. when printed in python +std::string ViewProviderSpreadsheetPy::representation(void) const +{ + return std::string(""); +} + + +PyObject* ViewProviderSpreadsheetPy::selectedRanges(PyObject* /*obj*/) +{ + ViewProviderSheet* vp = this->getViewProviderSheetPtr(); + SheetView *sheetView = vp->getView(); + std::vector ranges = sheetView->selectedRanges(); + PyObject *out = PyList_New(0); + std::vector::const_iterator i = ranges.begin(); + for (; i != ranges.end(); ++i) + { + PyObject *py_str = PyString_FromString(i->rangeString().c_str()); + PyList_Append(out, py_str); + } + + return out; +} + +PyObject* ViewProviderSpreadsheetPy::selectedCells(PyObject* /*obj*/) +{ + ViewProviderSheet* vp = this->getViewProviderSheetPtr(); + SheetView *sheetView = vp->getView(); + QModelIndexList cells = sheetView->selectedIndexes(); + PyObject *out = PyList_New(0); + for (auto it : cells) { + PyObject *py_str = PyString_FromString( + App::CellAddress(it.row(), it.column()).toString().c_str()); + PyList_Append(out, py_str); + } + + return out; +} + +PyObject *ViewProviderSpreadsheetPy::getCustomAttributes(const char* /*attr*/) const +{ + return 0; +} + + +int ViewProviderSpreadsheetPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/) +{ + return 0; +}