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 下载源码

需要下载的源码包括三部分

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:

新增特性和部分问题修复:

  1. ctrl+d删除文件(在文管和桌面同时生效)

  2. ctrl+shift+n,可在桌面创建目录(跟随光标)

  3. 修复快捷键预览中没有shift+t,从终端打开当前目录的内容

  4. 修复文件或目录属性框,编辑文件名时非dtk样式

  5. 更改文件或者目录属性框,标签内容栏的宽度,调整为一行

  6. 修复回收站清空文件时,文件停留一秒的问题

  7. 修复编译安装后,默认从【计算机】启动时,不显示磁盘列表问题

这些更新,使得文件管理器更加的高效。

我个人不喜欢【计算机】界面的大圆角,于是硬编码修改为【中圆角】。

修改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呢?

  1. 下载最新版本的dde-file-manager到本地

  2. 下载deepin-pdfium到本地

  3. 下载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);
}
posted @ 2024-02-08 10:08  liwldev  阅读(116)  评论(1编辑  收藏  举报