View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0014837 | Scribus | Scripter | public | 2017-05-31 18:02 | 2017-06-04 15:16 |
Reporter | dockattt | Assigned To | |||
Priority | normal | Severity | feature | Reproducibility | always |
Status | new | Resolution | open | ||
Product Version | 1.5.4.svn | ||||
Summary | 0014837: Add functions that get an object's page number and change an object's page number | ||||
Description | there doesn't seem to be functions that tell you what page number a page item is on. Nor does there seem to be one that allows you to easily change the page number of a page item. The patch attached adds the getObjectPageNumber function that returns the page items page number. It also adds setObjectPageNumber which moves a page item to a new page. getObjectPageNumber works simply like so getObjectPageNumber() getObjectPageNumber("name of page item") setObjectPageNumber works like so: setObjectPageNumber(newpagenumber) setObjectPageNumber(newpagenumber, "name of page item") | ||||
Steps To Reproduce | see doc strings for how to use. | ||||
Additional Information | Seeing the movement I'm expecting in testing. | ||||
Tags | No tags attached. | ||||
Patch | Yes | ||||
|
moveObject.patch (4,987 bytes)
Index: Scribus/scribus/plugins/scriptplugin/cmdpage.cpp =================================================================== --- Scribus/scribus/plugins/scriptplugin/cmdpage.cpp (revision 22048) +++ Scribus/scribus/plugins/scriptplugin/cmdpage.cpp (working copy) @@ -501,7 +501,76 @@ Py_RETURN_NONE; } +PyObject *scribus_getobjectpagenumber(PyObject* /* self */, PyObject* args){ + char *name = const_cast<char*>(""); + if (!PyArg_ParseTuple(args, "|es", "utf-8", &name)) + return NULL; + if(!checkHaveDocument()) + return NULL; + PageItem *i = GetUniqueItem(QString::fromUtf8(name)); + if (i == NULL) + return NULL; + PyObject* rv = PyInt_FromLong(ScCore->primaryMainWindow()->doc->OnPage(i)); + return rv; +} + +PyObject *scribus_setobjectpagenumber(PyObject* /* self */, PyObject* args){ + + char *name = const_cast<char*>(""); + int newpage; + if (!PyArg_ParseTuple(args, "i|es", &newpage, "utf-8", &name)) + return NULL; + if(!checkHaveDocument()) + return NULL; + PageItem *i = GetUniqueItem(QString::fromUtf8(name)); + if (i == NULL) + return NULL; + + if (newpage < 0) + { + PyErr_SetString(PyExc_RuntimeError, QObject::tr("Can't use a negative page number.","python error").toLocal8Bit().constData()); + return NULL; + } + + ScribusDoc* doc = ScCore->primaryMainWindow()->doc; + int numpages = doc->Pages->count(); + if (newpage >= numpages) + { + QByteArray qba = QString("pagenumber must be less than the number of pages: ").append(QString::number(numpages)).toUtf8(); + const char *message = qba.data(); + PyErr_SetString(PyExc_RuntimeError, + QObject::tr(message,"python error").toLocal8Bit().constData()); + return NULL; + } + + int oldpage = doc->OnPage(i); + if(oldpage == newpage) Py_RETURN_NONE; + + MarginStruct newPageBleeds; + doc->getBleeds(newpage, newPageBleeds); + double newy = doc->Pages->at(newpage)->yOffset() - newPageBleeds.top(); + + MarginStruct oldPageBleeds; + doc->getBleeds(oldpage, oldPageBleeds); + double oldy = doc->Pages->at(oldpage)->yOffset() - oldPageBleeds.top(); + + double ytarget; + if(newpage > oldpage){ + + ytarget = newy - oldy; + } + else{ + + ytarget = -(oldy - newy); + } + + doc->moveItem(0, ytarget, i); + + Py_RETURN_NONE; +} + + /*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings with header files structure untouched (docstrings are kept near declarations) PV */ @@ -516,5 +585,7 @@ << scribus_getVguides__doc__ << scribus_setVguides__doc__ << scribus_pagedimension__doc__ << scribus_getpageitems__doc__ << scribus_getpagemargins__doc__ << scribus_importpage__doc__ - << scribus_pagensize__doc__ << scribus_pagenmargins__doc__; + << scribus_pagensize__doc__ << scribus_pagenmargins__doc__ + << scribus_getobjectpagenumber__doc__ + << scribus_setobjectpagenumber__doc__; } Index: Scribus/scribus/plugins/scriptplugin/cmdpage.h =================================================================== --- Scribus/scribus/plugins/scriptplugin/cmdpage.h (revision 22048) +++ Scribus/scribus/plugins/scriptplugin/cmdpage.h (working copy) @@ -224,5 +224,25 @@ ")); PyObject *scribus_importpage(PyObject */*self*/, PyObject* args); +/*! docstring */ +PyDoc_STRVAR(scribus_getobjectpagenumber__doc__, +QT_TR_NOOP("getObjectPageNumber([\"name\"]) -> an integer\n\ +\n\ +Returns an integer that is the page number of the page item \"name\"\n\ +Page numbers start at 0 so the number returned will be 0 to (total pages)-1.\n\ +If \"name\" is not given the currently selected item is used.\n\ +")); +PyObject *scribus_getobjectpagenumber(PyObject* /* self */, PyObject* args); + +/*! docstring */ +PyDoc_STRVAR(scribus_setobjectpagenumber__doc__, +QT_TR_NOOP("setObjectPageNumber(pagenumber,[\"name\"]) -> None\n\ +\n\ +Moves the page item with the name \"name\" to the page \"pagenumber\".\n\ +Page numbers start at 0 so the number used must be 0 to (total pages)-1.\n\ +If \"name\" is not given the currently selected item is used.\n\ +")); +PyObject *scribus_setobjectpagenumber(PyObject* /* self */, PyObject* args); + #endif Index: Scribus/scribus/plugins/scriptplugin/scriptplugin.cpp =================================================================== --- Scribus/scribus/plugins/scriptplugin/scriptplugin.cpp (revision 22048) +++ Scribus/scribus/plugins/scriptplugin/scriptplugin.cpp (working copy) @@ -572,6 +572,8 @@ // Internal methods - Not for public use {const_cast<char*>("retval"), (PyCFunction)scribus_retval, METH_VARARGS, const_cast<char*>("Scribus internal.")}, {const_cast<char*>("getval"), (PyCFunction)scribus_getval, METH_NOARGS, const_cast<char*>("Scribus internal.")}, + {const_cast<char*>("getObjectPageNumber"), (PyCFunction)scribus_getobjectpagenumber, METH_VARARGS, tr(scribus_getobjectpagenumber__doc__)}, + {const_cast<char*>("setObjectPageNumber"), (PyCFunction)scribus_setobjectpagenumber, METH_VARARGS, tr(scribus_setobjectpagenumber__doc__)}, {NULL, (PyCFunction)(0), 0, NULL} /* sentinel */ }; |
|
The object page number is an internal property, it should be accessed, never be set externally. In some cases it is deliberately set to -1 by Scribus and must stay so. This page number is also useless when object covers two different pages. |
|
I've thought about this before I read this note. It's less of a "set page number" function than a "move object to page function". I think there's an page owning variable on the page item that if you set it doesn't seem to do anything. That's why it has to be moved/changed. I just tested the "object on multiple pages" scenario and it did as I expected. It returned the number of the page where the object starts on. If the object is between 2 pages it returns -1. I just found that Scribus crashes if its off in the scratch area. The function needs to be fixed if the page is on -1 so it doesn't crash. I'm not sure if that's a bug in Scribus or not! |
|
ok I just added some code in that guards against the crash that occurs when an object isn't on a page. Changed the pydocs a little as well to reflect this. This is in the new patch. I think when I was scripting this problem I used gotoPage(newPageNumber) and set the items page coordinates to what it already was. This "moved" the object to the page I wanted it on. moveObject_2.patch (5,321 bytes)
Index: Scribus/scribus/plugins/scriptplugin/cmdpage.cpp =================================================================== --- Scribus/scribus/plugins/scriptplugin/cmdpage.cpp (revision 22048) +++ Scribus/scribus/plugins/scriptplugin/cmdpage.cpp (working copy) @@ -501,7 +501,80 @@ Py_RETURN_NONE; } +PyObject *scribus_getobjectpagenumber(PyObject* /* self */, PyObject* args){ + char *name = const_cast<char*>(""); + if (!PyArg_ParseTuple(args, "|es", "utf-8", &name)) + return NULL; + if(!checkHaveDocument()) + return NULL; + PageItem *i = GetUniqueItem(QString::fromUtf8(name)); + if (i == NULL) + return NULL; + PyObject* rv = PyInt_FromLong(ScCore->primaryMainWindow()->doc->OnPage(i)); + return rv; +} + +PyObject *scribus_setobjectpagenumber(PyObject* /* self */, PyObject* args){ + + char *name = const_cast<char*>(""); + int newpage; + if (!PyArg_ParseTuple(args, "i|es", &newpage, "utf-8", &name)) + return NULL; + if(!checkHaveDocument()) + return NULL; + PageItem *i = GetUniqueItem(QString::fromUtf8(name)); + if (i == NULL) + return NULL; + + if (newpage < 0) + { + PyErr_SetString(PyExc_RuntimeError, QObject::tr("Can't use a negative page number.","python error").toLocal8Bit().constData()); + return NULL; + } + + ScribusDoc* doc = ScCore->primaryMainWindow()->doc; + int numpages = doc->Pages->count(); + if (newpage >= numpages) + { + QByteArray qba = QString("pagenumber must be less than the number of pages: ").append(QString::number(numpages)).toUtf8(); + const char *message = qba.data(); + PyErr_SetString(PyExc_RuntimeError, + QObject::tr(message,"python error").toLocal8Bit().constData()); + return NULL; + } + + int oldpage = doc->OnPage(i); + if(oldpage == newpage) Py_RETURN_NONE; + else if(oldpage < 0){ + PyErr_SetString(PyExc_RuntimeError, QObject::tr("Can't change an object's page that isn't on an identifiable page.","python error").toLocal8Bit().constData()); + return NULL; + } + + MarginStruct newPageBleeds; + doc->getBleeds(newpage, newPageBleeds); + double newy = doc->Pages->at(newpage)->yOffset() - newPageBleeds.top(); + + MarginStruct oldPageBleeds; + doc->getBleeds(oldpage, oldPageBleeds); + double oldy = doc->Pages->at(oldpage)->yOffset() - oldPageBleeds.top(); + + double ytarget; + if(newpage > oldpage){ + + ytarget = newy - oldy; + } + else{ + + ytarget = -(oldy - newy); + } + + doc->moveItem(0, ytarget, i); + + Py_RETURN_NONE; +} + + /*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings with header files structure untouched (docstrings are kept near declarations) PV */ @@ -516,5 +589,7 @@ << scribus_getVguides__doc__ << scribus_setVguides__doc__ << scribus_pagedimension__doc__ << scribus_getpageitems__doc__ << scribus_getpagemargins__doc__ << scribus_importpage__doc__ - << scribus_pagensize__doc__ << scribus_pagenmargins__doc__; + << scribus_pagensize__doc__ << scribus_pagenmargins__doc__ + << scribus_getobjectpagenumber__doc__ + << scribus_setobjectpagenumber__doc__; } Index: Scribus/scribus/plugins/scriptplugin/cmdpage.h =================================================================== --- Scribus/scribus/plugins/scriptplugin/cmdpage.h (revision 22048) +++ Scribus/scribus/plugins/scriptplugin/cmdpage.h (working copy) @@ -224,5 +224,27 @@ ")); PyObject *scribus_importpage(PyObject */*self*/, PyObject* args); +/*! docstring */ +PyDoc_STRVAR(scribus_getobjectpagenumber__doc__, +QT_TR_NOOP("getObjectPageNumber([\"name\"]) -> an integer\n\ +\n\ +Returns an integer that is the page number of the page item \"name\"\n\ +Page numbers start at 0 so the number returned will be 0 to (total pages)-1.\n\ +Will return -1 if the object is not on any page.\n\ +If \"name\" is not given the currently selected item is used.\n\ +")); +PyObject *scribus_getobjectpagenumber(PyObject* /* self */, PyObject* args); + +/*! docstring */ +PyDoc_STRVAR(scribus_setobjectpagenumber__doc__, +QT_TR_NOOP("setObjectPageNumber(pagenumber,[\"name\"]) -> None\n\ +\n\ +Moves the page item with the name \"name\" to the page \"pagenumber\".\n\ +Page numbers start at 0 so the number used must be 0 to (total pages)-1.\n\ +Objects that are not on any page cannot be moved to a different page.\n\ +If \"name\" is not given the currently selected item is used.\n\ +")); +PyObject *scribus_setobjectpagenumber(PyObject* /* self */, PyObject* args); + #endif Index: Scribus/scribus/plugins/scriptplugin/scriptplugin.cpp =================================================================== --- Scribus/scribus/plugins/scriptplugin/scriptplugin.cpp (revision 22048) +++ Scribus/scribus/plugins/scriptplugin/scriptplugin.cpp (working copy) @@ -572,6 +572,8 @@ // Internal methods - Not for public use {const_cast<char*>("retval"), (PyCFunction)scribus_retval, METH_VARARGS, const_cast<char*>("Scribus internal.")}, {const_cast<char*>("getval"), (PyCFunction)scribus_getval, METH_NOARGS, const_cast<char*>("Scribus internal.")}, + {const_cast<char*>("getObjectPageNumber"), (PyCFunction)scribus_getobjectpagenumber, METH_VARARGS, tr(scribus_getobjectpagenumber__doc__)}, + {const_cast<char*>("setObjectPageNumber"), (PyCFunction)scribus_setobjectpagenumber, METH_VARARGS, tr(scribus_setobjectpagenumber__doc__)}, {NULL, (PyCFunction)(0), 0, NULL} /* sentinel */ }; |
Date Modified | Username | Field | Change |
---|---|---|---|
2017-05-31 18:02 | dockattt | New Issue | |
2017-05-31 18:02 | dockattt | File Added: moveObject.patch | |
2017-05-31 19:46 | jghali | Note Added: 0043978 | |
2017-05-31 20:03 | jghali | Note Edited: 0043978 | |
2017-06-04 14:58 | dockattt | Note Added: 0043992 | |
2017-06-04 15:16 | dockattt | File Added: moveObject_2.patch | |
2017-06-04 15:16 | dockattt | Note Added: 0043993 |