chore(trash): now trash plugin is a part of dde-dock

Change-Id: I27d74962726a3b4dc5fe85a56e72a36bd5edbcd8
This commit is contained in:
Gary Wang 2018-09-19 10:56:17 +08:00
parent f73428a465
commit 33e0ac383b
Notes: gerrit 2018-09-19 13:10:48 +08:00
Verified+1: <jenkins@deepin.com>
Code-Review+2: Gary Wang <wzc782970009@gmail.com>
Submitted-by: Gary Wang <wzc782970009@gmail.com>
Submitted-at: Wed, 19 Sep 2018 13:10:47 +0800
Reviewed-on: https://cr.deepin.io/38531
Project: dde/dde-dock
Branch: refs/heads/master
10 changed files with 175 additions and 92 deletions

1
.gitignore vendored
View File

@ -17,6 +17,7 @@ build*/
CMakeLists.txt.user*
*.DS_Store
*.qm
.directory
# binary file
dde-dock

9
debian/control vendored
View File

@ -21,16 +21,15 @@ Homepage: http://www.deepin.org/
Package: dde-dock
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, deepin-menu
Recommends: dde-disk-mount-plugin,
dde-trash-plugin
Recommends: dde-disk-mount-plugin
Conflicts: dde-workspace (<< 2.90.5),
dde-dock-applets
dde-dock-applets, dde-trash-plugin
Replaces: dde-dock-applets
Description: deepin desktop-environment - dock module
Deepin desktop environment 2015 - dock module.
Deepin desktop environment - dock module.
Package: dde-dock-dev
Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: deepin desktop-environment - dock module development files
Deepin desktop environment 2015 - dock module development files.
Deepin desktop environment - dock module development files.

View File

@ -5,5 +5,5 @@ add_subdirectory("network")
add_subdirectory("shutdown")
add_subdirectory("sound")
add_subdirectory("system-tray")
#add_subdirectory("trash")
add_subdirectory("trash")
add_subdirectory("keyboard-layout")

View File

@ -9,23 +9,16 @@ file(GLOB SRCS "*.h" "*.cpp")
find_package(PkgConfig REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Svg REQUIRED)
find_package(Qt5DBus REQUIRED)
find_package(DtkWidget REQUIRED)
pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus)
add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN")
add_library(${PLUGIN_NAME} SHARED ${SRCS})
set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../)
target_include_directories(${PLUGIN_NAME} PUBLIC ${DtkWidget_INCLUDE_DIRS}
${DFrameworkDBus_INCLUDE_DIRS}
${Qt5DBus_INCLUDE_DIRS}
../../interfaces)
target_link_libraries(${PLUGIN_NAME} PRIVATE
${DtkWidget_LIBRARIES}
${DFrameworkDBus_LIBRARIES}
${Qt5Widgets_LIBRARIES}
${Qt5DBus_LIBRARIES}
${Qt5Svg_LIBRARIES}
)

View File

