deepinV23文件管理器改造
1. 概述
从dde-file-manager 6.0.43以后,这些特性已经增加到主线,并且修复了回收站清空文件时,文件停留一秒的bug
本篇博客主要介绍在deepinV23和deepinV20.9上改造编译安装dde-file-manager的过程。
其中编译的过程,主要参考了:Deepin深度操作系统中编译和安装dde-file-manager-CSDN博客,感谢这位大佬的分享
自己改造的部分,主要是:
- 增加文件管理器和桌面通过ctrl+d删除文件或目录
- 增加桌面通过ctrl+shift+n创建目录
没有实现ctrl+shift+d彻底删除文件,因为这个自己不常用。有需要的同学可以根据本篇博客自行处理
2. 过程
2.1 下载源码
需要下载的源码包括三部分
-
dde-file-manager
可以直接从github下载源码,也可以通过apt source dde-file-manager的方式
-
deepin-pdfium
-
util-dfm
2.2 安装依赖
首先参考源码包提供的README.zh_CN.md
,执行sudo apt build-dep ./
安装依赖
然后执行以下命令,安装其他依赖:
sudo apt install liblcms2-dev libopenjp2-7-dev libchardet-dev libudisks2-dev libisoburn-dev libmediainfo-dev fakeroot build-essential libfreetype6-dev libglibmm-2.4-dev
编译deepin-pdfium和util-dfm
#
cd deepin-pdfinum
dpkg-buildpackage -us -uc
sudo dpkg -i ../libdeepin-pdfium*.deb
#
cd ../util-dfm
dpkg-buildpackage -us -uc
sudo dpkg -i ../libdfm*.deb
编译过程中,缺少依赖环境会提示,继续安装即可
2.3 环境配置
首先修复qmake和lrelease路径问题
通过sudo find / -name qmake
查找工具的真实路径,不然编译时qmake和lrelease会报错
我本机环境如下
sudo ln -fs /usr/lib/x86_64-linux-gnu/qt5/bin/qmake /usr/bin/qmake
sudo ln -fs /usr/lib/x86_64-linux-gnu/qt5/bin/lrelease /usr/bin/lreleases
然后设置不编译保险箱:vim src/plugins/filemanager/CMakeLists.txt
,注释add_subdirectory(dfmplugin-vault)
,如下
cmake_minimum_required(VERSION 3.10)
# add sub dir for business plugins
add_subdirectory(core/dfmplugin-core)
add_subdirectory(core/dfmplugin-recent)
add_subdirectory(core/dfmplugin-sidebar)
add_subdirectory(core/dfmplugin-titlebar)
add_subdirectory(core/dfmplugin-workspace)
add_subdirectory(core/dfmplugin-detailspace)
add_subdirectory(core/dfmplugin-computer)
add_subdirectory(core/dfmplugin-trash)
add_subdirectory(dfmplugin-search)
add_subdirectory(dfmplugin-optical)
#add_subdirectory(dfmplugin-vault)
add_subdirectory(dfmplugin-myshares)
add_subdirectory(dfmplugin-smbbrowser)
add_subdirectory(dfmplugin-avfsbrowser)
这个在20.9上需要配置,否则就会编译出来保险箱,23好像不用
假如编译出来保险箱,采用:sudo mv /usr/lib/x86_64-linux-gnu/dde-file-manager/plugins/filemanager-edge/ libdfmplugin-vault.so /usr/lib/x86_64-linux-gnu/dde-file-manager/plugins/filemanager-edge/ libdfmplugin-vault 即可
处理编译报错问题:
vim docs/CMakeLists.txt
,注释最后一行。
注意:如果后续需要打包为deb,这一行在打包的时候,要取消注释。可能还要安装qt5-doc等相关依赖
2.4 修改代码
2.4.1 文件管理器增加ctrl+d删除文件
vim ./src/plugins/filemanager/core/dfmplugin-workspace/utils/shortcuthelper.cpp
在case Qt::Key_H
上面加上一个case语句
case Qt::Key_D: {
moveToTrash();
return true;
}
2.4.2 桌面增加ctrl+d删除文件
vim ./src/plugins/desktop/core/ddplugin-canvas/view/operator/shortcutoper.cpp
在case Qt::Key_ H
上面加上一个case语句:
case Qt::Key_D:
FileOperatorPorxyIns->moveToTrash(view);
return true;
2.4.3 桌面增加ctrl+shift+n创建目录
vim ./src/plugins/desktop/core/ddplugin-canvas/view/operator/shortcutoper.cpp
大概在155行左右的 modifiers = (Qt::ControlModifier | Qt::ShiftModifiler)
语句模块下修改,增加ctrl+shift+n
的操作选项
if (key == Qt::Key_I) {
view->d->keySelector->toggleSelect();
return ture;
}
if (key == Qt::Key_N) {
QPoint mousePos = QCursor::pos();
QPoint localPos = view->mapFromGlobal(mousePos);
auto gridPos = view->d->gridAt(localPos);
FileOperatorProxyIns->touchFolder(view, gridPos);
return true;
}
这部分代码自己写的,专业不专业不知道,但是能用
要注意,需要在这个cpp文件开始添加头文件
#include <QPoint>
#include <QCursor>
2.4.4 恢复悬浮和选中配色到v20.9
vim ./src/plugins/filemanager/core/dfmplugin-workspace/views/iconitemdelegate.cpp
大概410-420行左右,修改如下:
if (isDropTarget && !isSelected) {
backgroundColor.setAlpha(20); // DropTarg背景设置透明度为15% (40/255);//liwl,原来40
} else if (option.state & QStyle::StateFlag::State_Selected) {
backgroundColor.setAlpha(backgroundColor.alpha() + 30);//liwl,原来40
} else if (isHover) {
DGuiApplicationHelper::ColorType ct = DGuiApplicationHelper::toColorType(baseColor);
if (ct == DGuiApplicationHelper::DarkType && !isUpshow) {
baseColor = DGuiApplicationHelper::adjustColor(baseColor, 0, 0, +5, 0, 0, 0, 0);
backgroundColor = baseColor;
} else {
backgroundColor = backgroundColor.lighter();
backgroundColor.setAlpha(7); // Hover背景设置透明度为8% (22/255);//liwl,原来22
}
} else {
backgroundColor = baseColor;
}
...
...
...
if (isDropTarget || isSelected || isHover) { // 只有选中和mouseover才绘制背景
painter->setRenderHint(QPainter::Antialiasing, true);
painter->fillPath(path, backgroundColor);
if (isHover) {
QRectF outLineRect = backgroundRect;
outLineRect.setSize(outLineRect.size() - QSizeF(1.5, 1.5));
outLineRect.moveCenter(backgroundRect.center());
QPainterPath outLinePath;
outLinePath.addRoundedRect(outLineRect, kIconModeBackRadius, kIconModeBackRadius);
backgroundColor.setAlpha(7); // Hover背景边框设置透明度为16% (40/255);//liwl,原来40
painter->setPen(backgroundColor);
painter->drawPath(outLinePath);
}
painter->setRenderHint(QPainter::Antialiasing, false);
}
2.4.5 去掉回收站清空挂件
当回收站有垃圾时,回收站上方会显示【回收站】和【清空】按钮。当点击【清空】按钮时,回收站会被清空,当回收站没有文件时,这两个挂件不显示
这个功能在v23上有些问题:点击清空以后,这两个挂件里面消失,然后文件还在,随后文件才被清理。
猜测是按钮的事件触发跟文件清空未做好同步导致。
我个人觉得直接使用右键【清空回收站】或者再次全选删除,比较适合自己的使用习惯。所以直接在代码中去掉这些挂件。
vim src/plugins/filemanager/core/dfmplugin-trash/trash.cpp
,大约在55行,注释掉:addCustomTopWidget();
,如下:
bool Trash::start()
{
// show first window when all plugin initialized
dfmplugin_menu_util::menuSceneRegisterScene(TrashMenuCreator::name(), new TrashMenuCreator());
dpfSlotChannel->push("dfmplugin_workspace", "slot_RegisterFileView", TrashHelper::scheme());
dpfSlotChannel->push("dfmplugin_workspace", "slot_RegisterMenuScene", TrashHelper::scheme(), TrashMenuCreator::name());
//addCustomTopWidget();
addFileOperations();
return true;
}
2.5 编译安装
环境准备好,代码修改完成,准备编译安装。此时可以参考README.zh_CN.md
依次执行
cmake -B build -DCMAKE_INSTALL_PREFIX=/usr
cmake --build build #可以cmake --build build -j8,拉升编译速度
sudo cmake --build build --target install
如果改动了翻译文件,需要执行src/
目录下的脚本,生成翻译文件,再把翻译文件拷贝到系统路径下:/usr/share/dde-file-manager/translations/
2.6 重登录测试
略
3. 总结
v23beta3集成的文件管理版本为:dde-file-manager-6.0.40
。版本有很多特性我和喜欢的
- 通过shift+t,直接从终端打开当前路径
- 增加了列表模式下显示子目录的特性
- 修复了点击标记时,标记的文档角标颜色延迟出现的问题
- 可定制的左侧栏
- 代码更加整洁美观了
不喜欢的文管特性:
-
点击选中以后的阴影有些重了,还是喜欢v20.9的清淡一些的
自己已经修改
目前来说,deepinv23还不是我喜欢的样子,所以我把v23的文件管理拿到20.9上使用,同时增加了自己想要的功能,呜呼爽哉
4. 不定期更新内容
【2024/03/29,更新】
dde-file-manager更新到6.0.43时,已经新增了上述的特性,并且修复了一些bug:
新增特性和部分问题修复:
-
ctrl+d删除文件(在文管和桌面同时生效)
-
ctrl+shift+n,可在桌面创建目录(跟随光标)
-
修复快捷键预览中没有shift+t,从终端打开当前目录的内容
-
修复文件或目录属性框,编辑文件名时非dtk样式
-
更改文件或者目录属性框,标签内容栏的宽度,调整为一行
-
修复回收站清空文件时,文件停留一秒的问题
-
修复编译安装后,默认从【计算机】启动时,不显示磁盘列表问题
这些更新,使得文件管理器更加的高效。
我个人不喜欢【计算机】界面的大圆角,于是硬编码修改为【中圆角】。
修改src/plugins/filemanager/core/dfmplugin-computer/delegate/computeritemdelegate.cpp
,共2处
painter->drawRoundedRect(option.rect.adjusted(1, 1, -1, -1), 8, 8); //liwl,2024/03/29,圆角从大变为中:18-> 8
如果在deepin 20.9编译,如何创建可以直接用于安装的deb呢?
-
下载最新版本的dde-file-manager到本地
-
下载deepin-pdfium到本地
-
下载util-dfm到本地
分别编译,然后执行dpkg-buildpackage -us -uc
分别打包
最后把上面3个仓库生成的deb包,放在一起,拷贝到20.9以后,执行:sudo dpkg -i xxx.deb
即可
【2024/04/03 更新】
把【计算机】界面的【我的目录】下面的改成正方形(原来是矩形)
修改代码: vim ./src/plugins/filemanager/core/dfmplugin-computer/delegate/computeritemdelegate.cpp
....
const int kSmallItemWidth { 108 }; //liwl
const int kSmallItemHeight { 108 }; //liwl,这里之前是138,修改未108
...
void ComputerItemDelegate::paintSmallItem(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
prepareColor(painter, option, index);
// draw round rect
painter->drawRoundedRect(option.rect.adjusted(1, 1, -1, -1), 8, 8); //liwl
const int IconSize = view->iconSize().width();
const int TopMargin = 8; //liwl,这里之前是16,修改为8
const int LeftMargin = 22; //liwl
const auto &icon = index.data(Qt::ItemDataRole::DecorationRole).value<QIcon>();
auto tl = option.rect.topLeft() + QPoint(LeftMargin, TopMargin);
const auto &&pm = icon.pixmap(IconSize);
// const int ShadowBlurRadisu = 4;
// painter->drawPixmap(tl + QPoint(-ShadowBlurRadisu, -ShadowBlurRadisu + 2), renderBlurShadow(pm, ShadowBlurRadisu));
painter->drawPixmap(tl, pm);
QFont fnt(view->font());
fnt.setPixelSize(QFontInfo(fnt).pixelSize());
fnt.setWeight(QFont::Medium);
painter->setFont(fnt);
QFontMetrics fm(fnt);
const int TextMaxWidth = option.rect.width() - 20;
const QString &ElidedText = fm.elidedText(index.data(Qt::DisplayRole).toString(), Qt::ElideMiddle, TextMaxWidth);
const int LabelWidth = fm.horizontalAdvance(ElidedText);
const int LabelTopMargin = 10;
auto labelRect = QRect(option.rect.x() + (option.rect.width() - LabelWidth) / 2, option.rect.y() + TopMargin + IconSize + LabelTopMargin, LabelWidth, 40);
painter->setPen(qApp->palette().color(/*(option.state & QStyle::StateFlag::State_Selected) ? QPalette::ColorRole::BrightText : */ QPalette::ColorRole::Text)); // PO: no highlight
painter->drawText(labelRect, Qt::AlignTop, ElidedText);
}