From 3d3a8d01416186d359288aedb108704507dadfe3 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 23 Jan 2016 19:52:37 +0100 Subject: [PATCH] py3: ported Spreadsheet to python3 --- src/Mod/Spreadsheet/App/AppSpreadsheet.cpp | 12 ++++- src/Mod/Spreadsheet/App/SheetPyImp.cpp | 54 ++++++++++++++++++- src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp | 13 +++-- 3 files changed, 72 insertions(+), 7 deletions(-) diff --git a/src/Mod/Spreadsheet/App/AppSpreadsheet.cpp b/src/Mod/Spreadsheet/App/AppSpreadsheet.cpp index cdb2f1b36..b6eb587da 100644 --- a/src/Mod/Spreadsheet/App/AppSpreadsheet.cpp +++ b/src/Mod/Spreadsheet/App/AppSpreadsheet.cpp @@ -19,6 +19,7 @@ #include #include +#include #include "Sheet.h" namespace Spreadsheet { @@ -34,10 +35,16 @@ public: private: }; + +PyObject* initModule() +{ + return (new Module)->module().ptr(); +} } // namespace Spreadsheet /* Python entry */ -PyMODINIT_FUNC initSpreadsheet() { +PyMOD_INIT_FUNC(Spreadsheet) +{ Spreadsheet::PropertySpreadsheetQuantity::init(); Spreadsheet::PropertyColumnWidths::init(); Spreadsheet::PropertyRowHeights::init(); @@ -46,6 +53,7 @@ PyMODINIT_FUNC initSpreadsheet() { Spreadsheet::Sheet::init(); Spreadsheet::SheetPython::init(); - new Spreadsheet::Module(); + PyObject* mod = Spreadsheet::initModule(); Base::Console().Log("Loading Spreadsheet module... done\n"); + PyMOD_Return(mod); } diff --git a/src/Mod/Spreadsheet/App/SheetPyImp.cpp b/src/Mod/Spreadsheet/App/SheetPyImp.cpp index ce892509a..bfca86f8c 100644 --- a/src/Mod/Spreadsheet/App/SheetPyImp.cpp +++ b/src/Mod/Spreadsheet/App/SheetPyImp.cpp @@ -289,8 +289,13 @@ PyObject* SheetPy::setStyle(PyObject *args) PyObject * item = PySet_Pop(copy); // check on the key: +#if PY_MAJOR_VERSION >= 3 + if (PyBytes_Check(item)) + style.insert(PyBytes_AsString(item)); +#else if (PyString_Check(item)) style.insert(PyString_AsString(item)); +#endif else { std::string error = std::string("type of the set need to be a string, not ") + item->ob_type->tp_name; PyErr_SetString(PyExc_TypeError, error.c_str()); @@ -300,11 +305,19 @@ PyObject* SheetPy::setStyle(PyObject *args) } Py_DECREF(copy); } +#if PY_MAJOR_VERSION >= 3 + else if (PyBytes_Check(value)) { +#else else if (PyString_Check(value)) { +#endif using namespace boost; escaped_list_separator e('\0', '|', '\0'); +#if PY_MAJOR_VERSION >= 3 + std::string line = PyBytes_AsString(value); +#else std::string line = PyString_AsString(value); +#endif tokenizer > tok(line, e); for(tokenizer >::iterator i = tok.begin(); i != tok.end();++i) @@ -416,7 +429,11 @@ PyObject* SheetPy::getStyle(PyObject *args) PyObject * s = PySet_New(NULL); for (std::set::const_iterator i = style.begin(); i != style.end(); ++i) +#if PY_MAJOR_VERSION >= 3 + PySet_Add(s, PyBytes_FromString((*i).c_str())); +#else PySet_Add(s, PyString_FromString((*i).c_str())); +#endif return s; } @@ -568,8 +585,13 @@ PyObject* SheetPy::setAlignment(PyObject *args) while (n-- > 0) { PyObject * item = PySet_Pop(copy); +#if PY_MAJOR_VERSION >= 3 + if (PyBytes_Check(item)) + alignment = Cell::decodeAlignment(PyBytes_AsString(item), alignment); +#else if (PyString_Check(item)) alignment = Cell::decodeAlignment(PyString_AsString(item), alignment); +#endif else { std::string error = std::string("type of the key need to be a string, not") + item->ob_type->tp_name; PyErr_SetString(PyExc_TypeError, error.c_str()); @@ -580,12 +602,20 @@ PyObject* SheetPy::setAlignment(PyObject *args) Py_DECREF(copy); } +#if PY_MAJOR_VERSION >= 3 + else if (PyBytes_Check(value)) { +#else else if (PyString_Check(value)) { +#endif // Argument is a string, combination of alignments, separated by the pipe character using namespace boost; escaped_list_separator e('\0', '|', '\0'); +#if PY_MAJOR_VERSION >= 3 + std::string line = PyBytes_AsString(value); +#else std::string line = PyString_AsString(value); +#endif tokenizer > tok(line, e); for(tokenizer >::iterator i = tok.begin(); i != tok.end();++i) @@ -652,6 +682,20 @@ PyObject* SheetPy::getAlignment(PyObject *args) if (cell && cell->getAlignment(alignment)) { PyObject * s = PySet_New(NULL); +#if PY_MAJOR_VERSION >= 3 + if (alignment & Cell::ALIGNMENT_LEFT) + PySet_Add(s, PyBytes_FromString("left")); + if (alignment & Cell::ALIGNMENT_HCENTER) + PySet_Add(s, PyBytes_FromString("center")); + if (alignment & Cell::ALIGNMENT_RIGHT) + PySet_Add(s, PyBytes_FromString("right")); + if (alignment & Cell::ALIGNMENT_TOP) + PySet_Add(s, PyBytes_FromString("top")); + if (alignment & Cell::ALIGNMENT_VCENTER) + PySet_Add(s, PyBytes_FromString("vcenter")); + if (alignment & Cell::ALIGNMENT_BOTTOM) + PySet_Add(s, PyBytes_FromString("bottom")); +#else if (alignment & Cell::ALIGNMENT_LEFT) PySet_Add(s, PyString_FromString("left")); if (alignment & Cell::ALIGNMENT_HCENTER) @@ -664,6 +708,7 @@ PyObject* SheetPy::getAlignment(PyObject *args) PySet_Add(s, PyString_FromString("vcenter")); if (alignment & Cell::ALIGNMENT_BOTTOM) PySet_Add(s, PyString_FromString("bottom")); +#endif return s; } @@ -677,8 +722,13 @@ static float decodeFloat(const PyObject * obj) { if (PyFloat_Check(obj)) return PyFloat_AsDouble((PyObject *)obj); +#if PY_MAJOR_VERSION >= 3 + else if (PyLong_Check(obj)) + return PyLong_AsLong((PyObject *)obj); +#else else if (PyInt_Check(obj)) return PyInt_AsLong((PyObject *)obj); +#endif throw Base::TypeError("Float or integer expected"); } @@ -858,7 +908,7 @@ PyObject* SheetPy::getColumnWidth(PyObject *args) try { CellAddress address(std::string(columnStr) + "1"); - return Py::new_reference_to( Py::Int( getSheetPtr()->getColumnWidth(address.col()) ) ); + return Py::new_reference_to( Py::Long( getSheetPtr()->getColumnWidth(address.col()) ) ); } catch (const Base::Exception & e) { PyErr_SetString(PyExc_ValueError, e.what()); @@ -896,7 +946,7 @@ PyObject* SheetPy::getRowHeight(PyObject *args) try { CellAddress address("A" + std::string(rowStr)); - return Py::new_reference_to( Py::Int( getSheetPtr()->getRowHeight(address.row()) ) ); + return Py::new_reference_to( Py::Long( getSheetPtr()->getRowHeight(address.row()) ) ); } catch (const Base::Exception & e) { PyErr_SetString(PyExc_ValueError, e.what()); diff --git a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp index 486ad38d1..13eae3bb9 100644 --- a/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp +++ b/src/Mod/Spreadsheet/Gui/AppSpreadsheetGui.cpp @@ -93,15 +93,21 @@ private: return Py::None(); } }; + +PyObject* initModule() +{ + return (new Module)->module().ptr(); +} + } // namespace SpreadsheetGui /* Python entry */ -PyMODINIT_FUNC initSpreadsheetGui() +PyMOD_INIT_FUNC(SpreadsheetGui) { if (!Gui::Application::Instance) { PyErr_SetString(PyExc_ImportError, "Cannot load Gui module in console application."); - return; + PyMOD_Return(0); } // instantiating the commands @@ -114,6 +120,7 @@ PyMODINIT_FUNC initSpreadsheetGui() // add resources and reloads the translators loadSpreadsheetResource(); - new SpreadsheetGui::Module(); + PyObject* mod = SpreadsheetGui::initModule(); Base::Console().Log("Loading GUI of Spreadsheet module... done\n"); + PyMOD_Return(mod); }