wPictureList.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #include "wPictureList.h"
  2. #include "ui_wPictureList.h"
  3. #include <QDebug>
  4. #include <QMimeData>
  5. #include <QDragEnterEvent>
  6. #include <QDrag>
  7. #include <QPainter>
  8. #include "CAppInfo.h"
  9. wPictureList::wPictureList(int nItemWidth, int nItemSpace, QWidget *parent) :
  10. QWidget(parent),
  11. ui(new Ui::wPictureList),
  12. m_nItemWidth(nItemWidth),
  13. m_nItemSpace(nItemSpace),
  14. m_nColNum(6)
  15. {
  16. ui->setupUi(this);
  17. setStyleSheet(g_appInfoPtr->m_sQssStr);
  18. m_isDragout = false;
  19. m_dargItemstr = "application/x-dnditemdata";
  20. setAcceptDrops(true);
  21. }
  22. wPictureList::~wPictureList()
  23. {
  24. for_each(m_vPicList.begin(), m_vPicList.end(), [](wPictureItem *item){delete item;item=nullptr;});
  25. m_vPicList.clear();
  26. delete ui;
  27. }
  28. int wPictureList::setUI(const int nLeft, const int nTop, const int nWidth)
  29. {
  30. int nRowNum = m_vPicList.size() / m_nColNum + (m_vPicList.size() % m_nColNum + m_nColNum - 1) / m_nColNum;
  31. setGeometry(nLeft, nTop, nWidth, nRowNum*(m_nItemWidth+ m_nItemSpace));
  32. return height();
  33. }
  34. void wPictureList::setColNum(int nColNum)
  35. {
  36. m_nColNum = nColNum;
  37. }
  38. void wPictureList::clearPic()
  39. {
  40. m_vPicList.clear();
  41. }
  42. void wPictureList::AddPic(QString sUrl)
  43. {
  44. wPictureItem *item = new wPictureItem(sUrl, this);
  45. int nSize = m_vPicList.size();
  46. int nRow = nSize/m_nColNum;
  47. int nCol = nSize%m_nColNum;
  48. item->setUI((m_nItemWidth + m_nItemSpace)*nCol,nRow*(m_nItemWidth + m_nItemSpace), m_nItemWidth, m_nItemWidth);
  49. connect(item, &wPictureItem::viewPhoto, this, [&](QString sFileUrl)
  50. {
  51. QStringList list;
  52. int nIndex = 0;
  53. std::list<wPictureItem*>::iterator it = m_vPicList.begin();
  54. for (size_t i = 0; it != m_vPicList.end(); ++i,++it)
  55. {
  56. list<<(*it)->getUrl();
  57. if((*it)->getUrl() == sFileUrl)
  58. {
  59. nIndex = i;
  60. }
  61. }
  62. if(m_pViewPhoto == nullptr)
  63. {
  64. m_pViewPhoto = std::make_shared<widgetViewPhoto>(nIndex, list, g_appInfoPtr->m_pAnsBgWidget);
  65. connect(m_pViewPhoto.get(), &widgetViewPhoto::viewImgClose, this, [&](){
  66. m_pViewPhoto.reset();
  67. });
  68. }
  69. m_pViewPhoto->show();
  70. });
  71. connect(item, &wPictureItem::delFile, this, [&](QString sFileUrl)
  72. {
  73. for(std::list<wPictureItem*>::iterator it = m_vPicList.begin(); it != m_vPicList.end(); ++it)
  74. {
  75. if((*it)->getUrl() == sFileUrl)
  76. {
  77. wPictureItem* item = *it;
  78. delete item;
  79. m_vPicList.erase(it);
  80. break;
  81. }
  82. }
  83. std::list<wPictureItem*>::iterator it = m_vPicList.begin();
  84. for (size_t i = 0; i < m_vPicList.size(); ++i)
  85. {
  86. wPictureItem *item = *it;
  87. int nRow = i / m_nColNum;
  88. int nCol = i % m_nColNum;
  89. item->setGeometry((m_nItemWidth + m_nItemSpace)*nCol, nRow*(m_nItemWidth + m_nItemSpace), m_nItemWidth, m_nItemWidth);
  90. ++it;
  91. }
  92. emit picChange();
  93. });
  94. item->show();
  95. m_vPicList.push_back(item);
  96. }
  97. QString wPictureList::getFileUrls()
  98. {
  99. QStringList list;
  100. for(std::list<wPictureItem*>::iterator it = m_vPicList.begin(); it != m_vPicList.end(); ++it)
  101. {
  102. list<<(*it)->getUrl();
  103. }
  104. return list.join(",");
  105. }
  106. void wPictureList::rePos(QPoint startPt, QPoint endPt)
  107. {
  108. int nStartX = 0;
  109. int nEndX = 0;
  110. int nStartY = 0;
  111. int nEndY = 0;
  112. std::list<wPictureItem*>::iterator it = m_vPicList.begin();
  113. nStartX = startPt.x()/(m_nItemWidth + m_nItemSpace);
  114. if(startPt.x() <= endPt.x())
  115. {
  116. nEndX = abs(endPt.x()-startPt.x())/(m_nItemWidth + m_nItemSpace);
  117. }
  118. else
  119. {
  120. nEndX = (abs(endPt.x()-startPt.x()) + (m_nItemWidth + m_nItemSpace)/2)/(m_nItemWidth + m_nItemSpace);
  121. }
  122. nStartY = startPt.y()/(m_nItemWidth + m_nItemSpace);
  123. nEndY = (abs(endPt.y()-startPt.y()) + (m_nItemWidth + m_nItemSpace)/2)/(m_nItemWidth + m_nItemSpace);
  124. int nRowNum = m_vPicList.size()/m_nColNum + (m_vPicList.size()%m_nColNum + m_nColNum -1)/m_nColNum;
  125. if(startPt.x() < endPt.x())
  126. {
  127. if((nStartY+1)*m_nColNum > m_vPicList.size())
  128. {
  129. if(nStartX + nEndX > m_vPicList.size() - nStartY*m_nColNum - 1)
  130. {
  131. nEndX = m_vPicList.size() - nStartY*m_nColNum - nStartX -1;
  132. }
  133. }
  134. else
  135. {
  136. if(nStartX + nEndX > m_nColNum - 1)
  137. {
  138. nEndX = m_nColNum - nStartX -1;
  139. }
  140. }
  141. if(nEndY > 0 && startPt.y() > endPt.y())
  142. {//上移
  143. if(nEndY > nStartY)
  144. {
  145. nEndY = nStartY;
  146. }
  147. std::list<wPictureItem*>::iterator s = it;
  148. advance(s, nStartX + nStartY*m_nColNum - nEndY*m_nColNum + nEndX +1);
  149. std::list<wPictureItem*>::iterator s1 = it;
  150. advance(s1, nStartX + nStartY*m_nColNum);
  151. m_vPicList.splice(s, m_vPicList, s1);
  152. }
  153. else
  154. {
  155. if(nEndY > nRowNum - nStartY -1)
  156. {
  157. nEndY = nRowNum - nStartY -1;
  158. }
  159. std::list<wPictureItem*>::iterator s = it;
  160. advance(s, nStartX + nStartY*m_nColNum);
  161. std::list<wPictureItem*>::iterator s1 = it;
  162. advance(s1, nStartX + nStartY*m_nColNum+1);
  163. std::list<wPictureItem*>::iterator s2 = it;
  164. if(nStartX + nStartY*m_nColNum + nEndY*m_nColNum + nEndX + 1 > m_vPicList.size())
  165. {
  166. advance(s2, m_vPicList.size());
  167. }
  168. else
  169. {
  170. advance(s2, nStartX + nStartY*m_nColNum + nEndY*m_nColNum + nEndX + 1);
  171. }
  172. m_vPicList.splice(s, m_vPicList, s1, s2);
  173. }
  174. }
  175. else
  176. {
  177. if(nEndX > 0 && nEndX > nStartX)
  178. {
  179. nEndX = nStartX;
  180. }
  181. if(nEndY > 0 && startPt.y() < endPt.y())
  182. {//下移
  183. if(nEndY > nRowNum - nStartY -1)
  184. {
  185. nEndY = nRowNum - nStartY -1;
  186. }
  187. std::list<wPictureItem*>::iterator s = it;
  188. advance(s, nStartX + nStartY*m_nColNum);
  189. std::list<wPictureItem*>::iterator s1 = it;
  190. advance(s1, nStartX + nStartY*m_nColNum+1);
  191. std::list<wPictureItem*>::iterator s2 = it;
  192. if(nStartX + nStartY*m_nColNum + nEndY*m_nColNum - nEndX > m_vPicList.size())
  193. {
  194. advance(s2, m_vPicList.size());
  195. }
  196. else
  197. {
  198. advance(s2, nStartX + nStartY*m_nColNum + nEndY*m_nColNum - nEndX );
  199. }
  200. m_vPicList.splice(s, m_vPicList, s1, s2);
  201. }
  202. else
  203. {
  204. if(nEndY > nStartY)
  205. {
  206. nEndY = nStartY;
  207. }
  208. std::list<wPictureItem*>::iterator s = it;
  209. advance(s, nStartX + nStartY*m_nColNum - nEndY*m_nColNum - nEndX);
  210. std::list<wPictureItem*>::iterator s1 = it;
  211. advance(s1, nStartX + nStartY*m_nColNum);
  212. m_vPicList.splice(s, m_vPicList, s1);
  213. }
  214. }
  215. for_each(m_vPicList.begin(), m_vPicList.end(), [](wPictureItem *item){
  216. qDebug()<<item->getUrl();
  217. });
  218. it = m_vPicList.begin();
  219. for(size_t i = 0; i < m_vPicList.size(); ++i)
  220. {
  221. wPictureItem *item = *it;
  222. int nRow = i/m_nColNum;
  223. int nCol = i%m_nColNum;
  224. item->setGeometry((m_nItemWidth + m_nItemSpace)*nCol,nRow*(m_nItemWidth + m_nItemSpace), m_nItemWidth, m_nItemWidth);
  225. ++it;
  226. }
  227. }
  228. void wPictureList::dragEnterEvent(QDragEnterEvent * event)
  229. {
  230. if (event->mimeData()->hasFormat(m_dargItemstr))
  231. {
  232. m_isDragout = false;
  233. // highlightWidget(m_widget, event->pos());
  234. event->setDropAction(Qt::MoveAction);
  235. event->accept();
  236. }
  237. else {
  238. event->ignore();
  239. }
  240. }
  241. int wPictureList::itemCount() const
  242. {
  243. return m_vPicList.size();
  244. }
  245. void wPictureList::dragMoveEvent(QDragMoveEvent * event)
  246. {
  247. if (event->mimeData()->hasFormat(m_dargItemstr))
  248. {
  249. m_isDragout = false;
  250. // highlightWidget(m_widget, event->pos());
  251. event->setDropAction(Qt::MoveAction);
  252. event->accept();
  253. }
  254. else {
  255. event->ignore();
  256. }
  257. }
  258. void wPictureList::dragLeaveEvent(QDragLeaveEvent*)
  259. {
  260. m_isDragout = true;
  261. }
  262. void wPictureList::dropEvent(QDropEvent * event)
  263. {
  264. if (event->mimeData()->hasFormat(m_dargItemstr))
  265. {
  266. m_pos = event->pos();
  267. event->setDropAction(Qt::MoveAction);
  268. event->accept();
  269. }
  270. else {
  271. event->ignore();
  272. }
  273. }
  274. void wPictureList::mousePressEvent(QMouseEvent *event)
  275. {
  276. QObject *obj = static_cast<QObject*>(childAt(event->pos()));
  277. if (!obj)
  278. {
  279. return;
  280. }
  281. QString objName = obj->objectName();
  282. if(objName != "widget_operation")
  283. {
  284. return;
  285. }
  286. QWidget *child = static_cast<QWidget*>(obj->parent());
  287. if (!child)
  288. return;
  289. QPixmap pixmap = child->grab();
  290. QByteArray itemData;
  291. QDataStream dataStream(&itemData, QIODevice::WriteOnly);
  292. dataStream << pixmap << QPoint(event->pos() - child->pos());
  293. //! [1]
  294. //! [2]
  295. QMimeData *mimeData = new QMimeData;
  296. mimeData->setData("application/x-dnditemdata", itemData);
  297. //! [2]
  298. //! [3]
  299. QDrag *drag = new QDrag(this);
  300. drag->setMimeData(mimeData);
  301. drag->setPixmap(pixmap);
  302. drag->setHotSpot(event->pos() - child->pos());
  303. //! [3]
  304. QPixmap tempPixmap = pixmap;
  305. QPainter painter;
  306. painter.begin(&tempPixmap);
  307. painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127));
  308. painter.end();
  309. // child->setPixmap(tempPixmap);
  310. if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction)
  311. {
  312. rePos(event->pos(), m_pos);
  313. } else {
  314. child->show();
  315. }
  316. }