dde-dock/plugins/trash/trashwidget.cpp
donghualin c7826edd46 fix: 删除任务栏对libdframeworkdbus-dev库的依赖
1、删除项目中对libdframeworkdbus-dev库的依赖,通过使用xml2cpp的工具来自动生成dbus接口文件,在使用到dbus库的项目中包含生成文件的目录
2、修改相关服务中v20的接口(com.deepin...)为v23的接口(org.deepin...)

Log:
Influence: 打开控制中心,鼠标移动唤醒任务栏、加载插件等,观察相关功能是否正常
Task: https://pms.uniontech.com/task-view-182009.html
Change-Id: I960c849d06ed271ebbb9f8e479d9879967523581
2022-09-19 11:41:31 +00:00

260 lines
6.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
* 2016 ~ 2018 dragondjf
*
* Author: sbw <sbw@sbw.so>
* dragondjf<dingjiangfeng@deepin.com>
* zccrs<zhangjide@deepin.com>
* Tangtong<tangtong@deepin.com>
*
* Maintainer: dragondjf<dingjiangfeng@deepin.com>
* zccrs<zhangjide@deepin.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include "constants.h"
#include "trashwidget.h"
#include <QPainter>
#include <QIcon>
#include <QApplication>
#include <QDragEnterEvent>
#include <QJsonDocument>
#include <QApplication>
#include <QDBusConnection>
TrashWidget::TrashWidget(QWidget *parent)
: QWidget(parent)
, m_popupApplet(new PopupControlWidget(this))
, m_fileManagerInter(new DBusFileManager1("org.freedesktop.FileManager1",
"/org/freedesktop/FileManager1",
QDBusConnection::sessionBus(),
this))
, m_dragging(false)
{
m_popupApplet->setVisible(false);
connect(m_popupApplet, &PopupControlWidget::emptyChanged, this, &TrashWidget::updateIconAndRefresh);
setAcceptDrops(true);
m_defaulticon = QIcon::fromTheme(":/icons/user-trash.svg");
setMinimumSize(PLUGIN_ICON_MIN_SIZE, PLUGIN_ICON_MIN_SIZE);
}
QWidget *TrashWidget::popupApplet()
{
return m_popupApplet;
}
const QString TrashWidget::contextMenu() const
{
QList<QVariant> items;
items.reserve(2);
QMap<QString, QVariant> open;
open["itemId"] = "open";
open["itemText"] = tr("Open");
open["isActive"] = true;
items.push_back(open);
if (!m_popupApplet->empty()) {
QMap<QString, QVariant> empty;
empty["itemId"] = "empty";
empty["itemText"] = tr("Empty");
empty["isActive"] = true;
items.push_back(empty);
}
QMap<QString, QVariant> menu;
menu["items"] = items;
menu["checkableMenu"] = false;
menu["singleCheck"] = false;
return QJsonDocument::fromVariant(menu).toJson();
}
int TrashWidget::trashItemCount() const
{
return m_popupApplet->trashItems();
}
void TrashWidget::invokeMenuItem(const QString &menuId, const bool checked)
{
Q_UNUSED(checked);
if (menuId == "open")
m_popupApplet->openTrashFloder();
else if (menuId == "empty")
m_popupApplet->clearTrashFloder();
}
void TrashWidget::dragEnterEvent(QDragEnterEvent *e)
{
if (e->mimeData()->hasFormat("RequestDock")) {
// accept prevent the event from being propgated to the dock main panel
// which also takes drag event;
if (!e->mimeData()->hasFormat("Removable")) {
// show the forbit dropping cursor.
e->setDropAction(Qt::IgnoreAction);
} else {
e->setDropAction(Qt::MoveAction);
e->accept();
}
return;
}
if (!e->mimeData()->hasUrls())
return e->ignore();
e->setDropAction(Qt::MoveAction);
if (e->dropAction() != Qt::MoveAction) {
e->ignore();
} else {
// 设置item是否拖入回收站的状态给DockItem发送鼠标进入事件
setDragging(true);
qApp->postEvent(this->parent(), new QEnterEvent(e->pos(), mapToParent(e->pos()), mapToGlobal(e->pos())));
e->accept();
}
}
void TrashWidget::dragMoveEvent(QDragMoveEvent *e)
{
if (!e->mimeData()->hasUrls())
return;
e->setDropAction(Qt::MoveAction);
if (e->dropAction() != Qt::MoveAction) {
e->ignore();
} else {
e->accept();
}
}
void TrashWidget::dragLeaveEvent(QDragLeaveEvent *e)
{
Q_UNUSED(e);
// 设置item是否拖入回收站的状态给DockItem发送鼠标离开事件
setDragging(false);
qApp->postEvent(this->parent(), new QEvent(QEvent::Leave));
}
void TrashWidget::dropEvent(QDropEvent *e)
{
if (e->mimeData()->hasFormat("RequestDock"))
return removeApp(e->mimeData()->data("AppKey"));
if (!e->mimeData()->hasUrls()) {
return e->ignore();
}
e->setDropAction(Qt::MoveAction);
if (e->dropAction() != Qt::MoveAction) {
return e->ignore();
}
// 设置item是否拖入回收站的状态给DockItem发送鼠标离开事件
setDragging(false);
qApp->postEvent(this->parent(), new QEvent(QEvent::Leave));
const QMimeData *mime = e->mimeData();
for (auto url : mime->urls())
moveToTrash(url);
}
void TrashWidget::paintEvent(QPaintEvent *e)
{
QWidget::paintEvent(e);
updateIcon();
QPainter painter(this);
const QRectF &rf = QRectF(rect());
const QRectF &rfp = QRectF(m_icon.rect());
painter.drawPixmap(rf.center() - rfp.center() / devicePixelRatioF(), m_icon);
}
void TrashWidget::updateIcon()
{
// Dock::DisplayMode displayMode = qApp->property(PROP_DISPLAY_MODE).value<Dock::DisplayMode>();
Dock::DisplayMode displayMode = Dock::Fashion;
QString iconString = "user-trash";
if (!m_popupApplet->empty())
iconString.append("-full");
if (displayMode == Dock::Efficient)
iconString.append("-symbolic");
int size = std::min(width(), height());
if (size < PLUGIN_ICON_MIN_SIZE)
size = PLUGIN_ICON_MIN_SIZE;
if (size > PLUGIN_BACKGROUND_MAX_SIZE) {
size *= ((Dock::Fashion == qApp->property(PROP_DISPLAY_MODE).value<Dock::DisplayMode>()) ? 0.8 : 0.7);
if (size < PLUGIN_BACKGROUND_MAX_SIZE)
size = PLUGIN_BACKGROUND_MAX_SIZE;
}
QIcon icon = QIcon::fromTheme(iconString, m_defaulticon);
const auto ratio = devicePixelRatioF();
m_icon = icon.pixmap(size * ratio, size * ratio);
m_icon.setDevicePixelRatio(ratio);
}
void TrashWidget::updateIconAndRefresh()
{
updateIcon();
update();
}
bool TrashWidget::getDragging() const
{
return m_dragging;
}
void TrashWidget::setDragging(bool state)
{
m_dragging = state;
}
void TrashWidget::removeApp(const QString &appKey)
{
const QString cmd("dbus-send --print-reply --dest=org.deepin.dde.Launcher1 /org/deepin/dde/Launcher1 org.deepin.dde.Launcher1.UninstallApp string:\"" + appKey + "\"");
QProcess *proc = new QProcess;
proc->start(cmd);
proc->waitForFinished();
proc->deleteLater();
}
void TrashWidget::moveToTrash(const QUrl &url)
{
const QFileInfo info = url.toLocalFile();
QStringList argumentList;
argumentList << info.absoluteFilePath();
m_fileManagerInter->Trash(argumentList);
}