PageRenderTime 34ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/extensions/widgets/folderwidget/folderitem.cpp

https://github.com/plexydesk/plexydesk
C++ | 182 lines | 142 code | 32 blank | 8 comment | 9 complexity | 3a44264e395677c927d7e5ab5eb9f698 MD5 | raw file
Possible License(s): LGPL-3.0
  1. #include "folderitem.h"
  2. #include <ck_button.h>
  3. #include <QStyleOptionGraphicsItem>
  4. #include <QGraphicsEffect>
  5. #include <QGraphicsDropShadowEffect>
  6. #include <QMimeData>
  7. #include <QDrag>
  8. #include <QGraphicsSceneEvent>
  9. #include <QUrl>
  10. #include <QDebug>
  11. #include <QApplication>
  12. #include <QDesktopServices>
  13. #include <QColor>
  14. #include <QGraphicsEffect>
  15. #include <QGraphicsDropShadowEffect>
  16. class FolderItem::PrivateFolderItem {
  17. public:
  18. PrivateFolderItem() {}
  19. ~PrivateFolderItem() {}
  20. QRectF mRect;
  21. QIcon mIcon;
  22. QString mFileName;
  23. QString mFilePath;
  24. QFileInfo mFileInfo;
  25. QPointF mDragStartPosition;
  26. bool mSelected;
  27. QGraphicsDropShadowEffect *mShadowEffect;
  28. };
  29. FolderItem::FolderItem(const QRectF &rect, QGraphicsItem *parent)
  30. : cherry_kit::TableViewItem(rect, parent), d(new PrivateFolderItem) {
  31. this->setCacheMode(DeviceCoordinateCache);
  32. d->mRect = rect;
  33. setAcceptedMouseButtons(Qt::LeftButton | Qt::RightButton);
  34. setFlag(QGraphicsItem::ItemIsMovable, false);
  35. setFlag(QGraphicsItem::ItemIsFocusable, true);
  36. setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
  37. setAcceptTouchEvents(true);
  38. setAcceptHoverEvents(true);
  39. setGraphicsItem(this);
  40. d->mSelected = false;
  41. d->mShadowEffect = new QGraphicsDropShadowEffect(this);
  42. d->mShadowEffect->setBlurRadius(6.0);
  43. d->mShadowEffect->setEnabled(true);
  44. d->mShadowEffect->setColor(Qt::black);
  45. d->mShadowEffect->setXOffset(0);
  46. d->mShadowEffect->setYOffset(0);
  47. // this->setGraphicsEffect(d->mShadowEffect);
  48. }
  49. QRectF FolderItem::boundingRect() const { return QRectF(0.0, 0.0, 96, 96); }
  50. QSizeF FolderItem::sizeHint(Qt::SizeHint hint, const QSizeF &size) const {
  51. return boundingRect().size();
  52. }
  53. void FolderItem::setIcon(const QIcon &icon) { d->mIcon = icon; }
  54. void FolderItem::setFileName(const QString &fileName) {
  55. d->mFileName = fileName;
  56. }
  57. void FolderItem::setFilePath(const QString &path) { d->mFilePath = path; }
  58. void FolderItem::setFileInfo(const QFileInfo &info) { d->mFileInfo = info; }
  59. QFileInfo FolderItem::fileInfo() const { return d->mFileInfo; }
  60. QIcon FolderItem::icon() const { return d->mIcon; }
  61. void FolderItem::set_selected() {
  62. d->mSelected = true;
  63. update();
  64. }
  65. void FolderItem::clear_selection() {
  66. d->mSelected = false;
  67. update();
  68. }
  69. void FolderItem::paint(QPainter *painter,
  70. const QStyleOptionGraphicsItem *option,
  71. QWidget *widget) {
  72. if (!painter->isActive()) {
  73. return;
  74. }
  75. if (isObscured()) {
  76. return;
  77. }
  78. /* Painter settings */
  79. painter->setRenderHint(QPainter::Antialiasing, true);
  80. painter->setRenderHint(QPainter::TextAntialiasing, true);
  81. painter->setRenderHint(QPainter::HighQualityAntialiasing, true);
  82. QPainterPath path;
  83. path.addRoundedRect(boundingRect(), 4.0, 4.0);
  84. if (d->mSelected) {
  85. painter->setOpacity(0.5);
  86. painter->setPen(QColor("#e7e7e7"));
  87. painter->drawPath(path);
  88. // painter->drawRect(option->exposedRect);
  89. }
  90. QRect iconRect((boundingRect().width() - 48) / 2, 10.0, 48, 48);
  91. QRectF labelRectF(0, iconRect.height() + 2.0, option->exposedRect.width(),
  92. option->rect.height() - iconRect.height());
  93. if (d->mSelected)
  94. d->mIcon.paint(painter, iconRect, Qt::AlignCenter, QIcon::Active,
  95. QIcon::On);
  96. else
  97. d->mIcon.paint(painter, iconRect, Qt::AlignCenter, QIcon::Normal,
  98. QIcon::On);
  99. QTextOption txtOption;
  100. txtOption.setAlignment(Qt::AlignCenter);
  101. txtOption.setWrapMode(QTextOption::WrapAnywhere);
  102. QFontMetrics metrics(painter->font());
  103. QString elidedText =
  104. metrics.elidedText(d->mFileName, Qt::ElideMiddle, labelRectF.width());
  105. // Shadow
  106. // text
  107. QPen pen;
  108. pen.setColor(QColor(0, 0, 0));
  109. painter->setPen(pen);
  110. painter->drawText(labelRectF, elidedText, txtOption);
  111. }
  112. void FolderItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
  113. qDebug() << Q_FUNC_INFO << endl;
  114. event->accept();
  115. if (event->button() == Qt::LeftButton) {
  116. d->mDragStartPosition = event->pos();
  117. }
  118. }
  119. void FolderItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
  120. qDebug() << Q_FUNC_INFO << endl;
  121. event->accept();
  122. Q_EMIT clicked(this);
  123. // QGraphicsItem::mouseReleaseEvent(event);
  124. }
  125. void FolderItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
  126. if (!(event->buttons() & Qt::LeftButton)) {
  127. return;
  128. }
  129. if ((event->pos() - d->mDragStartPosition).manhattanLength() <
  130. QApplication::startDragDistance()) {
  131. return;
  132. }
  133. QMimeData *data = new QMimeData;
  134. data->setImageData(d->mIcon.pixmap(64, 64).toImage());
  135. data->setUrls(QList<QUrl>() << QUrl(d->mFilePath));
  136. QDrag *drag = new QDrag(event->widget());
  137. drag->setPixmap(d->mIcon.pixmap(64, 64));
  138. drag->setObjectName(d->mFileName);
  139. drag->setMimeData(data);
  140. drag->start();
  141. // Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);
  142. }
  143. void FolderItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) {
  144. qDebug() << Q_FUNC_INFO << "Run File: " << d->mFilePath;
  145. Q_EMIT doubleClicked(this);
  146. if (!QDesktopServices::openUrl(QUrl::fromLocalFile(d->mFilePath))) {
  147. qWarning() << "File opening failed";
  148. }
  149. // QGraphicsObject::mouseDoubleClickEvent(event);
  150. }