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"