File indexing completed on 2024-05-05 05:13:00

0001 /*
0002     This file is part of Akregator.
0003 
0004     SPDX-FileCopyrightText: 2008 Frank Osterfeld <osterfeld@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0007 */
0008 
0009 #include "createfeedcommand.h"
0010 
0011 #include "addfeeddialog.h"
0012 #include "feed.h"
0013 #include "feedlist.h"
0014 #include "feedpropertiesdialog.h"
0015 #include "folder.h"
0016 #include "mainwidget.h"
0017 #include "subscriptionlistview.h"
0018 
0019 #include <QUrl>
0020 
0021 #include <QClipboard>
0022 #include <QPointer>
0023 #include <QTimer>
0024 
0025 #include <cassert>
0026 
0027 using namespace Akregator;
0028 
0029 class Akregator::CreateFeedCommandPrivate
0030 {
0031     CreateFeedCommand *const q;
0032 
0033 public:
0034     explicit CreateFeedCommandPrivate(CreateFeedCommand *qq);
0035 
0036     void doCreate();
0037 
0038     QPointer<MainWidget> m_parent;
0039     QPointer<Folder> m_rootFolder;
0040     QPointer<SubscriptionListView> m_subscriptionListView;
0041     QString m_url;
0042     QPointer<Folder> m_parentFolder;
0043     QPointer<TreeNode> m_after;
0044     bool m_autoexec = false;
0045 };
0046 
0047 CreateFeedCommandPrivate::CreateFeedCommandPrivate(CreateFeedCommand *qq)
0048     : q(qq)
0049     , m_rootFolder(nullptr)
0050     , m_subscriptionListView(nullptr)
0051     , m_parentFolder(nullptr)
0052     , m_after(nullptr)
0053 {
0054 }
0055 
0056 void CreateFeedCommandPrivate::doCreate()
0057 {
0058     Q_ASSERT(m_rootFolder);
0059     Q_ASSERT(m_subscriptionListView);
0060 
0061     QPointer<AddFeedDialog> afd = new AddFeedDialog(q->parentWidget(), QStringLiteral("add_feed"));
0062 
0063     QString url = m_url;
0064 
0065     if (url.isEmpty()) {
0066         const QClipboard *const clipboard = QApplication::clipboard();
0067         Q_ASSERT(clipboard);
0068         const QString clipboardText = clipboard->text();
0069         // Check for the hostname, since the isValid method is not strict enough
0070         if (!QUrl(clipboardText).host().isEmpty()) {
0071             url = clipboardText;
0072         }
0073     }
0074 
0075     afd->setUrl(QUrl::fromPercentEncoding(QUrl::fromUserInput(url).toEncoded()));
0076 
0077     QPointer<QObject> thisPointer(q);
0078 
0079     if (m_autoexec) {
0080         afd->accept();
0081     } else {
0082         afd->exec();
0083     }
0084 
0085     if (!thisPointer) { // "this" might have been deleted while exec()!
0086         delete afd;
0087         return;
0088     }
0089 
0090     Feed *const feed = afd->feed();
0091     delete afd;
0092 
0093     if (!feed) {
0094         q->done();
0095         return;
0096     }
0097 
0098     QPointer<FeedPropertiesDialog> dlg = new FeedPropertiesDialog(q->parentWidget(), QStringLiteral("edit_feed"));
0099     dlg->setFeed(feed);
0100     dlg->selectFeedName();
0101 
0102     if (!m_autoexec && (dlg->exec() != QDialog::Accepted || !thisPointer)) {
0103         delete feed;
0104     } else {
0105         if (!m_parentFolder) {
0106             if (!m_rootFolder) {
0107                 if (m_parent->allFeedsList()) {
0108                     q->setRootFolder(m_parent->allFeedsList()->allFeedsFolder());
0109                 }
0110             }
0111             m_parentFolder = m_rootFolder;
0112         }
0113 
0114         if (m_parentFolder) {
0115             m_parentFolder->insertChild(feed, m_after);
0116             m_subscriptionListView->ensureNodeVisible(feed);
0117         }
0118     }
0119 
0120     delete dlg;
0121     q->done();
0122 }
0123 
0124 CreateFeedCommand::CreateFeedCommand(MainWidget *parent)
0125     : Command(parent)
0126     , d(new CreateFeedCommandPrivate(this))
0127 {
0128     d->m_parent = parent;
0129 }
0130 
0131 CreateFeedCommand::~CreateFeedCommand() = default;
0132 
0133 void CreateFeedCommand::setSubscriptionListView(SubscriptionListView *view)
0134 {
0135     d->m_subscriptionListView = view;
0136 }
0137 
0138 void CreateFeedCommand::setRootFolder(Folder *rootFolder)
0139 {
0140     d->m_rootFolder = rootFolder;
0141 }
0142 
0143 void CreateFeedCommand::setUrl(const QString &url)
0144 {
0145     d->m_url = url;
0146 }
0147 
0148 void CreateFeedCommand::setPosition(Folder *parent, TreeNode *after)
0149 {
0150     d->m_parentFolder = parent;
0151     d->m_after = after;
0152 }
0153 
0154 void CreateFeedCommand::setAutoExecute(bool autoexec)
0155 {
0156     d->m_autoexec = autoexec;
0157 }
0158 
0159 void CreateFeedCommand::doStart()
0160 {
0161     QTimer::singleShot(0, this, [this]() {
0162         d->doCreate();
0163     });
0164 }
0165 
0166 void CreateFeedCommand::doAbort()
0167 {
0168 }
0169 
0170 #include "moc_createfeedcommand.cpp"