deepin20.9文件管理器改造

1. 概述

本篇博客主要介绍在deepin20.9上改造deepin20.9自带版本(5.9.2)文件管理器,与《deepinV23编译文件管理器改造》不同的是,那个是6.0.40的版本,代码重构过,架构清晰。

主要实现的功能:

  • 文件管理器可以通过ctrl+d快捷键删除文件
  • 桌面可以通过ctrl+d快捷键删除文件
  • 桌面可以通过ctrl+shift+n创建目录

2. 操作过程

建议先在deepinv20.9虚拟机操作,确认一切都正常以后,可以用于正式环境。

2.1 获取deepin文件管理器代码

取消仓库里面对源码源的注释:sudo vim /etc/apt/sources.list,内容如下

## Generated by deepin-installer
deb https://community-packages.deepin.com/deepin/ apricot main contrib non-free
deb-src https://community-packages.deepin.com/deepin/ apricot main contrib non-free

终端执行:

cd ~/Documents
apt source dde-file-manager
cd dde-file-manager-5.9.2/
sudo apt build-dep .

至此,已经下载到源代码,以及编译需要的环境

2.2 修改代码

2.2.1 文件管理器实现ctrl+d删除文件

找到源码位置:vim ./src/dde-file-manager-lib/views/dfileview.cpp,大概在如下代码块下,增加代码

case Qt::ControlModifier:
    switch (event->key()) {
    case Qt::Key_N: {
        DUrlList list;

        for (const DUrl &url : urls) {
            const DAbstractFileInfoPointer &info = DFileService::instance()->createFileInfo(this, url);

            if (info && info->canFetch())
                list << url; 
        }    

        appController->actionNewWindow(dMakeEventPointer<DFMUrlListBaseEvent>(this, list.isEmpty() ? DUrlList() << DUrl() : list));
        return;
    } 
     //liwl,2024/03/22,begin。以下这部分代码,直接拷贝本文件中case Qt::Key_Delete: 部分代码即可
    case Qt::Key_D:{
        QString rootPath = rootUrl().toLocalFile();
        if (FileUtils::isGvfsMountFile(rootPath) || deviceListener->isInRemovableDeviceFolder(rootPath) || VaultController::isVaultFile(rootPath)) {
            appController->actionCompleteDeletion(dMakeEventPointer<DFMUrlListBaseEvent>(this, urls));
        } else {
            if (urls.size() > 0) { 
                QString filepath = urls.front().toLocalFile();
                if (VaultController::isVaultFile(filepath) && !d->isVaultDelSigConnected) {
                d->isVaultDelSigConnected = true;
            }
        }
        if (rootUrl().isTrashFile() && rootUrl() != DUrl::fromTrashFile("/"))
            break;
        appController->actionDelete(dMakeEventPointer<DFMUrlListBaseEvent>(this, urls));
    }
    break;
    }
    //end

2.2.2 桌面实现ctrl+d删除文件

找到源码位置:vim ./src/dde-desktop/view/canvasgridview.cpp,大概在如下代码块下,增加代码

case Qt::ControlModifier:
    switch (event->key()) {
    case Qt::Key_Minus:
        decreaseIcon();
        return;
    case Qt::Key_Equal:
        increaseIcon();
        return;
    //liwl,2024/03/22,begin,同样拷贝case Qt::Key_Delete:内容即可
    case Qt::Key_D: {
        if (canDeleted && !selectUrlsMap.contains(rootUrl.toString()) && !selectUrls.isEmpty()) {
            DFileService::instance()->moveToTrash(this, selectUrls);
        }    
        return;
    }    
    //end
    case Qt::Key_H: {
        //更改显示隐藏状态
        bool whetherShowHiddenFiles{ GridManager::instance()->getWhetherShowHiddenFiles() };
        GridManager::instance()->setWhetherShowHiddenFiles(!whetherShowHiddenFiles);

        //同步刷新,交由GridViewManager调用updateHiddenItems
        emit GridManager::instance()->sigSyncOperation(GridManager::soHidenSwitch);
        return;
    }

2.2.3 桌面实现ctrl+shift+n创建目录

找到源码位置:vim ./src/dde-desktop/view/canvasgridview.cpp,大概在如下代码块下,增加代码

case Qt::ControlModifier | Qt::ShiftModifier:

    if (event->key() == Qt::Key_N) {
        if (itemDelegate()->editingIndex().isValid()) {
            return;
        }    
        //liwl,2024/03/23,begin,这部分代码是个人研究所写,水平有限
        auto dirUrl = currentUrl();
        clearSelection();
        appController->actionNewFolder(dMakeEventPointer<DFMUrlBaseEvent>(this, dirUrl));
        // end
        return;
    }    

    if (event->key() == Qt::Key_Question) {
//            appController->actionShowHotkeyHelp(fmevent);
        return;
    }    
    if (event->key() == Qt::Key_Plus) {
        increaseIcon();
        return;
    }    
    break;

2.3 编译安装

完成上面代码修改以后,开始进行编译安装,具体操作,参考源码目录下的README.md

$ cd dde-file-manager
$ mkdir build
$ cd build
$ qmake ../filemanager.pro
$ make
$ sudo make install 

2.4 移植使用

编译完成后的build/./src/dde-file-manager-lib/libdde-file-manager.so文件,是实现了上述代码修改的功能的库

需要文件管理器能够实现ctrl+d功能,需要用这个库替换掉之前的库即可

sudo cp /usr/lib/x86_64-linux-gnu/libdde-file-manager.so.1.8.2 /usr/lib/x86_64-linux-gnu/libdde-file-manager.so.1.8.2.bak
sudo cp libdde-file-manager.so /usr/lib/x86_64-linux-gnu/libdde-file-manager.so.1.8.2
#不注销就可以生效

编译完成后的build/src/dde-desktop/dde-desktop文件,是实现 代码修改后,功能增加的二进制文件

需要桌面实现上述2个更能的,需要用此文件替换之前的二进制文件

sudo cp /usr/bin/dde-desktop /usr/bin/dde-desktop.bak
sudo cp dde-desktop /usr/bin/dde-desktop.new
sudo ln -fs /usr/bin/dde-desktop.new /usr/bin/dde-desktop
#注销生效
posted @ 2024-03-24 09:58  liwl1991  阅读(86)  评论(0编辑  收藏  举报