소스 검색

Optimise document element selector

Kandrashin Denis 13 년 전
부모
커밋
9d867e10a9
6개의 변경된 파일38개의 추가작업 그리고 21개의 파일을 삭제
  1. 6 1
      source/fb2dlgs.cpp
  2. 13 6
      source/fb2tree.cpp
  3. 12 1
      source/fb2tree.hpp
  4. 4 8
      source/fb2view.cpp
  5. 0 3
      source/fb2view.hpp
  6. 3 2
      source/js/set_cursor.js

+ 6 - 1
source/fb2dlgs.cpp

@@ -1,10 +1,14 @@
 #include "fb2dlgs.hpp"
 #include "fb2code.hpp"
+#include "fb2tree.hpp"
 #include "fb2view.hpp"
 #include "fb2utils.h"
 #include "ui_fb2find.h"
 #include "ui_fb2note.h"
 
+#include <QWebFrame>
+#include <QWebPage>
+
 //---------------------------------------------------------------------------
 //  Fb2CodeFindDlg
 //---------------------------------------------------------------------------
@@ -97,5 +101,6 @@ Fb2NoteDlg::~Fb2NoteDlg()
 
 void Fb2NoteDlg::loadFinished()
 {
-    Fb2WebView::selectText(ui->m_text, "var element=document.body");
+    Fb2WebElement body = ui->m_text->page()->mainFrame()->documentElement().findFirst("body");
+    body.select();
 }

+ 13 - 6
source/fb2tree.cpp

@@ -12,6 +12,16 @@
 #include "fb2utils.h"
 #include "fb2view.hpp"
 
+//---------------------------------------------------------------------------
+//  Fb2WebElement
+//---------------------------------------------------------------------------
+
+void Fb2WebElement::select()
+{
+    static const QString javascript = FB2::read(":/js/set_cursor.js");
+    evaluateJavaScript(javascript);
+}
+
 //---------------------------------------------------------------------------
 //  Fb2TreeItem
 //---------------------------------------------------------------------------
@@ -202,12 +212,9 @@ QVariant Fb2TreeModel::data(const QModelIndex &index, int role) const
 
 void Fb2TreeModel::selectText(const QModelIndex &index)
 {
-    Fb2TreeItem *node = item(index);
-    if (!node) return;
-    QWebFrame *frame = m_view.page()->mainFrame();
-    frame->scroll(0, node->pos().y() - frame->scrollPosition().y());
-    QString selector = QString("var element=%1;").arg(node->selector());
-    Fb2WebView::selectText(&m_view, selector);
+    if (Fb2TreeItem *node = item(index)) {
+        node->element().select();
+    }
 }
 
 QModelIndex Fb2TreeModel::index(const QString &location) const

+ 12 - 1
source/fb2tree.hpp

@@ -11,6 +11,17 @@ class Fb2WebView;
 
 class Fb2TreeModel;
 
+class Fb2WebElement : public QWebElement
+{
+public:
+    Fb2WebElement() {}
+    Fb2WebElement(const QWebElement &x) : QWebElement(x) {}
+    Fb2WebElement &operator=(const QWebElement &x) { QWebElement::operator=(x); return *this; }
+
+public:
+    void select();
+};
+
 class Fb2TreeItem: public QObject
 {
     Q_OBJECT
@@ -32,7 +43,7 @@ public:
         return m_list.size();
     }
 
-    QWebElement element() const {
+    Fb2WebElement element() const {
         return m_element;
     }
 

+ 4 - 8
source/fb2view.cpp

@@ -1,6 +1,7 @@
 #include "fb2view.hpp"
 #include "fb2dlgs.hpp"
 #include "fb2read.hpp"
+#include "fb2tree.hpp"
 #include "fb2save.hpp"
 #include "fb2utils.h"
 #include "fb2xml2.h"
@@ -107,13 +108,6 @@ void Fb2WebPage::insertBody()
 //  Fb2WebView
 //---------------------------------------------------------------------------
 
-void Fb2WebView::selectText(QWebView *view, const QString &locator)
-{
-    QWebFrame * frame = view->page()->mainFrame();
-    static const QString javascript = FB2::read(":/js/set_cursor.js");
-    frame->evaluateJavaScript(locator + ";" + javascript);
-}
-
 Fb2WebView::Fb2WebView(QWidget *parent)
     : Fb2BaseWebView(parent)
     , m_inspector(0)
@@ -365,7 +359,9 @@ void Fb2WebView::showInspector()
 
 void Fb2WebView::loadFinished()
 {
-    selectText(this, "var element=$('div.body').get(0);if(element===undefined)element=document.body");
+    Fb2WebElement element = body().findFirst("div.body");
+    if (element.isNull()) element = body();
+    element.select();
 }
 
 void Fb2WebView::insertTitle()

+ 0 - 3
source/fb2view.hpp

@@ -67,9 +67,6 @@ private:
 class Fb2WebView : public Fb2BaseWebView
 {
     Q_OBJECT
-public:
-    static void selectText(QWebView *view, const QString &locator);
-    static void selectBody(QWebView *view);
 
 public:
     explicit Fb2WebView(QWidget *parent = 0);

+ 3 - 2
source/js/set_cursor.js

@@ -1,6 +1,7 @@
+window.scrollTo(0,this.offsetTop);
 var range = document.createRange();
-range.setStart(element, 0);
-range.setEnd(element, 0);
+range.setStart(this,0);
+range.setEnd(this,0);
 var selection = window.getSelection();
 selection.removeAllRanges();
 selection.addRange(range);