Explorar o código

SHow document tree

Kandrashin Denis %!s(int64=13) %!d(string=hai) anos
pai
achega
71dc4774b7
Modificáronse 4 ficheiros con 82 adicións e 27 borrados
  1. 32 20
      source/fb2main.cpp
  2. 2 0
      source/fb2main.h
  3. 41 5
      source/fb2tree.cpp
  4. 7 2
      source/fb2tree.h

+ 32 - 20
source/fb2main.cpp

@@ -17,6 +17,7 @@ Fb2MainWindow::Fb2MainWindow()
     init();
     setCurrentFile();
     createText();
+    createTree();
 }
 
 Fb2MainWindow::Fb2MainWindow(const QString &filename, ViewMode mode)
@@ -25,6 +26,7 @@ Fb2MainWindow::Fb2MainWindow(const QString &filename, ViewMode mode)
     setCurrentFile(filename);
     if (mode == FB2) {
         createText();
+        createTree();
         textEdit->load(filename);
     } else {
         createQsci();
@@ -161,21 +163,7 @@ void Fb2MainWindow::fileOpen()
         }
     }
 }
-/*
-void Fb2MainWindow::sendDocument()
-{
-    treeView = new QTreeView(this);
-    treeView->setModel(new Fb2TreeModel(*textEdit));
-    treeView->setHeaderHidden(true);
-    connect(treeView, SIGNAL(activated(QModelIndex)), SLOT(treeActivated(QModelIndex)));
-    connect(treeView, SIGNAL(destroyed()), SLOT(treeDestroyed()));
-    QDockWidget * dock = new QDockWidget(tr("Contents"), this);
-    dock->setAttribute(Qt::WA_DeleteOnClose);
-    dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
-    dock->setWidget(treeView);
-    addDockWidget(Qt::LeftDockWidgetArea, dock);
-}
-*/
+
 bool Fb2MainWindow::fileSave()
 {
     if (isUntitled) {
@@ -395,21 +383,36 @@ void Fb2MainWindow::createActions()
     menu->addAction(act);
 }
 
+void Fb2MainWindow::createTree()
+{
+    if (treeView) return;
+    treeView = new QTreeView(this);
+    treeView->setHeaderHidden(true);
+    connect(treeView, SIGNAL(activated(QModelIndex)), SLOT(treeActivated(QModelIndex)));
+    connect(treeView, SIGNAL(destroyed()), SLOT(treeDestroyed()));
+    QDockWidget * dock = new QDockWidget(tr("Contents"), this);
+    dock->setAttribute(Qt::WA_DeleteOnClose);
+    dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
+    dock->setWidget(treeView);
+    addDockWidget(Qt::LeftDockWidgetArea, dock);
+}
+
 void Fb2MainWindow::createText()
 {
+    if (textEdit) return;
     textEdit = new Fb2WebView(this);
     setCentralWidget(textEdit);
     textEdit->setFocus();
 
-    connect(textEdit->page(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));
-    connect(textEdit, SIGNAL(selectionChanged()), this, SLOT(selectionChanged()));
+    connect(textEdit->page(), SIGNAL(contentsChanged()), SLOT(documentWasModified()));
+    connect(textEdit, SIGNAL(selectionChanged()), SLOT(selectionChanged()));
+    connect(textEdit, SIGNAL(loadFinished(bool)), SLOT(loadFinished(bool)));
 
+    connect(textEdit->pageAction(QWebPage::Undo), SIGNAL(changed()), SLOT(undoChanged()));
+    connect(textEdit->pageAction(QWebPage::Redo), SIGNAL(changed()), SLOT(redoChanged()));
     connect(actionUndo, SIGNAL(triggered()), textEdit->pageAction(QWebPage::Undo), SIGNAL(triggered()));
     connect(actionRedo, SIGNAL(triggered()), textEdit->pageAction(QWebPage::Redo), SIGNAL(triggered()));
 
-    connect(textEdit->pageAction(QWebPage::Undo), SIGNAL(changed()), this, SLOT(undoChanged()));
-    connect(textEdit->pageAction(QWebPage::Redo), SIGNAL(changed()), this, SLOT(redoChanged()));
-
     connect(actionCut, SIGNAL(triggered()), textEdit->pageAction(QWebPage::Cut), SIGNAL(triggered()));
     connect(actionCopy, SIGNAL(triggered()), textEdit->pageAction(QWebPage::Copy), SIGNAL(triggered()));
     connect(actionPaste, SIGNAL(triggered()), textEdit->pageAction(QWebPage::Paste), SIGNAL(triggered()));
@@ -425,6 +428,11 @@ void Fb2MainWindow::createText()
     connect(actionZoomOrig, SIGNAL(triggered()), textEdit, SLOT(zoomOrig()));
 }
 
+void Fb2MainWindow::loadFinished(bool ok)
+{
+    if (treeView) treeView->setModel(new Fb2TreeModel(*textEdit));
+}
+
 void Fb2MainWindow::selectionChanged()
 {
     actionCut->setEnabled(textEdit->CutEnabled());
@@ -435,6 +443,9 @@ void Fb2MainWindow::selectionChanged()
     actionTextStrike->setChecked(textEdit->StrikeChecked());
     actionTextSub->setChecked(textEdit->SubChecked());
     actionTextSup->setChecked(textEdit->SupChecked());
+
+    QString script = "document.getSelection().baseNode.parentNode.tagName";
+    qCritical() << textEdit->page()->mainFrame()->evaluateJavaScript(script).toString();
 }
 
 void Fb2MainWindow::undoChanged()
@@ -452,6 +463,7 @@ void Fb2MainWindow::createQsci()
     //  http://qtcoder.blogspot.com/2010/10/qscintills.html
     //  http://www.riverbankcomputing.co.uk/static/Docs/QScintilla2/classQsciScintilla.html
 
+    if (qsciEdit) return;
     qsciEdit = new QsciScintilla;
     qsciEdit->setUtf8(true);
     qsciEdit->setCaretLineVisible(true);

+ 2 - 0
source/fb2main.h

@@ -47,6 +47,7 @@ private slots:
     void viewText();
 
     void clipboardDataChanged();
+    void loadFinished(bool ok);
     void selectionChanged();
     void undoChanged();
     void redoChanged();
@@ -57,6 +58,7 @@ private:
 
 private:
     void init();
+    void createTree();
     void createText();
     void createQsci();
     void createActions();

+ 41 - 5
source/fb2tree.cpp

@@ -4,6 +4,10 @@
 #include <QTextDocument>
 #include <QTextDocumentFragment>
 #include <QTextFrame>
+#include <QWebElement>
+#include <QWebFrame>
+#include <QWebPage>
+#include <QWebView>
 
 Fb2TreeItem::Fb2TreeItem(QTextFrame *frame, Fb2TreeItem *parent)
     : QObject(parent)
@@ -20,6 +24,29 @@ Fb2TreeItem::Fb2TreeItem(QTextFrame *frame, Fb2TreeItem *parent)
     }
 }
 
