1
0
Эх сурвалжийг харах

Scroll QWebView without ID anchors

Kandrashin Denis 13 жил өмнө
parent
commit
a7b2e505e5

+ 1 - 25
source/fb2read.cpp

@@ -174,12 +174,6 @@ FB2_BEGIN_KEYHASH(Fb2ReadHandler::DescrHandler)
     FB2_KEY( Custom   , "custom-info"   );
 FB2_END_KEYHASH
 
-Fb2ReadHandler::DescrHandler::DescrHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
-    : HeadHandler(owner, name, atts)
-{
-    writer().writeAttribute("id", m_owner.newId());
-}
-
 Fb2XmlHandler::NodeHandler * Fb2ReadHandler::DescrHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 {
     Q_UNUSED(atts);
@@ -199,12 +193,6 @@ Fb2XmlHandler::NodeHandler * Fb2ReadHandler::DescrHandler::NewTag(const QString
 //  Fb2ReadHandler::TitleHandler
 //---------------------------------------------------------------------------
 
-Fb2ReadHandler::TitleHandler::TitleHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
-    : HeadHandler(owner, name, atts)
-{
-    writer().writeAttribute("id", m_owner.newId());
-}
-
 Fb2XmlHandler::NodeHandler * Fb2ReadHandler::TitleHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 {
     if (name == "annotation") return new TextHandler(m_owner, name, atts, "div", name);
@@ -267,13 +255,8 @@ void Fb2ReadHandler::TextHandler::Init(const QXmlAttributes &atts)
     if (m_tag.isEmpty()) return;
     writer().writeStartElement(m_tag);
     QString id = Value(atts, "id");
-    if (!id.isEmpty()) {
-        if (m_style == "section" && isNotes()) m_style = "note";
-        writer().writeAttribute("id", id);
-    } else if (m_tag == "div" || m_tag == "img") {
-        writer().writeAttribute("id", m_owner.newId());
-    }
     if (!m_style.isEmpty()) {
+        if (m_style == "section" && !id.isEmpty() && isNotes()) m_style = "note";
         if (m_style == "body" && Value(atts, "name").toLower() == "notes") m_style = "notes";
         writer().writeAttribute("class", m_style);
     }
@@ -373,7 +356,6 @@ Fb2ReadHandler::Fb2ReadHandler(Fb2ReadThread &thread, QXmlStreamWriter &writer)
     : Fb2XmlHandler()
     , m_thread(thread)
     , m_writer(writer)
-    , m_id(0)
 {
     m_writer.setAutoFormatting(true);
     m_writer.setAutoFormattingIndent(2);
@@ -398,9 +380,3 @@ void Fb2ReadHandler::addFile(const QString &name, const QByteArray &data)
 {
     QMetaObject::invokeMethod(m_thread.parent(), "data", Qt::QueuedConnection, Q_ARG(QString, name), Q_ARG(QByteArray, data));
 }
-
-QString Fb2ReadHandler::newId()
-{
-    return QString("FB2E%1").arg(++m_id);
-}
-

+ 4 - 4
source/fb2read.h

@@ -95,7 +95,8 @@ private:
             Custom,
         FB2_END_KEYLIST
     public:
-        explicit DescrHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
+        explicit DescrHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
+            : HeadHandler(owner, name, atts) {}
     protected:
         virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
     };
@@ -103,7 +104,8 @@ private:
     class TitleHandler : public HeadHandler
     {
     public:
-        explicit TitleHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
+        explicit TitleHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
+            : HeadHandler(owner, name, atts) {}
     protected:
         virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
     };
@@ -170,14 +172,12 @@ protected:
 private:
     void addFile(const QString &name, const QByteArray &data);
     QString getFile(const QString &name);
-    QString newId();
 
 private:
     typedef QHash<QString, QString> StringHash;
     Fb2ReadThread &m_thread;
     QXmlStreamWriter &m_writer;
     StringHash m_hash;
-    int m_id;
 };
 
 #endif // FB2READ_H

+ 10 - 5
source/fb2tree.cpp

@@ -8,22 +8,22 @@
 
 Fb2TreeItem::Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent)
     : QObject(parent)
+    , m_element(element)
     , m_parent(parent)
 {
     m_name = element.tagName().toLower();
     QString style = element.attribute("class").toLower();
     if (m_name == "div") {
         if (style == "title") {
-            m_text = element.toPlainText().simplified().left(255);
+            m_text = title(element);
             if (m_parent) m_parent->m_text += m_text += " ";
         } else if (style == "subtitle") {
-            m_text = element.toPlainText().simplified().left(255);
+            m_text = title(element);
         }
         if (!style.isEmpty()) m_name = style;
     } else if (m_name == "img") {
         m_text = element.attribute("alt");
     }
-    m_id = element.attribute("id");
     addChildren(element);
 }
 
@@ -34,6 +34,11 @@ Fb2TreeItem::~Fb2TreeItem()
     }
 }
 
+QString Fb2TreeItem::title(const QWebElement &element)
+{
+    return element.toPlainText().left(255).simplified();
+}
+
 void Fb2TreeItem::addChildren(QWebElement &parent)
 {
     QWebElement child = parent.firstChild();
@@ -154,6 +159,6 @@ QVariant Fb2TreeModel::data(const QModelIndex &index, int role) const
 void Fb2TreeModel::select(const QModelIndex &index)
 {
     Fb2TreeItem *node = item(index);
-    if (!node || node->id().isEmpty()) return;
-    m_view.page()->mainFrame()->scrollToAnchor(node->id());
+    QWebFrame *frame = m_view.page()->mainFrame();
+    if (node) frame->scroll(0, node->pos().y() - frame->scrollPosition().y());
 }

+ 6 - 5
source/fb2tree.h

@@ -36,23 +36,24 @@ public:
 
     QString text() const;
 
-    const QString & id() const {
-        return m_id;
-    }
-
     const QString & name() const {
         return m_name;
     }
 
+    QPoint pos() const {
+        return m_element.geometry().topLeft();
+    }
+
 private:
+    QString static title(const QWebElement &element);
     void addChildren(QWebElement &parent);
 
 private:
     QList<Fb2TreeItem*> m_list;
+    QWebElement m_element;
     QString m_name;
     QString m_text;
     Fb2TreeItem * m_parent;
-    QString m_id;
 };
 
 class Fb2TreeModel: public QAbstractItemModel