|
The patch file contains a new page arrange widget with page previews.
arrange_pages_2023-07-04_01.patch (119,688 bytes)
Index: resources/iconsets/1_7_0/1_7_0.xml
===================================================================
--- resources/iconsets/1_7_0/1_7_0.xml (Revision 25541)
+++ resources/iconsets/1_7_0/1_7_0.xml (Arbeitskopie)
@@ -365,6 +365,10 @@
<icon id="/16/list-remove.png" file="16/action-remove.svg" />
<icon id="16/list-remove.png" file="16/action-remove.svg" />
<icon id="22/list-remove.png" file="16/action-remove.svg" />
+ <icon id="page-move" file="16/page-move.svg" />
+ <icon id="page-insert" file="16/page-insert.svg" />
+ <icon id="page-duplicate" file="16/page-duplicate.svg" />
+ <icon id="page-import" file="16/page-import.svg" />
<!-- PDF Tools -->
<icon id="16/insert-button.png" file="16/pdf-button.svg" />
Index: scribus/appmodehelper.cpp
===================================================================
--- scribus/appmodehelper.cpp (Revision 25541)
+++ scribus/appmodehelper.cpp (Arbeitskopie)
@@ -283,7 +283,6 @@
a_actMgr->saveActionShortcutsPreEditMode();
if (currItem != nullptr)
{
- currItem->itemText.setCursorPosition(0);
scmw->setTBvals(currItem);
}
(*a_scrActions)["editPaste"]->setEnabled(false);
Index: scribus/canvasgesture_resize.cpp
===================================================================
--- scribus/canvasgesture_resize.cpp (Revision 25541)
+++ scribus/canvasgesture_resize.cpp (Arbeitskopie)
@@ -231,6 +231,7 @@
m_doc->invalidateRegion(m_mousePressBounds.united(m_bounds));
m_doc->regionsChanged()->update(m_mousePressBounds.united(m_bounds));
m_doc->changed();
+ m_doc->changedPagePreview();
}
}
if (m_transaction.isStarted())
Index: scribus/canvasmode.cpp
===================================================================
--- scribus/canvasmode.cpp (Revision 25541)
+++ scribus/canvasmode.cpp (Arbeitskopie)
@@ -202,6 +202,7 @@
result = new CanvasMode_Normal(view);
break;
}
+
return result;
}
@@ -1745,12 +1746,13 @@
currItem->ContourLine.translate(xposOrig - currItem->xPos(),yposOrig - currItem->yPos());
m_doc->nodeEdit.finishTransaction(currItem);
currItem->update();
- m_doc->regionsChanged()->update(currItem->getVisualBoundingRect());
+ m_doc->regionsChanged()->update(currItem->getVisualBoundingRect());
}
for (int i = 0; i < docSelectionCount; ++i)
m_doc->m_Selection->itemAt(i)->checkChanges(true);
if (docSelectionCount > 1 && m_view->groupTransactionStarted())
m_view->endGroupTransaction();
+ m_doc->changedPagePreview();
}
break;
}
Index: scribus/canvasmode.h
===================================================================
--- scribus/canvasmode.h (Revision 25541)
+++ scribus/canvasmode.h (Arbeitskopie)
@@ -19,6 +19,7 @@
#define CANVAS_MODE_H
#include "scribusapi.h"
+#include "scribusdoc.h"
#include <QBrush>
#include <QCursor>
Index: scribus/canvasmode_copyproperties.cpp
===================================================================
--- scribus/canvasmode_copyproperties.cpp (Revision 25541)
+++ scribus/canvasmode_copyproperties.cpp (Arbeitskopie)
@@ -203,6 +203,7 @@
// Update Item
m_doc->ElemToLink = currItem;
currItem->update();
+ m_doc->changedPagePreview();
// emit DocChanged();
// m_view->updateContents();
}
Index: scribus/canvasmode_create.cpp
===================================================================
--- scribus/canvasmode_create.cpp (Revision 25541)
+++ scribus/canvasmode_create.cpp (Arbeitskopie)
@@ -403,6 +403,7 @@
Um::Create + " " + currItem->getUName(), "", Um::ICreate);
m_createTransaction.reset();
m_doc->changed();
+ m_doc->changedPagePreview();
/*currItem->update();
currItem->emitAllToGUI();*/
}
Index: scribus/canvasmode_drawbezier.cpp
===================================================================
--- scribus/canvasmode_drawbezier.cpp (Revision 25541)
+++ scribus/canvasmode_drawbezier.cpp (Arbeitskopie)
@@ -198,6 +198,7 @@
else
m_view->requestMode(m_doc->appMode);
m_doc->changed();
+ m_doc->changedPagePreview();
m_firstPoly = true;
m_inItemCreation = false;
m_canvas->setRenderModeUseBuffer(false);
@@ -426,6 +427,7 @@
else
m_view->requestMode(m_doc->appMode);
m_doc->changed();
+ m_doc->changedPagePreview();
// emit DocChanged();
m_firstPoly = true;
m_inItemCreation = false;
Index: scribus/canvasmode_drawcalligraphic.cpp
===================================================================
--- scribus/canvasmode_drawcalligraphic.cpp (Revision 25541)
+++ scribus/canvasmode_drawcalligraphic.cpp (Arbeitskopie)
@@ -276,6 +276,7 @@
//FIXME
m_canvas->m_viewMode.operItemResizing = false;
m_doc->changed();
+ m_doc->changedPagePreview();
}
if (!PrefsManager::instance().appPrefs.uiPrefs.stickyTools)
{
Index: scribus/canvasmode_drawfreehand.cpp
===================================================================
--- scribus/canvasmode_drawfreehand.cpp (Revision 25541)
+++ scribus/canvasmode_drawfreehand.cpp (Arbeitskopie)
@@ -262,6 +262,7 @@
//FIXME
m_canvas->m_viewMode.operItemResizing = false;
m_doc->changed();
+ m_doc->changedPagePreview();
}
if (!PrefsManager::instance().appPrefs.uiPrefs.stickyTools)
{
Index: scribus/canvasmode_edit.cpp
===================================================================
--- scribus/canvasmode_edit.cpp (Revision 25541)
+++ scribus/canvasmode_edit.cpp (Arbeitskopie)
@@ -144,8 +144,38 @@
m_keyRepeat = false;
}
+void CanvasMode_Edit::keyReleaseEvent(QKeyEvent *e)
+{
+ PageItem* currItem;
+ if (!GetItem(&currItem))
+ {
+ return;
+ }
+ if (currItem->isImageFrame() && !currItem->locked())
+ {
+ switch (e->key())
+ {
+ case Qt::Key_Up:
+ case Qt::Key_Down:
+ case Qt::Key_Left:
+ case Qt::Key_Right:
+ m_doc->changedPagePreview();
+ break;
+ default:
+ break;
+ }
+ }
+ if (currItem->isTextFrame())
+ {
+ m_doc->changedPagePreview();
+ }
+
+}
+
+
+
void CanvasMode_Edit::rulerPreview(double base, double xp)
{
PageItem* currItem;
@@ -284,8 +314,8 @@
{
m_blinker->start(200);
m_blinkTime.start();
- m_cursorVisible = true;
- blinkTextCursor();
+ m_cursorVisible = true;
+ blinkTextCursor();
}
}
}
@@ -742,6 +772,8 @@
m_canvas->m_viewMode.operItemResizing = false;
if (currItem->isLine())
m_view->updateContents();
+ if (currItem->isImageFrame())
+ m_doc->changedPagePreview();
}
if (m_canvas->m_viewMode.operItemMoving)
{
@@ -828,6 +860,7 @@
//currItem->emitAllToGUI();
m_view->updatesOn(true);
m_view->updateContents();
+ m_doc->changedPagePreview();
}
}
//CB Drag selection performed here
@@ -892,6 +925,7 @@
m_canvas->m_viewMode.operItemMoving = false;
m_canvas->m_viewMode.operItemResizing = false;
m_view->updateContents(QRect(static_cast<int>(x-5), static_cast<int>(y-5), static_cast<int>(w+10), static_cast<int>(h+10)));
+
}
/*else
currItem->emitAllToGUI();*/
Index: scribus/canvasmode_edit.h
===================================================================
--- scribus/canvasmode_edit.h (Revision 25541)
+++ scribus/canvasmode_edit.h (Arbeitskopie)
@@ -52,6 +52,7 @@
void mousePressEvent(QMouseEvent *m) override;
void keyPressEvent(QKeyEvent *e) override;
+ void keyReleaseEvent(QKeyEvent *e) override;
void drawControls(QPainter* p) override;
Index: scribus/canvasmode_normal.cpp
===================================================================
--- scribus/canvasmode_normal.cpp (Revision 25541)
+++ scribus/canvasmode_normal.cpp (Arbeitskopie)
@@ -1101,6 +1101,7 @@
m_view->updatesOn(true);
m_view->updateContents();
m_doc->changed();
+ m_doc->changedPagePreview();
}
}
Index: scribus/gtaction.cpp
===================================================================
--- scribus/gtaction.cpp (Revision 25541)
+++ scribus/gtaction.cpp (Arbeitskopie)
@@ -840,6 +840,7 @@
m_textFrame->doc()->docHyphenator->slotHyphenate(m_textFrame);
m_textFrame->doc()->regionsChanged()->update(QRectF());
m_textFrame->doc()->changed();
+ m_textFrame->doc()->changedPagePreview();
}
gtAction::~gtAction()
Index: scribus/pageitem_textframe.cpp
===================================================================
--- scribus/pageitem_textframe.cpp (Revision 25541)
+++ scribus/pageitem_textframe.cpp (Arbeitskopie)
@@ -5880,4 +5880,5 @@
invalid = true;
m_Doc->changed();
m_Doc->regionsChanged()->update(QRect());
+ m_Doc->changedPagePreview();
}
Index: scribus/plugins/short-words/shortwords.cpp
===================================================================
--- scribus/plugins/short-words/shortwords.cpp (Revision 25541)
+++ scribus/plugins/short-words/shortwords.cpp (Arbeitskopie)
@@ -142,7 +142,10 @@
} // switch
// enable "Save" icon
if (parse->modify > 0)
+ {
doc->changed();
+ doc->changedPagePreview();
+ }
delete parse;
// redraw document
doc->view()->DrawNew();
Index: scribus/plugins/tools/2geomtools/meshdistortion/meshdistortion.cpp
===================================================================
--- scribus/plugins/tools/2geomtools/meshdistortion/meshdistortion.cpp (Revision 25541)
+++ scribus/plugins/tools/2geomtools/meshdistortion/meshdistortion.cpp (Arbeitskopie)
@@ -132,6 +132,7 @@
}
m_doc->changed();
m_doc->view()->DrawNew();
+ m_doc->changedPagePreview();
}
delete dia;
}
Index: scribus/plugins/tools/2geomtools/pathalongpath/pathalongpath.cpp
===================================================================
--- scribus/plugins/tools/2geomtools/pathalongpath/pathalongpath.cpp (Revision 25541)
+++ scribus/plugins/tools/2geomtools/pathalongpath/pathalongpath.cpp (Arbeitskopie)
@@ -228,6 +228,7 @@
{
updateEffectG(dia->effectType, dia->offset, dia->offsetY, dia->gap, dia->rotate);
m_doc->changed();
+ m_doc->changedPagePreview();
if (bxi->isGroup())
{
m_doc->resizeGroupToContents(bxi);
@@ -267,6 +268,7 @@
updateEffect(dia->effectType, dia->offset, dia->offsetY, dia->gap, dia->rotate);
patternItem->ContourLine = patternItem->PoLine.copy();
m_doc->changed();
+ m_doc->changedPagePreview();
}
else
{
Index: scribus/scribus.cpp
===================================================================
--- scribus/scribus.cpp (Revision 25541)
+++ scribus/scribus.cpp (Arbeitskopie)
@@ -2761,6 +2761,11 @@
}
}
+void ScribusMainWindow::slotPreviewCh()
+{
+ pagePalette->updatePagePreviews();
+}
+
void ScribusMainWindow::updateRecent(const QString& fn)
{
if (m_recentDocsList.indexOf(fn) != -1)
@@ -2945,6 +2950,7 @@
pasteAction.commit();
}
slotDocCh(false);
+ slotPreviewCh();
doc->regionsChanged()->update(QRectF());
view->dragX = 0;
view->dragY = 0;
@@ -4453,6 +4459,7 @@
doc->itemSelection_DeleteItem();
}
slotDocCh();
+ slotPreviewCh();
scrActions["editPaste"]->setEnabled(true);
scrMenuMgr->setMenuEnabled("EditPasteRecent", scrapbookPalette->tempBView->objectMap.count() != 0);
if (activeTransaction)
@@ -4811,6 +4818,7 @@
view->DrawNew();
slotDocCh(false);
+ slotPreviewCh();
}
//CB-->Doc ?????
@@ -7124,18 +7132,24 @@
doc->cmsSettings().GamutCheck = false;
doc->enableCMS(true);
}
- pageNumbersSize = pageNs.size();
- for (uint i = 0; i < pageNumbersSize; ++i)
- {
- QImage thumb(10, 10, QImage::Format_ARGB32_Premultiplied);
- if (doc->pdfOptions().Thumbnails)
- {
- // No need to load full res images for drawing small thumbnail
- PageToPixmapFlags flags = Pixmap_DontReloadImages | Pixmap_DrawWhiteBackground;
- thumb = view->PageToPixmap(pageNs[i] - 1, 100, flags);
- }
- allThumbs.insert(pageNs[i], thumb);
- }
+
+// MR: The following code has been replaced by view->PagesToPixmap(100, -1, flags);
+// pageNumbersSize = pageNs.size();
+// for (uint i = 0; i < pageNumbersSize; ++i)
+// {
+// QImage thumb(10, 10, QImage::Format_ARGB32_Premultiplied);
+// if (doc->pdfOptions().Thumbnails)
+// {
+// // No need to load full res images for drawing small thumbnail
+// PageToPixmapFlags flags = Pixmap_DontReloadImages | Pixmap_DrawWhiteBackground;
+// thumb = view->PageToPixmap(pageNs[i] - 1, 100, flags);
+// }
+// allThumbs.insert(pageNs[i], thumb);
+// }
+
+ PageToPixmapFlags flags = Pixmap_DontReloadImages | Pixmap_DrawWhiteBackground;
+ allThumbs = view->PagesToPixmap(100, -1, flags);
+
if (cmsCorr)
{
doc->cmsSettings().GamutCheck = true;
Index: scribus/scribus.h
===================================================================
--- scribus/scribus.h (Revision 25541)
+++ scribus/scribus.h (Arbeitskopie)
@@ -465,6 +465,8 @@
void HaveNewSel();
/** Dokument ist geaendert worden */
void slotDocCh(bool reb = true);
+ /** Page preview changed */
+ void slotPreviewCh();
/** Setzt die Abstufung */
//void setItemShade(int id);
/** Setz die Zeichensatzgroesse */
Index: scribus/scribusdoc.cpp
===================================================================
--- scribus/scribusdoc.cpp (Revision 25541)
+++ scribus/scribusdoc.cpp (Arbeitskopie)
@@ -1590,6 +1590,7 @@
--m_undoRedoOngoing;
m_Selection->delaySignalsOff();
m_docUpdater->endUpdate();
+ changedPagePreview();
}
void ScribusDoc::restore(UndoState* state, bool isUndo)
@@ -2508,7 +2509,10 @@
MasterPages.insert(pgN, addedPage);
assert(MasterPages.at(pgN) != nullptr);
if (!isLoading())
+ {
changed();
+ changedPagePreview();
+ }
if (UndoManager::undoEnabled())
{
auto *ss = new SimpleState(Um::NewMasterPage, "", Um::IDocument);
@@ -2830,6 +2834,7 @@
}
sourceSelection.clear();
changed();
+ changedPagePreview();
}
@@ -2867,6 +2872,7 @@
}
changed();
+ changedPagePreview();
return true;
}
@@ -2958,7 +2964,10 @@
}
}
if (found)
+ {
changed();
+ changedPagePreview();
+ }
return found;
}
@@ -3076,6 +3085,7 @@
invalidateLayer(it->ID);
}
changed();
+ changedPagePreview();
}
return found;
}
@@ -3116,7 +3126,10 @@
}
}
if (found)
+ {
changed();
+ changedPagePreview();
+ }
return found;
}
@@ -3156,7 +3169,10 @@
}
}
if (found)
+ {
changed();
+ changedPagePreview();
+ }
return found;
}
@@ -3187,7 +3203,10 @@
}
}
if (found)
+ {
changed();
+ changedPagePreview();
+ }
return found;
}
@@ -4664,7 +4683,10 @@
}
//TODO make a return false if not possible to apply the master page
if (!isLoading())
+ {
changed();
+ changedPagePreview();
+ }
return true;
}
@@ -4802,6 +4824,7 @@
invalidateRegion(pagebox);
regionsChanged()->update(pagebox);
changed();
+ changedPagePreview();
return true;
}
@@ -5436,8 +5459,9 @@
if (transaction)
transaction.commit();
setCurrentPage(oldCurrentPage);
- changed();
+ changed();
regionsChanged()->update(QRectF());
+ changedPagePreview();
return z;
}
@@ -5659,6 +5683,7 @@
{
pageItem->update();
changed();
+ changedPagePreview();
}
return true;
}
@@ -6156,6 +6181,7 @@
FPoint maxSize(qMax(maxXPos, maxPoint.x() + scratch.right()), qMax(maxYPos, maxPoint.y() + scratch.bottom()));
adjustCanvas(FPoint(qMin(0.0, minPoint.x() - scratch.left()), qMin(0.0, minPoint.y() - scratch.top())), maxSize, true);
changed();
+ changedPagePreview();
}
else
{
@@ -7415,6 +7441,7 @@
}
}
changed();
+ changedPagePreview();
invalidateRegion(selRect);
regionsChanged()->update(QRectF());
}
@@ -7482,6 +7509,7 @@
}
}
changed();
+ changedPagePreview();
invalidateRegion(selRect);
regionsChanged()->update(QRectF());
}
@@ -7554,6 +7582,7 @@
*m_Selection = tempSelection;
m_Selection->delaySignalsOff();
changed();
+ changedPagePreview();
invalidateRegion(selRect);
regionsChanged()->update(QRectF());
}
@@ -7628,6 +7657,7 @@
*m_Selection = tempSelection;
m_Selection->delaySignalsOff();
changed();
+ changedPagePreview();
invalidateRegion(selRect);
regionsChanged()->update(QRectF());
}
@@ -7665,6 +7695,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
@@ -7700,6 +7731,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
@@ -7724,6 +7756,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
@@ -7749,6 +7782,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
@@ -7774,6 +7808,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetLineSpacing(double w, Selection* customSelection)
@@ -7877,6 +7912,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetNamedCellStyle(const QString & name, Selection* customSelection)
@@ -7903,6 +7939,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetNamedTableStyle(const QString & name, Selection* customSelection)
@@ -7929,6 +7966,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemPen(QString color, Selection* customSelection)
@@ -7959,6 +7997,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetParBackgroundColor(QString farbe, Selection* customSelection)
@@ -8103,6 +8142,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemBrushShade(int sha, Selection* customSelection)
@@ -8129,6 +8169,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemPenShade(int sha, Selection* customSelection)
@@ -8154,6 +8195,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemGradMask(int typ, Selection* customSelection)
@@ -8180,6 +8222,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemGradStroke(int typ, Selection* customSelection)
@@ -8232,6 +8275,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemGradFill(int typ, Selection* customSelection)
@@ -8317,6 +8361,7 @@
trans.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemPatternFill(const QString& pattern, Selection* customSelection)
@@ -8336,6 +8381,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemPatternProps(double imageScaleX, double imageScaleY, double offsetX, double offsetY, double rotation, double skewX, double skewY, bool mirrorX, bool mirrorY)
@@ -8354,6 +8400,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemStrokePattern(const QString& pattern, Selection* customSelection)
@@ -8373,6 +8420,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemStrokePatternProps(double imageScaleX, double imageScaleY, double offsetX, double offsetY, double rotation, double skewX, double skewY, double space, bool mirrorX, bool mirrorY, Selection* customSelection)
@@ -8393,6 +8441,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemStrokePatternType(bool type, Selection* customSelection)
@@ -8412,6 +8461,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemPatternMask(const QString& pattern, Selection* customSelection)
@@ -8431,6 +8481,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetItemPatternMaskProps(double imageScaleX, double imageScaleY, double offsetX, double offsetY, double rotation, double skewX, double skewY, bool mirrorX, bool mirrorY, Selection* customSelection)
@@ -8451,6 +8502,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_InsertTableRows()
@@ -8486,6 +8538,7 @@
m_ScMW->updateTableMenuActions();
changed();
+ changedPagePreview();
}
}
@@ -8522,6 +8575,7 @@
m_ScMW->updateTableMenuActions();
changed();
+ changedPagePreview();
}
delete dialog;
@@ -8582,6 +8636,7 @@
m_ScMW->updateTableMenuActions();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_DeleteTableColumns()
@@ -8639,6 +8694,7 @@
m_ScMW->updateTableMenuActions();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_MergeTableCells()
@@ -8676,6 +8732,7 @@
m_ScMW->updateTableMenuActions();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetTableRowHeights()
@@ -8730,6 +8787,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetTableColumnWidths()
@@ -8787,6 +8845,7 @@
activeTransaction.commit();
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_DistributeTableRowsEvenly()
@@ -8830,6 +8889,7 @@
table->adjustTable();
table->update();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_DistributeTableColumnsEvenly()
@@ -8873,6 +8933,7 @@
table->adjustTable();
table->update();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetEffects(int s, Selection* customSelection)
@@ -9058,6 +9119,7 @@
activeTransaction.commit();
changed();
regionsChanged()->update(QRectF());
+ changedPagePreview();
}
void ScribusDoc::itemSelection_EraseParagraphStyle(Selection* customSelection)
@@ -9150,6 +9212,7 @@
activeTransaction.commit();
changed();
regionsChanged()->update(QRectF());
+ changedPagePreview();
}
void ScribusDoc::itemSelection_ClearBulNumStrings(Selection* customSelection)
@@ -9309,6 +9372,7 @@
activeTransaction.commit();
changed();
regionsChanged()->update(QRectF());
+ changedPagePreview();
}
void ScribusDoc::itemSelection_ApplyCharStyle(const CharStyle & newStyle, Selection* customSelection, const QString& ETEA)
@@ -9447,6 +9511,7 @@
activeTransaction.commit();
changed();
regionsChanged()->update(QRectF());
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetCharStyle(const CharStyle & newStyle, Selection* customSelection)
@@ -9527,6 +9592,7 @@
activeTransaction.commit();
changed();
regionsChanged()->update(QRectF());
+ changedPagePreview();
}
void ScribusDoc::itemSelection_EraseCharStyle(Selection* customSelection)
@@ -9632,6 +9698,7 @@
activeTransaction.commit();
changed();
regionsChanged()->update(QRectF());
+ changedPagePreview();
}
//AV -> NodeEditContext
@@ -9816,6 +9883,7 @@
if (m_hasGUI)
{
connect(this, SIGNAL(docChanged()), m_ScMW, SLOT(slotDocCh()));
+ connect(this, SIGNAL(pagePreviewChanged()), m_ScMW, SLOT(slotPreviewCh()));
connect(this, SIGNAL(firstSelectedItemType(int)), m_ScMW, SLOT(HaveNewSel()));
connect(this->m_Selection, SIGNAL(selectionChanged()), m_ScMW, SLOT(HaveNewSel()));
connect(autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
@@ -9830,6 +9898,7 @@
if (m_hasGUI)
{
disconnect(this, SIGNAL(docChanged()), m_ScMW, SLOT(slotDocCh()));
+ disconnect(this, SIGNAL(pagePreviewChanged()), m_ScMW, SLOT(slotPreviewCh()));
disconnect(this, SIGNAL(firstSelectedItemType(int)), m_ScMW, SLOT(HaveNewSel()));
disconnect(this->m_Selection, SIGNAL(selectionChanged()), m_ScMW, SLOT(HaveNewSel()));
disconnect(autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
@@ -9908,6 +9977,7 @@
{
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
}
@@ -9989,6 +10059,7 @@
{
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
}
@@ -10268,6 +10339,7 @@
{
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
}
@@ -10734,6 +10806,7 @@
m_updateManager.setUpdatesEnabled();
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
@@ -10854,7 +10927,8 @@
if (trans)
trans.commit();
regionsChanged()->update(QRectF());
- changed();
+ changed();
+ changedPagePreview();
emit firstSelectedItemType(itemSelection->itemAt(0)->itemType());
}
@@ -10970,6 +11044,7 @@
if (trans)
trans.commit();
changed();
+ changedPagePreview();
emit firstSelectedItemType(m_Selection->itemAt(0)->itemType());
}
@@ -10986,6 +11061,7 @@
else if (itemSelection->count() == 1)
rotateItem(angle, itemSelection->itemAt(0));
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_ChangePreviewResolution(int id)
@@ -11161,6 +11237,7 @@
}
item->update();
changed();
+ changedPagePreview();
if (activeTransaction)
activeTransaction.commit();
}
@@ -11194,6 +11271,7 @@
}
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_TruncateItem(Selection* customSelection)
@@ -11220,6 +11298,7 @@
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
QList<PageItem*>* ScribusDoc::groupOfItem(QList<PageItem*>* itemList, PageItem* item)
@@ -11399,6 +11478,7 @@
itemSelection->itemAt(0)->emitAllToGUI();
}
changed();
+ changedPagePreview();
}
@@ -11418,6 +11498,7 @@
}
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
@@ -11435,6 +11516,7 @@
}
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
@@ -11455,6 +11537,7 @@
}
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
if (activeTransaction)
{
activeTransaction.commit(Um::Selection,
@@ -11481,6 +11564,7 @@
}
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
if (activeTransaction)
activeTransaction.commit(Um::Selection, Um::IGroup, Um::BlendMode, "", Um::IGroup);
}
@@ -11503,6 +11587,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetFillGradient(VGradient& newGradient, Selection* customSelection)
@@ -11524,6 +11609,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetMaskGradient(VGradient& newGradient, Selection* customSelection)
@@ -11543,6 +11629,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
@@ -11567,6 +11654,7 @@
activeTransaction.commit(Um::Selection, Um::IGroup, Um::Overprint, "", Um::IGroup);
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_DoHyphenate()
@@ -11582,6 +11670,7 @@
//FIXME: stop using m_View
m_View->DrawNew(); //CB draw new until NLS for redraw through text chains
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_DoDeHyphenate()
@@ -11597,6 +11686,7 @@
//FIXME: stop using m_View
m_View->DrawNew(); //CB draw new until NLS for redraw through text chains
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SendToLayer(int layerID)
@@ -11629,6 +11719,7 @@
m_View->deselectItems(true);
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetAlignment(int s, Selection* customSelection)
@@ -11681,6 +11772,7 @@
activeTransaction.commit(Um::Selection, Um::IGroup, Um::ImageOffset, tooltip, Um::IImageScaling);
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetImageScale(double x, double y, Selection* customSelection)
@@ -11719,6 +11811,7 @@
activeTransaction.commit(Um::Selection, Um::IGroup, Um::ImageScale, tooltip, Um::IImageScaling);
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetImageScaleAndOffset(double sx, double sy, double ox, double oy, Selection* customSelection)
@@ -11763,6 +11856,7 @@
outerTransaction.commit(Um::Selection, Um::IGroup, Um::ImageScale, tooltip, Um::IImageScaling);
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetImageRotation(double rot, Selection* customSelection)
@@ -11794,6 +11888,7 @@
if (trans)
trans.commit();
changed();
+ changedPagePreview();
}
void ScribusDoc::buildAlignItemList(Selection* customSelection)
@@ -11882,6 +11977,7 @@
void ScribusDoc::endAlign()
{
changed();
+ changedPagePreview();
m_ScMW->HaveNewSel();
for (int i = 0; i < m_Selection->count(); ++i)
{
@@ -13100,6 +13196,11 @@
emit docChanged();
}
+void ScribusDoc::changedPagePreview()
+{
+ emit pagePreviewChanged();
+}
+
void ScribusDoc::invalidateAll()
{
QList<PageItem*> allItems;
@@ -13543,6 +13644,7 @@
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
void ScribusDoc::multipleDuplicateByPage(const ItemMultipleDuplicateData& dialogData, Selection& selection, QString& tooltip)
@@ -13673,6 +13775,7 @@
m_undoManager->action(currItem, state);
}
changed();
+ changedPagePreview();
}
@@ -13730,6 +13833,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_ApplyArrowScale(int startArrowSc, int endArrowSc, Selection* customSelection)
@@ -13775,6 +13879,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
@@ -15220,7 +15325,8 @@
if (needTextInteractionCheck)
invalidateRegion(regionToUpdate);
regionsChanged()->update(needTextInteractionCheck ? QRectF() : regionToUpdate);
- emit docChanged();
+ //emit docChanged();
+ changed();
if (m_ScMW && ScCore->usingGUI())
{
@@ -15320,7 +15426,8 @@
double x, y, w, h;
itemSelection->connectItemToGUI();
itemSelection->getGroupRect(&x, &y, &w, &h);
- emit docChanged();
+ //emit docChanged();
+ changed();
if (itemSelection->count() > 0)
m_ScMW->HaveNewSel();
@@ -15972,6 +16079,7 @@
activeTransaction.commit();
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
itemSelection->itemAt(0)->emitAllToGUI();
}
void ScribusDoc::itemSelection_AdjustImagetoFrameSize( Selection *customSelection)
@@ -15993,6 +16101,7 @@
}
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
itemSelection->itemAt(0)->emitAllToGUI();
}
@@ -16043,6 +16152,7 @@
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_AdjustTableToFrame()
@@ -16065,6 +16175,7 @@
regionsChanged()->update(QRectF());
changed();
+ changedPagePreview();
}
@@ -16091,6 +16202,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetRenderIntent(int intentIndex, Selection * customSelection)
@@ -16114,6 +16226,7 @@
}
m_updateManager.setUpdatesEnabled();
changed();
+ changedPagePreview();
}
void ScribusDoc::itemSelection_SetCompressionMethod(int cmIndex, Selection * customSelection)
@@ -16507,6 +16620,7 @@
changed();
regionsChanged()->update(QRect());
+ changedPagePreview();
}
@@ -16585,6 +16699,7 @@
item->invalid = true;
changed();
regionsChanged()->update(QRect());
+ changedPagePreview();
}
void ScribusDoc::restartAutoSaveTimer()
Index: scribus/scribusdoc.h
===================================================================
--- scribus/scribusdoc.h (Revision 25541)
+++ scribus/scribusdoc.h (Arbeitskopie)
@@ -1214,6 +1214,7 @@
* certain operations.
*/
void changed();
+ void changedPagePreview();
/*! \brief Get pointer to the current page
\retval Page* current page object */
ScPage* currentPage();
@@ -1493,8 +1494,9 @@
* @brief Let the document tell whatever is listening that it has changed
*/
void docChanged();
- void updateContents();
- void updateContents(const QRect &r);
+ void pagePreviewChanged();
+// void updateContents();
+// void updateContents(const QRect &r);
void firstSelectedItemType(int);
void updateEditItem();
Index: scribus/scribusview.cpp
===================================================================
--- scribus/scribusview.cpp (Revision 25541)
+++ scribus/scribusview.cpp (Arbeitskopie)
@@ -2388,6 +2388,7 @@
resizeContents(qRound((m_doc->maxCanvasCoordinate.x() - m_doc->minCanvasCoordinate.x()) * m_canvas->scale()), qRound((m_doc->maxCanvasCoordinate.y() - m_doc->minCanvasCoordinate.y()) * m_canvas->scale()));
}
+
QImage ScribusView::MPageToPixmap(const QString& name, int maxGr, bool drawFrame)
{
ScLayer layer;
@@ -2460,20 +2461,27 @@
QImage ScribusView::PageToPixmap(int Nr, int maxGr, PageToPixmapFlags flags)
{
- QImage im;
- double sx = maxGr / m_doc->DocPages.at(Nr)->width();
- double sy = maxGr / m_doc->DocPages.at(Nr)->height();
- double sc = qMin(sx, sy);
- int clipx = static_cast<int>(m_doc->DocPages.at(Nr)->xOffset() * sc);
- int clipy = static_cast<int>(m_doc->DocPages.at(Nr)->yOffset() * sc);
- int clipw = qRound(m_doc->DocPages.at(Nr)->width() * sc);
- int cliph = qRound(m_doc->DocPages.at(Nr)->height() * sc);
- if ((clipw <=0) || (cliph <= 0))
- return im;
- im = QImage(clipw, cliph, QImage::Format_ARGB32_Premultiplied);
- if (im.isNull())
- return im;
- im.fill( qRgba(0, 0, 0, 0) );
+ QImage img;
+ QMap<int, QImage> m_previews = PagesToPixmap(maxGr, Nr, flags);
+
+ if(!m_previews.isEmpty())
+ img = m_previews.first();
+
+ return img;
+}
+
+QMap<int, QImage> ScribusView::PagesToPixmap(int maxGr, int Nr, PageToPixmapFlags flags)
+{
+ QMap<int, QImage> m_previews;
+
+ if(m_doc == nullptr || maxGr <= 0)
+ return m_previews;
+
+ if(m_doc->DocPages.count() == 0)
+ return m_previews;
+
+ // Preserve old settings
+
int oldAppMode = m_doc->appMode;
requestMode(modeNormal);
double oldScale = m_canvas->scale();
@@ -2483,8 +2491,9 @@
bool oldFramesShown = m_doc->guidesPrefs().framesShown;
bool oldShowControls = m_doc->guidesPrefs().showControls;
bool oldDrawAsPreview = m_doc->drawAsPreview;
- m_doc->guidesPrefs().framesShown = false;
- m_doc->guidesPrefs().showControls = false;
+ ScPage* act = m_doc->currentPage();
+ bool mMode = m_doc->masterPageMode();
+
bool cmsCorr = false;
if ((m_doc->cmsSettings().CMSinUse) && (m_doc->cmsSettings().GamutCheck))
{
@@ -2492,15 +2501,86 @@
m_doc->cmsSettings().GamutCheck = false;
m_doc->enableCMS(true);
}
+
+
+ // Optimize settings for rendering
+
+ m_doc->guidesPrefs().framesShown = false;
+ m_doc->guidesPrefs().showControls = false;
m_doc->drawAsPreview = true;
- m_canvas->setScale(sc);
m_canvas->setPreviewMode(true);
m_canvas->setForcedRedraw(true);
- ScPage* act = m_doc->currentPage();
- bool mMode = m_doc->masterPageMode();
m_doc->setMasterPageMode(false);
m_doc->setLoading(true);
- m_doc->setCurrentPage(m_doc->DocPages.at(Nr));
+
+// QElapsedTimer timer;
+// timer.start();
+
+ // Draw all pages
+ if(Nr == -1)
+ {
+ foreach(ScPage *page, m_doc->DocPages){
+
+ QImage im = drawPageToPixmap(maxGr, page, flags);
+ m_previews.insert(page->pageNr(), im);
+
+ }
+ }
+ // Draw single page by number
+ else
+ {
+ if(inRange(0, Nr, m_doc->DocPages.count() - 1))
+ {
+ ScPage *page = m_doc->DocPages.at(Nr);
+ QImage im = drawPageToPixmap(maxGr, page, flags);
+ m_previews.insert(page->pageNr(), im);
+
+ }
+
+ }
+
+// qDebug() << Q_FUNC_INFO << "- draw preview in" << timer.elapsed() << "milliseconds";
+
+ // Reset settings
+
+ if (cmsCorr)
+ {
+ m_doc->cmsSettings().GamutCheck = true;
+ m_doc->enableCMS(true);
+ }
+ m_doc->drawAsPreview = oldDrawAsPreview;
+ m_doc->guidesPrefs().framesShown = oldFramesShown;
+ m_doc->guidesPrefs().showControls = oldShowControls;
+ m_canvas->setScale(oldScale);
+ m_doc->setMasterPageMode(mMode);
+ m_doc->setCurrentPage(act);
+ m_doc->setLoading(false);
+ m_canvas->setPreviewMode(m_doc->drawAsPreview);
+ m_canvas->setForcedRedraw(false);
+ m_doc->minCanvasCoordinate = FPoint(cx, cy);
+ requestMode(oldAppMode);
+
+ return m_previews;
+}
+
+QImage ScribusView::drawPageToPixmap(int maxGr, ScPage *page, PageToPixmapFlags flags)
+{
+ QImage im;
+ double sc = maxGr / page->height();
+ int clipx = static_cast<int>(page->xOffset() * sc);
+ int clipy = static_cast<int>(page->yOffset() * sc);
+ int clipw = qRound(page->width() * sc);
+ int cliph = qRound(page->height() * sc);
+
+ m_canvas->setScale(sc);
+
+ if ((clipw <=0) || (cliph <= 0))
+ return im;
+ im = QImage(clipw, cliph, QImage::Format_ARGB32_Premultiplied);
+ if (im.isNull())
+ return im;
+ im.fill( qRgba(0, 0, 0, 0) );
+
ScPainter *painter = new ScPainter(&im, im.width(), im.height(), 1.0, 0);
if (flags & Pixmap_DrawBackground)
painter->clear(m_doc->paperColor());
@@ -2518,7 +2598,6 @@
painter->setZoomFactor(m_canvas->scale());
QList<QPair<PageItem*, int> > changedList;
- ScPage* page = m_doc->DocPages.at(Nr);
PageItem* currItem;
if ((page->FromMaster.count() != 0) && !flags.testFlag(Pixmap_DontReloadImages))
{
@@ -2592,7 +2671,7 @@
for (int layerLevel = 0; layerLevel < layerCount; ++layerLevel)
{
m_doc->Layers.levelToLayer(layer, layerLevel);
- m_canvas->DrawMasterItems(painter, m_doc->DocPages.at(Nr), layer, QRect(clipx, clipy, clipw, cliph));
+ m_canvas->DrawMasterItems(painter, page, layer, QRect(clipx, clipy, clipw, cliph));
m_canvas->DrawPageItems(painter, layer, QRect(clipx, clipy, clipw, cliph), false);
m_canvas->DrawPageItems(painter, layer, QRect(clipx, clipy, clipw, cliph), true);
}
@@ -2620,22 +2699,7 @@
currItem->setImageYOffset(imgY);
}
}
- if (cmsCorr)
- {
- m_doc->cmsSettings().GamutCheck = true;
- m_doc->enableCMS(true);
- }
- m_doc->drawAsPreview = oldDrawAsPreview;
- m_doc->guidesPrefs().framesShown = oldFramesShown;
- m_doc->guidesPrefs().showControls = oldShowControls;
- m_canvas->setScale(oldScale);
- m_doc->setMasterPageMode(mMode);
- m_doc->setCurrentPage(act);
- m_doc->setLoading(false);
- m_canvas->setPreviewMode(m_doc->drawAsPreview);
- m_canvas->setForcedRedraw(false);
- m_doc->minCanvasCoordinate = FPoint(cx, cy);
- requestMode(oldAppMode);
+
return im;
}
Index: scribus/scribusview.h
===================================================================
--- scribus/scribusview.h (Revision 25541)
+++ scribus/scribusview.h (Arbeitskopie)
@@ -172,8 +172,10 @@
void showInlinePage(int id);
void hideInlinePage();
+ QMap<int, QImage> PagesToPixmap(int maxGr, int Nr = -1, PageToPixmapFlags flags = Pixmap_DrawFrame | Pixmap_DrawBackground);
QImage PageToPixmap(int Nr, int maxGr, PageToPixmapFlags flags = Pixmap_DrawFrame | Pixmap_DrawBackground);
QImage MPageToPixmap(const QString& name, int maxGr, bool drawFrame = true);
+ QImage drawPageToPixmap(int maxGr, ScPage *page, PageToPixmapFlags flags = Pixmap_DrawFrame | Pixmap_DrawBackground);
/**
* Called when the ruler origin is dragged
Index: scribus/ui/charselect.cpp
===================================================================
--- scribus/ui/charselect.cpp (Revision 25541)
+++ scribus/ui/charselect.cpp (Arbeitskopie)
@@ -134,6 +134,7 @@
}
m_doc->view()->DrawNew();
m_doc->changed();
+ m_doc->changedPagePreview();
// delEdit();
}
@@ -161,6 +162,7 @@
cItem->itemText.applyCharStyle(pot, 1, nstyle);
m_doc->view()->DrawNew();
m_doc->changed();
+ m_doc->changedPagePreview();
}
void CharSelect::slot_selectionChanged( const QItemSelection& sel, const QItemSelection& )
Index: scribus/ui/layers.cpp
===================================================================
--- scribus/ui/layers.cpp (Revision 25541)
+++ scribus/ui/layers.cpp (Arbeitskopie)
@@ -394,6 +394,7 @@
m_Doc->scMW()->changeLayer(m_Doc->activeLayer());
emit LayerChanged();
m_Doc->changed();
+ m_Doc->changedPagePreview();
}
void LayerPalette::downLayer()
@@ -410,6 +411,7 @@
emit LayerChanged();
markActiveLayer();
m_Doc->changed();
+ m_Doc->changedPagePreview();
}
void LayerPalette::changeName(int row, int col)
Index: scribus/ui/loremipsum.cpp
===================================================================
--- scribus/ui/loremipsum.cpp (Revision 25541)
+++ scribus/ui/loremipsum.cpp (Arbeitskopie)
@@ -343,6 +343,7 @@
}
m_Doc->regionsChanged()->update(QRectF());
m_Doc->changed();
+ m_Doc->changedPagePreview();
}
QString LoremManager::loremIpsum()
Index: scribus/ui/pagepalette.cpp
===================================================================
--- scribus/ui/pagepalette.cpp (Revision 25541)
+++ scribus/ui/pagepalette.cpp (Arbeitskopie)
@@ -150,6 +150,14 @@
}
}
+void PagePalette::updatePagePreviews()
+{
+ PagePalette_Pages* pageWidget = dynamic_cast<PagePalette_Pages*>(this->currentWidget());
+ if (pageWidget)
+ pageWidget->updatePagePreview();
+
+}
+
bool PagePalette::masterPageMode()
{
PagePalette_MasterPages* mpWidget = dynamic_cast<PagePalette_MasterPages*>(this->currentWidget());
@@ -185,7 +193,7 @@
}
else
{
- ScribusDoc* doc = m_view->m_doc;
+ //ScribusDoc* doc = m_view->m_doc;
PagePalette_MasterPages* mpWidget = this->masterpageWidget();
if (mpWidget->m_view != m_view)
mpWidget->setView(m_view, masterPage);
Index: scribus/ui/pagepalette.h
===================================================================
--- scribus/ui/pagepalette.h (Revision 25541)
+++ scribus/ui/pagepalette.h (Arbeitskopie)
@@ -61,6 +61,7 @@
void rebuildPages();
void markPage(uint nr);
void updateMasterPageList();
+ void updatePagePreviews();
void languageChange();
Index: scribus/ui/pagepalette_pages.cpp
===================================================================
--- scribus/ui/pagepalette_pages.cpp (Revision 25541)
+++ scribus/ui/pagepalette_pages.cpp (Arbeitskopie)
@@ -5,7 +5,6 @@
for which a new license (GPL+exception) is in place.
*/
-
#include <QApplication>
#include <QBitmap>
#include <QComboBox>
@@ -16,8 +15,8 @@
#include <QLabel>
#include <QList>
#include <QMenu>
+#include <QMessageBox>
#include <QMimeData>
-#include <QMessageBox>
#include <QPainter>
#include <QRegularExpression>
@@ -26,6 +25,7 @@
#include "pagelayout.h"
#include "pagepalette_pages.h"
#include "pagepalette_widgets.h"
+#include "qobjectdefs.h"
#include "scpage.h"
#include "scribusapp.h"
#include "scribuscore.h"
@@ -32,81 +32,78 @@
#include "scribusdoc.h"
#include "scribusview.h"
-PagePalette_Pages::PagePalette_Pages(QWidget* parent) : QWidget(parent)
+PagePalette_Pages::PagePalette_Pages(QWidget *parent)
+ : QWidget(parent)
{
m_scMW = ScCore->primaryMainWindow();
-
+
setupUi(this);
-
- setSizePolicy( QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding));
+ setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding));
+
masterPageList->setMinimumSize(QSize(200, 40));
- masterPageList->m_thumb = false;
+ masterPageList->m_thumb = true;
masterPageList->setIconSize(QSize(60, 60));
- QHeaderView *Header = pageView->verticalHeader();
- Header->setSectionsMovable(false);
- Header->setSectionResizeMode(QHeaderView::Fixed);
- Header->hide();
- Header = pageView->horizontalHeader();
- Header->setSectionsMovable(false);
- Header->setSectionResizeMode(QHeaderView::Fixed);
- Header->hide();
- pageView->setSortingEnabled(false);
- pageView->setSelectionMode( QAbstractItemView::NoSelection );
- pageView->setRowCount(1);
- pageView->setColumnCount(1);
- pageView->setIconSize(QSize(60, 60));
+ trash->setMinimumSize(QSize(32, 32));
+ trash->setMaximumSize(QSize(32, 32));
- trash->setMinimumSize(QSize(32,32));
- trash->setMaximumSize(QSize(32,32));
+ PageGrid *pageGrid = pageViewWidget->pageGrid();
- pix = IconManager::instance().loadPixmap("32/page-simple.png");
-
rebuild();
+ iconSetChange();
languageChange();
connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
- connect(masterPageList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(selMasterPage()));
+ connect(masterPageList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(selMasterPage()));
connect(masterPageList, SIGNAL(thumbnailChanged()), this, SLOT(rebuildMasters()));
connect(masterPageList, SIGNAL(delMasterRequest(QString)), this, SLOT(deleteMasterPage(QString)));
- connect(pageLayout, SIGNAL(selectedLayout(int)) , this, SLOT(handlePageLayout(int)));
+ connect(pageLayout, SIGNAL(selectedLayout(int)), this, SLOT(handlePageLayout(int)));
connect(pageLayout, SIGNAL(selectedFirstPage(int)), this, SLOT(handleFirstPage(int)));
- connect(pageView , SIGNAL(Click(int,int,int)) , this, SLOT(pageView_gotoPage(int,int,int)));
- connect(pageView , SIGNAL(movePage(int,int)) , this, SLOT(pageView_movePage(int,int)));
- connect(pageView , SIGNAL(delPageRequest(int)) , this, SLOT(pageView_deletePage(int)));
- connect(pageView , SIGNAL(UseTemp(QString,int)) , this, SLOT(pageView_applyMasterPage(QString,int)));
- connect(pageView , SIGNAL(NewPage(int,QString)) , m_scMW, SLOT(slotNewPageP(int,QString)));
- connect(trash , SIGNAL(delPageRequest(int)) , m_scMW, SLOT(deletePage2(int)));
- connect(trash , SIGNAL(delMasterRequest(QString)) , this, SLOT(deleteMasterPage(QString)));
-
- connect(this, SIGNAL(gotoPage(int)) , m_scMW, SLOT(selectPagesFromOutlines(int)));
+
+ connect(pageGrid, SIGNAL(click(int, int)), this, SLOT(pageView_gotoPage(int, int)));
+ connect(pageGrid, SIGNAL(movePage(int, int)), this, SLOT(pageView_movePage(int, int)));
+ connect(pageGrid, SIGNAL(delPageRequest(int)), this, SLOT(pageView_deletePage(int)));
+ connect(pageGrid, SIGNAL(useTemplate(QString, int)), this, SLOT(pageView_applyMasterPage(QString, int)));
+ connect(pageGrid, SIGNAL(newPage(int, QString)), m_scMW, SLOT(slotNewPageP(int, QString)));
+ connect(pageGrid, SIGNAL(previewSizeChanged()), this, SLOT(updatePagePreview()));
+
+ connect(trash, SIGNAL(delPageRequest(int)), m_scMW, SLOT(deletePage2(int)));
+ connect(trash, SIGNAL(delMasterRequest(QString)), this, SLOT(deleteMasterPage(QString)));
+
+ connect( buttonPageInsert, SIGNAL(clicked()), this, SLOT(newPage()) );
+ connect( buttonPageImport, SIGNAL(clicked()), this, SLOT(importPage()) );
+ connect( buttonPageDuplicate, SIGNAL(clicked()), this, SLOT(duplicatePage()) );
+ connect( buttonPageMove, SIGNAL(clicked()), this, SLOT(movePage()) );
+
+ connect(this, SIGNAL(gotoPage(int)), m_scMW, SLOT(selectPagesFromOutlines(int)));
}
-void PagePalette_Pages::deleteMasterPage(const QString& tmp)
+void PagePalette_Pages::deleteMasterPage(const QString &tmp)
{
if (tmp == CommonStrings::trMasterPageNormal)
return;
QString extraWarn;
- for (int i=0; i < currView->m_doc->DocPages.count(); ++i )
+ for (int i = 0; i < currView->m_doc->DocPages.count(); ++i)
{
if (currView->m_doc->DocPages[i]->masterPageName() == tmp)
extraWarn = tr("This master page is used at least once in the document.");
}
int exit = ScMessageBox::warning(this,
- CommonStrings::trWarning,
- tr("Do you really want to delete this master page?")+"\n"+extraWarn,
- QMessageBox::Yes | QMessageBox::No,
- QMessageBox::NoButton, // GUI default
- QMessageBox::Yes); // batch default
+ CommonStrings::trWarning,
+ tr("Do you really want to delete this master page?") + "\n"
+ + extraWarn,
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::NoButton, // GUI default
+ QMessageBox::Yes); // batch default
if (exit == QMessageBox::Yes)
{
bool oldMPMode = currView->m_doc->masterPageMode();
- int storedPageNum = currView->m_doc->currentPageNumber();
- int storedViewXCoor = currView->horizontalScrollBar()->value();
- int storedViewYCoor = currView->verticalScrollBar()->value();
+ int storedPageNum = currView->m_doc->currentPageNumber();
+ int storedViewXCoor = currView->horizontalScrollBar()->value();
+ int storedViewYCoor = currView->verticalScrollBar()->value();
currView->m_doc->setMasterPageMode(true);
currView->m_doc->scMW()->deletePage2(currView->m_doc->MasterNames[tmp]);
@@ -125,55 +122,161 @@
}
}
-void PagePalette_Pages::pageView_applyMasterPage(const QString& masterpageName, int pageIndex)
+void PagePalette_Pages::pageView_applyMasterPage(const QString &masterpageName, int pageIndex)
{
m_scMW->Apply_MasterPage(masterpageName, pageIndex, false);
currView->reformPages();
currView->DrawNew();
- SeItem* pageItem = pageView->getPageItem(pageIndex);
- if (pageItem)
- pageItem->setIcon(createIcon(pageIndex, masterpageName, pix));
+
+ if(pageIndex < 0 && pageIndex >= currView->m_doc->DocPages.count()) return;
+
+ ScPage page = *currView->m_doc->DocPages.at(pageIndex);
+ double pageRatio = page.width() / page.height();
+
+ PageCell *pc = pageViewWidget->pageGrid()->getPageItem(pageIndex);
+ pc->setPageName(masterpageName);
+ pc->setPageRatio(pageRatio);
+
}
void PagePalette_Pages::pageView_movePage(int r, int c)
{
- if ((r == c) || (r >= pageView->m_pageCount))
+ if ((r == c) || (r >= pageViewWidget->pageGrid()->pageCount()))
return;
- if (c >= pageView->m_pageCount)
+ if (c >= pageViewWidget->pageGrid()->pageCount())
currView->m_doc->movePage(r, r + 1, c, 2);
else
currView->m_doc->movePage(r, r + 1, c, 0);
+
currView->reformPages();
rebuildPages();
currView->DrawNew();
}
-void PagePalette_Pages::pageView_gotoPage(int r, int c, int b)
+void PagePalette_Pages::pageView_gotoPage(int pageID, int b)
{
- if ((b == Qt::LeftButton) && (r != -1) && (c != -1))
+ if (b == Qt::LeftButton)
{
- int p;
- bool dummy;
- p = pageView->getPage(r, c, &dummy);
- emit gotoPage(p);
+ emit gotoPage(pageID);
}
}
void PagePalette_Pages::pageView_deletePage(int pageIndex)
{
- int exit = ScMessageBox::question(this, tr("Delete Page?"),
- "<qt>" + tr("Are you sure you want to delete this page?") + "</qt>",
- QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
+ int exit = ScMessageBox::question(this,
+ tr("Delete Page?"),
+ "<qt>" + tr("Are you sure you want to delete this page?")
+ + "</qt>",
+ QMessageBox::Yes | QMessageBox::No,
+ QMessageBox::Yes);
if (exit != QMessageBox::Yes)
return;
m_scMW->deletePage2(pageIndex);
}
+void PagePalette_Pages::pageView_updatePagePreview()
+{
+ if (currView == nullptr)
+ {
+ m_pagePreviewUpdatePending = true;
+ return;
+ }
+
+ if (currView->m_doc == nullptr)
+ {
+ m_pagePreviewUpdatePending = true;
+ return;
+ }
+
+ qDebug() << Q_FUNC_INFO << "- start page preview update";
+
+ PageToPixmapFlags flags = Pixmap_DrawFrame | Pixmap_DrawBackground | Pixmap_DontReloadImages;
+ QMap<int, QImage> previews = currView->PagesToPixmap(pageViewWidget->pageGrid()->pageHeight(), -1, flags);
+
+ for (int i = 0; i < currView->m_doc->DocPages.count(); ++i)
+ {
+ if(previews.contains(i) && i < pageViewWidget->pageGrid()->pageList.count())
+ {
+ ScPage page = *currView->m_doc->DocPages.at(i);
+ double pageRatio = page.width() / page.height();
+ QPixmap pix = ( previews.contains(i) ) ? QPixmap::fromImage( previews.value(i) ) : QPixmap();
+
+ PageCell *pc = pageViewWidget->pageGrid()->pageList.at(i);
+ pc->setPagePreview( pix );
+ pc->setPageRatio( pageRatio );
+ }
+ }
+
+ pageViewWidget->pageGrid()->update();
+
+ m_pagePreviewUpdatePending = true;
+
+}
+
+void PagePalette_Pages::updatePagePreview()
+{
+ if (currView == nullptr || pageViewWidget->pageGrid()->pageList.empty())
+ {
+ m_pagePreviewUpdatePending = true;
+ return;
+ }
+
+ if (currView->m_doc == nullptr)
+ {
+ m_pagePreviewUpdatePending = true;
+ return;
+ }
+
+ if (m_pagePreviewUpdatePending && currView->m_doc->DocPages.count() == pageViewWidget->pageGrid()->pageList.count())
+ {
+ m_pagePreviewUpdatePending = false;
+
+ // limit preview update to 1 refresh event each 500ms
+ QTimer::singleShot(500, this, [this]()
+ {
+ pageView_updatePagePreview();
+ });
+
+ }
+
+}
+
+
+void PagePalette_Pages::newPage()
+{
+ m_scMW->slotNewPageM();
+}
+
+void PagePalette_Pages::duplicatePage()
+{
+ m_scMW->copyPage();
+}
+
+void PagePalette_Pages::importPage()
+{
+ m_scMW->slotPageImport();
+}
+
+void PagePalette_Pages::movePage()
+{
+ m_scMW->movePage();
+}
+
+void PagePalette_Pages::deletePage()
+{
+ int selectedPage = currView->m_doc->currentPageNumber();
+ pageView_deletePage(selectedPage);
+}
+
void PagePalette_Pages::enablePalette(const bool enabled)
{
- pageView->setEnabled(enabled);
+ pageViewWidget->setEnabled(enabled);
masterPageList->setEnabled(enabled);
pageLayout->setEnabled(enabled);
+ buttonPageDuplicate->setEnabled(enabled);
+ buttonPageImport->setEnabled(enabled);
+ buttonPageInsert->setEnabled(enabled);
+ buttonPageMove->setEnabled(enabled);
}
void PagePalette_Pages::handlePageLayout(int layout)
@@ -205,18 +308,20 @@
return;
QPixmap pm;
- QListWidgetItem* item;
+ QListWidgetItem *item;
for (auto it = currView->m_doc->MasterNames.cbegin(); it != currView->m_doc->MasterNames.cend(); ++it)
{
- const QString& pageName = it.key();
- QString pageLabel = (pageName == CommonStrings::masterPageNormal) ? CommonStrings::trMasterPageNormal : pageName;
+ const QString &pageName = it.key();
+ QString pageLabel = (pageName == CommonStrings::masterPageNormal)
+ ? CommonStrings::trMasterPageNormal
+ : pageName;
if (masterPageList->m_thumb)
{
pm = QPixmap::fromImage(currView->MPageToPixmap(pageName, 60));
item = new QListWidgetItem(QIcon(pm), pageLabel, masterPageList);
- }
- else
+ } else
item = new QListWidgetItem(pageLabel, masterPageList);
+
item->setData(Qt::UserRole, pageName);
}
}
@@ -229,9 +334,7 @@
disconnect(pageLayout, SIGNAL(selectedLayout(int)), this, SLOT(handlePageLayout(int)));
disconnect(pageLayout, SIGNAL(selectedFirstPage(int)), this, SLOT(handleFirstPage(int)));
- pageView->clearContents();
- pageView->setRowCount(1);
- pageView->setColumnCount(1);
+ pageViewWidget->pageGrid()->clear();
if (currView == nullptr)
{
connect(pageLayout, SIGNAL(selectedLayout(int)), this, SLOT(handlePageLayout(int)));
@@ -239,98 +342,54 @@
return;
}
- const PageSet& currentPageSet = currView->m_doc->pageSets()[currView->m_doc->pagePositioning()];
+ const PageSet ¤tPageSet = currView->m_doc->pageSets()[currView->m_doc->pagePositioning()];
pageLayout->updateLayoutSelector(currView->m_doc->pageSets());
pageLayout->selectItem(currView->m_doc->pagePositioning());
pageLayout->firstPage->setCurrentIndex(currentPageSet.FirstPage);
- pageView->m_pageCount = currView->m_doc->DocPages.count();
int counter = currentPageSet.FirstPage;
int cols = currentPageSet.Columns;
- int rows = (currView->m_doc->DocPages.count()+counter) / currentPageSet.Columns;
- if (((currView->m_doc->DocPages.count()+counter) % currentPageSet.Columns) != 0)
- rows++;
- int rowcounter = 0;
- int colmult, rowmult, coladd, rowadd;
- if (cols == 1)
- {
- pageView->setColumnCount(cols);
- pageView->setRowCount(rows * 2 + 1);
- colmult = 1;
- coladd = 0;
- rowmult = 2;
- rowadd = 1;
- }
- else
- {
- pageView->setColumnCount(cols * 2);
- pageView->setRowCount(rows + 1);
- colmult = 2;
- coladd = 1;
- rowmult = 1;
- rowadd = 0;
- }
- for (int row = 0; row < pageView->rowCount(); ++row)
- {
- for (int column = 0; column < pageView->columnCount(); ++column)
- {
- QTableWidgetItem *tW = new QTableWidgetItem(1001);
- tW->setFlags(Qt::ItemIsEnabled);
- pageView->setItem(row, column, tW);
- }
- }
+ pageViewWidget->pageGrid()->setDocumentPageSize(QSize(currView->m_doc->pageWidth(), currView->m_doc->pageHeight()));
+ pageViewWidget->pageGrid()->setPageInGroup(cols);
+ pageViewWidget->pageGrid()->setPageOffset(counter);
- pageView->m_coladd = coladd;
- pageView->m_colmult = colmult;
- pageView->m_rowadd = rowadd;
- pageView->m_rowmult = rowmult;
- pageView->m_firstPage = counter;
- pageView->m_cols = currentPageSet.Columns;
+ m_pagePreviewUpdatePending = false;
- int columnWidth = pix.width() * pageView->devicePixelRatioF();
- int rowHeight = pix.height() * pageView->devicePixelRatioF();
- int rowHeight5 = 5 * pageView->devicePixelRatioF();
- int rowHeight10 = 10 * pageView->devicePixelRatioF();
+// QElapsedTimer timer;
+// timer.start();
- pageList.clear();
+ // Create all page previews
+ PageToPixmapFlags flags = Pixmap_DrawFrame | Pixmap_DrawBackground | Pixmap_DontReloadImages;
+ QMap<int, QImage> previews = currView->PagesToPixmap(pageViewWidget->pageGrid()->pageHeight(), -1, flags);
+
for (int i = 0; i < currView->m_doc->DocPages.count(); ++i)
{
- QString str = currView->m_doc->DocPages.at(i)->masterPageName();
- SeItem *it = new SeItem(str, i, createIcon(i, str, pix));
- pageList.append(it);
- pageView->setItem(rowcounter * rowmult + rowadd, counter * colmult + coladd, it);
- pageView->setColumnWidth(counter * colmult + coladd, columnWidth);
- if (cols == 1)
- {
- pageView->setRowHeight(rowcounter * rowmult, 10);
- pageView->setRowHeight(rowcounter * rowmult + rowadd, rowHeight);
- }
- else
- pageView->setRowHeight(rowcounter * rowmult + rowadd, rowHeight + rowHeight5);
- counter++;
- if (counter > currentPageSet.Columns - 1)
- {
- counter = 0;
- rowcounter++;
- }
+ ScPage page = *currView->m_doc->DocPages.at(i);
+
+ QString str = page.masterPageName();
+ double pageRatio = page.width() / page.height();
+ QPixmap pix = (previews.contains(i)) ? QPixmap::fromImage(previews.value(i)) : QPixmap();
+
+ // empty page
+ PageCell *pc = new PageCell(str, i,
+ pix,// QPixmap can replace with real page preview
+ pageRatio);
+ pageViewWidget->pageGrid()->pageList.append(pc);
+
}
- pageView->setRowHeight(pageView->rowCount() - 1, rowHeight10);
- if (cols != 1)
+// qDebug() << Q_FUNC_INFO << "- Pages rebuilt in" << timer.elapsed() << "milliseconds";
+
+ pageViewWidget->pageGrid()->calculateSize();
+ pageViewWidget->pageGrid()->update();
+
+ m_pagePreviewUpdatePending = true;
+
+ if (currView != nullptr)
{
- for (int i = 0; i < pageView->columnCount(); ++i)
- {
- if ((i % 2) == 0)
- pageView->setColumnWidth(i, rowHeight10);
- else
- pageView->setColumnWidth(i, columnWidth);
- }
+ markPage(currView->m_doc->currentPageNumber());
}
-
- pageView->update();
- if (currView != nullptr)
- markPage(currView->m_doc->currentPageNumber());
connect(pageLayout, SIGNAL(selectedLayout(int)), this, SLOT(handlePageLayout(int)));
connect(pageLayout, SIGNAL(selectedFirstPage(int)), this, SLOT(handleFirstPage(int)));
}
@@ -347,18 +406,8 @@
if (currView == nullptr)
return;
- SeItem *it;
- for (int i = 0; i < pageList.count(); i++)
- {
- it = pageList.at(i);
- if (it->pageNumber == nr)
- {
- pageView->clearSelection();
- pageView->item(it->row(), it->column())->setSelected(true);
- pageView->scrollToItem(pageView->item(it->row(), it->column()), QAbstractItemView::EnsureVisible);
- break;
- }
- }
+ pageViewWidget->pageGrid()->setSelectedPage(nr);
+ pageViewWidget->scrollToPage(nr);
}
void PagePalette_Pages::setView(ScribusView *view)
@@ -365,7 +414,12 @@
{
if (m_scMW->scriptIsRunning())
return;
+
currView = view;
+
+// if(currView)
+// connect(currView->m_doc, SIGNAL(pagePreviewChanged()), this, SLOT(updatePagePreview()));
+
}
void PagePalette_Pages::selMasterPage()
@@ -376,39 +430,20 @@
emit gotoMasterPage(pageVar.toString());
}
-QPixmap PagePalette_Pages::createIcon(int number, QString masterPage, const QPixmap& pixin)
-{
- // Necessary on windows to ensure the pixmap is drawable
- QPixmap ret(pixin.width() * devicePixelRatioF(), pixin.height() * devicePixelRatioF());
- ret.setDevicePixelRatio(devicePixelRatioF());
+//QPixmap PagePalette_Pages::createPagePreview(const QPixmap &pixin, QSize size)
+//{
+// QRect pageRect(0, 0, size.width(), size.height());
+// QPixmap tile(size);
- QPainter p;
- if (!p.begin(&ret))
- return ret;
+// QPainter painter;
+// painter.begin(&tile);
+// painter.fillRect(pageRect, Qt::white);
+// painter.drawPixmap(pageRect, pixin);
+// painter.end();
- p.drawPixmap(0, 0, pixin);
- p.setBrush(Qt::white);
- p.setBackground(Qt::white);
- p.setBackgroundMode(Qt::OpaqueMode);
- p.setPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
- QString tmp(currView->m_doc->getSectionPageNumberForPageIndex(number));
- if (tmp.isEmpty())
- tmp.setNum(number + 1);
- QRegularExpression regExp ("([A-Z]*[0-9]*)( *[\\.|\\-|_] *)(.*)");
- QRegularExpressionMatch match = regExp.match(masterPage);
- if (match.hasMatch())
- masterPage = match.captured(1);
- QRect rect(0, 0, pixin.width(), pixin.height());
- p.setRenderHint(QPainter::TextAntialiasing, true);
- p.setFont(QFont("Helvetica", 7, QFont::Normal));
- p.drawText(rect, Qt::AlignCenter, tmp + "\n" + masterPage);
- p.end();
+// return tile;
+//}
- if (!pixin.mask().isNull())
- ret.setMask( pixin.mask() );
- return ret;
-}
-
void PagePalette_Pages::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange)
@@ -416,18 +451,28 @@
languageChange();
return;
}
-
+
QWidget::changeEvent(e);
}
void PagePalette_Pages::iconSetChange()
{
- pix = IconManager::instance().loadPixmap("32/page-simple.png");
- if (currView != nullptr)
- rebuild();
+ IconManager& iconManager = IconManager::instance();
+
+ // Pages
+ buttonPageImport->setIcon(iconManager.loadIcon("page-import"));
+ buttonPageInsert->setIcon(iconManager.loadIcon("page-insert"));
+ buttonPageDuplicate->setIcon(iconManager.loadIcon("page-duplicate"));
+ buttonPageMove->setIcon(iconManager.loadIcon("page-move"));
}
void PagePalette_Pages::languageChange()
{
+ // Pages
+ buttonPageDuplicate->setToolTip( tr( "Duplicate the selected page" ) );
+ buttonPageMove->setToolTip( tr( "Move the selected page" ) );
+ buttonPageInsert->setToolTip( tr( "Add a new page" ) );
+ buttonPageImport->setToolTip( tr( "Import pages from another document" ) );
+
retranslateUi(this);
}
Index: scribus/ui/pagepalette_pages.h
===================================================================
--- scribus/ui/pagepalette_pages.h (Revision 25541)
+++ scribus/ui/pagepalette_pages.h (Arbeitskopie)
@@ -25,6 +25,8 @@
class SeItem;
class SeList;
class SeView;
+class PageViewer;
+class PageCell;
class SCRIBUS_API PagePalette_Pages : public QWidget, Ui::PagePalette_PagesBase
{
@@ -34,9 +36,6 @@
PagePalette_Pages(QWidget* parent);
~PagePalette_Pages() {};
-protected:
- void changeEvent(QEvent *e) override;
-
public slots:
void setView(ScribusView *view);
void deleteMasterPage(const QString& tmp);
@@ -51,14 +50,22 @@
void markPage(uint nr);
void selMasterPage();
void languageChange();
+ void updatePagePreview();
private slots:
void iconSetChange();
void pageView_applyMasterPage(const QString& masterpageName, int pageIndex);
void pageView_movePage(int r, int c);
- void pageView_gotoPage(int r, int c, int b);
+ void pageView_gotoPage(int pageID, int b);
void pageView_deletePage(int pageIndex);
+ void pageView_updatePagePreview();
+ void newPage();
+ void duplicatePage();
+ void importPage();
+ void movePage();
+ void deletePage();
+
signals:
void gotoMasterPage(QString);
void gotoPage(int);
@@ -66,11 +73,11 @@
protected:
ScribusView *currView { nullptr};
ScribusMainWindow *m_scMW { nullptr};
+ bool m_pagePreviewUpdatePending {true};
- QList<SeItem*> pageList;
- QPixmap pix;
+// QPixmap createPagePreview(const QPixmap& pixin, QSize size);
- QPixmap createIcon(int number, QString masterPage, const QPixmap& pixin);
+ void changeEvent(QEvent *e) override;
};
#endif // SEITENPAL_H
Index: scribus/ui/pagepalette_pagesbase.ui
===================================================================
--- scribus/ui/pagepalette_pagesbase.ui (Revision 25541)
+++ scribus/ui/pagepalette_pagesbase.ui (Arbeitskopie)
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>220</width>
- <height>286</height>
+ <height>419</height>
</rect>
</property>
<property name="windowTitle">
@@ -28,6 +28,12 @@
</property>
<item>
<widget class="QSplitter" name="splitter">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@@ -35,6 +41,12 @@
<bool>false</bool>
</property>
<widget class="QWidget" name="widget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>5</number>
@@ -74,6 +86,12 @@
</layout>
</widget>
<widget class="QWidget" name="widget_2" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>5</number>
@@ -98,33 +116,61 @@
</widget>
</item>
<item>
- <widget class="SeView" name="pageView">
- <property name="toolTip">
- <string><qt>List of normal pages in the document, shown with the document layout. Pages may be dragged to rearrange or delete them.</qt></string>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>4</number>
</property>
- <property name="selectionMode">
- <enum>QAbstractItemView::NoSelection</enum>
+ <item>
+ <widget class="QToolButton" name="buttonPageInsert">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonPageImport">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonPageDuplicate">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="buttonPageMove">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="PageViewer" name="pageViewWidget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <property name="iconSize">
- <size>
- <width>60</width>
- <height>60</height>
- </size>
- </property>
- <property name="rowCount">
- <number>1</number>
- </property>
- <property name="columnCount">
- <number>1</number>
- </property>
- <attribute name="horizontalHeaderVisible">
- <bool>false</bool>
- </attribute>
- <attribute name="verticalHeaderVisible">
- <bool>false</bool>
- </attribute>
- <row/>
- <column/>
</widget>
</item>
</layout>
@@ -173,11 +219,6 @@
<header>ui/pagepalette_widgets.h</header>
</customwidget>
<customwidget>
- <class>SeView</class>
- <extends>QTableWidget</extends>
- <header>ui/pagepalette_widgets.h</header>
- </customwidget>
- <customwidget>
<class>PageLayouts</class>
<extends>QGroupBox</extends>
<header>ui/pagelayout.h</header>
@@ -188,6 +229,12 @@
<extends>QLabel</extends>
<header>ui/pagepalette_widgets.h</header>
</customwidget>
+ <customwidget>
+ <class>PageViewer</class>
+ <extends>QWidget</extends>
+ <header>ui/pagepalette_widgets.h</header>
+ <container>1</container>
+ </customwidget>
</customwidgets>
<resources/>
<connections/>
Index: scribus/ui/pagepalette_widgets.cpp
===================================================================
--- scribus/ui/pagepalette_widgets.cpp (Revision 25541)
+++ scribus/ui/pagepalette_widgets.cpp (Arbeitskopie)
@@ -9,6 +9,7 @@
#include <QBitmap>
#include <QCursor>
#include <QDrag>
+#include <QElapsedTimer>
#include <QEvent>
#include <QHeaderView>
#include <QLabel>
@@ -17,6 +18,7 @@
#include <QMimeData>
#include <QMessageBox>
#include <QPainter>
+#include <QScrollArea>
#include <QStringView>
#include "iconmanager.h"
@@ -23,22 +25,15 @@
#include "pagepalette_widgets.h"
#include "scribusapp.h"
+const QString MIMETYPE = "page/magic";
-/* IconItems Code */
-SeItem::SeItem(const QString& text, uint nr, const QPixmap& pix)
- : QTableWidgetItem(QIcon(pix), "", 1002),
- pageNumber(nr),
- pageName(text)
-{
- setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
-}
-
-const QString& SeItem::getPageName()
-{
- return pageName;
-}
-
-/* ListBox Subclass */
+/* ********************************************************************************* *
+ *
+ *
+ * Master Page List
+ *
+ *
+ * ********************************************************************************* */
SeList::SeList(QWidget* parent) : QListWidget(parent)
{
setAcceptDrops(true);
@@ -50,7 +45,7 @@
if (m->button() == Qt::RightButton)
{
QMenu *pmen = new QMenu();
-// qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
+ // qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
QAction *px = pmen->addAction( tr("Show Page Previews"), this, SLOT(toggleThumbnail()));
px->setCheckable(true);
if (m_thumb)
@@ -91,16 +86,14 @@
return;
QMimeData *mimeData = new QMimeData;
QString pageName = item->data(Qt::UserRole).toString();
- mimeData->setData("page/magic", "1" + pageName.toLocal8Bit());
+ mimeData->setData(MIMETYPE, "1" + pageName.toLocal8Bit());
mimeData->setText("1" + pageName);
QDrag *dr = new QDrag(this);
dr->setMimeData(mimeData);
- const QPixmap& pm = IconManager::instance().loadPixmap("doc.png");
+ // const QPixmap& pm = IconManager::instance().loadPixmap("doc.png");
+ const QPixmap& pm = item->icon().pixmap(60);
dr->setPixmap(pm);
- // dr->setDragCursor(pm, Qt::CopyAction);
- // dr->setDragCursor(pm, Qt::MoveAction);
dr->exec(Qt::CopyAction | Qt::MoveAction);
- QApplication::setOverrideCursor(Qt::ArrowCursor);
}
}
@@ -116,356 +109,1119 @@
return;
}
}
-
+
QListWidget::keyPressEvent(e);
}
-/* QTable Subclass */
-SeView::SeView(QWidget* parent) : QTableWidget(parent)
+
+
+/* ********************************************************************************* *
+ *
+ *
+ * Page Cell
+ *
+ *
+ * ********************************************************************************* */
+PageCell::PageCell(const QString& text, uint nr, const QPixmap& pix, double pageSize, const QColor color) :
+ m_pageNumber(nr),
+ m_pagePreview(pix),
+ m_pageName(text),
+ m_masterPageColor(color),
+ m_pageRatio(pageSize)
{
- setDragEnabled(true);
+
+}
+
+/* ********************************************************************************* *
+ *
+ *
+ * Page Viewer
+ *
+ *
+ * ********************************************************************************* */
+
+PageViewer::PageViewer(QWidget *parent) : QWidget(parent)
+{
+ m_pageGrid = new PageGrid(this);
+
+ m_scroll = new QScrollArea;
+ m_scroll->setWidget(m_pageGrid);
+
+ m_scroll->setWidgetResizable(true);
+ m_scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ m_scroll->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ m_scroll->setFrameShape(QFrame::NoFrame);
+
+ QVBoxLayout* layout = new QVBoxLayout;
+ layout->addWidget(m_scroll);
+ layout->setContentsMargins(0,0,0,0);
+
+ setLayout(layout);
+
+}
+
+PageGrid *PageViewer::pageGrid()
+{
+ return m_pageGrid;
+}
+
+void PageViewer::scrollToPage(int pageId)
+{
+ QPoint posOfSelection = pageGrid()->pagePosition(pageId);
+
+ m_scroll->ensureVisible(
+ posOfSelection.x(),
+ posOfSelection.y(),
+ pageGrid()->rowHeight(),
+ pageGrid()->rowHeight()
+ );
+
+}
+
+void PageViewer::keyPressEvent(QKeyEvent *event)
+{
+ int k = event->key();
+ if (k == Qt::Key_Delete)
+ {
+ event->accept();
+
+ m_pageGrid->deleteSelectedPage();
+ return;
+ }
+
+ QWidget::keyPressEvent(event);
+}
+
+
+
+/* ********************************************************************************* *
+ *
+ *
+ * Page Grid
+ *
+ *
+ * *********************************************************************************
+ *
+ * Grid Scheme for Double Page
+ *
+ * Column 1 Column 2 Column 3 Column 4
+ * ------------------------------ ------------------------------
+ * R | Group | | Group |
+ * o | ---------- ---------- | Group | ---------- ---------- |
+ * w | | Cell | Cell | Cell | | Space | | Cell | Cell | Cell | |
+ * | | | Gap | | | | | | Gap | | |
+ * 1 | ---------- ---------- | | ---------- ---------- |
+ * ------------------------------ ------------------------------
+ * Row Space Row Space
+ * ------------------------------ ------------------------------
+ * R | Group | | Group |
+ * o | ---------- ---------- | Group | ---------- ---------- |
+ * w | | Cell | Cell | Cell | | Space | | Cell | Cell | Cell | |
+ * | | | Gap | | | | | | Gap | | |
+ * 2 | ---------- ---------- | | ---------- ---------- |
+ * ------------------------------ ------------------------------
+ *
+ * A group can have minimum 1 cell or maximum 4 cells
+ *
+ * ********************************************************************************* */
+
+
+
+PageGrid::PageGrid(QWidget *parent)
+ : QWidget{parent}
+{
+ pageList = QList<PageCell*>();
+ m_rowHeight = 96;
+ m_cellGap = 1;
+ m_groupSpace = 16;
+ m_rowSpace = 12;
+ m_fontSize = 7; // font size of number label and masterpage label
+ m_labelGap = 8; // gap between page and number label
+ m_colorSelection = QColor(255, 51, 51);
+ m_pageOffset = 0;
+ m_pageLayout = PageLayout::singlePage;
+ m_cellsInGroup = 1; // single page
+ m_selectedPage = -1;
+ m_hoveredPage = -1;
+ m_rectInsert = QRect();
+ m_rectSelection = QRect();
+ m_documentPageSize = QSize(m_rowHeight, m_rowHeight);
+ m_enableSelection = false;
+ m_contextMenu = new QMenu(this);
+
+
+ setContextMenuPolicy(Qt::CustomContextMenu);
setAcceptDrops(true);
- setDropIndicatorShown(true);
- setShowGrid(false);
- setWordWrap(true);
+ calculateSize();
+ initContextMenu();
+
+ connect(this, &PageGrid::customContextMenuRequested, this, &PageGrid::showContextMenu);
+
}
-void SeView::mousePressEvent(QMouseEvent* e)
+/* ********************************************************************************* *
+ *
+ * Public Members
+ *
+ * ********************************************************************************* */
+
+void PageGrid::setPageInGroup(int amount)
{
- e->accept();
- m_mousePos = e->position().toPoint();
- m_mousePressed = true;
- QTableWidget::mousePressEvent(e);
+ m_cellsInGroup = amount;
}
-void SeView::mouseReleaseEvent(QMouseEvent* e)
+void PageGrid::setDocumentPageSize(QSizeF pageSize)
{
- e->accept();
- m_mousePressed = false;
+ m_documentPageSize = pageSize;
+}
- QPoint mouseEventPos = e->position().toPoint();
- emit Click(rowAt(mouseEventPos.y()), columnAt(mouseEventPos.x()), e->button());
- QTableWidget::mouseReleaseEvent(e);
+void PageGrid::setRowHeight(int size)
+{
+ // clamp size from 48 to 256)
+ m_rowHeight = qBound(48, size, 256);
+ // updateTileSize();
+ calculateSize();
+ update();
}
-void SeView::mouseMoveEvent(QMouseEvent* e)
+int PageGrid::rowHeight()
{
- QPoint mouseEventPos = e->position().toPoint();
- if ((m_mousePressed) && ((m_mousePos - mouseEventPos).manhattanLength() > 4))
+ return m_rowHeight;
+}
+
+void PageGrid::setFontSize(int size)
+{
+ m_fontSize = size;
+ // updateTileSize();
+ update();
+}
+
+int PageGrid::fontSize()
+{
+ return m_fontSize;
+}
+
+void PageGrid::setSelectionColor(QColor color)
+{
+ m_colorSelection = color;
+ update();
+}
+
+QColor PageGrid::selectionColor()
+{
+ return m_colorSelection;
+}
+
+void PageGrid::setPageLayout(PageLayout layout)
+{
+ m_pageLayout = layout;
+
+ switch(m_pageLayout)
{
- m_mousePressed = false;
- int a = rowAt(mouseEventPos.y());
- int b = columnAt(mouseEventPos.x());
- if ((a != -1) && (b != -1))
+ default:
+ case PageLayout::singlePage:
+ m_cellsInGroup = 1;
+ break;
+ case PageLayout::doublePage:
+ m_cellsInGroup = 2;
+ break;
+ case PageLayout::triplePage:
+ m_cellsInGroup = 3;
+ break;
+ case PageLayout::quadroPage:
+ m_cellsInGroup = 4;
+ break;
+ }
+
+ update();
+}
+
+PageLayout PageGrid::pageLayout()
+{
+ return m_pageLayout;
+}
+
+void PageGrid::setPageOffset(int pageCount)
+{
+ m_pageOffset = pageCount;
+ calculateSize();
+ update();
+}
+
+int PageGrid::pageOffset()
+{
+ return m_pageOffset;
+}
+
+//void PageGrid::setPageList(const QList<PageCell *> list)
+//{
+// m_pageList = list;
+// calculateSize();
+// // update();
+//}
+
+//QList<PageCell *> PageGrid::pageList() const
+//{
+// return m_pageList;
+//}
+
+int PageGrid::pageId(int r, int c, bool clampId)
+{
+
+ if ( r == -1 || c == -1) return -1;
+
+ int id = (r == 0) ? c : r * columns() + c;
+ id -= m_pageOffset;
+
+ // Important: The page id can be equal to pageCount to have an extra cell after the last one.
+ return (clampId) ? clampPageId(id, true) : id;
+
+}
+
+int PageGrid::pageId(QPoint pos, bool clampId)
+{
+ int row = rowAt(pos);
+ int col = columnAt(pos);
+
+ return pageId(row, col, clampId);
+}
+
+PageCell *PageGrid::getPageItem(int pageIndex)
+{
+ if(pageCount() == 0 || pageIndex >= pageCount() || pageIndex < 0)
+ return nullptr;
+
+ return pageList.at( clampPageId(pageIndex) );
+
+}
+
+
+int PageGrid::pageCount()
+{
+ return pageList.count();
+}
+
+int PageGrid::pageHeight()
+{
+ return m_rowHeight - m_fontSize - m_labelGap;
+}
+
+
+void PageGrid::setSelectedPage(int pageID)
+{
+ m_selectedPage = clampPageId(pageID);
+ update();
+}
+
+
+int PageGrid::selectedPage()
+{
+ return m_selectedPage;
+}
+
+void PageGrid::deleteSelectedPage()
+{
+ emit delPageRequest( clampPageId(m_selectedPage) );
+}
+
+void PageGrid::clear()
+{
+ pageList.clear();
+ clearUi();
+ calculateSize();
+}
+
+/* ********************************************************************************* *
+ *
+ * Private Members
+ *
+ * ********************************************************************************* */
+
+int PageGrid::columns()
+{
+ return m_cellsInGroup ;
+}
+
+int PageGrid::rows()
+{
+ // total page count + offset pages
+ return qCeil( (double)(pageCount() + m_pageOffset + 1) / (double)columns() );
+}
+
+int PageGrid::columnAt(QPoint pos)
+{
+ if(pageCount() == 0) return -1;
+
+ int row = rowAt(pos);
+ if ( row == -1) return row;
+
+ int m_col = -1;
+
+ int cellId = row * m_cellsInGroup;
+ int pageId = cellId - m_pageOffset;
+ QRect cellRect(m_groupSpace, m_rowSpace + row * (rowHeight() + m_rowSpace), dummyPageSize().width(), rowHeight());
+ int width = 0;
+
+ for (int i = 0; i < m_cellsInGroup; ++i)
+ {
+
+ int id = cellId + i;
+
+ // skip empty cells
+ if (id < m_pageOffset || id >= pageCount() + m_pageOffset)
{
- QTableWidgetItem* ite = item(a, b);
- if (ite != nullptr)
- {
- if (ite->type() == 1002)
- {
- SeItem* it = (SeItem*)ite;
- QString str(it->pageName);
- bool dummy;
- int p = getPage(a, b, &dummy);
- QString tmp;
- QMimeData *mimeData = new QMimeData;
- mimeData->setData("page/magic", "2 " + tmp.setNum(p).toLocal8Bit() + " " + str.toLocal8Bit());
- mimeData->setText("2 " + tmp.setNum(p) + " " + str);
- QDrag *dr = new QDrag(this);
- dr->setMimeData(mimeData);
- const QPixmap& pm = IconManager::instance().loadPixmap("doc.png");
- dr->setPixmap(pm);
- // dr->setDragCursor(pm, Qt::CopyAction);
- // dr->setDragCursor(pm, Qt::MoveAction);
- dr->exec(Qt::CopyAction | Qt::MoveAction);
- QApplication::setOverrideCursor(Qt::ArrowCursor);
- }
- }
+ //qDebug() << "Cell" << id << "is Empty";
+ width = dummyPageSize().width();
}
- }
- QTableWidget::mouseMoveEvent(e);
+ else
+ {
+ //qDebug() << "Cell" << id << "is Page" << "PageId" << pageId + i;
+ PageCell *pc = pageList.at(pageId + i);
+ width = pc->pageWidthByHeight(pageHeight());
+ }
+
+ cellRect.setWidth( width );
+
+ if(cellRect.contains(pos))
+ {
+ m_col = i;
+ //qDebug() << "Page" << pageId + i << "at" << pos << "in column"<< i;
+ break;
+ }
+
+ cellRect.setX(cellRect.x() + width + m_cellGap);
+ };
+
+ int m_columns = columns();
+
+ return (m_col < m_columns) ? m_col : m_columns -1;
}
-void SeView::dropEvent(QDropEvent * e)
+int PageGrid::rowAt(QPoint pos)
{
-
- bool lastPage = false;
- if (!e->mimeData()->hasFormat("page/magic"))
- return;
+ if(pageCount() == 0) return -1;
- QPoint dropEventPos = e->position().toPoint();
- e->setDropAction(Qt::MoveAction);
- e->accept();
- // HACK to prevent strange Qt4 cursor behaviour after dropping. It's examined by Trolltech now - PV.
- // It's the one and only reason why to include QApplication here.
- // But sadly this destroys our normal Cursors
- // Fixed at least in Qt-4.4.2
-// QApplication::restoreOverrideCursor();
- clearPix();
+ int gridHeight = m_rowSpace + rowHeight();
+ int m_rows = rows();
+ int m_row = pos.y() / gridHeight;
- QString tmp;
- QString str = e->mimeData()->text();
- if (str.startsWith("1"))
+ return (m_row < m_rows) ? m_row : m_rows -1;
+}
+
+int PageGrid::rowWidth(int rowId)
+{
+ if(pageCount() == 0 || rowId < 0) return -1;
+
+ int cellId = rowId * m_cellsInGroup;
+ int pageId = cellId - m_pageOffset;
+ int width = 0;
+
+ for (int i = 0; i < m_cellsInGroup; ++i)
{
- int a = rowAt(dropEventPos.y());
- int b = columnAt(dropEventPos.x());
- int p;
- tmp = str.remove(0,1);
- if ((a == -1) || (b == -1))
- return;
- if (a == rowCount() - 1)
+ int id = cellId + i;
+
+ if (id < m_pageOffset || id >= pageCount() + m_pageOffset)
{
- emit NewPage(m_pageCount, tmp);
- return;
+ width += dummyPageSize().width();
}
- p = getPage(a, b, &lastPage);
- if (columnCount() == 1)
+ else
{
- if ((a % 2) == 0)
- emit NewPage(p, tmp);
- else
- {
- emit UseTemp(tmp, p);
- QTableWidgetItem* ite = item(a, b);
- if (ite == nullptr)
- return;
- if (ite->type() == 1002)
- {
- SeItem* it = (SeItem*)ite;
- it->pageName = tmp;
- }
- }
- return;
+ PageCell *pc = pageList.at(pageId + i);
+ width += pc->pageWidthByHeight(pageHeight());
}
- if ((b % 2) == 0)
+
+ width += m_cellGap;
+
+ };
+
+ width += m_groupSpace * 2;
+
+ return width;
+
+}
+
+QRect PageGrid::rectAt(int row, int col)
+{
+ if ( row == -1 || col == -1) return QRect();
+
+ int cellId = row * m_cellsInGroup;
+ int pageId = cellId - m_pageOffset;
+ QRect cellRect(m_groupSpace, m_rowSpace + row * (rowHeight() + m_rowSpace), dummyPageSize().width(), rowHeight());
+ int width = 0;
+
+ for (int i = 0; i < m_cellsInGroup; ++i)
+ {
+
+ int id = cellId + i;
+
+ // skip empty cells
+ if (id < m_pageOffset || id >= pageCount() + m_pageOffset)
{
- if (lastPage)
- emit NewPage(p + 1, tmp);
- else
- emit NewPage(p, tmp);
+ width = dummyPageSize().width();
}
else
{
- emit UseTemp(tmp, p);
- QTableWidgetItem* ite = item(a, b);
- if (ite == nullptr)
- return;
- if (ite->type() == 1002)
- {
- SeItem* it = (SeItem*)ite;
- it->pageName = tmp;
- }
+ PageCell *pc = pageList.at(pageId + i);
+ width = pc->pageWidthByHeight(pageHeight());
}
- return;
+
+ cellRect.setWidth( width );
+
+ if(i == col)
+ {
+ return cellRect;
+ }
+
+ cellRect.setX(cellRect.x() + width + m_cellGap);
+ };
+
+ return QRect();
+
+}
+
+QSize PageGrid::dummyPageSize()
+{
+ double ratio = m_documentPageSize.width() / m_documentPageSize.height();
+ QSize dummySize(pageHeight() * ratio, pageHeight());
+
+ //qDebug() << dummySize << ratio << m_documentPageSize.width() << m_documentPageSize.height();
+
+ return dummySize;
+}
+
+QPoint PageGrid::mapPosToCell(QPoint pos, Mode &mode)
+{
+ int col = columnAt(pos);
+ int row = rowAt(pos);
+
+ // return if there is no row or column
+ if(col == -1 || row == -1)
+ {
+ mode = Mode::Invalid;
+ return QPoint();
}
- if (str.startsWith("2"))
+
+ int id = pageId(row, col, false);
+ QRect cellRect = rectAt(row, col);
+ int x = cellRect.x();
+ int y = cellRect.y();
+
+ // cell doesn't have a page
+ if(id < 0 || id >= pageCount()){
+ mode = Mode::Add;
+ }
+ else
{
- int st = str.indexOf(" ");
- int en = str.indexOf(" ", st + 1);
- tmp = str.mid(en + 1);
- int dr = QStringView(str).sliced(st, en - st).toInt();
- int a = rowAt(dropEventPos.y());
- int b = columnAt(dropEventPos.x());
- if ((a == -1) || (b == -1))
- return;
- QTableWidgetItem* ite = item(a, b);
- int p = getPage(a, b, &lastPage);
- if (a == rowCount() - 1)
+ // check if mouse is on "insert area"
+ QRect insertArea(x, y, 8, rowHeight());
+ if(insertArea.contains(pos))
{
- emit movePage(dr, p+1);
- return;
+ mode = Mode::Insert;
}
- if (columnCount() == 1)
- {
- if ((a % 2) == 0)
- emit movePage(dr, p);
- else
- {
- emit UseTemp(tmp, p);
- if (ite == nullptr)
- return;
- SeItem* it = (SeItem*)ite;
- it->pageName = tmp;
- }
- return;
- }
- if ((b % 2) == 0)
- emit movePage(dr, lastPage ? p+1 : p);
else
{
- emit UseTemp(tmp, p);
- if (ite == nullptr)
- return;
- if (ite->type() == 1002)
- {
- SeItem* it = (SeItem*)ite;
- it->pageName = tmp;
- }
+ mode = Mode::Hover;
}
- return;
}
+
+ return QPoint(x,y);
}
-void SeView::dragEnterEvent(QDragEnterEvent *e)
+QPoint PageGrid::pagePosition(int pageId)
{
- if (e->mimeData()->hasFormat("page/magic"))
- e->acceptProposedAction();
+ if(pageId < 0 || pageId >= pageCount()) return QPoint();
+
+ int row = qCeil( (pageId + m_pageOffset) / m_cellsInGroup );
+ int col = 0;
+
+ return rectAt(row, col).topLeft();
}
-void SeView::dragLeaveEvent(QDragLeaveEvent *)
+int PageGrid::clampPageId(int pageID, bool allowPlusOne)
{
- clearPix();
+ int max = (allowPlusOne) ? pageCount() : pageCount() -1;
+ return qBound( 0, pageID, max);
}
-void SeView::dragMoveEvent(QDragMoveEvent *e)
-{
- if (!e->mimeData()->hasFormat("page/magic"))
- return;
- e->acceptProposedAction();
- clearPix();
+/* ********************************************************************************* *
+ *
+ * Methods
+ *
+ * ********************************************************************************* */
- QPoint dragEventPos = e->position().toPoint();
- int row = rowAt(dragEventPos.y());
- int col = columnAt(dragEventPos.x());
- if ((row == -1) || (col == -1))
- return;
+void PageGrid::updateSelectedPage(QPoint pos)
+{
+ int col = columnAt(pos);
+ int row = rowAt(pos);
+ int id = pageId(row, col);
- if (columnCount() == 1)
+ // check if page id is in range of an existing cell
+ if(id > -1 && id < pageCount() )
{
- if ((row % 2) == 0)
+ int newSelectedPage = clampPageId( id );
+
+ // repaint only if there is a change
+ if(newSelectedPage != m_selectedPage)
{
- item(row, 0)->setBackground(Qt::darkBlue);
+ m_selectedPage = newSelectedPage;
+ update();
}
}
- else
+
+}
+
+void PageGrid::updateModeMarker(QPoint pos)
+{
+ Mode mode;
+ QPoint mapPos = mapPosToCell(pos, mode);
+
+ // check if mouse is on "insert area"
+ switch(mode)
{
- if (((col % 2) == 0) || (row == rowCount()-1))
- {
- item(row, col)->setBackground(Qt::darkBlue);
- }
+ case Mode::Add:
+ m_rectInsert = QRect();
+ m_rectAdd = QRect(mapPos.x(), mapPos.y(), dummyPageSize().width(), dummyPageSize().height() );
+ m_hoveredPage = -1;
+ break;
+ case Mode::Insert:
+ {
+ int selectorWidth = 4;
+ int offsetX = mapPos.x() - selectorWidth / 2 - qRound((double)m_cellGap / 2);
+ m_rectInsert = QRect(offsetX, mapPos.y() - 4, selectorWidth, pageHeight() + 8 );
+ m_rectAdd = QRect();
+ m_hoveredPage = -1;
}
+ break;
+ case Mode::Hover:
+ {
+ int col = columnAt(pos);
+ int row = rowAt(pos);
+ int id = pageId(row, col);
+ m_rectInsert = QRect();
+ m_rectAdd = QRect();
+ m_hoveredPage = id;
+ }
+ break;
+ case Mode::Invalid:
+ default:
+ m_rectInsert = QRect();
+ m_rectAdd = QRect();
+ m_hoveredPage = -1;
+ break;
+ }
+
+ update();
+
}
-void SeView::keyPressEvent(QKeyEvent * e)
+void PageGrid::calculateSize()
{
- int k = e->key();
- if (k == Qt::Key_Delete)
+ int width = dummyPageSize().width() + m_groupSpace * 2;
+
+ for (int i = 0; i < rows(); ++i)
{
- e->accept();
- bool dummy;
- int pageToDelete = getPage(currentRow(), currentColumn(), &dummy);
- emit delPageRequest(pageToDelete);
- return;
+ width = qMax(width, rowWidth(i));
}
- QTableWidget::keyPressEvent(e);
+ setMinimumHeight(rows() * (m_rowHeight + m_rowSpace) );
+ setMinimumWidth(width);
+
}
-void SeView::clearPix()
+void PageGrid::clearUi()
{
- int rowcounter = 0;
- for (int i = 0; i < rowCount(); ++i)
+ m_rectInsert = QRect();
+ m_rectSelection = QRect();
+ m_rectAdd = QRect();
+ m_hoveredPage = -1;
+ update();
+}
+
+void PageGrid::drawTile(QPainter &painter, QPoint cellPosition, PageCell *tile, bool selected, bool hovered)
+{
+
+ if(tile == nullptr) return;
+
+ QFont font(this->font().family(), m_fontSize, QFont::Normal);
+ QRect rectPage(cellPosition.x(), cellPosition.y(), tile->pageWidthByHeight(pageHeight()), pageHeight());
+ QRect rectCell(cellPosition.x(), cellPosition.y(), tile->pageWidthByHeight(pageHeight()), m_rowHeight);
+ // QRect rectMasterPageMarker(cellPosition.x(), cellPosition.y() + rectPage.height(), rectPage.width(), 4);
+
+ painter.save();
+
+ // Draw Page
+ painter.setBrush(Qt::NoBrush);
+ // painter.setPen( QPen(Qt::black, 1) );
+ painter.drawPixmap(rectPage, tile->pagePreview(), tile->pagePreview().rect());
+ // painter.drawRect(rectPage);
+
+ // Setup painter for text drawing
+ painter.setRenderHint(QPainter::TextAntialiasing, true);
+ painter.setFont(font);
+
+ // Draw Page Number
+ //painter.setPen(QPen(palette().windowText().color()));
+ painter.setPen(QPen( Qt::white ));
+ painter.drawText(rectCell, Qt::AlignHCenter|Qt::AlignBottom | Qt::TextWordWrap, QString::number(tile->pageNumber() + 1));
+
+ // Draw Page Name
+ painter.setBackgroundMode(Qt::OpaqueMode);
+ painter.setBackground(QColor(0,0,0,128));
+ painter.setPen(QPen(Qt::white));
+ painter.drawText(rectPage.adjusted(2,2,-2,-2), Qt::AlignTop | Qt::AlignLeft |Qt::TextWordWrap, tile->pageName());
+
+ // Draw Master Page Color
+ // painter.setPen(Qt::NoPen);
+ // painter.fillRect(rectMasterPageMarker, tile->masterPageColor());
+
+
+ // Draw selection
+ // if(selected)
+ // {
+ // painter.setBrush(Qt::NoBrush);
+ // painter.setPen( QPen(m_colorSelection, 2) );
+ // painter.drawRect(rectPage);
+ // }
+
+ // Draw hover
+ if(hovered)
{
- int counter = 0;
- if (columnCount() == 1)
+ QColor colHover = palette().highlight().color();
+ colHover.setAlphaF(0.5);
+ painter.setBackgroundMode(Qt::TransparentMode);
+ painter.setBrush(colHover);
+ painter.setPen( Qt::NoPen );
+ painter.drawRect(rectPage);
+ }
+
+ // tmp border
+ // painter.setPen( Qt::magenta );
+ // painter.setBrush(Qt::NoBrush);
+ // painter.drawRect(rectCell);
+
+ painter.restore();
+
+}
+
+void PageGrid::initContextMenu()
+{
+ m_contextMenu->clear();
+
+ m_contextMenu->addAction(tr("&Small Preview"), [this]() {
+ m_rowSpace = 8;
+ setRowHeight(64);
+ emit previewSizeChanged();
+ });
+ m_contextMenu->addAction(tr("&Medium Preview"), [this]() {
+ m_rowSpace = 12;
+ setRowHeight(96);
+ emit previewSizeChanged();
+ });
+ m_contextMenu->addAction(tr("&Large Preview"), [this]() {
+ m_rowSpace = 16;
+ setRowHeight(128);
+ emit previewSizeChanged();
+ });
+// m_contextMenu->addAction(tr("&Extra Large Preview"), [this]() {
+// m_rowSpace = 20;
+// setRowHeight(196);
+// emit previewSizeChanged();
+// });
+}
+
+void PageGrid::showContextMenu(QPoint pos)
+{
+ m_contextMenu->popup( mapToGlobal(pos) );
+}
+
+/* ********************************************************************************* *
+ *
+ * Events
+ *
+ * ********************************************************************************* */
+
+void PageGrid::paintEvent(QPaintEvent *event)
+{
+
+ int count = 0;
+ int x = m_groupSpace;
+ int y = m_rowSpace;
+ int offset = 0;
+ QRect selectedPageRect;
+
+ QPainter painter(this);
+
+ // Draw background
+ painter.fillRect(rect(), palette().dark());
+ //painter.fillRect(rect(), QColor(128,128,128));
+
+ if(pageCount() == 0) return;
+
+// QElapsedTimer timer;
+// timer.start();
+
+ // Draw pages
+ for(int r = 0; r < rows(); r++)
+ {
+ int groupStart = m_groupSpace;
+ int groupWidth = 0;
+ bool drawGroupRect = false;
+
+ for(int c = 0; c < columns(); c++)
{
- if ((i % 2) == 0)
+
+ // cell is after last page cell
+ if(count >= pageCount() + m_pageOffset)
+ break;
+
+ // cell is a page cell
+ if(count >= m_pageOffset && count < pageCount() + m_pageOffset)
{
- item(rowcounter, 0)->setBackground(Qt::white);
- rowcounter += 2;
- }
- }
- else
- {
- for (int j = 0; j < columnCount(); ++j)
- {
- if ((j % 2) == 0)
+ int id = count - m_pageOffset;
+ PageCell * cell = getPageItem(id);
+ if(id == m_selectedPage) selectedPageRect = QRect(x, y, cell->pageWidthByHeight(pageHeight()), pageHeight() );
+ QPoint pos(x,y);
+ drawTile(painter, pos, cell, (id == m_selectedPage) ? true : false, (id == m_hoveredPage) ? true : false);
+
+ // add space only between pages
+ if((c + 1) % m_cellsInGroup == 0 || count == pageCount() + m_pageOffset -1)
{
- item(rowcounter, counter)->setBackground(Qt::white);
- counter += 2;
+ offset = 0;
}
+ else
+ offset = m_cellGap;
+
+
+ x += cell->pageWidthByHeight(pageHeight()) + offset;
+ groupWidth += cell->pageWidthByHeight(pageHeight()) + offset;
+ drawGroupRect = true;
+
+
}
- rowcounter++;
+ // cell is before first page cell
+ else
+ {
+ offset = ((c + 1) % m_cellsInGroup) == 0 ? 0 : m_cellGap;
+ x += dummyPageSize().width() + offset;
+
+ // adjust start on first row if first page has an offset
+ if(r == 0)
+ groupStart = x;
+ }
+
+ count++;
}
+
+ // Draw group border
+ if (drawGroupRect)
+ painter.drawRect( QRect(groupStart, y, groupWidth, pageHeight()) );
+
+ y += m_rowHeight + m_rowSpace;
+ x = m_groupSpace;
}
- for (int i = 0; i < columnCount(); ++i)
+
+ // Draw selected page
+ if(!selectedPageRect.isEmpty())
{
- item(rowCount()-1, i)->setBackground(Qt::white);
+ QColor colorSelection = (this->isEnabled()) ? m_colorSelection : palette().highlight().color();
+ painter.setPen( QPen(colorSelection, 2) );
+ painter.setBrush(Qt::NoBrush);
+ painter.drawRect(selectedPageRect);
}
+
+ // Draw insert marker
+ if(!m_rectInsert.isEmpty())
+ {
+ painter.fillRect(m_rectInsert, palette().highlight());
+ }
+
+ // Draw add page marker
+ if(!m_rectAdd.isEmpty())
+ {
+ QColor colAdd = Qt::white;
+ colAdd.setAlphaF(0.5);
+ painter.setBackgroundMode(Qt::TransparentMode);
+ painter.fillRect(m_rectAdd, colAdd);
+ painter.setBrush(Qt::NoBrush);
+ colAdd = Qt::black;
+ colAdd.setAlphaF(0.5);
+ painter.setPen( QPen(colAdd, 1, Qt::DashLine) );
+ painter.drawRect(m_rectAdd.adjusted(0, 0, -1, -1));
+ }
+
+ // Draw selection frame
+ if(!m_rectSelection.isEmpty())
+ {
+ QColor colorSelection = palette().highlight().color();
+ painter.setPen( QPen(colorSelection) );
+ colorSelection.setAlphaF(0.5);
+ painter.setBrush(colorSelection);
+ painter.drawRect(m_rectSelection);
+ }
+
+
+ painter.end();
+
+// qDebug() << "PageGrid::paintEvent() - Render Time Page Grid:" << timer.elapsed() << "milliseconds";
+
}
-int SeView::getPage(int r, int c, bool *last)
+
+void PageGrid::resizeEvent(QResizeEvent *event)
{
- int counter = m_firstPage;
- int rowcounter = 0;
- int ret = m_pageCount - 1;
- *last = false;
- if (r == rowCount() - 1)
+ if (event->oldSize() != event->size())
{
- *last = true;
- return ret;
+ calculateSize();
}
- if ((r == 0) && (c < m_firstPage * m_colmult + m_coladd))
- return 0;
- for (int a = 0; a < m_pageCount; ++a)
+
+ QWidget::resizeEvent(event);
+}
+
+void PageGrid::dropEvent(QDropEvent *event)
+{
+
+ if (!event->mimeData()->hasFormat(MIMETYPE))
+ return;
+
+ QPoint dropEventPos = event->position().toPoint();
+ event->setDropAction(Qt::MoveAction);
+ event->accept();
+
+ clearUi();
+
+ QString tmp;
+ QString str = event->mimeData()->text();
+
+ // external drop
+ if (str.startsWith("1"))
{
- if ((rowcounter * m_rowmult + m_rowadd == r) && (counter * m_colmult + m_coladd == c))
+ int r = rowAt(dropEventPos);
+ int c = columnAt(dropEventPos);
+ tmp = str.remove(0,1);
+
+ if ( r == -1 || c == -1 )
+ return;
+
+ int p = pageId(r, c);
+ Mode mode;
+ mapPosToCell(dropEventPos, mode);
+
+ switch(mode)
{
- ret = a;
- return ret;
+ case Mode::Add:
+ case Mode::Insert:
+ emit newPage(p, tmp);
+ break;
+ case Mode::Hover:
+ emit useTemplate(tmp, clampPageId(p));
+ break;
+ case Mode::Invalid:
+ break;
}
- if (columnCount() == 1)
+
+ return;
+
+ }
+
+ // internal drop
+ if (str.startsWith("2"))
+ {
+
+ int st = str.indexOf(" ");
+ int en = str.indexOf(" ", st + 1);
+ tmp = str.mid(en + 1);
+ int dr = QStringView(str).sliced(st, en - st).toInt();
+ int r = rowAt(dropEventPos);
+ int c = columnAt(dropEventPos);
+ int id = pageId(r, c);
+
+ if ( r == -1 || c == -1 || id == -1 )
+ return;
+
+ Mode mode;
+ mapPosToCell(dropEventPos, mode);
+
+ switch(mode)
{
- if ((rowcounter * m_rowmult) == r)
- {
- ret = a;
- return ret;
- }
+ case Mode::Add:
+ case Mode::Insert:
+ emit movePage(dr, id);
+ break;
+ case Mode::Hover:
+ // apply master page only if drop is on existing page
+ emit useTemplate(tmp, clampPageId(id));
+ break;
+ case Mode::Invalid:
+ break;
}
- else
+
+ update();
+ return;
+
+ }
+
+}
+
+void PageGrid::dragEnterEvent(QDragEnterEvent *event)
+{
+ if (event->mimeData()->hasFormat(MIMETYPE))
+ event->acceptProposedAction();
+}
+
+void PageGrid::dragLeaveEvent(QDragLeaveEvent *event)
+{
+ clearUi();
+}
+
+void PageGrid::dragMoveEvent(QDragMoveEvent *event)
+{
+ if (!event->mimeData()->hasFormat(MIMETYPE))
+ return;
+
+ event->acceptProposedAction();
+
+ QPoint dragEventPos = event->position().toPoint();
+ updateModeMarker(dragEventPos);
+
+}
+
+void PageGrid::mouseReleaseEvent(QMouseEvent *event)
+{
+ event->accept();
+
+ QPoint mouseEventPos = event->position().toPoint();
+
+ switch(m_state)
+ {
+ case State::StartDrag:
+ if(pageCount() > 0)
{
- if ((counter * m_colmult == c) && (rowcounter * m_rowmult + m_rowadd == r))
+ updateSelectedPage(mouseEventPos);
+
+ int row = rowAt(mouseEventPos);
+ int col = columnAt(mouseEventPos);
+ int pageID = pageId(row, col);
+
+ if(pageID > -1 && pageID < pageCount() )
{
- ret = a;
- return ret;
+ emit click(m_selectedPage, event->button());
}
}
- counter++;
- if (counter > m_cols - 1)
+ break;
+
+ case State::StartSelection:
+ break;
+
+ default:
+ break;
+
+ }
+
+ m_state = State::None;
+ clearUi();
+
+ QWidget::mouseReleaseEvent(event);
+}
+
+void PageGrid::mousePressEvent(QMouseEvent *event)
+{
+ event->accept();
+ m_mousePos = event->position().toPoint();
+
+ m_state = State::None;
+
+ if(event->button() == Qt::LeftButton)
+ {
+ int id = pageId(m_mousePos, false);
+
+ if(id == -1 && m_enableSelection == true)
{
- counter = 0;
- rowcounter++;
+ m_state = State::StartSelection;
}
+ else if (id > -1)
+ {
+ m_state = State::StartDrag;
+ }
}
- *last = true;
- return ret;
+
+ QWidget::mousePressEvent(event);
}
-SeItem* SeView::getPageItem(int pageIndex)
+void PageGrid::mouseMoveEvent(QMouseEvent *event)
{
- int rows = this->rowCount();
- int columns = this->columnCount();
- for (int i = 0; i < rows; ++i)
+
+ QPoint mouseEventPos = event->position().toPoint();
+
+ if ((m_mousePos - mouseEventPos).manhattanLength() > 4)
{
- for (int j = 0; j < columns; ++j)
+ switch(m_state)
{
- QTableWidgetItem* tbItem = item(i, j);
- SeItem* pageItem = dynamic_cast<SeItem*>(tbItem);
- if (pageItem && pageItem->pageNumber == static_cast<uint>(pageIndex))
- return pageItem;
+ // Drag
+ case State::StartDrag:
+ {
+ m_state = State::None;
+
+ int a = rowAt(mouseEventPos);
+ int b = columnAt(mouseEventPos);
+ if ( a != -1 && b != -1 )
+ {
+ PageCell* ite = getPageItem(pageId(a, b));
+ if (ite != nullptr)
+ {
+
+ QString str(ite->pageName());
+
+ int p = ite->pageNumber();
+ QString tmp;
+ QMimeData *mimeData = new QMimeData;
+ mimeData->setData(MIMETYPE, "2 " + tmp.setNum(p).toLocal8Bit() + " " + str.toLocal8Bit());
+ mimeData->setText("2 " + tmp.setNum(p) + " " + str);
+ QDrag *dr = new QDrag(this);
+ dr->setMimeData(mimeData);
+ //const QPixmap& pm = IconManager::instance().loadPixmap("doc.png");
+ const QPixmap& pm = ite->pagePreview();
+ dr->setPixmap(pm);
+ dr->exec(Qt::CopyAction | Qt::MoveAction);
+
+ }
+ }
+ break;
}
+ // Selection
+ case State::StartSelection:
+ {
+ int x = qMin(m_mousePos.x(), mouseEventPos.x());
+ int y = qMin(m_mousePos.y(), mouseEventPos.y());
+ int width = (m_mousePos.x() < mouseEventPos.x()) ? mouseEventPos.x() - m_mousePos.x() : m_mousePos.x() - mouseEventPos.x();
+ int height = (m_mousePos.y() < mouseEventPos.y()) ? mouseEventPos.y() - m_mousePos.y() : m_mousePos.y() - mouseEventPos.y();
+
+ m_rectSelection = QRect(x, y, width, height);
+
+ update();
+ break;
+ }
+ default:
+ // do nothing
+ break;
+ }
}
- return nullptr;
+
+ QWidget::mouseMoveEvent(event);
}
-/* Der Muelleimer */
+
+/* ********************************************************************************* *
+ *
+ *
+ * Trash Bin
+ *
+ *
+ * ********************************************************************************* */
TrashBin::TrashBin(QWidget * parent) : QLabel(parent)
{
- Normal = IconManager::instance().loadPixmap("trashcan.png");
- Offen = IconManager::instance().loadPixmap("trashcan2.png");
- setPixmap(Normal);
+ iconSetChange();
setScaledContents(false);
setAcceptDrops(true);
@@ -474,23 +1230,23 @@
void TrashBin::dragEnterEvent(QDragEnterEvent *e)
{
- if (e->mimeData()->hasFormat("page/magic"))
+ if (e->mimeData()->hasFormat(MIMETYPE))
{
e->accept();
- setPixmap(Offen);
+ setPixmap(open);
}
}
void TrashBin::dragLeaveEvent(QDragLeaveEvent *)
{
- setPixmap(Normal);
+ setPixmap(normal);
}
void TrashBin::dropEvent(QDropEvent * e)
{
- setPixmap(Normal);
+ setPixmap(normal);
QString str, tmp;
- if (e->mimeData()->hasFormat("page/magic"))
+ if (e->mimeData()->hasFormat(MIMETYPE))
{
e->accept();
str = e->mimeData()->text();
@@ -510,7 +1266,7 @@
void TrashBin::iconSetChange()
{
- Normal = IconManager::instance().loadPixmap("trashcan.png");
- Offen = IconManager::instance().loadPixmap("trashcan2.png");
- setPixmap(Normal);
+ normal = IconManager::instance().loadPixmap("trashcan.png");
+ open = IconManager::instance().loadPixmap("trashcan2.png");
+ setPixmap(normal);
}
Index: scribus/ui/pagepalette_widgets.h
===================================================================
--- scribus/ui/pagepalette_widgets.h (Revision 25541)
+++ scribus/ui/pagepalette_widgets.h (Arbeitskopie)
@@ -7,6 +7,7 @@
#ifndef PAGEPALETTE_WIDGETS_H
#define PAGEPALETTE_WIDGETS_H
+#include "qmenu.h"
#include <QCheckBox>
#include <QDialog>
#include <QDragEnterEvent>
@@ -22,6 +23,7 @@
#include <QMouseEvent>
#include <QPixmap>
#include <QPushButton>
+#include <QScrollArea>
#include <QSplitter>
#include <QTableWidget>
#include <QTableWidgetItem>
@@ -31,29 +33,19 @@
class QEvent;
#include "scribusapi.h"
-#include "scdockpalette.h"
+#include "pagestructs.h"
class ScribusView;
class ScribusMainWindow;
class PageLayouts;
-class SCRIBUS_API SeItem : public QTableWidgetItem
-{
- friend class PagePalette;
- friend class PagePalette_Pages;
- friend class SeView;
-public:
- SeItem(const QString& text, uint pgnr, const QPixmap& pix);
- ~SeItem() {};
+/* ********************************************************************************* *
+ *
+ * Master Page List
+ *
+ * ********************************************************************************* */
- const QString& getPageName();
- uint pageNumber;
-
-protected:
- QString pageName;
-};
-
class SCRIBUS_API SeList : public QListWidget
{
friend class PagePalette;
@@ -74,11 +66,11 @@
void delMasterRequest(QString);
protected:
- void mouseReleaseEvent(QMouseEvent *m) override;
- void mousePressEvent(QMouseEvent* e) override;
- void mouseMoveEvent(QMouseEvent* e) override;
- void keyPressEvent(QKeyEvent* e) override;
-
+ void mouseReleaseEvent(QMouseEvent *m);
+ void mousePressEvent(QMouseEvent* e);
+ void mouseMoveEvent(QMouseEvent* e);
+ virtual void keyPressEvent(QKeyEvent* e);
+
QListWidgetItem *m_currItem {nullptr};
QPoint m_mousePos;
bool m_mousePressed {false};
@@ -86,49 +78,207 @@
};
-class SCRIBUS_API SeView : public QTableWidget
+/* ********************************************************************************* *
+ *
+ * Page Cell
+ *
+ * ********************************************************************************* */
+
+class SCRIBUS_API PageCell
{
+ friend class PanelPages;
+ friend class PageGrid;
+
+public:
+ PageCell(const QString& text, uint pgnr, const QPixmap& pix, double pageRatio, const QColor color = Qt::black);
+ // ~PageCell() {};
+
+ const QString& pageName() {return m_pageName;}
+ QPixmap pagePreview() {return m_pagePreview;}
+ uint pageNumber() {return m_pageNumber;}
+ QColor masterPageColor() {return m_masterPageColor;}
+ int pageWidthByHeight(int height) {return qCeil(height * m_pageRatio);}
+ double pageRatio() {return m_pageRatio;}
+
+ void setPageName(const QString& name ) {m_pageName = name;}
+ void setPagePreview(QPixmap preview ) {m_pagePreview = preview;}
+ void setPageNumber(uint number ) {m_pageNumber = number;}
+ void setMasterPageColor(QColor color ) {m_masterPageColor = color;}
+ void setPageRatio(double pageRatio){m_pageRatio = pageRatio;}
+
+private:
+ uint m_pageNumber;
+ QPixmap m_pagePreview;
+ QString m_pageName;
+ QColor m_masterPageColor;
+ double m_pageRatio;
+};
+
+/* ********************************************************************************* *
+ *
+ * Page Grid
+ *
+ * ********************************************************************************* */
+
+class SCRIBUS_API PageGrid : public QWidget
+{
Q_OBJECT
-
- friend class PagePalette;
- friend class PagePalette_Pages;
+ friend class PageViewer;
+
public:
- SeView(QWidget* parent);
- ~SeView() {};
+ explicit PageGrid(QWidget *parent = nullptr);
- void clearPix();
- int getPage(int r, int c, bool *last);
- SeItem* getPageItem(int pageIndex);
+ void setPageInGroup(int amount);
+ void setDocumentPageSize(QSizeF pageSize);
+
+ void setRowHeight(int size);
+ int rowHeight();
+
+ void setFontSize(int size);
+ int fontSize();
+
+ void setSelectionColor(QColor color);
+ QColor selectionColor();
+
+ void setPageLayout(PageLayout layout);
+ PageLayout pageLayout();
+
+ void setPageOffset(int pageCount);
+ int pageOffset();
+
+ QList<PageCell*> pageList;
+
+ int pageId(int r, int c, bool clampId = true);
+ int pageId(QPoint pos, bool clampId = true);
+
+ PageCell* getPageItem(int pageIndex);
+
+ int pageCount();
+ int pageHeight();
+
+ void setSelectedPage(int pageID);
+ int selectedPage();
+
+ void deleteSelectedPage();
+ void clear();
+ void calculateSize();
+
+private:
+
+ enum State {
+ None = 0,
+ StartDrag = 1,
+ StartSelection = 2
+ };
+
+ enum Mode {
+ Invalid = 0,
+ Insert = 1,
+ Add = 2,
+ Hover = 3
+ };
+
+ QSize m_pageSize;
+ QSizeF m_documentPageSize;
+ int m_rowHeight;
+ int m_cellGap;
+ int m_groupSpace;
+ int m_rowSpace;
+ int m_fontSize;
+ int m_labelGap;
+ QRect m_rectInsert;
+ QRect m_rectSelection;
+ QRect m_rectAdd;
+ QColor m_colorSelection;
+ int m_selectedPage;
+ int m_hoveredPage;
+ bool m_enableSelection;
+ QPoint m_mousePos;
+ State m_state {State::None};
+ PageLayout m_pageLayout;
+ int m_cellsInGroup;
+ int m_pageOffset;
+ QMenu *m_contextMenu;
+
+ int columns();
+ int rows();
+
+ int columnAt(QPoint pos);
+ int rowAt(QPoint pos);
+ int rowWidth(int rowId);
+ QRect rectAt(int row, int col);
+
+ QSize dummyPageSize();
+
+ QPoint mapPosToCell(QPoint pos, Mode &mode);
+ QPoint pagePosition(int pageId);
+
+ int clampPageId(int pageID, bool allowPlusOne = false);
+
+ void updateSelectedPage(QPoint pos);
+ void updateModeMarker(QPoint pos);
+ void clearUi();
+ void drawTile(QPainter &painter, QPoint cellPosition, PageCell * tile, bool selected, bool hovered);
+ void initContextMenu();
+
+private slots:
+ void showContextMenu(QPoint pos);
+
+protected:
+
+ void paintEvent(QPaintEvent *event);
+ void resizeEvent(QResizeEvent *event);
+
+ virtual void dropEvent(QDropEvent * event);
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dragLeaveEvent(QDragLeaveEvent *event);
+ virtual void dragMoveEvent(QDragMoveEvent *event);
+ virtual void mouseReleaseEvent(QMouseEvent *event);
+ virtual void mousePressEvent(QMouseEvent* event);
+ virtual void mouseMoveEvent(QMouseEvent* event);
+
signals:
- void UseTemp(QString, int);
- void NewPage(int, QString);
+ void useTemplate(QString, int);
+ void newPage(int, QString);
void movePage(int, int);
- void Click(int, int, int);
+ void click(int, int);
void delPageRequest(int);
+ void previewSizeChanged();
+};
+/* ********************************************************************************* *
+ *
+ * Page Viewer
+ *
+ * ********************************************************************************* */
+
+class SCRIBUS_API PageViewer : public QWidget
+{
+
+public:
+ PageViewer(QWidget *parent = nullptr);
+ ~PageViewer() {};
+
+ PageGrid *pageGrid();
+ void scrollToPage(int pageId);
+
+
protected:
- void dropEvent(QDropEvent * e) override;
- void dragEnterEvent(QDragEnterEvent *e) override;
- void dragLeaveEvent(QDragLeaveEvent *e) override;
- void dragMoveEvent(QDragMoveEvent *e) override;
- void mouseReleaseEvent(QMouseEvent *e) override;
- void mousePressEvent(QMouseEvent* e) override;
- void mouseMoveEvent(QMouseEvent* e) override;
- void keyPressEvent(QKeyEvent* e) override;
-
- QPoint m_mousePos;
- bool m_mousePressed {false};
- int m_coladd {0};
- int m_colmult {1};
- int m_cols {1};
- int m_firstPage {0};
- int m_pageCount {0};
- int m_rowadd {1};
- int m_rowmult {2};
+ PageGrid *m_pageGrid;
+ QScrollArea* m_scroll;
+
+ virtual void keyPressEvent(QKeyEvent* event);
+
};
+/* ********************************************************************************* *
+ *
+ * Trash bin
+ *
+ * ********************************************************************************* */
+
class SCRIBUS_API TrashBin : public QLabel
{
Q_OBJECT
@@ -137,17 +287,17 @@
TrashBin( QWidget * parent );
~TrashBin() {};
+ void dragEnterEvent( QDragEnterEvent *e );
+ void dragLeaveEvent( QDragLeaveEvent * );
+ void dropEvent( QDropEvent * e );
+
protected:
- QPixmap Normal;
- QPixmap Offen;
+ QPixmap normal;
+ QPixmap open;
- void dragEnterEvent(QDragEnterEvent* e) override;
- void dragLeaveEvent(QDragLeaveEvent*) override;
- void dropEvent(QDropEvent* e) override;
-
protected slots:
void iconSetChange();
-
+
signals:
void delPageRequest(int);
void delMasterRequest(QString);
Index: scribus/ui/propertiespalette.cpp
===================================================================
--- scribus/ui/propertiespalette.cpp (Revision 25541)
+++ scribus/ui/propertiespalette.cpp (Arbeitskopie)
@@ -618,6 +618,7 @@
upRect.translate(m_item->xPos(), m_item->yPos());
m_doc->regionsChanged()->update(upRect.adjusted(-10.0, -10.0, 10.0, 10.0));
m_doc->changed();
+ m_doc->changedPagePreview();
}
}
@@ -694,6 +695,7 @@
upRect.translate(m_item->xPos(), m_item->yPos());
m_doc->regionsChanged()->update(upRect.adjusted(-10.0, -10.0, 10.0, 10.0));
m_doc->changed();
+ m_doc->changedPagePreview();
}
}
Index: scribus/ui/propertiespalette_image.cpp
===================================================================
--- scribus/ui/propertiespalette_image.cpp (Revision 25541)
+++ scribus/ui/propertiespalette_image.cpp (Arbeitskopie)
@@ -621,6 +621,7 @@
{
m_item->setImageScalingMode(freeScale->isChecked(), cbProportional->isChecked());
m_doc->changed();
+ m_doc->changedPagePreview();
emit UpdtGui(PageItem::ImageFrame);
}
}
@@ -730,6 +731,7 @@
return;
m_ScMW->view->editExtendedImageProperties();
m_doc->changed();
+ m_doc->changedPagePreview();
}
void PropertiesPalette_Image::handleImagePageNumber()
Index: scribus/ui/propertiespalette_shape.cpp
===================================================================
--- scribus/ui/propertiespalette_shape.cpp (Revision 25541)
+++ scribus/ui/propertiespalette_shape.cpp (Arbeitskopie)
@@ -395,6 +395,7 @@
mode = PageItem::TextFlowUsesImageClipping;
m_item->setTextFlowMode(mode);
m_doc->changed();
+ m_doc->changedPagePreview();
m_doc->invalidateAll();
m_doc->regionsChanged()->update(QRect());
}
@@ -429,6 +430,7 @@
connect(m_ScMW->nodePalette, SIGNAL(paletteClosed()), this, SLOT(handleShapeEditEnded()));
}
m_doc->changed();
+ m_doc->changedPagePreview();
}
}
@@ -453,6 +455,7 @@
m_item->setCornerRadius(roundRect->value() / m_unitRatio);
m_doc->setFrameRounded();
m_doc->changed();
+ m_doc->changedPagePreview();
//called from setFrameRounded already!
m_doc->regionsChanged()->update(QRect());
m_item->update();
Index: scribus/ui/propertiespalette_xyz.cpp
===================================================================
--- scribus/ui/propertiespalette_xyz.cpp (Revision 25541)
+++ scribus/ui/propertiespalette_xyz.cpp (Arbeitskopie)
@@ -811,6 +811,7 @@
}
m_doc->regionsChanged()->update(QRect());
m_doc->changed();
+ m_doc->changedPagePreview();
}
void PropertiesPalette_XYZ::handleNewY()
@@ -909,6 +910,7 @@
}
m_doc->regionsChanged()->update(QRect());
m_doc->changed();
+ m_doc->changedPagePreview();
}
void PropertiesPalette_XYZ::handleNewW()
@@ -991,6 +993,7 @@
m_doc->changed();
m_doc->regionsChanged()->update(QRect());
m_ScMW->setStatusBarTextSelectedItemInfo();
+ m_doc->changedPagePreview();
}
void PropertiesPalette_XYZ::handleNewH()
@@ -1073,6 +1076,7 @@
m_doc->changed();
m_doc->regionsChanged()->update(QRect());
m_ScMW->setStatusBarTextSelectedItemInfo();
+ m_doc->changedPagePreview();
}
void PropertiesPalette_XYZ::handleRotation()
@@ -1099,6 +1103,7 @@
}
m_doc->changed();
m_doc->regionsChanged()->update(QRect());
+ m_doc->changedPagePreview();
m_oldRotation = rotationSpin->value();
basePointWidget->setAngle(m_oldRotation);
}
@@ -1130,6 +1135,7 @@
}
m_doc->changed();
m_doc->regionsChanged()->update(QRect());
+ m_doc->changedPagePreview();
m_oldRotation = rotationSpin->value();
basePointWidget->setAngle(m_oldRotation);
}
@@ -1161,6 +1167,7 @@
}
m_doc->changed();
m_doc->regionsChanged()->update(QRect());
+ m_doc->changedPagePreview();
m_oldRotation = rotationSpin->value();
basePointWidget->setAngle(m_oldRotation);
}
Index: scribus/ui/smcellstyle.cpp
===================================================================
--- scribus/ui/smcellstyle.cpp (Revision 25541)
+++ scribus/ui/smcellstyle.cpp (Arbeitskopie)
@@ -210,6 +210,7 @@
//m_doc->scMW()->requestUpdate(reqTextStylesUpdate);
m_doc->changed();
+ m_doc->changedPagePreview();
}
void SMCellStyle::editMode(bool isOn)
Index: scribus/ui/smlinestyle.cpp
===================================================================
--- scribus/ui/smlinestyle.cpp (Revision 25541)
+++ scribus/ui/smlinestyle.cpp (Arbeitskopie)
@@ -286,6 +286,7 @@
}
}
m_doc->changed();
+ m_doc->changedPagePreview();
m_doc->scMW()->requestUpdate(reqLineStylesUpdate);
// Better not call DrawNew() here, as this will cause several unnecessary calls
// m_doc->view()->DrawNew();
Index: scribus/ui/smtablestyle.cpp
===================================================================
--- scribus/ui/smtablestyle.cpp (Revision 25541)
+++ scribus/ui/smtablestyle.cpp (Arbeitskopie)
@@ -210,6 +210,7 @@
//m_doc->scMW()->requestUpdate(reqTextStylesUpdate);
m_doc->changed();
+ m_doc->changedPagePreview();
}
void SMTableStyle::editMode(bool isOn)
Index: scribus/ui/smtextstyles.cpp
===================================================================
--- scribus/ui/smtextstyles.cpp (Revision 25541)
+++ scribus/ui/smtextstyles.cpp (Arbeitskopie)
@@ -285,6 +285,7 @@
// Better not call DrawNew() here, as this will cause several unnecessary calls
// m_doc->view()->DrawNew();
m_doc->changed();
+ m_doc->changedPagePreview();
}
void SMParagraphStyle::editMode(bool isOn)
@@ -2076,6 +2077,7 @@
m_doc->scMW()->requestUpdate(reqTextStylesUpdate);
m_doc->changed();
+ m_doc->changedPagePreview();
}
void SMCharacterStyle::editMode(bool isOn)
Index: scribus/util.cpp
===================================================================
--- scribus/util.cpp (Revision 25541)
+++ scribus/util.cpp (Arbeitskopie)
@@ -1348,3 +1348,8 @@
}
return QChar::Null;
}
+
+bool inRange(unsigned min, unsigned value, unsigned max)
+{
+ return (min <= value && value <= max);
+}
Index: scribus/util.h
===================================================================
--- scribus/util.h (Revision 25541)
+++ scribus/util.h (Arbeitskopie)
@@ -204,4 +204,12 @@
*/
void SCRIBUS_API getUniqueName(QString &name, const QStringList& list, const QString& separator = QString(), bool prepend = false);
+/*!
+ * \brief inRange check if value is in range of min and max
+ * \param min
+ * \param value
+ * \param max
+ */
+bool SCRIBUS_API inRange(unsigned min, unsigned value, unsigned max);
+
#endif
|