/* * Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd. * * Author: sbw * * Maintainer: sbw * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "constants.h" #include "pluginsitem.h" #include "pluginsiteminterface.h" #include "util/imagefactory.h" #include #include #include #include #include #define PLUGIN_ITEM_DRAG_THRESHOLD 20 QPoint PluginsItem::MousePressPoint = QPoint(); PluginsItem::PluginsItem(PluginsItemInterface* const pluginInter, const QString &itemKey, QWidget *parent) : DockItem(parent), m_pluginInter(pluginInter), m_centralWidget(m_pluginInter->itemWidget(itemKey)), m_itemKey(itemKey), m_draging(false) { qDebug() << "load plugins item: " << pluginInter->pluginName() << itemKey << m_centralWidget; m_centralWidget->setParent(this); m_centralWidget->setVisible(true); m_centralWidget->installEventFilter(this); QBoxLayout *hLayout = new QHBoxLayout; hLayout->addWidget(m_centralWidget); hLayout->setSpacing(0); hLayout->setMargin(0); setLayout(hLayout); setAccessibleName(pluginInter->pluginName() + "-" + m_itemKey); setAttribute(Qt::WA_TranslucentBackground); } PluginsItem::~PluginsItem() { } int PluginsItem::itemSortKey() const { return m_pluginInter->itemSortKey(m_itemKey); } void PluginsItem::setItemSortKey(const int order) const { m_pluginInter->setSortKey(m_itemKey, order); } void PluginsItem::detachPluginWidget() { QWidget *widget = m_pluginInter->itemWidget(m_itemKey); if (widget) widget->setParent(nullptr); } bool PluginsItem::allowContainer() const { if (DockDisplayMode == Dock::Fashion) return false; return m_pluginInter->itemAllowContainer(m_itemKey); } bool PluginsItem::isInContainer() const { if (DockDisplayMode == Dock::Fashion) return false; return m_pluginInter->itemIsInContainer(m_itemKey); } void PluginsItem::setInContainer(const bool container) { m_pluginInter->setItemIsInContainer(m_itemKey, container); } QSize PluginsItem::sizeHint() const { return m_centralWidget->sizeHint(); } void PluginsItem::refershIcon() { m_pluginInter->refershIcon(m_itemKey); } void PluginsItem::mousePressEvent(QMouseEvent *e) { if (!isInContainer() && PopupWindow->isVisible()) hideNonModel(); if (e->button() == Qt::LeftButton) MousePressPoint = e->pos(); const QPoint dis = e->pos() - rect().center(); if (dis.manhattanLength() > std::min(width(), height()) / 2 * 0.8) QWidget::mousePressEvent(e); else DockItem::mousePressEvent(e); } void PluginsItem::mouseMoveEvent(QMouseEvent *e) { if (e->buttons() != Qt::LeftButton) return DockItem::mouseMoveEvent(e); e->accept(); const QPoint distance = e->pos() - MousePressPoint; if (distance.manhattanLength() > PLUGIN_ITEM_DRAG_THRESHOLD) startDrag(); } void PluginsItem::mouseReleaseEvent(QMouseEvent *e) { DockItem::mouseReleaseEvent(e); if (e->button() != Qt::LeftButton) return; e->accept(); const QPoint distance = e->pos() - MousePressPoint; if (distance.manhattanLength() < PLUGIN_ITEM_DRAG_THRESHOLD) mouseClicked(); } bool PluginsItem::eventFilter(QObject *o, QEvent *e) { if (m_draging) if (o == m_centralWidget && e->type() == QEvent::Paint) return true; return DockItem::eventFilter(o, e); } void PluginsItem::invokedMenuItem(const QString &itemId, const bool checked) { m_pluginInter->invokedMenuItem(m_itemKey, itemId, checked); } void PluginsItem::showPopupWindow(QWidget * const content, const bool model) { if (isInContainer()) return; DockItem::showPopupWindow(content, model); } const QString PluginsItem::contextMenu() const { return m_pluginInter->itemContextMenu(m_itemKey); } QWidget *PluginsItem::popupTips() { return m_pluginInter->itemTipsWidget(m_itemKey); } void PluginsItem::startDrag() { const QPixmap pixmap = grab(); m_draging = true; update(); QMimeData *mime = new QMimeData; mime->setData(DOCK_PLUGIN_MIME, m_itemKey.toStdString().c_str()); QDrag *drag = new QDrag(this); drag->setPixmap(pixmap); drag->setHotSpot(pixmap.rect().center() / pixmap.devicePixelRatioF()); drag->setMimeData(mime); emit dragStarted(); const Qt::DropAction result = drag->exec(Qt::MoveAction); Q_UNUSED(result); emit itemDropped(drag->target()); m_draging = false; setVisible(true); update(); } void PluginsItem::mouseClicked() { const QString command = m_pluginInter->itemCommand(m_itemKey); if (!command.isEmpty()) { QProcess *proc = new QProcess(this); connect(proc, static_cast(&QProcess::finished), proc, &QProcess::deleteLater); proc->startDetached(command); return; } // request popup applet QWidget *w = m_pluginInter->itemPopupApplet(m_itemKey); if (w) showPopupApplet(w); }