Browse Source

Select tree when text selection changed

Kandrashin Denis 13 years ago
parent
commit
faf980b48c
7 changed files with 64 additions and 23 deletions
  1. 8 1
      source/fb2main.cpp
  2. 1 0
      source/fb2main.hpp
  3. 26 15
      source/fb2tree.cpp
  4. 5 3
      source/fb2tree.hpp
  5. 15 0
      source/fb2view.cpp
  6. 6 1
      source/fb2view.hpp
  7. 3 3
      source/js/get_location.js

+ 8 - 1
source/fb2main.cpp

@@ -430,7 +430,8 @@ void Fb2MainWindow::createTree()
     if (treeView) return;
     if (treeView) return;
     treeView = new Fb2TreeView(this);
     treeView = new Fb2TreeView(this);
     treeView->setHeaderHidden(true);
     treeView->setHeaderHidden(true);
-    connect(textEdit->page(), SIGNAL(selectionChanged()), treeView, SLOT(select()));
+    connect(textEdit, SIGNAL(updateTree()), SLOT(updateTree()));
+    connect(textEdit, SIGNAL(selectTree()), treeView, SLOT(select()));
     connect(treeView, SIGNAL(activated(QModelIndex)), SLOT(treeActivated(QModelIndex)));
     connect(treeView, SIGNAL(activated(QModelIndex)), SLOT(treeActivated(QModelIndex)));
     connect(treeView, SIGNAL(destroyed()), SLOT(treeDestroyed()));
     connect(treeView, SIGNAL(destroyed()), SLOT(treeDestroyed()));
     dockTree = new QDockWidget(tr("Contents"), this);
     dockTree = new QDockWidget(tr("Contents"), this);
@@ -443,11 +444,17 @@ void Fb2MainWindow::createTree()
 
 
 void Fb2MainWindow::loadFinished(bool ok)
 void Fb2MainWindow::loadFinished(bool ok)
 {
 {
+    Q_UNUSED(ok);
+    updateTree();
     if (headTree) {
     if (headTree) {
         Fb2HeadModel *model = new Fb2HeadModel(*textEdit, treeView);
         Fb2HeadModel *model = new Fb2HeadModel(*textEdit, treeView);
         headTree->setModel(model);
         headTree->setModel(model);
         model->expand(headTree);
         model->expand(headTree);
     }
     }
+}
+
+void Fb2MainWindow::updateTree()
+{
     if (treeView) {
     if (treeView) {
         Fb2TreeModel *model = new Fb2TreeModel(*textEdit, treeView);
         Fb2TreeModel *model = new Fb2TreeModel(*textEdit, treeView);
         treeView->setModel(model);
         treeView->setModel(model);

+ 1 - 0
source/fb2main.hpp

@@ -45,6 +45,7 @@ private slots:
     void treeDestroyed();
     void treeDestroyed();
     void logDestroyed();
     void logDestroyed();
     void logShowed();
     void logShowed();
+    void updateTree();
     void viewCode();
     void viewCode();
     void viewText();
     void viewText();
     void viewHead();
     void viewHead();

+ 26 - 15
source/fb2tree.cpp

@@ -9,10 +9,11 @@
 #include "fb2utils.h"
 #include "fb2utils.h"
 #include "fb2view.hpp"
 #include "fb2view.hpp"
 
 
-Fb2TreeItem::Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent)
+Fb2TreeItem::Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent, int number)
     : QObject(parent)
     : QObject(parent)
     , m_element(element)
     , m_element(element)
     , m_parent(parent)
     , m_parent(parent)
+    , m_number(number)
 {
 {
     m_name = element.tagName().toLower();
     m_name = element.tagName().toLower();
     QString style = element.attribute("class").toLower();
     QString style = element.attribute("class").toLower();
@@ -48,21 +49,19 @@ QString Fb2TreeItem::title(const QWebElement &element)
 
 
 void Fb2TreeItem::addChildren(QWebElement &parent, bool direct)
 void Fb2TreeItem::addChildren(QWebElement &parent, bool direct)
 {
 {
+    int number = 0;
     QWebElement child = parent.firstChild();
     QWebElement child = parent.firstChild();
     while (!child.isNull()) {
     while (!child.isNull()) {
         QString tag = child.tagName().toLower();
         QString tag = child.tagName().toLower();
         if (tag == "div") {
         if (tag == "div") {
-            Fb2TreeItem * item = new Fb2TreeItem(child, this);
-            m_list << item;
-            if (direct) m_content << item;
+            m_list << new Fb2TreeItem(child, this, direct ? number : -1);
         } else if (tag == "img") {
         } else if (tag == "img") {
-            Fb2TreeItem * item = new Fb2TreeItem(child, this);
-            m_list << item;
-            if (direct) m_content << item;
+            m_list << new Fb2TreeItem(child, this, direct ? number : -1);
         } else {
         } else {
             addChildren(child, false);
             addChildren(child, false);
         }
         }
         child = child.nextSibling();
         child = child.nextSibling();
+        number++;
     }
     }
 }
 }
 
 
@@ -107,9 +106,18 @@ QString Fb2TreeItem::selector() const
     return selector.prepend("$('html')");
     return selector.prepend("$('html')");
 }
 }
 
 
-Fb2TreeItem * Fb2TreeItem::content(int index) const
+Fb2TreeItem * Fb2TreeItem::content(const Fb2TreeModel &model, int number, QModelIndex &index) const
 {
 {
-    return (0 <= index && index < m_content.count()) ? m_content[index] : 0;
+    int row = 0;
+    QList<Fb2TreeItem*>::const_iterator i;
+    for (i = m_list.constBegin(); i != m_list.constEnd(); ++i) {
+        if ((*i)->m_number == number) {
+            index = model.index(row, 0, index);
+            return *i;
+        }
+        row++;
+    }
+    return 0;
 }
 }
 
 
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -218,11 +226,10 @@ QModelIndex Fb2TreeModel::index(const QString &location) const
         QString str = iterator.next();
         QString str = iterator.next();
         if (str.left(5) == "HTML=") continue;
         if (str.left(5) == "HTML=") continue;
         int key = str.mid(str.indexOf("=")+1).toInt();
         int key = str.mid(str.indexOf("=")+1).toInt();
-        Fb2TreeItem * child = parent->content(key);
-        if (child) index = this->index(key, 0, index);
+        Fb2TreeItem * child = parent->content(*this, key, index);
         parent = child;
         parent = child;
     }
     }
