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 }