PageRenderTime 61ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 0ms

/gui/main_window/history_control/ImagePreviewWidget.cpp

https://gitlab.com/alvinahmadov2/icq-desktop
C++ | 229 lines | 178 code | 51 blank | 0 comment | 14 complexity | 63b9b97538210f4a859a5c30ccf79553 MD5 | raw file
  1. #include "stdafx.h"
  2. #include "../../core_dispatcher.h"
  3. #include "../../utils/log/log.h"
  4. #include "../../utils/utils.h"
  5. #include "ImagePreviewWidget.h"
  6. namespace HistoryControl
  7. {
  8. enum class ImagePreviewWidget::State
  9. {
  10. Min,
  11. Initial,
  12. Loaded,
  13. Error,
  14. Max,
  15. };
  16. ImagePreviewWidget::ImagePreviewWidget(QWidget *parent, const bool isOutgoing, const QString &uri, const QString &text, const bool previewsEnabled)
  17. : PreviewContentWidget(parent, isOutgoing, text, previewsEnabled)
  18. , State_(State::Initial)
  19. , Uri_(uri.trimmed())
  20. , LeftButtonPressed_(false)
  21. {
  22. if (build::is_debug())
  23. {
  24. QUrl uri(Uri_);
  25. assert(uri.isValid());
  26. assert(!uri.isLocalFile());
  27. assert(!uri.isRelative());
  28. }
  29. setMouseTracking(true);
  30. }
  31. ImagePreviewWidget::~ImagePreviewWidget()
  32. {
  33. }
  34. void ImagePreviewWidget::leaveEvent(QEvent *e)
  35. {
  36. PreviewContentWidget::leaveEvent(e);
  37. LeftButtonPressed_ = false;
  38. }
  39. void ImagePreviewWidget::mouseMoveEvent(QMouseEvent *e)
  40. {
  41. PreviewContentWidget::mouseMoveEvent(e);
  42. setCursor(
  43. isOverPicture(e->pos()) ?
  44. Qt::PointingHandCursor :
  45. Qt::ArrowCursor
  46. );
  47. }
  48. void ImagePreviewWidget::mousePressEvent(QMouseEvent *e)
  49. {
  50. PreviewContentWidget::mousePressEvent(e);
  51. const auto clickedOnPicture = (
  52. isLeftButtonClick(e) &&
  53. isOverPicture(e->pos())
  54. );
  55. LeftButtonPressed_ |= clickedOnPicture;
  56. }
  57. void ImagePreviewWidget::mouseReleaseEvent(QMouseEvent *e)
  58. {
  59. PreviewContentWidget::mouseReleaseEvent(e);
  60. const auto clickedOnPicture = (
  61. isLeftButtonClick(e) &&
  62. PreviewGenuineSize_.isValid() &&
  63. getPreviewScaledRect().contains(e->pos())
  64. );
  65. if (clickedOnPicture && LeftButtonPressed_)
  66. {
  67. QDesktopServices::openUrl(Uri_);
  68. }
  69. LeftButtonPressed_ = false;
  70. }
  71. void ImagePreviewWidget::imageDownloaded(qint64 seq, QString uri, QPixmap preview)
  72. {
  73. if (!isCurrentProcessId(seq))
  74. {
  75. return;
  76. }
  77. connectCoreSignals(false);
  78. resetCurrentProcessId();
  79. if (!preview.isNull())
  80. {
  81. State_ = State::Loaded;
  82. setPreview(preview);
  83. }
  84. else
  85. {
  86. __WARN(
  87. "preview",
  88. "loading failed\n"
  89. " uri=<" << Uri_ << ">"
  90. );
  91. State_ = State::Error;
  92. setTextVisible(true);
  93. }
  94. update();
  95. }
  96. bool ImagePreviewWidget::isBlockElement() const
  97. {
  98. return false;
  99. }
  100. bool ImagePreviewWidget::canUnload() const
  101. {
  102. return true;
  103. }
  104. QString ImagePreviewWidget::toLogString() const
  105. {
  106. QString result;
  107. result.reserve(512);
  108. QTextStream fmt(&result);
  109. fmt << " widget=<image_preview>\n";
  110. if (isOutgoing())
  111. {
  112. fmt << " type=<outgoing>\n";
  113. }
  114. else
  115. {
  116. fmt << " type=<incoming>\n";
  117. }
  118. fmt << " uri=<" << Uri_ << ">\n"
  119. " text=<" << getText() << ">";
  120. return result;
  121. }
  122. QString ImagePreviewWidget::toString() const
  123. {
  124. return Text_;
  125. }
  126. void ImagePreviewWidget::initialize()
  127. {
  128. PreviewContentWidget::initialize();
  129. if (!PreviewsEnabled_)
  130. {
  131. setTextVisible(true);
  132. return;
  133. }
  134. const auto hasText = !Text_.isEmpty();
  135. const auto uriOnly = (hasText && (Text_.trimmed() == Uri_));
  136. if (!uriOnly)
  137. {
  138. setTextVisible(true);
  139. }
  140. connectCoreSignals(true);
  141. const auto procId = Ui::GetDispatcher()->downloadImagePreview(Uri_);
  142. setCurrentProcessId(procId);
  143. }
  144. bool ImagePreviewWidget::isPreloaderVisible() const
  145. {
  146. return true;
  147. }
  148. bool ImagePreviewWidget::isLeftButtonClick(QMouseEvent *e)
  149. {
  150. assert(e);
  151. const auto isLeftButtonFlagSet = ((e->buttons() & Qt::LeftButton) != 0);
  152. const auto isLeftButton = (
  153. isLeftButtonFlagSet ||
  154. (e->button() == Qt::LeftButton)
  155. );
  156. return isLeftButton;
  157. }
  158. void ImagePreviewWidget::connectCoreSignals(const bool isConnected)
  159. {
  160. connectCoreSignal(
  161. SIGNAL(imageDownloaded(qint64, QString, QPixmap)),
  162. SLOT(imageDownloaded(qint64, QString, QPixmap)),
  163. isConnected
  164. );
  165. }
  166. bool ImagePreviewWidget::isOverPicture(const QPoint &p) const
  167. {
  168. if (!PreviewGenuineSize_.isValid())
  169. {
  170. return false;
  171. }
  172. return getPreviewScaledRect().contains(p);
  173. }
  174. bool ImagePreviewWidget::isPreviewVisible() const
  175. {
  176. return (State_ == State::Loaded);
  177. }
  178. }