Pārlūkot izejas kodu

Deferred resizing QTextEdit in class Fb2TextEdit

Kandrashin Denis 13 gadi atpakaļ
vecāks
revīzija
708bc5491d
5 mainītis faili ar 156 papildinājumiem un 49 dzēšanām
  1. 38 0
      source/fb2edit.h
  2. 25 24
      source/fb2edit.pro
  3. 2 1
      source/fb2main.cpp
  4. 49 4
      source/fb2read.cpp
  5. 42 20
      source/fb2read.h

+ 38 - 0
source/fb2edit.h

@@ -0,0 +1,38 @@
+#ifndef FB2EDIT_H
+#define FB2EDIT_H
+
+#include <QResizeEvent>
+#include <QTextEdit>
+#include <QTimer>
+
+class Fb2TextEdit : public QTextEdit
+{
+    Q_OBJECT
+
+public:
+    Fb2TextEdit(QWidget* parent = 0)
+        : QTextEdit(parent)
+    {
+          m_timer.setInterval( 100 );
+          m_timer.setSingleShot(true);
+          connect(&m_timer, SIGNAL(timeout()), SLOT(doResize()));
+    }
+
+protected slots:
+    void doResize() {
+        QResizeEvent event(size(), m_size);
+        QTextEdit::resizeEvent(&event);
+    }
+
+protected:
+     void resizeEvent( QResizeEvent* e ) {
+          if (!m_timer.isActive()) m_size = e->oldSize();
+          m_timer.start();
+     }
+
+private:
+    QTimer m_timer;
+    QSize m_size;
+};
+
+#endif // FB2EDIT_H

+ 25 - 24
source/fb2edit.pro

@@ -1,24 +1,25 @@
-HEADERS = \
-    fb2app.h \
-    fb2doc.h \
-    fb2main.h \
-    fb2read.h \
-    fb2tree.h
-
-SOURCES = \
-    fb2app.cpp \
-    fb2doc.cpp \
-    fb2main.cpp \
-    fb2read.cpp \
-    fb2tree.cpp
-
-RESOURCES = \
-    fb2edit.qrc
-
-TARGET = fb2edit
-
-VERSION = 0.01.1
-
-QT += xml
-
-LIBS += -lqscintilla2
+HEADERS = \
+    fb2app.h \
+    fb2doc.h \
+    fb2main.h \
+    fb2read.h \
+    fb2tree.h \
+    fb2edit.h
+
+SOURCES = \
+    fb2app.cpp \
+    fb2doc.cpp \
+    fb2main.cpp \
+    fb2read.cpp \
+    fb2tree.cpp
+
+RESOURCES = \
+    fb2edit.qrc
+
+TARGET = fb2edit
+
+VERSION = 0.01.1
+
+QT += xml
+
+LIBS += -lqscintilla2

+ 2 - 1
source/fb2main.cpp

@@ -4,6 +4,7 @@
 
 #include "fb2main.h"
 #include "fb2doc.h"
+#include "fb2edit.h"
 #include "fb2read.h"
 #include "fb2tree.h"
 
