Rev 23129 |
Rev 23200 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/
#include <QApplication>
#include <QBitmap>
#include <QCursor>
#include <QDrag>
#include <QEvent>
#include <QHeaderView>
#include <QLabel>
#include <QList>
#include <QMenu>
#include <QMimeData>
#include <QMessageBox>
#include <QPainter>
#include "commonstrings.h"
#include "iconmanager.h"
#include "pagelayout.h"
#include "pagepalette_pages.h"
#include "pagepalette_widgets.h"
#include "sccombobox.h"
#include "scpage.h"
#include "scribuscore.h"
#include "scribusdoc.h"
#include "scribusview.h"
PagePalette_Pages::PagePalette_Pages(QWidget* parent) : QWidget(parent)
{
m_scMW = ScCore->primaryMainWindow();
setupUi(this);
setSizePolicy( QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
masterPageList->setMinimumSize(QSize(130,70));
masterPageList->m_thumb = false;
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));
pageView->setMinimumSize(QSize(130,120));
trash->setMinimumSize(QSize(32,32));
trash->setMaximumSize(QSize(32,32));
pix = IconManager::instance().loadPixmap("32/page-simple.png");
currView = nullptr;
Rebuild();
languageChange();
connect(masterPageList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(selMasterPage()));
connect(masterPageList, SIGNAL(thumbnailChanged()), this, SLOT(rebuildMasters()));
connect(masterPageList, SIGNAL(DelMaster(QString)), this, SLOT(deleteMasterPage(QString)));
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(DelPage(int)) , m_scMW, SLOT(deletePage2(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(DelPage(int)) , m_scMW, SLOT(deletePage2(int)));
connect(trash , SIGNAL(DelMaster(QString)) , this, SLOT(deleteMasterPage(QString)));
connect(this, SIGNAL(gotoPage(int)) , m_scMW, SLOT(selectPagesFromOutlines(int)));
}
void PagePalette_Pages::deleteMasterPage(const QString& tmp)
{
if (tmp == CommonStrings::trMasterPageNormal)
return;
QString extraWarn = "";
for (int i=0; i < currView->Doc->DocPages.count(); ++i )
{
if (currView->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
if (exit == QMessageBox::Yes)
{
bool oldMPMode = currView->Doc->masterPageMode();
int storedPageNum = currView->Doc->currentPageNumber();
int storedViewXCoor = currView->horizontalScrollBar()->value();
int storedViewYCoor = currView->verticalScrollBar()->value();
currView->Doc->setMasterPageMode(true);
currView->Doc->scMW()->deletePage2(currView->Doc->MasterNames[tmp]);
//<<CB TODO Move back into ScribusDoc::deleteMasterPage();
//This must happen after the pages have been reformed (view/doc)
currView->Doc->rebuildMasterNames();
// Fix up any pages that refer to the deleted master page
currView->Doc->replaceMasterPage(tmp);
currView->Doc->setMasterPageMode(oldMPMode);
currView->Doc->setModified(true);
currView->Doc->setCurrentPage(currView->Doc->DocPages.at(storedPageNum));
currView->reformPages(false);
currView->setContentsPos(storedViewXCoor, storedViewYCoor);
currView->DrawNew();
}
}
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));
}
void PagePalette_Pages::pageView_movePage(int r, int c)
{
if (r == c || r == pageView->m_pageCount - 1)
return;
if (c >= pageView->m_pageCount)
currView->Doc->movePage(r, r + 1, c, 2);
else
currView->Doc->movePage(r, r + 1, c, 0);
currView->reformPages();
rebuildPages();
currView->DrawNew();
}
void PagePalette_Pages::pageView_gotoPage(int r, int c, int b)
{
if ((b == Qt::LeftButton) && (r != -1) && (c != -1))
{
int p;
bool dummy;
p = pageView->getPage(r, c, &dummy);
emit gotoPage(p);
}
}
void PagePalette_Pages::enablePalette(const bool enabled)
{
pageView->setEnabled(enabled);
masterPageList->setEnabled(enabled);
pageLayout->setEnabled(enabled);
}
void PagePalette_Pages::handlePageLayout(int layout)
{
pageLayout->selectFirstP(currView->Doc->pageSets()[layout].FirstPage);
currView->Doc->resetPage(layout);
currView->reformPages();
currView->DrawNew();
currView->GotoPage(currView->Doc->currentPageNumber());
rebuildPages();
}
void PagePalette_Pages::handleFirstPage(int fp)
{
currView->Doc->setPageSetFirstPage(currView->Doc->pagePositioning(), fp);
currView->reformPages();
currView->DrawNew();
currView->GotoPage(currView->Doc->currentPageNumber());
rebuildPages();
}
void PagePalette_Pages::rebuildMasters()
{
if (m_scMW->scriptIsRunning())
return;
masterPageList->clear();
if (currView == nullptr)
return;
QPixmap pm;
QListWidgetItem* item;
QMap<QString,int>::Iterator it;
for (it = currView->Doc->MasterNames.begin(); it != currView->Doc->MasterNames.end(); ++it)
{
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
item = new QListWidgetItem(pageLabel, masterPageList);
item->setData(Qt::UserRole, pageName);
}
}
void PagePalette_Pages::rebuildPages()
{
if (m_scMW->scriptIsRunning())
return;
QString str;
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);
if (currView == nullptr)
{
connect(pageLayout, SIGNAL(selectedLayout(int)), this, SLOT(handlePageLayout(int)));
connect(pageLayout, SIGNAL(selectedFirstPage(int)), this, SLOT(handleFirstPage(int)));
return;
}
pageLayout->updateLayoutSelector(currView->Doc->pageSets());
pageLayout->selectItem(currView->Doc->pagePositioning());
pageLayout->firstPage->setCurrentIndex(currView->Doc->pageSets()[currView->Doc->pagePositioning()].FirstPage);
pageView->m_pageCount = currView->Doc->DocPages.count();
int counter = currView->Doc->pageSets()[currView->Doc->pagePositioning()].FirstPage;
int cols = currView->Doc->pageSets()[currView->Doc->pagePositioning()].Columns;
int rows = (currView->Doc->DocPages.count()+counter) / currView->Doc->pageSets()[currView->Doc->pagePositioning()].Columns;
if (((currView->Doc->DocPages.count()+counter) % currView->Doc->pageSets()[currView->Doc->pagePositioning()].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 rr = 0; rr < pageView->rowCount(); rr++)
{
for (int cc = 0; cc < pageView->columnCount(); cc++)
{
QTableWidgetItem *tW = new QTableWidgetItem(1001);
tW->setFlags(Qt::ItemIsEnabled);
pageView->setItem(rr, cc, tW);
}
}
pageView->m_coladd = coladd;
pageView->m_colmult = colmult;
pageView->m_rowadd = rowadd;
pageView->m_rowmult = rowmult;
pageView->m_firstPage = counter;
pageView->m_cols = currView->Doc->pageSets()[currView->Doc->pagePositioning()].Columns;
pageList.clear();
for (int a = 0; a < currView->Doc->DocPages.count(); ++a)
{
str = currView->Doc->DocPages.at(a)->masterPageName();
SeItem *it = new SeItem(str, a, createIcon(a, str, pix));
pageList.append(it);
pageView->setItem(rowcounter*rowmult+rowadd, counter*colmult+coladd, (QTableWidgetItem *)it);
pageView->setColumnWidth(counter*colmult+coladd, pix.width());
if (cols == 1)
{
pageView->setRowHeight(rowcounter*rowmult, 10);
pageView->setRowHeight(rowcounter*rowmult+rowadd, pix.height());
}
else
pageView->setRowHeight(rowcounter*rowmult+rowadd, pix.height()+5);
counter++;
if (counter > currView->Doc->pageSets()[currView->Doc->pagePositioning()].Columns-1)
{
counter = 0;
rowcounter++;
}
}
pageView->setRowHeight(pageView->rowCount()-1, 10);
counter = 0;
if (cols != 1)
{
for (int c = 0; c < pageView->columnCount(); ++c)
{
if ((counter % 2) == 0)
pageView->setColumnWidth(counter, 10);
else
pageView->setColumnWidth(counter, pix.width());
counter++;
}
}
pageView->repaint();
if (currView != nullptr)
markPage(currView->Doc->currentPageNumber());
connect(pageLayout, SIGNAL(selectedLayout(int)), this, SLOT(handlePageLayout(int)));
connect(pageLayout, SIGNAL(selectedFirstPage(int)), this, SLOT(handleFirstPage(int)));
}
void PagePalette_Pages::Rebuild()
{
rebuildMasters();
rebuildPages();
enablePalette(currView != nullptr);
}
void PagePalette_Pages::markPage(uint nr)
{
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;
}
}
}
void PagePalette_Pages::setView(ScribusView *view)
{
if (m_scMW->scriptIsRunning())
return;
currView = view;
}
void PagePalette_Pages::selMasterPage()
{
if (masterPageList->m_currItem == nullptr)
return;
QVariant pageVar = masterPageList->m_currItem->data(Qt::UserRole);
emit gotoMasterPage(pageVar.toString());
}
QPixmap PagePalette_Pages::createIcon(int nr, QString masterPage, const QPixmap& pixin)
{
QPainter p;
// Necessary on windows to ensure the pixmap is drawable
QPixmap ret(pixin.width(), pixin.height()); // Qt4, pixin.depth());
if (p.begin(&ret))
{
p.drawPixmap( 0, 0, pixin );
// if( !pixin.mask().isNull() )
// ret.setMask( pixin.mask() );
p.setBrush(Qt::white);
p.setBackground(Qt::white);
p.setBackgroundMode(Qt::OpaqueMode);
p.setPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
//p.setFont(QFont("Helvetica", 12, QFont::Bold));
//QString tmp = tmp.setNum(nr+1);
QString tmp(currView->Doc->getSectionPageNumberForPageIndex(nr));
if (tmp.isEmpty())
tmp = tmp.setNum(nr+1);
QRegExp Exp ("([A-Z]*[0-9]*)( *[\\.|\\-|_] *)(.*)");
if (Exp.indexIn(masterPage) != -1)
masterPage = Exp.cap(1);
QRect d = QRect(0, 0, ret.width(), ret.height());
// p.fillRect(d.adjusted(-1, -1, -1, -1), color);
p.setFont(QFont("Helvetica", 7, QFont::Normal));
p.drawText(d, Qt::AlignCenter, tmp+"\n"+masterPage);
p.end();
if( !pixin.mask().isNull() )
ret.setMask( pixin.mask() );
}
return ret;
}
void PagePalette_Pages::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange)
{
languageChange();
return;
}
QWidget::changeEvent(e);
}
void PagePalette_Pages::languageChange()
{
retranslateUi(this);
}