fb2imgs.hpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #ifndef FB2IMGS_H
  2. #define FB2IMGS_H
  3. #include <QByteArray>
  4. #include <QDialog>
  5. #include <QComboBox>
  6. #include <QLabel>
  7. #include <QLineEdit>
  8. #include <QList>
  9. #include <QNetworkAccessManager>
  10. #include <QNetworkReply>
  11. #include <QString>
  12. #include <QTemporaryFile>
  13. #include <QToolButton>
  14. #include <QTreeView>
  15. #include <QVBoxLayout>
  16. #include <QWebView>
  17. class FbTextEdit;
  18. class FbNetworkAccessManager;
  19. class FbBinary : public QTemporaryFile
  20. {
  21. Q_OBJECT
  22. public:
  23. static QString md5(const QByteArray &data);
  24. public:
  25. explicit FbBinary(const QString &name);
  26. inline qint64 write(QByteArray &data);
  27. void setHash(const QString &hash) { m_hash = hash; }
  28. const QString & hash() const { return m_hash; }
  29. const QString & name() const { return m_name; }
  30. const QString & type() const { return m_type; }
  31. qint64 size() const { return m_size; }
  32. QByteArray data();
  33. private:
  34. const QString m_name;
  35. QString m_hash;
  36. QString m_type;
  37. qint64 m_size;
  38. };
  39. typedef QList<FbBinary*> FbBinatyList;
  40. class FbStore : public QObject, private FbBinatyList
  41. {
  42. Q_OBJECT
  43. public:
  44. explicit FbStore(QObject *parent);
  45. virtual ~FbStore();
  46. QString add(const QString &path, QByteArray &data);
  47. bool exists(const QString &name) const;
  48. FbBinary * get(const QString &name) const;
  49. const QString & set(const QString &name, QByteArray data, const QString &hash = QString());
  50. QString name(const QString &hash) const;
  51. QByteArray data(const QString &name) const;
  52. public slots:
  53. void binary(const QString &name, const QByteArray &data);
  54. public:
  55. inline FbBinary * at(int i) const { return FbBinatyList::at(i); }
  56. inline int count() const { return FbBinatyList::count(); }
  57. private:
  58. QString newName(const QString &path);
  59. };
  60. typedef QListIterator<FbBinary*> FbTemporaryIterator;
  61. #if 0
  62. class FbNetworkDiskCache : public QNetworkDiskCache
  63. {
  64. public:
  65. explicit FbNetworkDiskCache(QObject *parent = 0) : QNetworkDiskCache(parent) {}
  66. QNetworkCacheMetaData metaData(const QUrl &url);
  67. QIODevice *data(const QUrl &url);
  68. };
  69. #endif
  70. class FbNetworkAccessManager : public QNetworkAccessManager
  71. {
  72. Q_OBJECT
  73. public:
  74. explicit FbNetworkAccessManager(QObject *parent = 0);
  75. void setStore(const QUrl url, FbStore *store);
  76. FbStore *store() const { return m_store; }
  77. public:
  78. QString add(const QString &path, QByteArray &data) { return m_store->add(path, data); }
  79. bool exists(const QString &name) const { return m_store->exists(name); }
  80. FbBinary * get(const QString &name) const { return m_store->get(name); }
  81. int count() const { return m_store->count(); }
  82. QByteArray data(int index) const;
  83. QVariant info(int row, int col) const;
  84. protected:
  85. virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);
  86. private:
  87. FbStore *m_store;
  88. QString m_path;
  89. };
  90. class FbImageReply : public QNetworkReply
  91. {
  92. Q_OBJECT
  93. public:
  94. explicit FbImageReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &data);
  95. qint64 bytesAvailable() const { return content.size(); }
  96. bool isSequential() const { return true; }
  97. void abort() { close(); }
  98. protected:
  99. qint64 readData(char *data, qint64 maxSize);
  100. private:
  101. QByteArray content;
  102. qint64 offset;
  103. };
  104. class FbComboCtrl : public QLineEdit
  105. {
  106. Q_OBJECT
  107. public:
  108. explicit FbComboCtrl(QWidget *parent = 0);
  109. void setIcon(const QIcon &icon);
  110. signals:
  111. void popup();
  112. protected:
  113. void resizeEvent(QResizeEvent* event);
  114. private:
  115. QToolButton *button;
  116. };
  117. class FbImageDlg : public QDialog
  118. {
  119. Q_OBJECT
  120. private:
  121. class FbTab: public QWidget
  122. {
  123. public:
  124. explicit FbTab(QWidget* parent, QAbstractItemModel *model = 0);
  125. QLabel *label;
  126. QComboBox *combo;
  127. FbComboCtrl *edit;
  128. QWebView *preview;
  129. };
  130. public:
  131. explicit FbImageDlg(FbTextEdit *text);
  132. QString result() const;
  133. private slots:
  134. void pictureActivated(const QString & text);
  135. void filenameChanged(const QString & text);
  136. void notebookChanged(int index);
  137. void selectFile();
  138. private:
  139. void preview(QWebView *preview, const QUrl &url);
  140. void clear(QWebView *preview);
  141. private:
  142. FbTextEdit *owner;
  143. QTabWidget *notebook;
  144. FbTab *tabFile;
  145. FbTab *tabPict;
  146. };
  147. class FbImgsModel : public QAbstractListModel
  148. {
  149. Q_OBJECT
  150. public:
  151. explicit FbImgsModel(FbTextEdit *text, QObject *parent = 0);
  152. public:
  153. int rowCount(const QModelIndex &parent = QModelIndex()) const;
  154. int columnCount(const QModelIndex &parent = QModelIndex()) const;
  155. QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
  156. QVariant headerData(int section, Qt::Orientation orientation, int role) const;
  157. private:
  158. FbNetworkAccessManager *manager;
  159. };
  160. class FbImgsWidget : public QWidget
  161. {
  162. Q_OBJECT
  163. public:
  164. explicit FbImgsWidget(FbTextEdit *text, QWidget* parent = 0);
  165. QSize sizeHint() const { return QSize(200,200); }
  166. public slots:
  167. void showCurrent(const QString &name);
  168. private slots:
  169. void loadFinished();
  170. private:
  171. FbTextEdit *m_text;
  172. QTreeView *m_list;
  173. QWebView *m_view;
  174. };
  175. #endif // FB2IMGS_H