@ -1,9 +1,14 @@
/*
* 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: sbw <sbw@sbw.so>
* 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
@ -27,14 +32,16 @@
#include <QDir>
#include <ddialog.h>
#include <DTrashManager>
#include <DDesktopServices>
#include <com_deepin_daemon_soundeffect.h>
#include <QCoreApplication>
DWIDGET_USE_NAMESPACE
const QString TrashDir = QDir::homePath() + "/.local/share/Trash";
const QDir::Filters ItemsShouldCount = QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot;
using SoundEffectInter = com::deepin::daemon::SoundEffect;
PopupControlWidget::PopupControlWidget(QWidget *parent)
: QWidget(parent),
@ -73,54 +80,56 @@ const QString PopupControlWidget::trashDir()
void PopupControlWidget::openTrashFloder()
{
QProcess *proc = new QProcess;
connect(proc, static_cast<void (QProcess::*)(int)>(&QProcess::finished), proc, &QProcess::deleteLater);
proc->startDetached("gvfs-open trash:///");
QProcess::startDetached("gio", QStringList() << "open" << "trash:///");
}
void PopupControlWidget::clearTrashFloder()
{
QString ClearTrashMutliple = qApp->translate("DialogManager", "Are you sure to empty %1 items?");
// show confrim dialog
bool accept = false;
const int itemCount = trashItemCount();
const QStringList btns = {tr("Cancel"), tr("Empty")};
DDialog d;
QStringList buttonTexts;
buttonTexts << qApp->translate("DialogManager", "Cancel") << qApp->translate("DialogManager", "Delete");
DDialog *dialog = new DDialog(nullptr);
dialog->addButtons(btns);
dialog->setIconPixmap(QIcon::fromTheme("user-trash-full").pixmap(48, 48));
dialog->setMessage(tr("This action cannot be restored"));
if (itemCount == 1)
dialog->setTitle(tr("Are you sure to empty 1 item ?"));
else
dialog->setTitle(tr("Are you sure to empty %1 items ?").arg(itemCount));
if (!d.parentWidget()) {
d.setWindowFlags(d.windowFlags() | Qt::WindowStaysOnTopHint);
}
connect(dialog, &DDialog::buttonClicked, [&] (const int index) {
accept = index;
});
dialog->exec();
dialog->deleteLater();
QDir dir(TrashDir + "/files");//QDir::homePath() + "/.local/share/Trash/files");
uint count = dir.entryList(ItemsShouldCount).count();
int execCode = -1;
if (!accept)
if (count > 0) {
// blumia: Workaround. There is a bug with DDialog which will let DDialog always use the smallest
// avaliable size of the given icon. So we create a m_dialogTrashFullIcon and leave a minimum
// 64*64 pixmap size icon here.
QIcon m_dialogTrashFullIcon;
QIcon trash_full_icon = QIcon::fromTheme("user-trash-full-opened");
m_dialogTrashFullIcon.addPixmap(trash_full_icon.pixmap(64));
m_dialogTrashFullIcon.addPixmap(trash_full_icon.pixmap(128));
d.setTitle(ClearTrashMutliple.arg(count));
d.setMessage(qApp->translate("DialogManager", "This action cannot be restored"));
d.setIcon(m_dialogTrashFullIcon);
d.addButton(buttonTexts[0], true, DDialog::ButtonNormal);
d.addButton(buttonTexts[1], false, DDialog::ButtonWarning);
d.setDefaultButton(1);
d.getButton(1)->setFocus();
d.moveToCenter();
execCode = d.exec();
}
if (execCode != QDialog::Accepted) {
return;
}
QProcess::startDetached("gvfs-trash", QStringList() << "-f" << "--empty");
// play sound effects
SoundEffectInter sei("com.deepin.daemon.SoundEffect", "/com/deepin/daemon/SoundEffect", QDBusConnection::sessionBus());
sei.PlaySystemSound("trash-empty");
// for (auto item : QDir(TrashDir).entryInfoList())
// {
// if (item.fileName() == "." || item.fileName() == "..")
// continue;
// if (item.isFile())
// QFile(item.fileName()).remove();
// else if (item.isDir())
// QDir(item.absoluteFilePath()).removeRecursively();
// }
if (DTrashManager::instance()->cleanTrash()) {
DDesktopServices::playSystemSoundEffect(DDesktopServices::SSE_EmptyTrash);
} else {
qWarning() << "Clear trash failed";
}
// DFMGlobal::instance()->clearTrash();
}
int PopupControlWidget::trashItemCount() const
@ -135,20 +144,23 @@ void PopupControlWidget::trashStatusChanged()
// add monitor paths
m_fsWatcher->addPath(TrashDir);
if (files)
if (files) {
m_fsWatcher->addPath(TrashDir + "/files");
}
// if (info)
// m_fsWatcher->addPath(TrashDir + "/info");
// check empty
if (!files)
if (!files) {
m_trashItemsCount = 0;
else
m_trashItemsCount = QDir(TrashDir + "/files").entryList().count() - 2;
} else {
m_trashItemsCount = QDir(TrashDir + "/files").entryList(ItemsShouldCount).count();
}
const bool empty = m_trashItemsCount == 0;
if (m_empty == empty)
if (m_empty == empty) {
return;
}
// m_clearBtn->setVisible(!empty);
m_empty = empty;

View File

@ -1,9 +1,14 @@
/*
* 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: sbw <sbw@sbw.so>
* 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

View File

@ -1,9 +1,14 @@
/*
* 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: sbw <sbw@sbw.so>
* 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
@ -21,10 +26,15 @@
#include "trashplugin.h"
#include <DApplication>
DWIDGET_USE_NAMESPACE
TrashPlugin::TrashPlugin(QObject *parent)
: QObject(parent),
m_trashWidget(new TrashWidget),
m_tipsLabel(new QLabel)
m_tipsLabel(new QLabel),
m_settings("deepin", "dde-dock-trash")
{
m_tipsLabel->setObjectName("trash");
m_tipsLabel->setStyleSheet("color:white;"
@ -40,8 +50,14 @@ const QString TrashPlugin::pluginName() const
void TrashPlugin::init(PluginProxyInterface *proxyInter)
{
m_proxyInter = proxyInter;
// blumia: we are using i10n translation from DFM so...
QString applicationName = qApp->applicationName();
qApp->setApplicationName("dde-file-manager");
qDebug() << qApp->loadTranslator();
qApp->setApplicationName(applicationName);
m_proxyInter = proxyInter;
// DFMGlobal::instance()->installTranslator();
displayModeChanged(displayMode());
}
@ -78,7 +94,7 @@ const QString TrashPlugin::itemCommand(const QString &itemKey)
Q_UNUSED(itemKey);
// return QString();
return "gvfs-open trash:///";
return "gio open trash:///";
}
const QString TrashPlugin::itemContextMenu(const QString &itemKey)
@ -104,10 +120,14 @@ void TrashPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId,
int TrashPlugin::itemSortKey(const QString &itemKey)
{
Q_UNUSED(itemKey);
const QString &key = QString("pos_%1_%2").arg(itemKey).arg(displayMode());
return m_settings.value(key, -1).toInt();
}
// always place at last
return -1;
void TrashPlugin::setSortKey(const QString &itemKey, const int order)
{
const QString &key = QString("pos_%1_%2").arg(itemKey).arg(displayMode());
m_settings.setValue(key, order);
}
void TrashPlugin::displayModeChanged(const Dock::DisplayMode displayMode)

View File

@ -1,9 +1,14 @@
/*
* 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: sbw <sbw@sbw.so>
* 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
@ -26,6 +31,7 @@
#include "trashwidget.h"
#include <QLabel>
#include <QSettings>
class TrashPlugin : public QObject, PluginsItemInterface
{
@ -47,7 +53,8 @@ public:
void refershIcon(const QString &itemKey);
void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked);
int itemSortKey(const QString &itemKey);
int itemSortKey(const QString &itemKey) override;
void setSortKey(const QString &itemKey, const int order) override;
void displayModeChanged(const Dock::DisplayMode displayMode);
private:
@ -56,6 +63,7 @@ private:
private:
TrashWidget *m_trashWidget;
QLabel *m_tipsLabel;
QSettings m_settings;
};
#endif // TRASHPLUGIN_H

View File

@ -1,9 +1,14 @@
/*
* 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: sbw <sbw@sbw.so>
* 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
@ -27,6 +32,7 @@
#include <QApplication>
#include <QDragEnterEvent>
#include <QJsonDocument>
#include <QApplication>
DWIDGET_USE_NAMESPACE
@ -100,11 +106,43 @@ void TrashWidget::invokeMenuItem(const QString &menuId, const bool checked)
void TrashWidget::dragEnterEvent(QDragEnterEvent *e)
{
if (e->mimeData()->hasFormat("RequestDock"))
return e->accept();
if (e->mimeData()->hasFormat("RequestDock")) {
// accept prevent the event from being propgated to the dock main panel
// which also takes drag event;
e->accept();
if (e->mimeData()->hasFormat("text/uri-list"))
return e->accept();
if (!e->mimeData()->hasFormat("Removable")) {
// show the forbit dropping cursor.
e->setDropAction(Qt::IgnoreAction);
}
return;
}
if (!e->mimeData()->hasUrls())
e->ignore();
e->setDropAction(Qt::MoveAction);
if (e->dropAction() != Qt::MoveAction) {
e->ignore();
} else {
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::dropEvent(QDropEvent *e)
@ -112,12 +150,19 @@ void TrashWidget::dropEvent(QDropEvent *e)
if (e->mimeData()->hasFormat("RequestDock"))
return removeApp(e->mimeData()->data("AppKey"));
if (e->mimeData()->hasFormat("text/uri-list"))
{
const QMimeData *mime = e->mimeData();
for (auto url : mime->urls())
moveToTrash(url);
if (!e->mimeData()->hasUrls()) {
return e->ignore();
}
e->setDropAction(Qt::MoveAction);
if (e->dropAction() != Qt::MoveAction) {
return e->ignore();
}
const QMimeData *mime = e->mimeData();
for (auto url : mime->urls())
moveToTrash(url);
}
void TrashWidget::paintEvent(QPaintEvent *e)
@ -125,7 +170,7 @@ void TrashWidget::paintEvent(QPaintEvent *e)
QWidget::paintEvent(e);
QPainter painter(this);
painter.drawPixmap(rect().center() - m_icon.rect().center(), m_icon);
painter.drawPixmap(rect().center() - m_icon.rect().center() / qApp->devicePixelRatio(), m_icon);
}
void TrashWidget::resizeEvent(QResizeEvent *e)
@ -156,8 +201,8 @@ void TrashWidget::updateIcon()
const int size = displayMode == Dock::Fashion ? std::min(width(), height()) * 0.8 : 16;
QIcon icon = QIcon::fromTheme(iconString);
m_icon = icon.pixmap(size, size);
m_icon = icon.pixmap(size * qApp->devicePixelRatio(), size * qApp->devicePixelRatio());
m_icon.setDevicePixelRatio(qApp->devicePixelRatio());
update();
}
@ -176,11 +221,5 @@ void TrashWidget::moveToTrash(const QUrl &url)
{
const QFileInfo info = url.toLocalFile();
QProcess::startDetached("gvfs-trash", QStringList() << "-f" << info.absoluteFilePath());
// QDir trashDir(m_popupApplet->trashDir() + "/files");
// if (!trashDir.exists())
// trashDir.mkpath(".");
// QDir().rename(info.absoluteFilePath(), trashDir.absoluteFilePath(info.fileName()));
QProcess::startDetached("gio", QStringList() << "trash" << "-f" << info.absoluteFilePath());
}

View File

@ -1,9 +1,14 @@
/*
* 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: sbw <sbw@sbw.so>
* 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
@ -48,8 +53,9 @@ signals:
void requestContextMenu() const;
protected:
void dragEnterEvent(QDragEnterEvent *e);
void dropEvent(QDropEvent *e);
void dragEnterEvent(QDragEnterEvent *e) override;
void dragMoveEvent(QDragMoveEvent *e) override;
void dropEvent(QDropEvent *e) override;
void paintEvent(QPaintEvent *e);
void resizeEvent(QResizeEvent *e);
void mousePressEvent(QMouseEvent *e);