File indexing completed on 2024-09-29 07:47:27

0001 /*
0002  *   SPDX-FileCopyrightText: 2003 Waldo Bastian <bastian@kde.org>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-or-later
0005  *
0006  */
0007 
0008 #ifndef menuinfo_h
0009 #define menuinfo_h
0010 
0011 #include <QList>
0012 
0013 #include <KService>
0014 #include <QKeySequence>
0015 
0016 class MenuFile;
0017 class MenuEntryInfo;
0018 
0019 class MenuInfo
0020 {
0021 public:
0022     MenuInfo()
0023     {
0024     }
0025 
0026     virtual ~MenuInfo()
0027     {
0028     }
0029 };
0030 
0031 class MenuSeparatorInfo : public MenuInfo
0032 {
0033 public:
0034     MenuSeparatorInfo()
0035     {
0036     }
0037 };
0038 
0039 class MenuFolderInfo : public MenuInfo
0040 {
0041 public:
0042     MenuFolderInfo()
0043         : dirty(false)
0044         , hidden(false)
0045     {
0046     }
0047 
0048     ~MenuFolderInfo() override;
0049     // Add separator
0050     void add(MenuSeparatorInfo *, bool initial = false);
0051 
0052     // Add sub menu
0053     void add(MenuFolderInfo *, bool initial = false);
0054 
0055     // Remove sub menu (without deleting it)
0056     void take(MenuFolderInfo *);
0057 
0058     // Remove sub menu (without deleting it)
0059     // @return true if found
0060     bool takeRecursive(MenuFolderInfo *info);
0061 
0062     // Add entry
0063     void add(MenuEntryInfo *, bool initial = false);
0064 
0065     // Remove entry (without deleting it)
0066     void take(MenuEntryInfo *);
0067 
0068     // Return a unique sub-menu caption inspired by @p caption
0069     QString uniqueMenuCaption(const QString &caption);
0070 
0071     // Return a unique item caption inspired by @p caption but different
0072     // from @p exclude
0073     QString uniqueItemCaption(const QString &caption, const QString &exclude = QString());
0074 
0075     // Update full id's for this item and all submenus
0076     void updateFullId(const QString &parentId);
0077 
0078     // Return a list of existing submenu ids
0079     QStringList existingMenuIds();
0080 
0081     void setCaption(const QString &_caption)
0082     {
0083         if (_caption == caption) {
0084             return;
0085         }
0086         caption = _caption;
0087         setDirty();
0088     }
0089 
0090     void setIcon(const QString &_icon)
0091     {
0092         if (_icon == icon) {
0093             return;
0094         }
0095         icon = _icon;
0096         setDirty();
0097     }
0098 
0099     void setGenericName(const QString &_description)
0100     {
0101         if (_description == genericname) {
0102             return;
0103         }
0104         genericname = _description;
0105         setDirty();
0106     }
0107 
0108     void setComment(const QString &_comment)
0109     {
0110         if (_comment == comment) {
0111             return;
0112         }
0113         comment = _comment;
0114         setDirty();
0115     }
0116 
0117     // Mark menu as dirty
0118     void setDirty();
0119 
0120     // Return whether this menu or any entry or submenu contained in it is dirty.
0121     bool hasDirt();
0122 
0123     // Return whether this menu should be explicitly added to its parent menu
0124     bool needInsertion();
0125 
0126     // Save menu and all its entries and submenus
0127     void save(MenuFile *);
0128 
0129     // Search service by shortcut
0130     KService::Ptr findServiceShortcut(const QKeySequence &);
0131 
0132     // Set whether the entry is in active use (as opposed to in the clipboard/deleted)
0133     void setInUse(bool inUse);
0134 
0135 public:
0136     QString id; // Relative to parent
0137     QString fullId; // Name in tree
0138     QString caption; // Visible name
0139     QString genericname; // Generic description
0140     QString comment; // Comment
0141     QString directoryFile; // File describing this folder.
0142     QString icon; // Icon
0143     QList<MenuFolderInfo *> subFolders; // Sub menus in this folder
0144     QList<MenuEntryInfo *> entries; // Menu entries in this folder
0145     QList<MenuInfo *> initialLayout; // Layout of menu entries according to sycoca
0146     bool dirty;
0147     bool hidden;
0148 };
0149 
0150 class MenuEntryInfo : public MenuInfo
0151 {
0152 public:
0153     explicit MenuEntryInfo(const KService::Ptr &_service, KDesktopFile *_df = nullptr)
0154         : service(_service)
0155         , m_desktopFile(_df)
0156         , shortcutLoaded(false)
0157         , shortcutDirty(false)
0158         , dirty(_df != 0)
0159         , hidden(false)
0160     {
0161         caption = service->name();
0162         description = service->genericName();
0163         icon = service->icon();
0164     }
0165 
0166     ~MenuEntryInfo() override;
0167 
0168     void setCaption(const QString &_caption);
0169     void setDescription(const QString &_description);
0170     void setIcon(const QString &_icon);
0171 
0172     QString menuId() const
0173     {
0174         return service->menuId();
0175     }
0176 
0177     QString file() const
0178     {
0179         return service->entryPath();
0180     }
0181 
0182     QKeySequence shortcut();
0183     void setShortcut(const QKeySequence &_shortcut);
0184     bool isShortcutAvailable(const QKeySequence &_shortcut);
0185 
0186     void setDirty();
0187 
0188     // Set whether the entry is in active use (as opposed to in the clipboard/deleted)
0189     void setInUse(bool inUse);
0190 
0191     // Return whether this menu should be explicitly added to its parent menu
0192     bool needInsertion();
0193 
0194     void save();
0195 
0196     KDesktopFile *desktopFile();
0197 
0198 public:
0199     QString caption;
0200     QString description;
0201     QString icon;
0202     KService::Ptr service;
0203     KDesktopFile *m_desktopFile;
0204     QKeySequence shortCut;
0205     bool shortcutLoaded;
0206     bool shortcutDirty;
0207     bool dirty;
0208     bool hidden;
0209 };
0210 
0211 #endif