fb2view.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #ifndef FB2VIEW_H
  2. #define FB2VIEW_H
  3. #include <QMap>
  4. #include <QNetworkAccessManager>
  5. #include <QNetworkReply>
  6. #include <QResizeEvent>
  7. #include <QTimer>
  8. #include <QThread>
  9. #include <QWebView>
  10. class Fb2ImageReply : public QNetworkReply
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit Fb2ImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data);
  15. void abort();
  16. qint64 bytesAvailable() const;
  17. bool isSequential() const;
  18. protected:
  19. qint64 readData(char *data, qint64 maxSize);
  20. private:
  21. QByteArray content;
  22. qint64 offset;
  23. };
  24. class Fb2NetworkAccessManager : public QNetworkAccessManager
  25. {
  26. Q_OBJECT
  27. public:
  28. explicit Fb2NetworkAccessManager(QObject *parent = 0);
  29. void insert(const QString &file, const QByteArray &data);
  30. protected:
  31. virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
  32. private:
  33. QNetworkReply *imageRequest(Operation op, const QNetworkRequest &request);
  34. private:
  35. typedef QMap<QString, QByteArray> ImageMap;
  36. ImageMap m_images;
  37. };
  38. class Fb2BaseWebView : public QWebView
  39. {
  40. Q_OBJECT
  41. public:
  42. Fb2BaseWebView(QWidget* parent = 0)
  43. : QWebView(parent)
  44. {
  45. m_timer.setInterval(100);
  46. m_timer.setSingleShot(true);
  47. connect(&m_timer, SIGNAL(timeout()), SLOT(doResize()));
  48. }
  49. protected slots:
  50. void doResize() {
  51. QResizeEvent event(size(), m_size);
  52. QWebView::resizeEvent(&event);
  53. QWebView::update();
  54. }
  55. protected:
  56. void resizeEvent(QResizeEvent* event) {
  57. if (!m_timer.isActive()) m_size = event->oldSize();
  58. m_timer.start();
  59. }
  60. private:
  61. QTimer m_timer;
  62. QSize m_size;
  63. };
  64. class Fb2WebView : public Fb2BaseWebView
  65. {
  66. Q_OBJECT
  67. public:
  68. explicit Fb2WebView(QWidget *parent = 0);
  69. bool load(const QString &filename);
  70. signals:
  71. public slots:
  72. void image(QString file, QByteArray data);
  73. void html(QString html);
  74. void zoomIn();
  75. void zoomOut();
  76. void zoomOrig();
  77. private:
  78. Fb2NetworkAccessManager m_network;
  79. QThread *m_thread;
  80. };
  81. #endif // FB2VIEW_H