123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- #include "wPictureList.h"
- #include "ui_wPictureList.h"
- #include <QDebug>
- #include <QMimeData>
- #include <QDragEnterEvent>
- #include <QDrag>
- #include <QPainter>
- #include "CAppInfo.h"
- wPictureList::wPictureList(int nItemWidth, int nItemSpace, QWidget *parent) :
- QWidget(parent),
- ui(new Ui::wPictureList),
- m_nItemWidth(nItemWidth),
- m_nItemSpace(nItemSpace),
- m_nColNum(6)
- {
- ui->setupUi(this);
- setStyleSheet(g_appInfoPtr->m_sQssStr);
- m_isDragout = false;
- m_dargItemstr = "application/x-dnditemdata";
- setAcceptDrops(true);
- }
- wPictureList::~wPictureList()
- {
- for_each(m_vPicList.begin(), m_vPicList.end(), [](wPictureItem *item){delete item;item=nullptr;});
- m_vPicList.clear();
- delete ui;
- }
- int wPictureList::setUI(const int nLeft, const int nTop, const int nWidth)
- {
- int nRowNum = m_vPicList.size() / m_nColNum + (m_vPicList.size() % m_nColNum + m_nColNum - 1) / m_nColNum;
- setGeometry(nLeft, nTop, nWidth, nRowNum*(m_nItemWidth+ m_nItemSpace));
- return height();
- }
- void wPictureList::setColNum(int nColNum)
- {
- m_nColNum = nColNum;
- }
- void wPictureList::clearPic()
- {
- m_vPicList.clear();
- }
- void wPictureList::AddPic(QString sUrl)
- {
- wPictureItem *item = new wPictureItem(sUrl, this);
- int nSize = m_vPicList.size();
- int nRow = nSize/m_nColNum;
- int nCol = nSize%m_nColNum;
- item->setUI((m_nItemWidth + m_nItemSpace)*nCol,nRow*(m_nItemWidth + m_nItemSpace), m_nItemWidth, m_nItemWidth);
- connect(item, &wPictureItem::viewPhoto, this, [&](QString sFileUrl)
- {
- QStringList list;
- int nIndex = 0;
- std::list<wPictureItem*>::iterator it = m_vPicList.begin();
- for (size_t i = 0; it != m_vPicList.end(); ++i,++it)
- {
- list<<(*it)->getUrl();
- if((*it)->getUrl() == sFileUrl)
- {
- nIndex = i;
- }
- }
- if(m_pViewPhoto == nullptr)
- {
- m_pViewPhoto = std::make_shared<widgetViewPhoto>(nIndex, list, g_appInfoPtr->m_pAnsBgWidget);
- connect(m_pViewPhoto.get(), &widgetViewPhoto::viewImgClose, this, [&](){
- m_pViewPhoto.reset();
- });
- }
- m_pViewPhoto->show();
- });
- connect(item, &wPictureItem::delFile, this, [&](QString sFileUrl)
- {
- for(std::list<wPictureItem*>::iterator it = m_vPicList.begin(); it != m_vPicList.end(); ++it)
- {
- if((*it)->getUrl() == sFileUrl)
- {
- wPictureItem* item = *it;
- delete item;
- m_vPicList.erase(it);
- break;
- }
- }
- std::list<wPictureItem*>::iterator it = m_vPicList.begin();
- for (size_t i = 0; i < m_vPicList.size(); ++i)
- {
- wPictureItem *item = *it;
- int nRow = i / m_nColNum;
- int nCol = i % m_nColNum;
- item->setGeometry((m_nItemWidth + m_nItemSpace)*nCol, nRow*(m_nItemWidth + m_nItemSpace), m_nItemWidth, m_nItemWidth);
- ++it;
- }
- emit picChange();
- });
- item->show();
- m_vPicList.push_back(item);
- }
- QString wPictureList::getFileUrls()
- {
- QStringList list;
- for(std::list<wPictureItem*>::iterator it = m_vPicList.begin(); it != m_vPicList.end(); ++it)
- {
- list<<(*it)->getUrl();
- }
- return list.join(",");
- }
- void wPictureList::rePos(QPoint startPt, QPoint endPt)
- {
- int nStartX = 0;
- int nEndX = 0;
- int nStartY = 0;
- int nEndY = 0;
- std::list<wPictureItem*>::iterator it = m_vPicList.begin();
- nStartX = startPt.x()/(m_nItemWidth + m_nItemSpace);
- if(startPt.x() <= endPt.x())
- {
- nEndX = abs(endPt.x()-startPt.x())/(m_nItemWidth + m_nItemSpace);
- }
- else
- {
- nEndX = (abs(endPt.x()-startPt.x()) + (m_nItemWidth + m_nItemSpace)/2)/(m_nItemWidth + m_nItemSpace);
- }
- nStartY = startPt.y()/(m_nItemWidth + m_nItemSpace);
- nEndY = (abs(endPt.y()-startPt.y()) + (m_nItemWidth + m_nItemSpace)/2)/(m_nItemWidth + m_nItemSpace);
- int nRowNum = m_vPicList.size()/m_nColNum + (m_vPicList.size()%m_nColNum + m_nColNum -1)/m_nColNum;
- if(startPt.x() < endPt.x())
- {
- if((nStartY+1)*m_nColNum > m_vPicList.size())
- {
- if(nStartX + nEndX > m_vPicList.size() - nStartY*m_nColNum - 1)
- {
- nEndX = m_vPicList.size() - nStartY*m_nColNum - nStartX -1;
- }
- }
- else
- {
- if(nStartX + nEndX > m_nColNum - 1)
- {
- nEndX = m_nColNum - nStartX -1;
- }
- }
- if(nEndY > 0 && startPt.y() > endPt.y())
- {//上移
- if(nEndY > nStartY)
- {
- nEndY = nStartY;
- }
- std::list<wPictureItem*>::iterator s = it;
- advance(s, nStartX + nStartY*m_nColNum - nEndY*m_nColNum + nEndX +1);
- std::list<wPictureItem*>::iterator s1 = it;
- advance(s1, nStartX + nStartY*m_nColNum);
- m_vPicList.splice(s, m_vPicList, s1);
- }
- else
- {
- if(nEndY > nRowNum - nStartY -1)
- {
- nEndY = nRowNum - nStartY -1;
- }
- std::list<wPictureItem*>::iterator s = it;
- advance(s, nStartX + nStartY*m_nColNum);
- std::list<wPictureItem*>::iterator s1 = it;
- advance(s1, nStartX + nStartY*m_nColNum+1);
- std::list<wPictureItem*>::iterator s2 = it;
- if(nStartX + nStartY*m_nColNum + nEndY*m_nColNum + nEndX + 1 > m_vPicList.size())
- {
- advance(s2, m_vPicList.size());
- }
- else
- {
- advance(s2, nStartX + nStartY*m_nColNum + nEndY*m_nColNum + nEndX + 1);
- }
- m_vPicList.splice(s, m_vPicList, s1, s2);
- }
- }
- else
- {
- if(nEndX > 0 && nEndX > nStartX)
- {
- nEndX = nStartX;
- }
- if(nEndY > 0 && startPt.y() < endPt.y())
- {//下移
- if(nEndY > nRowNum - nStartY -1)
- {
- nEndY = nRowNum - nStartY -1;
- }
- std::list<wPictureItem*>::iterator s = it;
- advance(s, nStartX + nStartY*m_nColNum);
- std::list<wPictureItem*>::iterator s1 = it;
- advance(s1, nStartX + nStartY*m_nColNum+1);
- std::list<wPictureItem*>::iterator s2 = it;
- if(nStartX + nStartY*m_nColNum + nEndY*m_nColNum - nEndX > m_vPicList.size())
- {
- advance(s2, m_vPicList.size());
- }
- else
- {
- advance(s2, nStartX + nStartY*m_nColNum + nEndY*m_nColNum - nEndX );
- }
- m_vPicList.splice(s, m_vPicList, s1, s2);
- }
- else
- {
- if(nEndY > nStartY)
- {
- nEndY = nStartY;
- }
- std::list<wPictureItem*>::iterator s = it;
- advance(s, nStartX + nStartY*m_nColNum - nEndY*m_nColNum - nEndX);
- std::list<wPictureItem*>::iterator s1 = it;
- advance(s1, nStartX + nStartY*m_nColNum);
- m_vPicList.splice(s, m_vPicList, s1);
- }
- }
- for_each(m_vPicList.begin(), m_vPicList.end(), [](wPictureItem *item){
- qDebug()<<item->getUrl();
- });
- it = m_vPicList.begin();
- for(size_t i = 0; i < m_vPicList.size(); ++i)
- {
- wPictureItem *item = *it;
- int nRow = i/m_nColNum;
- int nCol = i%m_nColNum;
- item->setGeometry((m_nItemWidth + m_nItemSpace)*nCol,nRow*(m_nItemWidth + m_nItemSpace), m_nItemWidth, m_nItemWidth);
- ++it;
- }
- }
- void wPictureList::dragEnterEvent(QDragEnterEvent * event)
- {
- if (event->mimeData()->hasFormat(m_dargItemstr))
- {
- m_isDragout = false;
- // highlightWidget(m_widget, event->pos());
- event->setDropAction(Qt::MoveAction);
- event->accept();
- }
- else {
- event->ignore();
- }
- }
- int wPictureList::itemCount() const
- {
- return m_vPicList.size();
- }
- void wPictureList::dragMoveEvent(QDragMoveEvent * event)
- {
- if (event->mimeData()->hasFormat(m_dargItemstr))
- {
- m_isDragout = false;
- // highlightWidget(m_widget, event->pos());
- event->setDropAction(Qt::MoveAction);
- event->accept();
- }
- else {
- event->ignore();
- }
- }
- void wPictureList::dragLeaveEvent(QDragLeaveEvent*)
- {
- m_isDragout = true;
- }
- void wPictureList::dropEvent(QDropEvent * event)
- {
- if (event->mimeData()->hasFormat(m_dargItemstr))
- {
- m_pos = event->pos();
- event->setDropAction(Qt::MoveAction);
- event->accept();
- }
- else {
- event->ignore();
- }
- }
- void wPictureList::mousePressEvent(QMouseEvent *event)
- {
- QObject *obj = static_cast<QObject*>(childAt(event->pos()));
- if (!obj)
- {
- return;
- }
- QString objName = obj->objectName();
- if(objName != "widget_operation")
- {
- return;
- }
- QWidget *child = static_cast<QWidget*>(obj->parent());
- if (!child)
- return;
- QPixmap pixmap = child->grab();
- QByteArray itemData;
- QDataStream dataStream(&itemData, QIODevice::WriteOnly);
- dataStream << pixmap << QPoint(event->pos() - child->pos());
- //! [1]
- //! [2]
- QMimeData *mimeData = new QMimeData;
- mimeData->setData("application/x-dnditemdata", itemData);
- //! [2]
- //! [3]
- QDrag *drag = new QDrag(this);
- drag->setMimeData(mimeData);
- drag->setPixmap(pixmap);
- drag->setHotSpot(event->pos() - child->pos());
- //! [3]
- QPixmap tempPixmap = pixmap;
- QPainter painter;
- painter.begin(&tempPixmap);
- painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127));
- painter.end();
- // child->setPixmap(tempPixmap);
- if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction)
- {
- rePos(event->pos(), m_pos);
- } else {
- child->show();
- }
- }
|