-    return QModelIndex();
+    return index;
 }
 }
 
 
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -231,17 +238,21 @@ QModelIndex Fb2TreeModel::index(const QString &location) const
 
 
 void Fb2TreeView::select()
 void Fb2TreeView::select()
 {
 {
-    return;
     if (model() == 0) return;
     if (model() == 0) return;
     Fb2TreeModel * model = static_cast<Fb2TreeModel*>(this->model());
     Fb2TreeModel * model = static_cast<Fb2TreeModel*>(this->model());
     QWebFrame * frame = model->view().page()->mainFrame();
     QWebFrame * frame = model->view().page()->mainFrame();
     static const QString javascript = FB2::read(":/js/get_location.js");
     static const QString javascript = FB2::read(":/js/get_location.js");
     QString location = frame->evaluateJavaScript(javascript).toString();
     QString location = frame->evaluateJavaScript(javascript).toString();
     QModelIndex index = model->index(location);
     QModelIndex index = model->index(location);
-    setCurrentIndex(index);
-    this->expand(index);
+    if (index.isValid()) {
+        setCurrentIndex(index);
+        scrollTo(index);
+    }
 }
 }
 
 
 void Fb2TreeView::update()
 void Fb2TreeView::update()
 {
 {
+    if (model() == 0) return;
+    Fb2TreeModel * model = static_cast<Fb2TreeModel*>(this->model());
+    Fb2WebView & view = model->view();
 }
 }

+ 5 - 3
source/fb2tree.hpp

@@ -7,12 +7,14 @@
 
 
 class Fb2WebView;
 class Fb2WebView;
 
 
+class Fb2TreeModel;
+
 class Fb2TreeItem: public QObject
 class Fb2TreeItem: public QObject
 {
 {
     Q_OBJECT
     Q_OBJECT
 
 
 public:
 public:
-    explicit Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent = 0);
+    explicit Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent = 0, int index = 0);
 
 
     virtual ~Fb2TreeItem();
     virtual ~Fb2TreeItem();
 
 
@@ -48,7 +50,7 @@ public:
 
 
     QString selector() const;
     QString selector() const;
 
 
-    Fb2TreeItem * content(int index) const;
+    Fb2TreeItem * content(const Fb2TreeModel &model, int number, QModelIndex &index) const;
 
 
 private:
 private:
     QString static title(const QWebElement &element);
     QString static title(const QWebElement &element);
@@ -56,11 +58,11 @@ private:
 
 
 private:
 private:
     QList<Fb2TreeItem*> m_list;
     QList<Fb2TreeItem*> m_list;
