View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0016300 | Scribus | Scripter | public | 2020-11-01 20:06 | 2020-11-10 16:21 |
Reporter | ale | Assigned To | |||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | new | Resolution | open | ||
Product Version | 1.5.6.svn | ||||
Summary | 0016300: [PATCHJ] add moveToPage() to the scripter | ||||
Description | currently if you want to move an item from a page to a different one, you need to use the clipboard and copy paste. this is not a good idea, since it changes the user's clipboard. it would be better to use duplicate() and then add a moveToPage(). of course, this is only important for script that run while the user is working on a document... i can propose a patch for this. | ||||
Tags | No tags attached. | ||||
Patch | Yes | ||||
|
here is the first part of the patch: add moveToPage to PageItem move-to-page.diff (17,004 bytes)
diff --git a/scribus/pageitem.cpp b/scribus/pageitem.cpp index 53bb80446..d304c0191 100644 --- a/scribus/pageitem.cpp +++ b/scribus/pageitem.cpp @@ -8744,6 +8744,23 @@ void PageItem::getOldBoundingRect(double *x1, double *y1, double *x2, double *y2 } } +void PageItem::moveToPage(int page) +{ + int iPage = m_Doc->OnPage(this); + if (iPage == - 1) + return; + + auto currentPage = m_Doc->Pages->at(iPage); + auto targetPage = m_Doc->Pages->at(page); + + auto dX = targetPage->xOffset() - currentPage->xOffset(); + auto dY = targetPage->yOffset() - currentPage->yOffset(); + + m_Doc->moveItem(dX, dY, this); + + m_Doc->changed(); +} + void PageItem::getVisualBoundingRect(double * x1, double * y1, double * x2, double * y2) const { double minx = std::numeric_limits<double>::max(); diff --git a/scribus/pageitem.h b/scribus/pageitem.h index 4e7dc56ab..4ce5a3952 100644 --- a/scribus/pageitem.h +++ b/scribus/pageitem.h @@ -499,6 +499,7 @@ public: // Start public functions virtual QList<PageItem*> getAllChildren() const; //<< ********* Attributes of the item ********* + void moveToPage(int page); //Position double xPos() const { return m_xPos; } double yPos() const { return m_yPos; } diff --git a/scribus/ui/outlinepalette.cpp b/scribus/ui/outlinepalette.cpp index 8049f42e0..8e2a7fad6 100644 --- a/scribus/ui/outlinepalette.cpp +++ b/scribus/ui/outlinepalette.cpp @@ -82,37 +82,39 @@ void OutlineWidget::selectItems(const QList<QTreeWidgetItem*>& items) selectionModel()->select(itemSelection, QItemSelectionModel::Select); } +/* +- use a list with both the item and its parent +- use range loops +- it is for iterators, not items... +- if item is nullptr, don't bothe rwith adding to items + */ void OutlineWidget::dropEvent(QDropEvent *e) { - bool haveLayers = false; - QModelIndex id; - QList<QTreeWidgetItem*> its; - QList<OutlineTreeItem*> itemPars; - QList<QModelIndex> idxs = selectedIndexes(); - for (int i = 0; i < idxs.count(); ++i) + bool haveLayers = false; // TODO: shouldn't it just count if the layers in doc are > 1? + QList<QPair<QTreeWidgetItem*, OutlineTreeItem*>> items; + for (const auto& index: selectedIndexes()) { - id = idxs.at(i); - QTreeWidgetItem* it = id.isValid() ? itemFromIndex(id) : nullptr; - OutlineTreeItem *itemPar = it ? dynamic_cast<OutlineTreeItem*>(it->parent()) : nullptr; - while (itemPar && (itemPar->type != 2)) + if (!index.isValid()) + continue; + QTreeWidgetItem* item = itemFromIndex(index); + OutlineTreeItem *itemParent = dynamic_cast<OutlineTreeItem*>(item->parent()); + while (itemParent && (itemParent->type != 2)) { - if (itemPar->type == 5) + if (itemParent->type == 5) haveLayers = true; - itemPar = dynamic_cast<OutlineTreeItem*>(itemPar->parent()); + itemParent = dynamic_cast<OutlineTreeItem*>(itemParent->parent()); } - its.append(it); - itemPars.append(itemPar); + items.append(qMakePair(item, itemParent)); } QTreeWidget::dropEvent(e); QList<QTreeWidgetItem*> selList; - for (int i = 0; i < its.count(); ++i) + for (const auto& itemPair: items) { - QTreeWidgetItem* it = its.at(i); - if (it == nullptr) - continue; - OutlineTreeItem *itemPar = itemPars.at(i); + QTreeWidgetItem* it = itemPair.first; // widgetItem + OutlineTreeItem *itemPar = itemPair.second; + OutlineTreeItem *item = dynamic_cast<OutlineTreeItem*>(it); if (!item) qFatal("OutlineWidget::dropEvent !item"); @@ -1089,91 +1091,87 @@ void OutlinePalette::BuildTree(bool storeVals) if (storeVals) buildReopenVals(); clearPalette(); - OutlineTreeItem * item = new OutlineTreeItem( reportDisplay, nullptr ); + OutlineTreeItem* item = new OutlineTreeItem(reportDisplay, nullptr); rootObject = item; - item->setText( 0, currDoc->documentFileName().section( '/', -1 ) ); + item->setText(0, currDoc->documentFileName().section('/', -1)); item->type = -2; item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); OutlineTreeItem * pagep = nullptr; freeObjects = nullptr; - PageItem* pgItem; - QString tmp; if (currDoc->symbolEditMode() || currDoc->inlineEditMode()) { OutlineTreeItem *page = new OutlineTreeItem( item, pagep ); page->PageObject = currDoc->Pages->at(0); page->type = 2; page->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); + if (currDoc->symbolEditMode()) + page->setText(0, currDoc->getEditedSymbol()); + else + page->setText(0, tr("Inline Frame")); + pagep = page; - for (int b = 0; b < currDoc->Items->count(); ++b) + + for (auto pageItem: *currDoc->Items) { - pgItem = currDoc->Items->at(b); - if (!pgItem->isGroup()) + OutlineTreeItem *object = new OutlineTreeItem(page, nullptr); + object->PageItemObject = pageItem; + object->PageObject = currDoc->DocPages.at(0); + object->DocObject = currDoc; + object->type = 3; + object->setText(0, pageItem->itemName()); + + if (!pageItem->isGroup()) { - OutlineTreeItem *object = new OutlineTreeItem( page, nullptr ); - object->PageItemObject = pgItem; - object->PageObject = currDoc->DocPages.at(0); - object->DocObject = currDoc; - object->type = 3; - object->setText(0, pgItem->itemName()); - setItemIcon(object, pgItem); + setItemIcon(object, pageItem); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); } else { - OutlineTreeItem *object = new OutlineTreeItem( page, nullptr ); - object->PageItemObject = pgItem; - object->PageObject = currDoc->DocPages.at(0); - object->DocObject = currDoc; - object->type = 3; - object->setText(0, pgItem->itemName()); - object->setIcon( 0, groupIcon ); + object->setIcon(0, groupIcon); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); - parseSubGroup(object, &pgItem->groupItemList, 3, currDoc->Pages->at(0)); + parseSubGroup(object, &pageItem->groupItemList, 3, currDoc->Pages->at(0)); } } - if (currDoc->symbolEditMode()) - page->setText(0, currDoc->getEditedSymbol()); - else - page->setText(0, tr("Inline Frame")); } else { + // TODO check if masterPage has OwnPage and it is a... or otherwise has the value of a for (int a = 0; a < static_cast<int>(currDoc->MasterPages.count()); ++a) { + const auto masterPage = currDoc->MasterPages.at(a); OutlineTreeItem *page = new OutlineTreeItem( item, pagep ); + qDebug() << a << masterPage->pageNr(); page->PageObject = currDoc->MasterPages.at(a); page->type = 0; page->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); QString pageNam = currDoc->MasterPages.at(a)->pageName(); pagep = page; - for (int b = 0; b < currDoc->MasterItems.count(); ++b) + for (const auto& pageItem: currDoc->MasterItems) { - pgItem = currDoc->MasterItems.at(b); - if (((pgItem->OwnPage == a) || (pgItem->OnMasterPage == pageNam))) + if (((pageItem->OwnPage == a) || (pageItem->OnMasterPage == pageNam))) { - if (!pgItem->isGroup()) + if (!pageItem->isGroup()) { OutlineTreeItem *object = new OutlineTreeItem( page, nullptr ); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = currDoc->MasterPages.at(a); object->DocObject = currDoc; object->type = 1; - object->setText(0, pgItem->itemName()); - setItemIcon(object, pgItem); + object->setText(0, pageItem->itemName()); + setItemIcon(object, pageItem); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); } else { OutlineTreeItem * object = new OutlineTreeItem(page, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = currDoc->MasterPages.at(a); object->DocObject = currDoc; object->type = 1; - object->setText(0, pgItem->itemName()); + object->setText(0, pageItem->itemName()); object->setIcon( 0, groupIcon ); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); - parseSubGroup(object, &pgItem->groupItemList, 1, currDoc->MasterPages.at(a)); + parseSubGroup(object, &pageItem->groupItemList, 1, currDoc->MasterPages.at(a)); } } } @@ -1191,13 +1189,12 @@ void OutlinePalette::BuildTree(bool storeVals) if (layerCount > 1) { QList<PageItem*> pgItems; - for (int b = 0; b < currDoc->DocItems.count(); ++b) + for (auto pageItem: currDoc->DocItems) { - pgItem = currDoc->DocItems.at(b); - if (pgItem->OwnPage == -1) + if (pageItem->OwnPage == -1) hasfreeItems = true; - if (pgItem->OwnPage == a) - pgItems.append(pgItem); + if (pageItem->OwnPage == a) + pgItems.append(pageItem); } ScLayer layer; layer.ID = 0; @@ -1210,73 +1207,71 @@ void OutlinePalette::BuildTree(bool storeVals) ObjLayer->DocObject = currDoc; ObjLayer->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); ObjLayer->setText(0, tr("Layer: \"") + layer.Name + "\""); - for (int it = 0; it < pgItems.count(); ++it) + for (auto pageItem: pgItems) { - pgItem = pgItems.at(it); - if (pgItem->m_layerID != layer.ID) + if (pageItem->m_layerID != layer.ID) continue; - if (!pgItem->isGroup()) + if (!pageItem->isGroup()) { OutlineTreeItem *object = new OutlineTreeItem(ObjLayer, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = currDoc->DocPages.at(a); object->DocObject = currDoc; object->type = 3; - object->setText(0, pgItem->itemName()); - setItemIcon(object, pgItem); + object->setText(0, pageItem->itemName()); + setItemIcon(object, pageItem); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); } else { OutlineTreeItem *object = new OutlineTreeItem(ObjLayer, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = currDoc->DocPages.at(a); object->DocObject = currDoc; object->type = 3; - object->setText(0, pgItem->itemName()); + object->setText(0, pageItem->itemName()); object->setIcon( 0, groupIcon ); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); - parseSubGroup(object, &pgItem->groupItemList, 3, currDoc->DocPages.at(a)); + parseSubGroup(object, &pageItem->groupItemList, 3, currDoc->DocPages.at(a)); } } } } else { - for (int b = 0; b < currDoc->DocItems.count(); ++b) + for (auto pageItem: currDoc->DocItems) { - pgItem = currDoc->DocItems.at(b); - if (pgItem->OwnPage == -1) + if (pageItem->OwnPage == -1) hasfreeItems = true; - if (pgItem->OwnPage == a) + if (pageItem->OwnPage == a) { - if (!pgItem->isGroup()) + if (!pageItem->isGroup()) { OutlineTreeItem *object = new OutlineTreeItem(page, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = currDoc->DocPages.at(a); object->DocObject = currDoc; object->type = 3; - object->setText(0, pgItem->itemName()); - setItemIcon(object, pgItem); + object->setText(0, pageItem->itemName()); + setItemIcon(object, pageItem); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); } else { OutlineTreeItem *object = new OutlineTreeItem(page, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = currDoc->DocPages.at(a); object->DocObject = currDoc; object->type = 3; - object->setText(0, pgItem->itemName()); + object->setText(0, pageItem->itemName()); object->setIcon( 0, groupIcon ); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); - parseSubGroup(object, &pgItem->groupItemList, 3, currDoc->DocPages.at(a)); + parseSubGroup(object, &pageItem->groupItemList, 3, currDoc->DocPages.at(a)); } } } } - page->setText(0, tr("Page ")+tmp.setNum(a+1)); + page->setText(0, tr("Page %1").arg(a + 1)); } if (hasfreeItems) { @@ -1289,11 +1284,10 @@ void OutlinePalette::BuildTree(bool storeVals) if (layerCount > 1) { QList<PageItem*> pgItems; - for (int b = 0; b < currDoc->DocItems.count(); ++b) + for (auto pageItem: currDoc->DocItems) { - pgItem = currDoc->DocItems.at(b); - if (pgItem->OwnPage == -1) - pgItems.append(pgItem); + if (pageItem->OwnPage == -1) + pgItems.append(pageItem); } ScLayer layer; layer.ID = 0; @@ -1306,66 +1300,64 @@ void OutlinePalette::BuildTree(bool storeVals) ObjLayer->DocObject = currDoc; ObjLayer->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); ObjLayer->setText(0, tr("Layer: \"") + layer.Name + "\""); - for (int it = 0; it < pgItems.count(); ++it) + for (auto pageItem: pgItems) { - pgItem = pgItems.at(it); - if (pgItem->m_layerID != layer.ID) + if (pageItem->m_layerID != layer.ID) continue; - if (!pgItem->isGroup()) + if (!pageItem->isGroup()) { OutlineTreeItem *object = new OutlineTreeItem(ObjLayer, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = nullptr; object->DocObject = currDoc; object->type = 4; - object->setText(0, pgItem->itemName()); - setItemIcon(object, pgItem); + object->setText(0, pageItem->itemName()); + setItemIcon(object, pageItem); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); } else { OutlineTreeItem *object = new OutlineTreeItem(ObjLayer, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = nullptr; object->DocObject = currDoc; object->type = 4; - object->setText(0, pgItem->itemName()); + object->setText(0, pageItem->itemName()); object->setIcon( 0, groupIcon ); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); - parseSubGroup(object, &pgItem->groupItemList, 4, nullptr); + parseSubGroup(object, &pageItem->groupItemList, 4, nullptr); } } } } else { - for (int b = 0; b < currDoc->DocItems.count(); ++b) + for (auto pageItem: currDoc->DocItems) { - pgItem = currDoc->DocItems.at(b); - if (pgItem->OwnPage == -1) + if (pageItem->OwnPage == -1) { - if (!pgItem->isGroup()) + if (!pageItem->isGroup()) { OutlineTreeItem *object = new OutlineTreeItem(page, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = nullptr; object->DocObject = currDoc; object->type = 4; - object->setText(0, pgItem->itemName()); - setItemIcon(object, pgItem); + object->setText(0, pageItem->itemName()); + setItemIcon(object, pageItem); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); } else { OutlineTreeItem *object = new OutlineTreeItem(page, nullptr); - object->PageItemObject = pgItem; + object->PageItemObject = pageItem; object->PageObject = nullptr; object->DocObject = currDoc; object->type = 4; - object->setText(0, pgItem->itemName()); + object->setText(0, pageItem->itemName()); object->setIcon( 0, groupIcon ); object->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); - parseSubGroup(object, &pgItem->groupItemList, 4, nullptr); + parseSubGroup(object, &pageItem->groupItemList, 4, nullptr); } } } diff --git a/scribus/ui/outlinepalette.h b/scribus/ui/outlinepalette.h index 4ad9d4173..75640f5a5 100644 --- a/scribus/ui/outlinepalette.h +++ b/scribus/ui/outlinepalette.h @@ -34,7 +34,7 @@ public: ScPage *PageObject; ScribusDoc *DocObject; int LayerID; - int type; //1=PageItem on Master Page,2=,3=PageItem,4=,5=,... + int type; //-3, -2, 0=,1=PageItem on Master Page,2=InlineFrame,3=PageItem,4=,5=Layer,... }; class SCRIBUS_API OutlineWidget : public QTreeWidget |
|
the final patch will depend on 0016317 and 0016318 |
|
we do this a lot in our script (copy/paste) to move objects from one page to another. I agree with @ale and that having a moveToPage() type command would be ideal and the best way to do it. |
|
voilĂ , the fourth part of the patch as said this needs: - the patch above for moveToPage in PageItem - the two patches for checking for the valid page number and the single selection move-to-page-script.diff (3,157 bytes)
diff --git a/scribus/plugins/scriptplugin/cmdobj.cpp b/scribus/plugins/scriptplugin/cmdobj.cpp index fc76020ee..7953f9e36 100644 --- a/scribus/plugins/scriptplugin/cmdobj.cpp +++ b/scribus/plugins/scriptplugin/cmdobj.cpp @@ -1071,6 +1071,29 @@ PyObject *scribus_pasteobjects(PyObject * /* self */, PyObject * /*args*/) return pyList; } +PyObject *scribus_moveitemtopage(PyObject * /* self */, PyObject *args) +{ + if (!checkHaveDocument()) + return nullptr; + + uint page = 0; + char* name = const_cast<char*>(""); + + if (!PyArg_ParseTuple(args, "i|es", &page, "utf-8", &name)) + return nullptr; + + PageItem *pageItem = GetSingleItem(name); + if (pageItem == nullptr) + return nullptr; + + if (!checkValidPageNumber(page)) + return nullptr; + + pageItem->moveToPage(page); + + 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 */ @@ -1096,6 +1119,7 @@ void cmdobjdocwarnings() << scribus_getparagraphstyle__doc__ << scribus_getstyle__doc__ << scribus_gettextflowmode__doc__ + << scribus_moveitemtopage__doc__ << scribus_objectexists__doc__ << scribus_pasteobject__doc__ << scribus_pasteobjects__doc__ diff --git a/scribus/plugins/scriptplugin/cmdobj.h b/scribus/plugins/scriptplugin/cmdobj.h index 8835045ae..6853e1e25 100644 --- a/scribus/plugins/scriptplugin/cmdobj.h +++ b/scribus/plugins/scriptplugin/cmdobj.h @@ -401,5 +401,13 @@ Returns the names of the newly created object in a list.\n\ ")); PyObject *scribus_pasteobjects(PyObject * /* self */, PyObject *args); -#endif +/*! docstring */ +PyDoc_STRVAR(scribus_moveitemtopage__doc__, +QT_TR_NOOP("moveItemToPage(page:int, name:string = None) -> void\n\ +\n\ +Move the item to the given page (the first page being 0).\n\ +If \"name\" is not given the currently selected item is moved.\n\ +")); +PyObject *scribus_moveitemtopage(PyObject * /* self */, PyObject *args); +#endif diff --git a/scribus/plugins/scriptplugin/scriptplugin.cpp b/scribus/plugins/scriptplugin/scriptplugin.cpp index 37bfb84ba..4eae0aeb7 100644 --- a/scribus/plugins/scriptplugin/scriptplugin.cpp +++ b/scribus/plugins/scriptplugin/scriptplugin.cpp @@ -447,6 +447,7 @@ PyMethodDef scribus_methods[] = { {const_cast<char*>("mergeTableCells"), scribus_mergetablecells, METH_VARARGS, tr(scribus_mergetablecells__doc__)}, {const_cast<char*>("messageBox"), (PyCFunction)scribus_messagebox, METH_VARARGS|METH_KEYWORDS, tr(scribus_messagebox__doc__)}, {const_cast<char*>("messagebarText"), scribus_statusmessage, METH_VARARGS, tr(scribus_statusmessage__doc__)}, // Deprecated + {const_cast<char*>("moveItemToPage"), scribus_moveitemtopage, METH_VARARGS, tr(scribus_moveitemtopage__doc__)}, {const_cast<char*>("moveObject"), scribus_moveobjectrel, METH_VARARGS, tr(scribus_moveobjectrel__doc__)}, {const_cast<char*>("moveObjectAbs"), scribus_moveobjectabs, METH_VARARGS, tr(scribus_moveobjectabs__doc__)}, {const_cast<char*>("moveSelectionToBack"), (PyCFunction)scribus_moveselectiontoback, METH_NOARGS, tr(scribus_moveselectiontoback__doc__) }, |
Date Modified | Username | Field | Change |
---|---|---|---|
2020-11-01 20:06 | ale | New Issue | |
2020-11-10 13:12 | ale | File Added: move-to-page.diff | |
2020-11-10 13:12 | ale | Note Added: 0048368 | |
2020-11-10 13:16 | ale | Relationship added | related to 0016318 |
2020-11-10 13:16 | ale | Relationship added | related to 0016317 |
2020-11-10 13:16 | ale | Note Added: 0048369 | |
2020-11-10 14:15 | digirew | Note Added: 0048371 | |
2020-11-10 16:21 | ale | File Added: move-to-page-script.diff | |
2020-11-10 16:21 | ale | Note Added: 0048374 | |
2020-11-10 16:21 | ale | Summary | add moveToPage() to the scripter => [PATCHJ] add moveToPage() to the scripter |
2020-11-10 16:21 | ale | Patch | No => Yes |