Jelajahi Sumber

View pictures list

Kandrashin Denis 13 tahun lalu
induk
melakukan
5d9b4f2964
5 mengubah file dengan 164 tambahan dan 18 penghapusan
  1. 2 0
      source/fb2main.cpp
  2. 104 6
      source/fb2temp.cpp
  3. 51 6
      source/fb2temp.hpp
  4. 4 3
      source/fb2text.cpp
  5. 3 3
      source/fb2text.hpp

+ 2 - 0
source/fb2main.cpp

@@ -632,6 +632,7 @@ void FbMainWindow::viewCode()
 
     FB2DELETE(textFrame);
     FB2DELETE(dockTree);
+    FB2DELETE(dockImgs);
     FB2DELETE(headTree);
 
     if (!codeEdit) {
@@ -774,6 +775,7 @@ void FbMainWindow::viewHead()
     if (codeEdit) xml = codeEdit->text();
 
     FB2DELETE(dockTree);
+    FB2DELETE(dockImgs);
     FB2DELETE(codeEdit);
     FB2DELETE(toolEdit);
 

+ 104 - 6
source/fb2temp.cpp

@@ -1,5 +1,6 @@
 #include "fb2temp.hpp"
 
+#include <QAbstractListModel>
 #include <QCryptographicHash>
 #include <QFileInfo>
 #include <QImageReader>
@@ -192,6 +193,7 @@ FbNetworkAccessManager::FbNetworkAccessManager(FbTextEdit &view)
     : QNetworkAccessManager(&view)
     , m_view(view)
 {
+    QWebSettings::clearMemoryCaches();
 }
 
 QNetworkReply * FbNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
@@ -203,23 +205,119 @@ QNetworkReply * FbNetworkAccessManager::createRequest(Operation op, const QNetwo
 QNetworkReply * FbNetworkAccessManager::imageRequest(Operation op, const QNetworkRequest &request)
 {
     QString name = request.url().fragment();
-    QByteArray data = m_view.files().data(name);
+    QByteArray data = m_files.data(name);
     return new FbImageReply(op, request, data);
 }
 
+QString FbNetworkAccessManager::name(int index) const
+{
+    if (0 <= index && index < count()) {
+        return m_files[index]->name();
+    }
+    return QString();
+}
+
+QByteArray FbNetworkAccessManager::data(int index) const
+{
+    if (0 <= index && index < count()) {
+        return m_files[index]->data();
+    }
+    return QByteArray();
+}
+
+void FbNetworkAccessManager::data(QString name, QByteArray data)
+{
+    m_files.set(name, data);
+}
+
+//---------------------------------------------------------------------------
+//  FbListModel
+//---------------------------------------------------------------------------
+
+FbListModel::FbListModel(FbNetworkAccessManager &files, QObject *parent)
+    : QAbstractListModel(parent)
+    , m_files(files)
+{
+}
+
+int FbListModel::rowCount(const QModelIndex &parent) const
+{
+    if (parent.isValid()) return 0;
+    return m_files.count();
+}
+
+QVariant FbListModel::data(const QModelIndex &index, int role) const
+{
+    if (index.isValid()) {
+        switch (role) {
+            case Qt::DisplayRole: return m_files.name(index.row());
+        }
+    }
+    return QVariant();
+}
+
+//---------------------------------------------------------------------------
+//  FbListView
+//---------------------------------------------------------------------------
+
+#include <QSplitter>
+#include <QScrollArea>
+
+FbListView::FbListView(FbNetworkAccessManager &files, QWidget *parent)
+    : QListView(parent)
+    , m_files(files)
+{
+    m_label = new QLabel(this);
+    m_label->setScaledContents(true);
+}
+
+void FbListView::currentChanged(const QModelIndex &current, const QModelIndex &previous)
+{
+    QListView::currentChanged(current, previous);
+
+    int row = current.row();
+    if (0 <= row && row < m_files.count()) {
+        QByteArray data = m_files.data(row);
+        QPixmap pixmap;
+        pixmap.loadFromData(data);
+        m_label->setPixmap(pixmap);
+        m_label->resize(pixmap.size());
+    }
+}
+
 //---------------------------------------------------------------------------
 //  FbListWidget
 //---------------------------------------------------------------------------
 
 FbListWidget::FbListWidget(FbTextEdit &view, QWidget* parent)
+    : QWidget(parent)
+    , m_view(view)
 {
-    QVBoxLayout * layout = new QVBoxLayout(this);
+    QVBoxLayout *layout = new QVBoxLayout(this);
     layout->setSpacing(0);
     layout->setContentsMargins(0, 0, 0, 0);
 
-    m_list = new QListView(this);
-    layout->addWidget(m_list);
+    QSplitter *splitter = new QSplitter(Qt::Vertical, this);
+
+    m_list = new FbListView(view.files(), splitter);
+    splitter->addWidget(m_list);
+
+    QScrollArea * scroll = new QScrollArea(splitter);
+    scroll->setWidget(m_list->label());
+    splitter->addWidget(scroll);
 
-    m_tool = new QToolBar(this);
-    layout->addWidget(m_tool);
+    splitter->setSizes(QList<int>() << 1 << 1);
+    layout->addWidget(splitter);
+
+    connect(&m_view, SIGNAL(loadFinished(bool)), SLOT(loadFinished(bool)));
+    loadFinished(true);
+
+//    m_tool = new QToolBar(this);
+//    layout->addWidget(m_tool);
+}
+
+void FbListWidget::loadFinished(bool ok)
+{
+    m_list->setModel(new FbListModel(m_view.files(), this));
+    m_list->reset();
 }

+ 51 - 6
source/fb2temp.hpp

@@ -80,8 +80,21 @@ private:
 class FbNetworkAccessManager : public QNetworkAccessManager
 {
     Q_OBJECT
+
 public:
     explicit FbNetworkAccessManager(FbTextEdit &view);
+    FbTemporaryList & files() { return m_files; }
+
+public slots:
+    void data(QString name, QByteArray data);
+
+public:
+    QString add(const QString &path, const 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;
+    QString name(int index) const;
 
 protected:
     virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
@@ -90,8 +103,37 @@ private:
     QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
 
 private:
-    FbTextEdit & m_view;
-    QString m_path;
+    FbTemporaryList m_files;
+    FbTextEdit &m_view;
+};
+
+class FbListModel : public QAbstractListModel
+{
+    Q_OBJECT
+
+public:
+    explicit FbListModel(FbNetworkAccessManager &files, QObject *parent = 0);
+    int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+
+private:
+    FbNetworkAccessManager &m_files;
+};
+
+class FbListView : public QListView
+{
+    Q_OBJECT
+
+public:
+    explicit FbListView(FbNetworkAccessManager &files, QWidget *parent = 0);
+    QLabel *label() { return m_label; }
+
+protected:
+    void currentChanged(const QModelIndex &current, const QModelIndex &previous);
+
+private:
+    FbNetworkAccessManager &m_files;
+    QLabel *m_label;
 };
 
 class FbListWidget : public QWidget
@@ -101,10 +143,13 @@ class FbListWidget : public QWidget
 public:
     explicit FbListWidget(FbTextEdit &view, QWidget* parent = 0);
 
-protected:
-    QToolBar * m_tool;
-    QListView * m_list;
-    QLabel * m_label;
+private slots:
+    void loadFinished(bool ok);
+
+private:
+    FbTextEdit &m_view;
+    FbListView *m_list;
+    QToolBar *m_tool;
 };
 
 #endif // FB2TEMP_H

+ 4 - 3
source/fb2text.cpp

@@ -382,11 +382,12 @@ void FbTextBase::addTools(QToolBar *tool)
 
 FbTextEdit::FbTextEdit(QWidget *parent)
     : FbTextBase(parent)
+    , m_files(*this)
     , m_noteView(0)
     , m_thread(0)
 {
     setPage(new FbTextPage(this));
-    page()->setNetworkAccessManager(new FbNetworkAccessManager(*this));
+    page()->setNetworkAccessManager(&m_files);
     page()->setContentEditable(true);
     connect(page(), SIGNAL(contentsChanged()), this, SLOT(fixContents()));
     connect(page(), SIGNAL(linkHovered(QString,QString,QString)), this, SLOT(linkHovered(QString,QString,QString)));
@@ -501,7 +502,7 @@ bool FbTextEdit::save(QString *string)
 
 void FbTextEdit::data(QString name, QByteArray data)
 {
-    m_files.set(name, data);
+    files().data(name, data);
 }
 
 void FbTextEdit::html(QString html)
@@ -596,7 +597,7 @@ void FbTextEdit::insertImage()
     if (!file.open(QIODevice::ReadOnly)) return;
 
     QByteArray data = file.readAll();
-    QString name = m_files.add(path, data);
+    QString name = files().add(path, data);
     execCommand("insertImage", name.prepend("#"));
 }
 

+ 3 - 3
source/fb2text.hpp

@@ -106,7 +106,7 @@ public:
     virtual ~FbTextEdit();
 
     FbTextPage * page();
-    FbTemporaryList & files() { return m_files; }
+    FbNetworkAccessManager & files() { return m_files; }
     void load(const QString &filename, const QString &xml = QString());
     bool save(QIODevice *device, const QString &codec = QString());
     bool save(QByteArray *array);
@@ -126,8 +126,8 @@ protected:
     virtual void mouseMoveEvent(QMouseEvent *event);
 
 public slots:
-    void data(QString name, QByteArray data);
     void html(QString html);
+    void data(QString name, QByteArray data);
     void linkHovered(const QString &link, const QString &title, const QString &textContent);
     void insertImage();
     void insertNote();
@@ -150,7 +150,7 @@ private:
     QWebElement doc();
 
 private:
-    FbTemporaryList m_files;
+    FbNetworkAccessManager m_files;
     FbNoteView *m_noteView;
     QThread *m_thread;
     QPoint m_point;