-    QList<Fb2TreeItem*> m_content;
     QWebElement m_element;
     QWebElement m_element;
     QString m_name;
     QString m_name;
     QString m_text;
     QString m_text;
     Fb2TreeItem * m_parent;
     Fb2TreeItem * m_parent;
+    int m_number;
 };
 };
 
 
 class Fb2TreeModel: public QAbstractItemModel
 class Fb2TreeModel: public QAbstractItemModel

+ 15 - 0
source/fb2view.cpp

@@ -93,7 +93,16 @@ Fb2WebView::Fb2WebView(QWidget *parent)
     page()->setNetworkAccessManager(new Fb2NetworkAccessManager(*this));
     page()->setNetworkAccessManager(new Fb2NetworkAccessManager(*this));
     page()->setContentEditable(true);
     page()->setContentEditable(true);
     connect(page(), SIGNAL(contentsChanged()), this, SLOT(fixContents()));
     connect(page(), SIGNAL(contentsChanged()), this, SLOT(fixContents()));
+    connect(page(), SIGNAL(selectionChanged()), this, SLOT(selectionChanged()));
     connect(page(), SIGNAL(linkHovered(QString,QString,QString)), this, SLOT(linkHovered(QString,QString,QString)));
     connect(page(), SIGNAL(linkHovered(QString,QString,QString)), this, SLOT(linkHovered(QString,QString,QString)));
+
+    m_timerSelect.setInterval(1000);
+    m_timerSelect.setSingleShot(true);
+    connect(&m_timerSelect, SIGNAL(timeout()), SIGNAL(selectTree()));
+
+    m_timerUpdate.setInterval(1000);
+    m_timerUpdate.setSingleShot(true);
+    connect(&m_timerUpdate, SIGNAL(timeout()), SIGNAL(updateTree()));
 }
 }
 
 
 Fb2WebView::~Fb2WebView()
 Fb2WebView::~Fb2WebView()
@@ -130,6 +139,12 @@ void Fb2WebView::fixContents()
     foreach (QWebElement span, doc().findAll("span.apple-style-span[style]")) {
     foreach (QWebElement span, doc().findAll("span.apple-style-span[style]")) {
         span.removeAttribute("style");
         span.removeAttribute("style");
     }
     }
+    m_timerUpdate.start();
+ }
+
+void Fb2WebView::selectionChanged()
+{
+    m_timerSelect.start();
 }
 }
 
 
 void Fb2WebView::mouseMoveEvent(QMouseEvent *event)
 void Fb2WebView::mouseMoveEvent(QMouseEvent *event)

+ 6 - 1
source/fb2view.hpp

@@ -86,7 +86,9 @@ protected:
     virtual void mouseMoveEvent(QMouseEvent *event);
     virtual void mouseMoveEvent(QMouseEvent *event);
 
 
 signals:
 signals:
-    
+    void selectTree();
+    void updateTree();
+
 public slots:
 public slots:
     void data(QString name, QByteArray data);
     void data(QString name, QByteArray data);
     void html(QString name, QString html);
     void html(QString name, QString html);
@@ -101,6 +103,7 @@ public slots:
     void find();
     void find();
 
 
 private slots:
 private slots:
+    void selectionChanged();
     void fixContents();
     void fixContents();
 
 
 private:
 private:
@@ -110,6 +113,8 @@ private:
     QWebElement doc();
     QWebElement doc();
 
 
 private:
 private:
+    QTimer m_timerUpdate;
+    QTimer m_timerSelect;
     QWebInspector * m_inspector;
     QWebInspector * m_inspector;
     Fb2TemporaryList m_files;
     Fb2TemporaryList m_files;
     Fb2NoteView *m_noteView;
     Fb2NoteView *m_noteView;

+ 3 - 3
source/js/get_location.js

@@ -5,7 +5,7 @@ var hierarchy = $( startNode ).parents().reverse().add( $( startNode ) ) ;
 hierarchy.map(function () { 
 hierarchy.map(function () { 
     if ( undefined !== $( this ).parent().get( 0 ).tagName )
     if ( undefined !== $( this ).parent().get( 0 ).tagName )
 	{
 	{
-		var first_part = $( this ).parent().get( 0 ).tagName + "=";
-		return first_part + jQuery.inArray( this, $( this ).parent().contents() );
-	}
+        var first_part = $( this ).parent().get( 0 ).tagName + "=";
+        return first_part + $( this ).parent().children().index( this );
+    }
 }).get().join(",");
 }).get().join(",");