Browse Source

Class FbListWidget::FbProxy

Kandrashin Denis 12 năm trước cách đây
mục cha
commit
e1993fe9b6
2 tập tin đã thay đổi với 63 bổ sung42 xóa
  1. 17 7
      source/fb2temp.cpp
  2. 46 35
      source/fb2temp.hpp

+ 17 - 7
source/fb2temp.cpp

@@ -312,9 +312,8 @@ QVariant FbListModel::data(const QModelIndex &index, int role) const
 #include <QSplitter>
 #include <QScrollArea>
 
-FbListView::FbListView(FbNetworkAccessManager *files, QWidget *parent)
+FbListView::FbListView(QWidget *parent)
     : QTreeView(parent)
-    , m_files(*files)
 {
     setAllColumnsShowFocus(true);
 }
@@ -331,6 +330,18 @@ FbListModel * FbListView::model() const
     return qobject_cast<FbListModel*>(QTreeView::model());
 }
 
+//---------------------------------------------------------------------------
+//  FbListWidget::FbProxy
+//---------------------------------------------------------------------------
+
+QNetworkReply *FbListWidget::FbProxy::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
+{
+    if (FbNetworkAccessManager * m = qobject_cast<FbNetworkAccessManager*>(m_page->networkAccessManager())) {
+        return m->createRequest(op, request, outgoingData);
+    }
+    return QNetworkAccessManager::createRequest(op, request, outgoingData);
+}
+
 //---------------------------------------------------------------------------
 //  FbListWidget
 //---------------------------------------------------------------------------
@@ -345,13 +356,16 @@ FbListWidget::FbListWidget(FbTextEdit *text, QWidget* parent)
 
     QSplitter *splitter = new QSplitter(Qt::Vertical, this);
 
-    m_list = new FbListView(text->files(), splitter);
+    m_list = new FbListView(splitter);
     splitter->addWidget(m_list);
 
     FbTextFrame *frame = new FbTextFrame(splitter);
     splitter->addWidget(frame);
 
+    FbProxy *proxy = new FbProxy(text->page(), this);
+
     m_view = new FbTextBase(frame);
+    m_view->page()->setNetworkAccessManager(proxy);
     frame->layout()->addWidget(m_view);
 
     splitter->setSizes(QList<int>() << 100 << 100);
@@ -365,10 +379,6 @@ FbListWidget::FbListWidget(FbTextEdit *text, QWidget* parent)
 
 void FbListWidget::loadFinished()
 {
-    if (m_view->page() && m_text->page()) {
-        m_view->page()->setNetworkAccessManager(m_text->page()->networkAccessManager());
-    }
-
     m_view->load(QUrl());
 
     m_list->setModel(new FbListModel(m_text, this));

+ 46 - 35
source/fb2temp.hpp

@@ -13,6 +13,8 @@
 
 class FbTextEdit;
 
+class FbNetworkAccessManager;
+
 class FbTemporaryFile : public QTemporaryFile
 {
     Q_OBJECT
@@ -81,37 +83,6 @@ private:
     qint64 offset;
 };
 
-class FbNetworkAccessManager : public QNetworkAccessManager
-{
-    Q_OBJECT
-
-public:
-    explicit FbNetworkAccessManager(QObject *parent = 0);
-    FbTemporaryList & files() { return m_files; }
-    void setPath(const QString &path) { m_path = path; }
-
-public slots:
-    void binary(const QString &name, const QByteArray &data);
-
-public:
-    QString add(const QString &path, QByteArray &data) { return m_files.add(path, data); }
-    bool exists(const QString &name) const { return m_files.exists(name); }
-    FbTemporaryFile * get(const QString &name) const { return m_files.get(name); }
-    int count() const { return m_files.count(); }
-    QByteArray data(int index) const;
-    QVariant info(int row, int col) const;
-
-protected:
-    virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
-
-private:
-    QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
-
-private:
-    FbTemporaryList m_files;
-    QString m_path;
-};
-
 class FbListModel : public QAbstractListModel
 {
     Q_OBJECT
@@ -137,7 +108,7 @@ class FbListView : public QTreeView
     Q_OBJECT
 
 public:
-    explicit FbListView(FbNetworkAccessManager *files, QWidget *parent = 0);
+    explicit FbListView(QWidget *parent = 0);
     FbListModel *model() const;
 
 protected:
@@ -145,15 +116,23 @@ protected:
 
 signals:
     void showImage(const QString &name);
-
-private:
-    FbNetworkAccessManager &m_files;
 };
 
 class FbListWidget : public QWidget
 {
     Q_OBJECT
 
+public:
+    class FbProxy : public QNetworkAccessManager
+    {
+    public:
+        FbProxy(QWebPage *page, QObject *parent): QNetworkAccessManager(parent), m_page(page) {}
+    protected:
+        virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
+    private:
+        QWebPage *m_page;
+    };
+
 public:
     explicit FbListWidget(FbTextEdit *text, QWidget* parent = 0);
 
@@ -171,4 +150,36 @@ private:
     QWebView *m_view;
 };
 
+class FbNetworkAccessManager : public QNetworkAccessManager
+{
+    Q_OBJECT
+
+public:
+    explicit FbNetworkAccessManager(QObject *parent = 0);
+    FbTemporaryList & files() { return m_files; }
+    void setPath(const QString &path) { m_path = path; }
+
+public slots:
+    void binary(const QString &name, const QByteArray &data);
+
+public:
+    QString add(const QString &path, QByteArray &data) { return m_files.add(path, data); }
+    bool exists(const QString &name) const { return m_files.exists(name); }
+    FbTemporaryFile * get(const QString &name) const { return m_files.get(name); }
+    int count() const { return m_files.count(); }
+    QByteArray data(int index) const;
+    QVariant info(int row, int col) const;
+
+protected:
+    virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
+
+private:
+    QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
+
+private:
+    FbTemporaryList m_files;
+    QString m_path;
+    friend class FbListWidget::FbProxy;
+};
+
 #endif // FB2TEMP_H