@@ -391,7 +392,7 @@ void MainWindow::connectTextDocument(QTextDocument * document)
 
 void MainWindow::createText()
 {
-    textEdit = new QTextEdit;
+    textEdit = new Fb2TextEdit;
     textEdit->setAcceptRichText(true);
     setCentralWidget(textEdit);
 

+ 49 - 4
source/fb2read.cpp

@@ -10,8 +10,8 @@
 
 Fb2ReadThread::Fb2ReadThread(QObject *parent, const QString &filename)
     : QThread(parent)
-    , m_document(NULL)
     , m_filename(filename)
+    , m_document(NULL)
     , m_abort(false)
 {
 }
@@ -165,7 +165,7 @@ Fb2Handler::BaseHandler * Fb2Handler::RootHandler::NewTag(const QString &name, c
 {
     switch (toKeyword(name)) {
         case Body   : { BaseHandler * handler = new BodyHandler(m_cursor, name); m_empty = false; return handler; }
-        case Descr  : return new DescrHandler(name);
+        case Descr  : return new DescrHandler(m_cursor, name);
         case Binary : return new BinaryHandler(m_document, name, attributes);
         default: return NULL;
     }
@@ -175,11 +175,43 @@ Fb2Handler::BaseHandler * Fb2Handler::RootHandler::NewTag(const QString &name, c
 //  Fb2Handler::DescrHandler
 //---------------------------------------------------------------------------
 
+FB2_BEGIN_KEYHASH(DescrHandler)
+    insert( "title-info"   , Title   );
+    insert( "publish-info" , Publish );
+FB2_END_KEYHASH
+
 Fb2Handler::BaseHandler * Fb2Handler::DescrHandler::NewTag(const QString &name, const QXmlAttributes &attributes)
 {
-    Q_UNUSED(name);
     Q_UNUSED(attributes);
-    return new BaseHandler(name);
+    switch (toKeyword(name)) {
+        case Title   : return new HeaderHandler(*this, name);
+        case Publish : return new BaseHandler(name);
+        default: return NULL;
+    }
+}
+
+//---------------------------------------------------------------------------
+//  Fb2Handler::HeaderHandler
+//---------------------------------------------------------------------------
+
+FB2_BEGIN_KEYHASH(HeaderHandler)
+    insert( "book-title"   , Title    );
+    insert( "author"       , Author   );
+    insert( "sequence"     , Sequence );
+    insert( "genre"        , Genre    );
+    insert( "lang"         , Lang     );
+    insert( "annotation"   , Annot    );
+    insert( "coverpage"    , Cover    );
+FB2_END_KEYHASH
+
+Fb2Handler::BaseHandler * Fb2Handler::HeaderHandler::NewTag(const QString &name, const QXmlAttributes &attributes)
+{
+    Q_UNUSED(attributes);
+    switch (toKeyword(name)) {
+        case Title   : return new BaseHandler(name);
+        case Annot   : return new BaseHandler(name);
+        default: return NULL;
+    }
 }
 
 //---------------------------------------------------------------------------
@@ -230,8 +262,15 @@ FB2_END_KEYHASH
 
 Fb2Handler::BodyHandler::BodyHandler(Fb2TextCursor &cursor, const QString &name)
     : TextHandler(cursor, name)
+    , m_frame(cursor.currentFrame())
     , m_feed(false)
 {
+    QTextFrameFormat frameFormat;
+    frameFormat.setBorder(1);
+    frameFormat.setPadding(8);
+    frameFormat.setTopMargin(4);
+    frameFormat.setBottomMargin(4);
+    cursor.insertFrame(frameFormat);
 }
 
 Fb2Handler::BaseHandler * Fb2Handler::BodyHandler::NewTag(const QString &name, const QXmlAttributes &attributes)
@@ -247,6 +286,12 @@ Fb2Handler::BaseHandler * Fb2Handler::BodyHandler::NewTag(const QString &name, c
     }
 }
 
+void Fb2Handler::BodyHandler::EndTag(const QString &name)
+{
+    Q_UNUSED(name);
+    if (m_frame) cursor().setPosition(m_frame->lastPosition());
+}
+
 //---------------------------------------------------------------------------
 //  Fb2Handler::SectionHandler
 //---------------------------------------------------------------------------

+ 42 - 20
source/fb2read.h

@@ -16,7 +16,16 @@ QT_BEGIN_NAMESPACE
 class QTextEdit;
 QT_END_NAMESPACE
 
-class Fb2MainDocumen;
+class Fb2TextCursor : public QTextCursor
+{
+public:
+    explicit Fb2TextCursor(QTextDocument *document, bool foot)
+        : QTextCursor(document), m_foot(foot) {}
+    bool foot()
+        { return m_foot; }
+private:
+    const bool m_foot;
+};
 
 class Fb2ReadThread : public QThread
 {
@@ -64,17 +73,6 @@ public:
     QString errorString() const;
 
 private:
-    class Fb2TextCursor : public QTextCursor
-    {
-    public:
-        explicit Fb2TextCursor(QTextDocument *document, bool foot)
-            : QTextCursor(document), m_foot(foot) {}
-        bool foot()
-            { return m_foot; }
-    private:
-        const bool m_foot;
-    };
-
     class BaseHandler
     {
     public:
@@ -115,14 +113,6 @@ private:
         bool m_empty;
     };
 
-    class DescrHandler : public BaseHandler
-    {
-    public:
-        explicit DescrHandler(const QString &name) : BaseHandler(name) {}
-    protected:
-        virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
-    };
-
     class TextHandler : public BaseHandler
     {
     public:
@@ -138,6 +128,36 @@ private:
         QTextCharFormat m_charFormat;
     };
 
+    class DescrHandler : public TextHandler
+    {
+        FB2_BEGIN_KEYLIST
+            Title,
+            Publish,
+        FB2_END_KEYLIST
+    public:
+        explicit DescrHandler(Fb2TextCursor &cursor, const QString &name) : TextHandler(cursor, name) {}
+    protected:
+        virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
+    };
+
+    class HeaderHandler : public TextHandler
+    {
+        FB2_BEGIN_KEYLIST
+            Author,
+            Title,
+            Sequence,
+            Genre,
+            Lang,
+            Annot,
+            Cover,
+        FB2_END_KEYLIST
+    public:
+        explicit HeaderHandler(TextHandler &parent, const QString &name) : TextHandler(parent, name) {}
+    protected:
+        virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
+        QString m_title;
+    };
+
     class BodyHandler : public TextHandler
     {
         FB2_BEGIN_KEYLIST
@@ -154,7 +174,9 @@ private:
         explicit BodyHandler(Fb2TextCursor &cursor, const QString &name);
     protected:
         virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
+        virtual void EndTag(const QString &name);
     private:
+        QTextFrame * m_frame;
         bool m_feed;
     };