File indexing completed on 2024-05-12 09:57:49
0001 /* 0002 SPDX-FileCopyrightText: 2002 Shie Erlich <erlich@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2002 Rafi Yanai <yanai@users.sourceforge.net> 0004 SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org> 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "krbookmark.h" 0010 #include "../Archive/krarchandler.h" 0011 #include "../FileSystem/krtrashhandler.h" 0012 #include "../Panel/listpanelactions.h" 0013 #include "../icon.h" 0014 #include "../krglobal.h" 0015 0016 #include <KI18n/KLocalizedString> 0017 #include <KXmlGui/KActionCollection> 0018 #include <utility> 0019 0020 #define BM_NAME(X) (QString("Bookmark:") + X) 0021 0022 static const char *NAME_TRASH = I18N_NOOP("Trash bin"); 0023 static const char *NAME_VIRTUAL = I18N_NOOP("Virtual Filesystem"); 0024 static const char *NAME_LAN = I18N_NOOP("Local Network"); 0025 0026 KrBookmark::KrBookmark(const QString &name, QUrl url, KActionCollection *parent, const QString &iconName, const QString &actionName) 0027 : QAction(parent) 0028 , _url(std::move(url)) 0029 , _iconName(iconName) 0030 , _folder(false) 0031 , _separator(false) 0032 , _autoDelete(true) 0033 { 0034 QString actName = actionName.isNull() ? BM_NAME(name) : BM_NAME(actionName); 0035 setText(name); 0036 parent->addAction(actName, this); 0037 connect(this, &KrBookmark::triggered, this, &KrBookmark::activatedProxy); 0038 0039 setIconName(iconName); 0040 } 0041 0042 KrBookmark::KrBookmark(const QString &name, const QString &iconName) 0043 : QAction(Icon(iconName), name, nullptr) 0044 , _iconName(iconName) 0045 , _folder(true) 0046 , _separator(false) 0047 , _autoDelete(false) 0048 { 0049 setIcon(Icon(iconName == "" ? "folder" : iconName)); 0050 } 0051 0052 KrBookmark::~KrBookmark() 0053 { 0054 if (_autoDelete) { 0055 QListIterator<KrBookmark *> it(_children); 0056 while (it.hasNext()) 0057 delete it.next(); 0058 _children.clear(); 0059 } 0060 } 0061 0062 void KrBookmark::setIconName(const QString &iconName) 0063 { 0064 if (!iconName.isEmpty()) { 0065 setIcon(Icon(iconName)); 0066 } else if (_url.isLocalFile()) { 0067 setIcon(Icon("folder")); 0068 } else if (KrArcHandler::isArchive(_url)) { 0069 setIcon(Icon("application-x-tar")); 0070 } else { 0071 setIcon(Icon("folder-html")); 0072 } 0073 } 0074 0075 KrBookmark *KrBookmark::getExistingBookmark(const QString &actionName, KActionCollection *collection) 0076 { 0077 return dynamic_cast<KrBookmark *>(collection->action(BM_NAME(actionName))); 0078 } 0079 0080 KrBookmark *KrBookmark::trash(KActionCollection *collection) 0081 { 0082 KrBookmark *bm = getExistingBookmark(i18n(NAME_TRASH), collection); 0083 if (!bm) 0084 bm = new KrBookmark(i18n(NAME_TRASH), QUrl("trash:/"), collection); 0085 0086 bm->setIcon(Icon(KrTrashHandler::trashIconName())); 0087 return bm; 0088 } 0089 0090 KrBookmark *KrBookmark::virt(KActionCollection *collection) 0091 { 0092 KrBookmark *bm = getExistingBookmark(i18n(NAME_VIRTUAL), collection); 0093 if (!bm) { 0094 bm = new KrBookmark(i18n(NAME_VIRTUAL), QUrl("virt:/"), collection); 0095 bm->setIcon(Icon("document-open-remote")); 0096 } 0097 return bm; 0098 } 0099 0100 KrBookmark *KrBookmark::lan(KActionCollection *collection) 0101 { 0102 KrBookmark *bm = getExistingBookmark(i18n(NAME_LAN), collection); 0103 if (!bm) { 0104 bm = new KrBookmark(i18n(NAME_LAN), QUrl("remote:/"), collection); 0105 bm->setIcon(Icon("network-workgroup")); 0106 } 0107 return bm; 0108 } 0109 0110 QAction *KrBookmark::jumpBackAction(KActionCollection *collection, bool isSetter, ListPanelActions *sourceActions) 0111 { 0112 auto actionName = isSetter ? QString("setJumpBack") : QString("jumpBack"); 0113 auto action = collection->action(actionName); 0114 if (action) { 0115 return action; 0116 } 0117 0118 if (!sourceActions) { 0119 return nullptr; 0120 } 0121 0122 // copy essential part of source action 0123 auto sourceAction = isSetter ? sourceActions->actSetJumpBack : sourceActions->actJumpBack; 0124 action = new QAction(sourceAction->icon(), sourceAction->text(), sourceAction); 0125 action->setShortcut(sourceAction->shortcut()); 0126 action->setShortcutContext(Qt::WidgetShortcut); 0127 connect(action, &QAction::triggered, sourceAction, &QAction::trigger); 0128 // ensure there are no accelerator keys coming from another menu 0129 action->setText(KLocalizedString::removeAcceleratorMarker(action->text())); 0130 0131 collection->addAction(actionName, action); 0132 return action; 0133 } 0134 0135 KrBookmark *KrBookmark::separator() 0136 { 0137 KrBookmark *bm = new KrBookmark(""); 0138 bm->_separator = true; 0139 bm->_folder = false; 0140 return bm; 0141 } 0142 0143 void KrBookmark::activatedProxy() 0144 { 0145 emit activated(url()); 0146 }