Spreadsheet: several improvements

* do not simply return with Py_None from Python handler without incrementing the ref. counter as otherwise the interpreter steals a reference and the program will crash after a while
* avoid using the plain Python C API and instead use the PyCXX API
This commit is contained in:
wmayer
2021-11-13 21:56:15 +01:00
parent 63e1f95a97
commit 5eb97d0028

View File

@@ -2,6 +2,7 @@
#include "ViewProviderSpreadsheetPy.h"
#include "ViewProviderSpreadsheetPy.cpp"
#include <CXX/Objects.hxx>
#include "SpreadsheetView.h"
@@ -19,14 +20,13 @@ PyObject* ViewProviderSpreadsheetPy::selectedRanges(PyObject* /*obj*/)
ViewProviderSheet* vp = this->getViewProviderSheetPtr();
SheetView *sheetView = vp->getView();
std::vector<App::Range> ranges = sheetView->selectedRanges();
PyObject *out = PyList_New(0);
Py::List list;
for (const auto &range : ranges)
{
PyObject *py_str = PyUnicode_FromString(range.rangeString().c_str());
PyList_Append(out, py_str);
list.append(Py::String(range.rangeString()));
}
return out;
return Py::new_reference_to(list);
}
PyObject* ViewProviderSpreadsheetPy::selectedCells(PyObject* /*obj*/)
@@ -34,14 +34,12 @@ PyObject* ViewProviderSpreadsheetPy::selectedCells(PyObject* /*obj*/)
ViewProviderSheet* vp = this->getViewProviderSheetPtr();
SheetView *sheetView = vp->getView();
QModelIndexList cells = sheetView->selectedIndexes();
PyObject *out = PyList_New(0);
Py::List list;
for (const auto &cell : cells) {
PyObject *py_str = PyUnicode_FromString(
App::CellAddress(cell.row(), cell.column()).toString().c_str());
PyList_Append(out, py_str);
}
list.append(Py::String(App::CellAddress(cell.row(), cell.column()).toString()));
}
return out;
return Py::new_reference_to(list);
}
PyObject* ViewProviderSpreadsheetPy::select(PyObject* _args)
@@ -69,7 +67,7 @@ PyObject* ViewProviderSpreadsheetPy::select(PyObject* _args)
else
throw Base::TypeError("Wrong arguments to select: specify either a cell, or two cells (for a range), and QItemSelectionModel.SelectionFlags");
}
return Py_None;
Py_RETURN_NONE;
}
PyObject* ViewProviderSpreadsheetPy::currentIndex(PyObject* /*_args*/)
@@ -77,9 +75,8 @@ PyObject* ViewProviderSpreadsheetPy::currentIndex(PyObject* /*_args*/)
ViewProviderSheet* vp = this->getViewProviderSheetPtr();
SheetView* sheetView = vp->getView();
auto index = sheetView->currentIndex();
PyObject* py_str = PyUnicode_FromString(
App::CellAddress(index.row(), index.column()).toString().c_str());
return py_str;
Py::String str(App::CellAddress(index.row(), index.column()).toString());
return Py::new_reference_to(str);
}
PyObject* ViewProviderSpreadsheetPy::setCurrentIndex(PyObject* args)
@@ -91,7 +88,7 @@ PyObject* ViewProviderSpreadsheetPy::setCurrentIndex(PyObject* args)
if (PyArg_ParseTuple(args, "s", &cell)) {
sheetView->setCurrentIndex(App::CellAddress(cell));
}
return Py_None;
Py_RETURN_NONE;
}
PyObject* ViewProviderSpreadsheetPy::getView(PyObject* args)