+Fb2TreeItem::Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent)
+    : QObject(parent)
+    , m_frame(0)
+    , m_parent(parent)
+    , m_element(element)
+{
+    m_name = element.tagName().toLower();
+    QString style = element.attribute("class").toLower();
+    if (!style.isEmpty()) m_name = style;
+    if (style == "title") {
+        QString text = element.toPlainText().simplified().left(255);
+        if (m_parent) m_parent->m_text = text; else m_text = text;
+    } else if (m_name == "img") {
+        m_text = element.attribute("alt");
+    }
+    QWebElement child = element.firstChild();
+    while (!child.isNull()) {
+        QString tag = child.tagName().toLower();
+        if (tag != "p") m_list << new Fb2TreeItem(child, this);
+        child = child.nextSibling();
+    }
+}
+
 Fb2TreeItem::~Fb2TreeItem()
 {
     foreach (Fb2TreeItem * item, m_list) {
@@ -42,20 +69,27 @@ Fb2TreeItem * Fb2TreeItem::item(int row) const
 
 QString Fb2TreeItem::text() const
 {
-    return tr("<section>") + m_text;
+    return QString("<%1> %2").arg(m_name).arg(m_text);
 }
 
 //---------------------------------------------------------------------------
 //  Fb2TreeModel
 //---------------------------------------------------------------------------
 
-Fb2TreeModel::Fb2TreeModel(QTextEdit &text, QObject *parent)
+Fb2TreeModel::Fb2TreeModel(QWebView &view, QObject *parent)
     : QAbstractItemModel(parent)
-    , m_text(text)
+    , m_view(view)
     , m_root(NULL)
 {
-    if (QTextDocument * doc = text.document()) {
-        m_root = new Fb2TreeItem(doc->rootFrame());
+    QWebElement doc = view.page()->mainFrame()->documentElement();
+    QWebElement child = doc.firstChild();
+    while (!child.isNull()) {
+        if (child.tagName().toLower() == "body") {
+            m_root = new Fb2TreeItem(child);
+            break;
+        } else {
+            child = child.nextSibling();
+        }
     }
 }
 
@@ -118,6 +152,7 @@ QVariant Fb2TreeModel::data(const QModelIndex &index, int role) const
 
 void Fb2TreeModel::select(const QModelIndex &index)
 {
+/*
     Fb2TreeItem * i = item(index);
     if (!i) return;
 
@@ -128,4 +163,5 @@ void Fb2TreeModel::select(const QModelIndex &index)
     cursor.setPosition(f->firstPosition());
     m_text.moveCursor(QTextCursor::End);
     m_text.setTextCursor(cursor);
+*/
 }

+ 7 - 2
source/fb2tree.h

@@ -3,6 +3,8 @@
 
 #include <QAbstractItemModel>
 #include <QTextEdit>
+#include <QWebElement>
+#include <QWebView>
 
 class Fb2TreeItem: public QObject
 {
@@ -10,6 +12,7 @@ class Fb2TreeItem: public QObject
 
 public:
     explicit Fb2TreeItem(QTextFrame *frame, Fb2TreeItem *parent = 0);
+    explicit Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent = 0);
 
     virtual ~Fb2TreeItem();
 
@@ -37,9 +40,11 @@ public:
 
 private:
     QList<Fb2TreeItem*> m_list;
+    QString m_name;
     QString m_text;
     QTextFrame * m_frame;
     Fb2TreeItem * m_parent;
+    QWebElement m_element;
 };
 
 class Fb2TreeModel: public QAbstractItemModel
@@ -47,7 +52,7 @@ class Fb2TreeModel: public QAbstractItemModel
     Q_OBJECT
 
 public:
-    explicit Fb2TreeModel(QTextEdit &text, QObject *parent = 0);
+    explicit Fb2TreeModel(QWebView &view, QObject *parent = 0);
     virtual ~Fb2TreeModel();
     void select(const QModelIndex &index);
 
@@ -62,7 +67,7 @@ protected:
     Fb2TreeItem * item(const QModelIndex &index) const;
 
 private:
-    QTextEdit & m_text;
+    QWebView & m_view;
     Fb2TreeItem * m_root;
 };