## 文件管理器扩展右键菜单的两种方式

#### １．继承MenuInterface，遵守Qt的插件规范实现你的菜单插件接口

- ###### 插件头文件

  如果你安装了`libdde-file-manager-dev`你可以在如下路径找到menuinterface.h

  - 在/etc/apt/source.list中添加如下源：

        deb-src http://pools.corp.deepin.com/deepin unstable main non-free

  - 升级安装libdde-file-manager-dev

        sudo apt-get update
        sudo apt-get install libdde-file-manager-dev

  - 就可以找到`/usr/include/dde-file-manager/menuinterface.h`

  同样可以在 git clone https://github.com/linuxdeepin/dde-file-manager下载源码到`dde-file-manager`, 切到`develop2.0分支` 可以找到`dde-file-manager/dde-file-manager-plugins/plugininterfaces/menu/menuinterface.h`

- ###### 接口说明：

  - virtual QList additionalIcons(const QString &file) 实现这个接口可以扩展指定文件的角标
    - `const QString &file` 表示需要显示脚本的文件完整路径
    - QList 返回一组QIcon列表

  - virtual QList<QAction*> additionalMenu(const QStringList &files, const QString& currentDir)　实现这个接口可以扩展选中文件的右键菜单

    - `const QStringList &files` 表示选中的文件的完整路径列表
    - `const QString& currentDir` 表示选中的文件所在的目录
    - `QList<QAction*>` 返回一组QAction指针列表

  - virtual QList<QAction*> additionalEmptyMenu(const QString &currentDir)　实现这个接口可以扩展空白处的右键菜单

    - `const QString& currentDir`表示空白处所在的文件目录
    - `QList<QAction*>` 返回一组QAction指针列表

- ##### 插件默认安装目录

  - x86架
    - `/usr/lib/x86_64-linux-gnu/dde-file-manager/plugins/menu/` 64位
    - `/usr/lib/x86_32-linux-gnu/dde-file-manager/plugins/menu/`32位
  - 龙芯架构
    - `/usr/lib/mipsel-linux-gnu//dde-file-manager/plugins/menu/`
  - 神威架构
    - `/usr/lib/sw_64-linux-gnu/dde-file-manager/plugins/menu/`

- ###### 源码：

      #ifndef MENUINTERFACE
      #define MENUINTERFACE

      #include <QList>
      #include <QIcon>
      #include <QAction>
      #include <QWidget>

      /*
       * The menu interface of dde-file-manager
       * 文件管理器的右键菜单插件接口
      */
      class MenuInterface
      {
      public:
          virtual ~MenuInterface() {}

          /*!
           * \brief additionalIcons
           * \param file: the file path
           * \return QList<QIcon>: corner mark icon list of the file which you want to by drawed
           */
          /*!
           * \brief additionalIcons　角标接口
           * \param file: 文件路径
           * \return QList<QIcon>:　返回一组QIcon列表，这些icon就是角标
           */
          virtual QList<QIcon> additionalIcons(const QString &file)
          {
              Q_UNUSED(file)
              QList<QIcon> icons;
              return icons;
          }

          /*!
           * \brief additionalMenu
           * \param files: selected files list
           * \param currentDir : the current dir of menu which will be showed
           * \return  QList<QAction*>: QAction pointer list
           */
          /*!
           * \brief additionalMenu　选中文件菜单接口
           * \param files: 选中的文件路径列表
           * \param currentDir：右键所在的文件目录
           * \return QList<QAction*>：返回一组QAction指针列表，每个action对应菜单的一个菜单项
           */
          virtual QList<QAction*> additionalMenu(const QStringList &files, const QString& currentDir){
              Q_UNUSED(files)
              Q_UNUSED(currentDir)
              QList<QAction*> actions;
              return actions;
          }

          /*!
           * \brief additionalEmptyMenu
           * \param currentDir: the current dir of empty area menu which will be showed
           * \return QList<QAction*>: QAction pointer list
           */
          /*!
           * \brief additionalEmptyMenu　空白菜单接口
           * \param currentDir: 空白菜单所在的文件目录
           * \return QList<QAction*>：返回一组QAction指针列表，每个action对应菜单的一个菜单项
           */
          virtual QList<QAction*> additionalEmptyMenu(const QString &currentDir){
              Q_UNUSED(currentDir)
              QList<QAction*> actions;
              return actions;
          }
      };

      /*
       * The property dialog expand info interface of dde-file-manager
       * 文件管理器的属性对话框插件接口
      */
      class PropertyDialogExpandInfoInterface
      {
      public:

          virtual ~PropertyDialogExpandInfoInterface() {}

          /*!
           * \brief expandWidget
           * \param file: the file path
           * \return QWidget*: the widget which will be showed in property dialog
           */
          /*!
           * \brief expandWidget 属性子控件接口
           * \param file：需要扩展属性显示的文件路径
           * \return QWidget*：返回对应的属性控件指针
           */
          virtual QWidget* expandWidget(const QString& file) {
              Q_UNUSED(file)
              return new QWidget();
          }

          /*!
           * \brief expandWidgetTitle
           * \return QString: the title of the QWidget which will be showed in property dialog
           */
          /*!
           * \brief expandWidgetTitle　属性子控件对应的标题即可
           * \return QString:　返回对应扩展属性控件的标题
           */
          virtual QString expandWidgetTitle(){
              return "";
          }

      };

      #define MenuInterface_iid "com.deepin.dde-file-manager.MenuInterface"
      Q_DECLARE_INTERFACE(MenuInterface, MenuInterface_iid)

      #define PropertyDialogExpandInfoInterface_iid "com.deepin.dde-file-manager.PropertyDialogExpandInfoInterface"
      Q_DECLARE_INTERFACE(PropertyDialogExpandInfoInterface, PropertyDialogExpandInfoInterface_iid)

      #endif // MENUINTERFACE

