diff --git a/dde-dock/Panel/panel.cpp b/dde-dock/Panel/panel.cpp index db726cc9e..7d42bb6bb 100644 --- a/dde-dock/Panel/panel.cpp +++ b/dde-dock/Panel/panel.cpp @@ -1,6 +1,7 @@ #include "panel.h" -Panel::Panel(QWidget *parent) : QWidget(parent) +Panel::Panel(QWidget *parent) + : QWidget(parent),parentWidget(parent) { leftLayout = new DockLayout(this); leftLayout->resize(1024,50); @@ -17,6 +18,9 @@ Panel::Panel(QWidget *parent) : QWidget(parent) leftLayout->addItem(b3); leftLayout->addItem(b4); leftLayout->addItem(b5); + + connect(leftLayout,SIGNAL(dragStarted()),this,SLOT(slotDragStarted())); + connect(leftLayout,SIGNAL(itemDropped()),this,SLOT(slotItemDropped())); } void Panel::resize(const QSize &size) @@ -31,6 +35,36 @@ void Panel::resize(int width, int height) leftLayout->resize(this->width() * 2 / 3,this->height()); } +void Panel::showScreenMask() +{ + qWarning() << "[Info:]" << "Show Screen Mask."; + maskWidget = new ScreenMask(); + connect(maskWidget,SIGNAL(itemDropped(QPoint)),this,SLOT(slotItemDropped())); + + //TODO change to Other ways to do this,it will hide the drag icon + parentWidget->hide(); + parentWidget->show(); +} + +void Panel::hideScreenMask() +{ + qWarning() << "[Info:]" << "Hide Screen Mask."; + disconnect(maskWidget,SIGNAL(itemDropped(QPoint)),this,SLOT(slotItemDropped())); + maskWidget->hide(); + maskWidget->deleteLater(); + maskWidget = NULL; +} + +void Panel::slotDragStarted() +{ + showScreenMask(); +} + +void Panel::slotItemDropped() +{ + hideScreenMask(); +} + Panel::~Panel() { diff --git a/dde-dock/Panel/panel.h b/dde-dock/Panel/panel.h index 2718b9a9c..2be4f64d3 100644 --- a/dde-dock/Panel/panel.h +++ b/dde-dock/Panel/panel.h @@ -6,6 +6,7 @@ #include #include "Widgets/appitem.h" #include "Widgets/docklayout.h" +#include "Widgets/screenmask.h" class Panel : public QWidget { @@ -17,11 +18,19 @@ public: void resize(const QSize &size); void resize(int width,int height); + void showScreenMask(); + void hideScreenMask(); + signals: public slots: + void slotDragStarted(); + void slotItemDropped(); + private: DockLayout * leftLayout; + QWidget * parentWidget = NULL; + ScreenMask * maskWidget = NULL; }; #endif // PANEL_H diff --git a/dde-dock/Widgets/appitem.cpp b/dde-dock/Widgets/appitem.cpp index 156a46c96..3473bcbe8 100644 --- a/dde-dock/Widgets/appitem.cpp +++ b/dde-dock/Widgets/appitem.cpp @@ -106,6 +106,8 @@ void AppItem::mouseMoveEvent(QMouseEvent *event) { QDrag* drag = new QDrag(this); QMimeData* data = new QMimeData(); + QImage dataImg(this->itemIconPath); + data->setImageData(QVariant(dataImg)); drag->setMimeData(data); QPixmap pixmap(this->itemIconPath); @@ -130,8 +132,18 @@ void AppItem::leaveEvent(QEvent *event) void AppItem::dragEnterEvent(QDragEnterEvent *event) { emit dragEntered(event,this); -// event->setDropAction(Qt::MoveAction); -// event->accept(); + + AppItem *tmpItem = NULL; + tmpItem = dynamic_cast(event->source()); + if (tmpItem) + { +// qWarning()<< "[Info:]" << "Brother Item."; + } + else + { + event->setDropAction(Qt::MoveAction); + event->accept(); + } // if (event->mimeData()->hasFormat("application/x-dnditemdata")){ // if (event->source() == this){ diff --git a/dde-dock/Widgets/appitem.h b/dde-dock/Widgets/appitem.h index f03aa4d60..849cd0fe4 100644 --- a/dde-dock/Widgets/appitem.h +++ b/dde-dock/Widgets/appitem.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include "dockitem.h" #include "dockconstants.h" diff --git a/dde-dock/Widgets/docklayout.cpp b/dde-dock/Widgets/docklayout.cpp index 7ad759631..5650de5a1 100644 --- a/dde-dock/Widgets/docklayout.cpp +++ b/dde-dock/Widgets/docklayout.cpp @@ -199,6 +199,8 @@ void DockLayout::dropEvent(QDropEvent *event) { insertItem(tmpItem,lastHoverIndex); } + + emit itemDropped(); } void DockLayout::slotItemDrag(AppItem *item) @@ -208,6 +210,8 @@ void DockLayout::slotItemDrag(AppItem *item) if (tmpIndex != -1) { dragoutFromLayout(tmpIndex); + + emit dragStarted(); } } diff --git a/dde-dock/Widgets/docklayout.h b/dde-dock/Widgets/docklayout.h index 71923cd70..e85ff7759 100644 --- a/dde-dock/Widgets/docklayout.h +++ b/dde-dock/Widgets/docklayout.h @@ -42,6 +42,10 @@ public: int indexOf(AppItem * item); int indexOf(int x,int y); +signals: + void dragStarted(); + void itemDropped(); + protected: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); diff --git a/dde-dock/Widgets/screenmask.cpp b/dde-dock/Widgets/screenmask.cpp new file mode 100644 index 000000000..94e8d61a6 --- /dev/null +++ b/dde-dock/Widgets/screenmask.cpp @@ -0,0 +1,40 @@ +#include "screenmask.h" + +ScreenMask::ScreenMask(QWidget *parent) : QWidget(parent) +{ + QRect rec = QApplication::desktop()->screenGeometry(); + this->resize(rec.width(),rec.height()); + this->setWindowFlags(Qt::ToolTip); + this->setWindowOpacity(0); + + setAcceptDrops(true); + + this->show(); +} + +void ScreenMask::dragEnterEvent(QDragEnterEvent *event) +{ + event->setDropAction(Qt::MoveAction); + event->accept(); +} + +void ScreenMask::dropEvent(QDropEvent *event) +{ + qWarning() << "Item drop here:" << event->pos() << event->mimeData()->hasImage(); + QImage image = qvariant_cast(event->mimeData()->imageData()); + if (!image.isNull()) + { + TransformLabel * imgLabel = new TransformLabel(); + imgLabel->setAttribute(Qt::WA_TranslucentBackground); + imgLabel->setWindowFlags(Qt::ToolTip); + imgLabel->setPixmap(QPixmap::fromImage(image)); + imgLabel->move(event->pos()); + imgLabel->show(); + + //TODO add animation here + QTimer::singleShot(1000,imgLabel,SLOT(deleteLater())); + + emit itemDropped(event->pos()); + } + +} diff --git a/dde-dock/Widgets/screenmask.h b/dde-dock/Widgets/screenmask.h new file mode 100644 index 000000000..85b61cce8 --- /dev/null +++ b/dde-dock/Widgets/screenmask.h @@ -0,0 +1,52 @@ +#ifndef SCREENMASK_H +#define SCREENMASK_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class TransformLabel : public QLabel +{ + Q_OBJECT + Q_PROPERTY(QTransform transform READ getTransform WRITE setTransform) +public: + explicit TransformLabel(QWidget *parent=0) : QLabel(parent){} + + QTransform getTransform(){return this->pixTransform;} + void setTransform(const QTransform &value) + { + this->pixTransform = value; + this->setPixmap(this->pixmap()->transformed(value)); + } + +private: + QTransform pixTransform; +}; + +class ScreenMask : public QWidget +{ + Q_OBJECT +public: + explicit ScreenMask(QWidget *parent = 0); + +protected: + void dragEnterEvent(QDragEnterEvent *event); + void dropEvent(QDropEvent *event); + +signals: + void itemDropped(QPoint pos); + +public slots: +}; + +#endif // SCREENMASK_H diff --git a/dde-dock/dde-dock.pro b/dde-dock/dde-dock.pro index 88b337dea..8723e7724 100644 --- a/dde-dock/dde-dock.pro +++ b/dde-dock/dde-dock.pro @@ -24,7 +24,8 @@ SOURCES += main.cpp\ Widgets/appitem.cpp \ Widgets/docklayout.cpp \ Widgets/windowpreview.cpp \ - Widgets/dockitem.cpp + Widgets/dockitem.cpp \ + Widgets/screenmask.cpp HEADERS += mainwidget.h \ Panel/panel.h \ @@ -37,7 +38,8 @@ HEADERS += mainwidget.h \ Widgets/appitem.h \ Widgets/docklayout.h \ Widgets/windowpreview.h \ - Widgets/dockitem.h + Widgets/dockitem.h \ + Widgets/screenmask.h RESOURCES += \ images.qrc