Jelajahi Sumber

Show footnotes

Kandrashin Denis 13 tahun lalu
induk
melakukan
e4da3fb30e
5 mengubah file dengan 55 tambahan dan 21 penghapusan
  1. 1 2
      source/fb2main.cpp
  2. 2 0
      source/fb2utils.h
  3. 49 18
      source/fb2view.cpp
  4. 2 0
      source/fb2view.hpp
  5. 1 1
      source/res/style.css

+ 1 - 2
source/fb2main.cpp

@@ -10,8 +10,7 @@
 #include "fb2tree.hpp"
 #include "fb2view.hpp"
 #include "fb2head.hpp"
-
-#define FB2DELETE(p) { if ( (p) != NULL ) { delete p; p = NULL; } }
+#include "fb2utils.h"
 
 Fb2MainWindow::Fb2MainWindow()
 {

+ 2 - 0
source/fb2utils.h

@@ -3,6 +3,8 @@
 
 #include <QString>
 
+#define FB2DELETE(p) { if ((p) != NULL) { delete (p); (p) = NULL; } }
+
 namespace FB2 {
 
 QString read(const QString &filename);

+ 49 - 18
source/fb2view.cpp

@@ -21,7 +21,6 @@
 Fb2WebPage::Fb2WebPage(QObject *parent)
     : QWebPage(parent)
 {
-    setContentEditable(true);
     QWebSettings *s = settings();
     s->setAttribute(QWebSettings::AutoLoadImages, true);
     s->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
@@ -31,10 +30,6 @@ Fb2WebPage::Fb2WebPage(QObject *parent)
     s->setAttribute(QWebSettings::PluginsEnabled, false);
     s->setAttribute(QWebSettings::ZoomTextOnly, true);
     s->setUserStyleSheetUrl(QUrl::fromLocalFile(":style.css"));
-
-//    Fb2NetworkDiskCache * cache = new Fb2NetworkDiskCache(this);
-//    cache->setCacheDirectory("/home/user/tmp/");
-//    networkAccessManager()->setCache(cache);
 }
 
 bool Fb2WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)
@@ -54,16 +49,30 @@ bool Fb2WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest
 
 Fb2WebView::Fb2WebView(QWidget *parent)
     : Fb2BaseWebView(parent)
+    , m_noteView(0)
     , m_thread(0)
 {
     setPage(new Fb2WebPage(this));
     page()->setNetworkAccessManager(new Fb2NetworkAccessManager(*this));
+    page()->setContentEditable(true);
     connect(page(), SIGNAL(contentsChanged()), this, SLOT(fixContents()));
     connect(page(), SIGNAL(linkHovered(QString,QString,QString)), this, SLOT(linkHovered(QString,QString,QString)));
 }
 
 Fb2WebView::~Fb2WebView()
 {
+    FB2DELETE(m_noteView);
+}
+
+QWebView * Fb2WebView::noteView()
+{
+    if (m_noteView) return m_noteView;
+    m_noteView = new QWebView(qobject_cast<QWidget*>(parent()));
+    m_noteView->setPage(new Fb2WebPage(this));
+    m_noteView->page()->setNetworkAccessManager(page()->networkAccessManager());
+    m_noteView->page()->setContentEditable(false);
+    m_noteView->setGeometry(QRect(100, 100, 400, 200));
+    return m_noteView;
 }
 
 QWebElement Fb2WebView::doc()
@@ -91,25 +100,47 @@ void Fb2WebView::linkHovered(const QString &link, const QString &title, const QS
 {
     Q_UNUSED(title);
     Q_UNUSED(textContent);
-    QToolTip::showText(QPoint(100, 100), link);
     QUrl url = link;
+
+    if (link.isEmpty()) {
+        if (m_noteView) m_noteView->hide();
+        return;
+    }
+
     const QString href = url.fragment();
     QString query = QString("DIV[id=%1]").arg(href);
 
     QWebElement element = doc().findFirst(query);
     if (element.isNull()) return;
-
-    QRect rect = element.geometry();
-    QImage image(rect.size(), QImage::Format_ARGB32);
-    QPainter painter(&image);
-    painter.fillRect(rect, QColor("white"));
-    element.render(&painter);
-    painter.end();
-
-    QLabel * label = new QLabel();
-    label->setPixmap(QPixmap::fromImage(image));
-//    label->setText(element.toOuterXml());
-    label->show();
+    QRect geometry = element.geometry();
+/*
+    QWebView * view = noteView();
+    QString html = element.toOuterXml();
+    element = element.parent();
+    while (!element.isNull()) {
+        QString tag = element.tagName();
+        QString id = element.attribute("id");
+        QString name = element.attribute("name");
+        QString style = element.attribute("class");
+        html.prepend(QString(">"));
+        if (!id.isEmpty()) html.prepend(QString(" id=%1").arg(id));
+        if (!name.isEmpty()) html.prepend(QString(" name=%1").arg(name));
+        if (!style.isEmpty()) html.prepend(QString(" class=%1").arg(style));
+        html.prepend(QString("<%1").arg(tag));
+        html.append(QString("</%1>").arg(tag));
+        element = element.parent();
+    }
+*/
+    QWebView * view = noteView();
+    QString html = element.toOuterXml();
+    html.prepend("<html><body><div class=body name=notes>");
+    html.append("</div></body></html>");
+    QRect rect = view->geometry();
+    rect.setHeight(geometry.height() * 3 * 2 + 4);
+    rect.setWidth(geometry.width() / 2 + 4);
+    view->setHtml(html);
+    view->setGeometry(rect);
+    view->show();
 }
 
 void Fb2WebView::load(const QString &filename, const QString &xml)

+ 2 - 0
source/fb2view.hpp

@@ -96,10 +96,12 @@ private slots:
 private:
     void execCommand(const QString &cmd, const QString &arg);
     Fb2TemporaryFile * file(const QString &name);
+    QWebView * noteView();
     QWebElement doc();
 
 private:
     Fb2TemporaryList m_files;
+    QWebView *m_noteView;
     QThread *m_thread;
 };
 

+ 1 - 1
source/res/style.css

@@ -91,7 +91,7 @@ div.poem p {
 div.body[name=notes] {
   border-top: none;
   border-bottom: none;
-  border-left: thin solid green;
+  border-left: none;
   border-right: none;
   padding-top: 0;
   padding-bottom: 0;