#### 2. 支持json配置文件格式扩展右键菜单

- ###### 支持扩展的右键菜单各个字段说明

  - 通用字段

    - `MenuType` 菜单类型（必须指定）

      - `SingleFile` 选中单个文件
      - `MultiFiles`选中多个文件
      - `SingleDir`选中单个目录
      - `MultiDirs`选中多个目录
      - `MultiFileDirs`选中多个文件和目录
      - `EmptyArea`空白区域

    - `Icon` 菜单项的指示图标(可选)

      - `Icon`: `/home/djf/Music/usb_normal_16px.svg`
    - `Text[local]` 根据不同的语言环境给出不同的菜单文本（必须指定）
      - `Text[zh_CN]`: `sub文件SingleFile`
      - `Text[en]`: `sub文件SingleFile`
      - ……
    - `Exec` 点击菜单项执行的命令（必须指定）
      + `Exec`: `dde-file-manager` 启动文件管理器
    - `SubMenu` :子菜单列表，子菜单列表不需要再次指定`MenuType`字段，其他字段参数一样，支持SubMenu中嵌套无限层级级菜单。

  - 如果MenuType为`SingleFile` 或者`MultiFiles`，可以增加下面两个字段来细化菜单控制

    - MimeType 文件的MimeType类型，如果指定了这个参数，表示只拓展这个类型的文件右键菜单；以`;`隔开
      - `MimeType`:`text/plain;image/jpeg`

    - Suffix　文件的后缀，如果指定了这个参数，表示只拓展后缀名为指定后缀的文件的右键菜单；以`;`隔开

      - `Suffix`: `md;txt`

    - 如果`MimeType`和`Suffix`两个参数同时指定，表示文件类型为`MimeType`且后缀名为`Suffix`的文件才支持扩展右键菜单

- ##### 默认配置文件路径

  `/home/djf/.config/deepin/dde-file-manager/menuextensions`

- ###### 示例：

      [
          {
              "MenuType": "SingleFile",
              "Icon": "/home/djf/Music/usb_normal_16px.svg",
              "Text[zh_CN]": "文件SingleFile",
              "Text[zh_HK]": "文件SingleFile",
              "Text[zh_TW]": "文件SingleFile",
              "MimeType": "",
              "Suffix": "md;",
              "Exec": "",
              "SubMenu": [
                   {
                      "Icon": "111111111",
                      "Text[zh_CN]": "sub文件SingleFile",
                      "Text[zh_HK]": "sub文件SingleFile",
                      "Text[zh_TW]": "sub文件SingleFile",
                      "Exec": "dde-file-manager",
                      "SubMenu": [
                          {
                              "Icon": "dssd",
                              "Text[zh_CN]": "sub文件SingleFile",
                              "Text[zh_HK]": "sub文件SingleFile",
                              "Text[zh_TW]": "sub文件SingleFile",
                              "Exec": "dde-file-manager"
                          },
                          {
                              "Icon": "dssd",
                              "Text[zh_CN]": "sub文件SingleFile",
                              "Text[zh_HK]": "sub文件SingleFile",
                              "Text[zh_TW]": "sub文件SingleFile",
                              "Exec": "dde-file-manager"
                          }
                      ]
                   },
                   {
                      "Icon": "2222222",
                      "Text[zh_CN]": "sub文件SingleFile",
                      "Text[zh_HK]": "sub文件SingleFile",
                      "Text[zh_TW]": "sub文件SingleFile",
                      "Exec": "dde-file-manager"
                   }
              ]
          },
          {
              "MenuType": "SingleFile",
              "Icon": "Files",
              "Text[zh_CN]": "文件SingleFile2",
              "Text[zh_HK]": "文件SingleFile2",
              "Text[zh_TW]": "文件SingleFile2",
              "MimeType": "",
              "Exec": "dde-file-manager"
          },
          {
              "MenuType": "MultiFiles",
              "Icon": "Files",
              "Text[zh_CN]": "文件MultiFiles",
              "Text[zh_HK]": "文件MultiFiles",
              "Text[zh_TW]": "文件MultiFiles",
              "MimeType": "text/plain;image/jpeg",
              "Exec": "dde-file-manager"
          },
          {
              "MenuType": "MultiFiles",
              "Icon": "Files",
              "Text[zh_CN]": "文件MultiFiles2",
              "Text[zh_HK]": "文件MultiFiles2",
              "Text[zh_TW]": "文件MultiFiles2",
              "MimeType": "",
              "Exec": "dde-file-manager"
          },
          {
              "MenuType": "SingleDir",
              "Icon": "Files",
              "Text[zh_CN]": "文件SingleDir",
              "Text[zh_HK]": "文件SingleDir",
              "Text[zh_TW]": "文件SingleDir",
              "Exec": "dde-file-manager"
          },
          {
              "MenuType": "MultiDirs",
              "Icon": "Files",
              "Text[zh_CN]": "文件MultiDir",
              "Text[zh_HK]": "文件MultiDir",
              "Text[zh_TW]": "文件MultiDir",
              "Exec": "dde-file-manager"
          },
          {
              "MenuType": "MultiFileDirs",
              "Icon": "Files",
              "Text[zh_CN]": "文件MultiFileDirs",
              "Text[zh_HK]": "文件MultiFileDirs",
              "Text[zh_TW]": "文件MultiFileDirs",
              "Exec": "dde-file-manager"
          },
          {
              "MenuType": "EmptyArea",
              "Icon": "Files",
              "Text[zh_CN]": "EmptyArea",
              "Text[zh_HK]": "EmptyArea",
              "Text[zh_TW]": "EmptyArea",
              "Exec": "dde-file-manager"
          }
      ]