瀏覽代碼

Some work on header footer parms

Antialize 16 年之前
父節點
當前提交
516dae5728
共有 3 個文件被更改,包括 46 次插入56 次删除
  1. 23 1
      src/outline.cc
  2. 20 40
      src/pageconverter.cc
  3. 3 15
      src/pageconverter_p.hh

+ 23 - 1
src/outline.cc

@@ -25,6 +25,10 @@
   \class OutlineItem
   \brief Class describing an item in the outline
 */
+
+/*!
+  \brief Recursivily delete the subtree
+*/
 OutlineItem::~OutlineItem() {
 	foreach (OutlineItem * i, children)
 		delete i;
@@ -128,7 +132,25 @@ void Outline::addWebPage(const QString & name, QWebPrinter & wp, QWebFrame * fra
   \param parms The structure to fill
  */
 void Outline::fillHeaderFooterParms(int page, QHash<QString, QString> & parms) {
-	#warning "IMPLEMENT ME"
+	int off = d->settings.pageOffset;
+	parms["frompage"] = QString::number(off);
+	parms["topage"] = QString::number(off+d->pageCount-1);
+	parms["page" ] = QString::number(page+off);
+	parms["webpage"] = "foobar";
+
+//  	QString sec[TocPrinter::levels];
+// 	for (uint i=0; i < TocPrinter::levels; ++i) {
+// 		QMap<int, TocItem*>::const_iterator j = tocPrinter.page2sectionslow[i].find(pageNum);
+// 		if (j == tocPrinter.page2sectionslow[i].end()) {
+// 			j = tocPrinter.page2sectionshigh[i].upperBound(pageNum);
+// 			--j;
+// 			if (j == tocPrinter.page2sectionshigh[i].end()) continue;
+// 		}
+// 		sec[i] = j.value()->value;
+// 	}
+// 	res["section"] = sec[0];
+// 	res["subsection"] = sec[1];
+// 	res["subsubsection"] = sec[2];
 }
 
 /*!

+ 20 - 40
src/pageconverter.cc

@@ -254,10 +254,14 @@ void PageConverterPrivate::preparePrint(bool ok) {
 		for(int d=0; d < pages.size(); ++d) {
 			if (!settings.cover.isEmpty() && d == 0) continue;
 			for(int p=0; p < pageCount[d]; ++p) {
+
+				QHash<QString, QString> parms;
+				outline->fillHeaderFooterParms(page, parms);
+
 				if(!settings.header.htmlUrl.isEmpty())
-					headers.push_back(loadHeaderFooter(settings.header.htmlUrl, d, page) );
+					headers.push_back(loadHeaderFooter(settings.header.htmlUrl, parms) );
 				if(!settings.footer.htmlUrl.isEmpty())
-					footers.push_back(loadHeaderFooter(settings.footer.htmlUrl, d, page) );
+					footers.push_back(loadHeaderFooter(settings.footer.htmlUrl, parms) );
 				++page;
 			}
 		}
@@ -279,6 +283,10 @@ void PageConverterPrivate::beginPage(int & actualPage, bool & first) {
 
 void PageConverterPrivate::endPage(bool actual, bool hasHeaderFooter) {
 	if(hasHeaderFooter && actual) {
+
+		QHash<QString, QString> parms;
+		outline->fillHeaderFooterParms(logicalPage, parms);
+
 		//Webkit used all kinds of crasy cordinate transformation, and font setup
 		//We save it here and restore some sane defaults
 		painter->save();
@@ -294,9 +302,9 @@ void PageConverterPrivate::endPage(bool actual, bool hasHeaderFooter) {
 		int dy = painter->boundingRect(0, 0, w, h, Qt::AlignTop, "M").height();
 		//Draw the header text
 		QRect r=QRect(0, 0-dy, w, h);
-		painter->drawText(r, Qt::AlignTop | Qt::AlignLeft, hfreplace(settings.header.left));
-		painter->drawText(r, Qt::AlignTop | Qt::AlignHCenter, hfreplace(settings.header.center));
-		painter->drawText(r, Qt::AlignTop | Qt::AlignRight, hfreplace(settings.header.right));
+		painter->drawText(r, Qt::AlignTop | Qt::AlignLeft, hfreplace(settings.header.left, parms));
+		painter->drawText(r, Qt::AlignTop | Qt::AlignHCenter, hfreplace(settings.header.center, parms));
+		painter->drawText(r, Qt::AlignTop | Qt::AlignRight, hfreplace(settings.header.right, parms));
 		
 		//IF needed draw the footer line
 		if (settings.footer.line) painter->drawLine(0, h, w, h);
@@ -305,9 +313,9 @@ void PageConverterPrivate::endPage(bool actual, bool hasHeaderFooter) {
 		dy = painter->boundingRect(0, 0, w, h, Qt::AlignTop, "M").height();
 		//Draw the fooder text
 		r=QRect(0,0,w,h+dy);
-		painter->drawText(r, Qt::AlignBottom | Qt::AlignLeft, hfreplace(settings.footer.left));
-		painter->drawText(r, Qt::AlignBottom | Qt::AlignHCenter, hfreplace(settings.footer.center));
-		painter->drawText(r, Qt::AlignBottom | Qt::AlignRight, hfreplace(settings.footer.right));
+		painter->drawText(r, Qt::AlignBottom | Qt::AlignLeft, hfreplace(settings.footer.left, parms));
+		painter->drawText(r, Qt::AlignBottom | Qt::AlignHCenter, hfreplace(settings.footer.center, parms));
+		painter->drawText(r, Qt::AlignBottom | Qt::AlignRight, hfreplace(settings.footer.right, parms));
 		
 		//Restore webkits crasy scaling and font settings
 		painter->restore();
@@ -499,11 +507,10 @@ void PageConverterPrivate::printPage(bool ok) {
 }
 
 
-QWebPage * PageConverterPrivate::loadHeaderFooter(QString url, int d, int page) {
+QWebPage * PageConverterPrivate::loadHeaderFooter(QString url, const QHash<QString, QString> & parms) {
 	QUrl u = MultiPageLoader::guessUrlFromString(url);
 
-	QHash<QString, QString> values = calculateHeaderFooterParams(d, page);
-	for(QHash<QString, QString>::iterator i=values.begin(); i != values.end(); ++i)
+	for(QHash<QString, QString>::const_iterator i=parms.begin(); i != parms.end(); ++i)
 		u.addQueryItem(i.key(), i.value());
 	
 	return hfLoader.addResource(u);
@@ -513,10 +520,9 @@ QWebPage * PageConverterPrivate::loadHeaderFooter(QString url, int d, int page)
  * Replace some variabels in a string used in a header or fooder
  * \param q the string to substitute in
  */
-QString PageConverterPrivate::hfreplace(const QString & q) {
-	QHash<QString, QString> values = calculateHeaderFooterParams(1,1);
+QString PageConverterPrivate::hfreplace(const QString & q, const QHash<QString, QString> & parms) {
 	QString r=q;
-	for(QHash<QString, QString>::iterator i=values.begin(); i != values.end(); ++i)
+	for(QHash<QString, QString>::const_iterator i=parms.begin(); i != parms.end(); ++i)
 		r=r.replace("["+i.key()+"]", i.value(), Qt::CaseInsensitive);
 	return r;
 }
@@ -534,32 +540,6 @@ void PageConverterPrivate::cancel() {
 
 }
 
-
-QHash<QString, QString> PageConverterPrivate::calculateHeaderFooterParams(int d, int page) {
-	QHash<QString, QString> res;
-	
-// 	res["frompage"] = QString::number(page_offset);
-// 	res["topage"] = QString::number(page_offset+logicalPages-1);
-// 	res["page"] = QString::number(logicalPage);
-// 	res["webpage"] = "foobar";
-	
-//  	QString sec[TocPrinter::levels];
-// 	for (uint i=0; i < TocPrinter::levels; ++i) {
-// 		QMap<int, TocItem*>::const_iterator j = tocPrinter.page2sectionslow[i].find(pageNum);
-// 		if (j == tocPrinter.page2sectionslow[i].end()) {
-// 			j = tocPrinter.page2sectionshigh[i].upperBound(pageNum);
-// 			--j;
-// 			if (j == tocPrinter.page2sectionshigh[i].end()) continue;
-// 		}
-// 		sec[i] = j.value()->value;
-// 	}
-// 	res["section"] = sec[0];
-// 	res["subsection"] = sec[1];
-// 	res["subsubsection"] = sec[2];
-	return res;
-}
-
-
 /*!
   \class PageConverter
   \brief Class responsible for converting html pages to pdf

+ 3 - 15
src/pageconverter_p.hh

@@ -50,12 +50,6 @@ private:
 
 	TempFile tempOut;
 	
-// 	int networkError;
-// 	int loginTry;
-//	QNetworkAccessManager networkAccessManager;
-	//!Keep track of the numer of pages loading
-//	QAtomicInt loading; 
-//	QList<QString> temporaryFiles;
 	QList<QWebPage *> pages;
 	QPrinter * printer;
 	QPainter * painter;
@@ -70,7 +64,6 @@ private:
 
 	bool convertionDone;
 
-	QHash<QString, QString> calculateHeaderFooterParams(int d, int page);
 	QHash<int, QHash<QString, QWebElement> > anchors;
 	QHash<int, QVector< QPair<QWebElement,QString> > > localLinks;
 	QHash<int, QVector< QPair<QWebElement,QString> > > externalLinks;
@@ -80,17 +73,12 @@ private:
 
 	void beginPage(int & actualPage, bool & first);
 	void endPage(bool actual, bool hasHeaderFooter);
-	QString hfreplace(const QString & q);
-	QWebPage * loadHeaderFooter(QString url, int d, int page);
+	QString hfreplace(const QString & q, const QHash<QString, QString> & parms);
+	QWebPage * loadHeaderFooter(QString url, const QHash<QString, QString> & parms);
 public slots:
 	void loadProgress(int progress);
 	
-	// void amfinished(QNetworkReply * r);
-// 	void authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator);
-// 	void loadFinished(bool ok);
-// 	void loadStarted();
-// 	void loadProgress(int progress);
-// 	void sslErrors(QNetworkReply *reply, const QList<QSslError> &);
+
 	void preparePrint(bool ok);
 	void printPage(bool ok);
 	void beginConvert();