Refactoring of feed editing forms, re-introduced support for adding tt-rss feeds.
This commit is contained in:
		
							parent
							
								
									db92b9d27b
								
							
						
					
					
						commit
						59e546a8cd
					
				
					 16 changed files with 355 additions and 72 deletions
				
			
		|  | @ -160,7 +160,7 @@ HEADERS += core/feeddownloader.h \ | ||||||
|            services/owncloud/owncloudserviceroot.h \ |            services/owncloud/owncloudserviceroot.h \ | ||||||
|            services/standard/atomparser.h \ |            services/standard/atomparser.h \ | ||||||
|            services/standard/feedparser.h \ |            services/standard/feedparser.h \ | ||||||
|            services/standard/gui/authenticationdetails.h \ |            services/abstract/gui/authenticationdetails.h \ | ||||||
|            services/standard/gui/formstandardcategorydetails.h \ |            services/standard/gui/formstandardcategorydetails.h \ | ||||||
|            services/standard/gui/formstandardfeeddetails.h \ |            services/standard/gui/formstandardfeeddetails.h \ | ||||||
|            services/standard/gui/formstandardimportexport.h \ |            services/standard/gui/formstandardimportexport.h \ | ||||||
|  | @ -175,6 +175,8 @@ HEADERS += core/feeddownloader.h \ | ||||||
|            services/standard/standardserviceroot.h \ |            services/standard/standardserviceroot.h \ | ||||||
|            services/tt-rss/definitions.h \ |            services/tt-rss/definitions.h \ | ||||||
|            services/tt-rss/gui/formeditttrssaccount.h \ |            services/tt-rss/gui/formeditttrssaccount.h \ | ||||||
|  |            services/tt-rss/gui/formttrssfeeddetails.h \ | ||||||
|  |            services/tt-rss/gui/ttrssfeeddetails.h \ | ||||||
|            services/tt-rss/network/ttrssnetworkfactory.h \ |            services/tt-rss/network/ttrssnetworkfactory.h \ | ||||||
|            services/tt-rss/ttrssfeed.h \ |            services/tt-rss/ttrssfeed.h \ | ||||||
|            services/tt-rss/ttrssserviceentrypoint.h \ |            services/tt-rss/ttrssserviceentrypoint.h \ | ||||||
|  | @ -308,7 +310,7 @@ SOURCES += core/feeddownloader.cpp \ | ||||||
|            services/owncloud/owncloudserviceroot.cpp \ |            services/owncloud/owncloudserviceroot.cpp \ | ||||||
|            services/standard/atomparser.cpp \ |            services/standard/atomparser.cpp \ | ||||||
|            services/standard/feedparser.cpp \ |            services/standard/feedparser.cpp \ | ||||||
|            services/standard/gui/authenticationdetails.cpp \ |            services/abstract/gui/authenticationdetails.cpp \ | ||||||
|            services/standard/gui/formstandardcategorydetails.cpp \ |            services/standard/gui/formstandardcategorydetails.cpp \ | ||||||
|            services/standard/gui/formstandardfeeddetails.cpp \ |            services/standard/gui/formstandardfeeddetails.cpp \ | ||||||
|            services/standard/gui/formstandardimportexport.cpp \ |            services/standard/gui/formstandardimportexport.cpp \ | ||||||
|  | @ -322,6 +324,8 @@ SOURCES += core/feeddownloader.cpp \ | ||||||
|            services/standard/standardserviceentrypoint.cpp \ |            services/standard/standardserviceentrypoint.cpp \ | ||||||
|            services/standard/standardserviceroot.cpp \ |            services/standard/standardserviceroot.cpp \ | ||||||
|            services/tt-rss/gui/formeditttrssaccount.cpp \ |            services/tt-rss/gui/formeditttrssaccount.cpp \ | ||||||
|  |            services/tt-rss/gui/formttrssfeeddetails.cpp \ | ||||||
|  |            services/tt-rss/gui/ttrssfeeddetails.cpp \ | ||||||
|            services/tt-rss/network/ttrssnetworkfactory.cpp \ |            services/tt-rss/network/ttrssnetworkfactory.cpp \ | ||||||
|            services/tt-rss/ttrssfeed.cpp \ |            services/tt-rss/ttrssfeed.cpp \ | ||||||
|            services/tt-rss/ttrssserviceentrypoint.cpp \ |            services/tt-rss/ttrssserviceentrypoint.cpp \ | ||||||
|  | @ -363,7 +367,7 @@ FORMS += gui/dialogs/formabout.ui \ | ||||||
|          services/gmail/gui/formeditgmailaccount.ui \ |          services/gmail/gui/formeditgmailaccount.ui \ | ||||||
|          services/inoreader/gui/formeditinoreaderaccount.ui \ |          services/inoreader/gui/formeditinoreaderaccount.ui \ | ||||||
|          services/owncloud/gui/formeditowncloudaccount.ui \ |          services/owncloud/gui/formeditowncloudaccount.ui \ | ||||||
|          services/standard/gui/authenticationdetails.ui \ |          services/abstract/gui/authenticationdetails.ui \ | ||||||
|          services/standard/gui/formstandardcategorydetails.ui \ |          services/standard/gui/formstandardcategorydetails.ui \ | ||||||
|          services/standard/gui/formstandardimportexport.ui \ |          services/standard/gui/formstandardimportexport.ui \ | ||||||
|          services/standard/gui/standardfeeddetails.ui \ |          services/standard/gui/standardfeeddetails.ui \ | ||||||
|  | @ -371,7 +375,8 @@ FORMS += gui/dialogs/formabout.ui \ | ||||||
|          services/gmail/gui/formdownloadattachment.ui \ |          services/gmail/gui/formdownloadattachment.ui \ | ||||||
|          services/gmail/gui/formaddeditemail.ui \ |          services/gmail/gui/formaddeditemail.ui \ | ||||||
|          gui/searchtextwidget.ui \ |          gui/searchtextwidget.ui \ | ||||||
|          gui/newspaperpreviewer.ui |          gui/newspaperpreviewer.ui \ | ||||||
|  |          services/tt-rss/gui/ttrssfeeddetails.ui | ||||||
| 
 | 
 | ||||||
| equals(USE_WEBENGINE, true) { | equals(USE_WEBENGINE, true) { | ||||||
|   HEADERS += gui/locationlineedit.h \ |   HEADERS += gui/locationlineedit.h \ | ||||||
|  |  | ||||||
							
								
								
									
										47
									
								
								src/librssguard/services/abstract/gui/authenticationdetails.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										47
									
								
								src/librssguard/services/abstract/gui/authenticationdetails.cpp
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | // For license of this file, see <project-root-folder>/LICENSE.md.
 | ||||||
|  | 
 | ||||||
|  | #include "services/abstract/gui/authenticationdetails.h" | ||||||
|  | 
 | ||||||
|  | AuthenticationDetails::AuthenticationDetails(QWidget* parent) : QWidget(parent) { | ||||||
|  |   setupUi(this); | ||||||
|  | 
 | ||||||
|  |   // Set text boxes.
 | ||||||
|  |   m_txtUsername->lineEdit()->setPlaceholderText(tr("Username")); | ||||||
|  |   m_txtUsername->lineEdit()->setToolTip(tr("Set username to access the feed.")); | ||||||
|  |   m_txtPassword->lineEdit()->setPlaceholderText(tr("Password")); | ||||||
|  |   m_txtPassword->lineEdit()->setToolTip(tr("Set password to access the feed.")); | ||||||
|  | 
 | ||||||
|  |   connect(m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &AuthenticationDetails::onUsernameChanged); | ||||||
|  |   connect(m_txtPassword->lineEdit(), &BaseLineEdit::textChanged, this, &AuthenticationDetails::onPasswordChanged); | ||||||
|  |   connect(m_gbAuthentication, &QGroupBox::toggled, this, &AuthenticationDetails::onAuthenticationSwitched); | ||||||
|  | 
 | ||||||
|  |   onUsernameChanged(QString()); | ||||||
|  |   onPasswordChanged(QString()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AuthenticationDetails::onUsernameChanged(const QString& new_username) { | ||||||
|  |   bool is_username_ok = !m_gbAuthentication->isChecked() || !new_username.simplified().isEmpty(); | ||||||
|  | 
 | ||||||
|  |   m_txtUsername->setStatus(is_username_ok ? | ||||||
|  |                            LineEditWithStatus::StatusType::Ok : | ||||||
|  |                            LineEditWithStatus::StatusType::Warning, | ||||||
|  |                            is_username_ok ? | ||||||
|  |                            tr("Username is ok or it is not needed.") : | ||||||
|  |                            tr("Username is empty.")); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AuthenticationDetails::onPasswordChanged(const QString& new_password) { | ||||||
|  |   bool is_password_ok = !m_gbAuthentication->isChecked() || !new_password.simplified().isEmpty(); | ||||||
|  | 
 | ||||||
|  |   m_txtPassword->setStatus(is_password_ok ? | ||||||
|  |                            LineEditWithStatus::StatusType::Ok : | ||||||
|  |                            LineEditWithStatus::StatusType::Warning, | ||||||
|  |                            is_password_ok ? | ||||||
|  |                            tr("Password is ok or it is not needed.") : | ||||||
|  |                            tr("Password is empty.")); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AuthenticationDetails::onAuthenticationSwitched() { | ||||||
|  |   onUsernameChanged(m_txtUsername->lineEdit()->text()); | ||||||
|  |   onPasswordChanged(m_txtPassword->lineEdit()->text()); | ||||||
|  | } | ||||||
|  | @ -7,11 +7,9 @@ | ||||||
| 
 | 
 | ||||||
| #include "ui_authenticationdetails.h" | #include "ui_authenticationdetails.h" | ||||||
| 
 | 
 | ||||||
| class AuthenticationDetails : public QWidget { | class AuthenticationDetails : public QWidget, public Ui::AuthenticationDetails { | ||||||
|   Q_OBJECT |   Q_OBJECT | ||||||
| 
 | 
 | ||||||
|   friend class FormStandardFeedDetails; |  | ||||||
| 
 |  | ||||||
|   public: |   public: | ||||||
|     explicit AuthenticationDetails(QWidget* parent = nullptr); |     explicit AuthenticationDetails(QWidget* parent = nullptr); | ||||||
| 
 | 
 | ||||||
|  | @ -19,9 +17,6 @@ class AuthenticationDetails : public QWidget { | ||||||
|     void onUsernameChanged(const QString& new_username); |     void onUsernameChanged(const QString& new_username); | ||||||
|     void onPasswordChanged(const QString& new_password); |     void onPasswordChanged(const QString& new_password); | ||||||
|     void onAuthenticationSwitched(); |     void onAuthenticationSwitched(); | ||||||
| 
 |  | ||||||
|   private: |  | ||||||
|     Ui::AuthenticationDetails m_ui; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif // AUTHENTICATIONDETAILS_H
 | #endif // AUTHENTICATIONDETAILS_H
 | ||||||
|  | @ -37,6 +37,10 @@ void FormFeedDetails::activateTab(int index) { | ||||||
|   m_ui->m_tabWidget->setCurrentIndex(index); |   m_ui->m_tabWidget->setCurrentIndex(index); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void FormFeedDetails::clearTabs() { | ||||||
|  |   m_ui->m_tabWidget->clear(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void FormFeedDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) { | void FormFeedDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) { | ||||||
|   m_ui->m_tabWidget->insertTab(index, custom_tab, title); |   m_ui->m_tabWidget->insertTab(index, custom_tab, title); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -28,6 +28,7 @@ class FormFeedDetails : public QDialog { | ||||||
| 
 | 
 | ||||||
|   protected slots: |   protected slots: | ||||||
|     void activateTab(int index); |     void activateTab(int index); | ||||||
|  |     void clearTabs(); | ||||||
|     void insertCustomTab(QWidget* custom_tab, const QString& title, int index); |     void insertCustomTab(QWidget* custom_tab, const QString& title, int index); | ||||||
| 
 | 
 | ||||||
|     // Applies changes.
 |     // Applies changes.
 | ||||||
|  |  | ||||||
|  | @ -1,47 +0,0 @@ | ||||||
| // For license of this file, see <project-root-folder>/LICENSE.md.
 |  | ||||||
| 
 |  | ||||||
| #include "services/standard/gui/authenticationdetails.h" |  | ||||||
| 
 |  | ||||||
| AuthenticationDetails::AuthenticationDetails(QWidget* parent) : QWidget(parent) { |  | ||||||
|   m_ui.setupUi(this); |  | ||||||
| 
 |  | ||||||
|   // Set text boxes.
 |  | ||||||
|   m_ui.m_txtUsername->lineEdit()->setPlaceholderText(tr("Username")); |  | ||||||
|   m_ui.m_txtUsername->lineEdit()->setToolTip(tr("Set username to access the feed.")); |  | ||||||
|   m_ui.m_txtPassword->lineEdit()->setPlaceholderText(tr("Password")); |  | ||||||
|   m_ui.m_txtPassword->lineEdit()->setToolTip(tr("Set password to access the feed.")); |  | ||||||
| 
 |  | ||||||
|   connect(m_ui.m_txtUsername->lineEdit(), &BaseLineEdit::textChanged, this, &AuthenticationDetails::onUsernameChanged); |  | ||||||
|   connect(m_ui.m_txtPassword->lineEdit(), &BaseLineEdit::textChanged, this, &AuthenticationDetails::onPasswordChanged); |  | ||||||
|   connect(m_ui.m_gbAuthentication, &QGroupBox::toggled, this, &AuthenticationDetails::onAuthenticationSwitched); |  | ||||||
| 
 |  | ||||||
|   onUsernameChanged(QString()); |  | ||||||
|   onPasswordChanged(QString()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void AuthenticationDetails::onUsernameChanged(const QString& new_username) { |  | ||||||
|   bool is_username_ok = !m_ui.m_gbAuthentication->isChecked() || !new_username.simplified().isEmpty(); |  | ||||||
| 
 |  | ||||||
|   m_ui.m_txtUsername->setStatus(is_username_ok ? |  | ||||||
|                                 LineEditWithStatus::StatusType::Ok : |  | ||||||
|                                 LineEditWithStatus::StatusType::Warning, |  | ||||||
|                                 is_username_ok ? |  | ||||||
|                                 tr("Username is ok or it is not needed.") : |  | ||||||
|                                 tr("Username is empty.")); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void AuthenticationDetails::onPasswordChanged(const QString& new_password) { |  | ||||||
|   bool is_password_ok = !m_ui.m_gbAuthentication->isChecked() || !new_password.simplified().isEmpty(); |  | ||||||
| 
 |  | ||||||
|   m_ui.m_txtPassword->setStatus(is_password_ok ? |  | ||||||
|                                 LineEditWithStatus::StatusType::Ok : |  | ||||||
|                                 LineEditWithStatus::StatusType::Warning, |  | ||||||
|                                 is_password_ok ? |  | ||||||
|                                 tr("Password is ok or it is not needed.") : |  | ||||||
|                                 tr("Password is empty.")); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void AuthenticationDetails::onAuthenticationSwitched() { |  | ||||||
|   onUsernameChanged(m_ui.m_txtUsername->lineEdit()->text()); |  | ||||||
|   onPasswordChanged(m_ui.m_txtPassword->lineEdit()->text()); |  | ||||||
| } |  | ||||||
|  | @ -6,8 +6,8 @@ | ||||||
| #include "miscellaneous/iconfactory.h" | #include "miscellaneous/iconfactory.h" | ||||||
| #include "network-web/networkfactory.h" | #include "network-web/networkfactory.h" | ||||||
| #include "services/abstract/category.h" | #include "services/abstract/category.h" | ||||||
|  | #include "services/abstract/gui/authenticationdetails.h" | ||||||
| #include "services/abstract/serviceroot.h" | #include "services/abstract/serviceroot.h" | ||||||
| #include "services/standard/gui/authenticationdetails.h" |  | ||||||
| #include "services/standard/gui/standardfeeddetails.h" | #include "services/standard/gui/standardfeeddetails.h" | ||||||
| #include "services/standard/standardfeed.h" | #include "services/standard/standardfeed.h" | ||||||
| 
 | 
 | ||||||
|  | @ -39,19 +39,19 @@ int FormStandardFeedDetails::addEditFeed(StandardFeed* input_feed, RootItem* par | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // Run the dialog.
 |   // Run the dialog.
 | ||||||
|   return QDialog::exec(); |   return exec(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void FormStandardFeedDetails::guessFeed() { | void FormStandardFeedDetails::guessFeed() { | ||||||
|   m_standardFeedDetails->guessFeed(m_standardFeedDetails->ui.m_txtUrl->lineEdit()->text(), |   m_standardFeedDetails->guessFeed(m_standardFeedDetails->ui.m_txtUrl->lineEdit()->text(), | ||||||
|                                    m_authDetails->m_ui.m_txtUsername->lineEdit()->text(), |                                    m_authDetails->m_txtUsername->lineEdit()->text(), | ||||||
|                                    m_authDetails->m_ui.m_txtPassword->lineEdit()->text()); |                                    m_authDetails->m_txtPassword->lineEdit()->text()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void FormStandardFeedDetails::guessIconOnly() { | void FormStandardFeedDetails::guessIconOnly() { | ||||||
|   m_standardFeedDetails->guessIconOnly(m_standardFeedDetails->ui.m_txtUrl->lineEdit()->text(), |   m_standardFeedDetails->guessIconOnly(m_standardFeedDetails->ui.m_txtUrl->lineEdit()->text(), | ||||||
|                                        m_authDetails->m_ui.m_txtUsername->lineEdit()->text(), |                                        m_authDetails->m_txtUsername->lineEdit()->text(), | ||||||
|                                        m_authDetails->m_ui.m_txtPassword->lineEdit()->text()); |                                        m_authDetails->m_txtPassword->lineEdit()->text()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void FormStandardFeedDetails::apply() { | void FormStandardFeedDetails::apply() { | ||||||
|  | @ -71,9 +71,9 @@ void FormStandardFeedDetails::apply() { | ||||||
|   new_feed->setEncoding(m_standardFeedDetails->ui.m_cmbEncoding->currentText()); |   new_feed->setEncoding(m_standardFeedDetails->ui.m_cmbEncoding->currentText()); | ||||||
|   new_feed->setType(type); |   new_feed->setType(type); | ||||||
|   new_feed->setUrl(m_standardFeedDetails->ui.m_txtUrl->lineEdit()->text()); |   new_feed->setUrl(m_standardFeedDetails->ui.m_txtUrl->lineEdit()->text()); | ||||||
|   new_feed->setPasswordProtected(m_authDetails->m_ui.m_gbAuthentication->isChecked()); |   new_feed->setPasswordProtected(m_authDetails->m_gbAuthentication->isChecked()); | ||||||
|   new_feed->setUsername(m_authDetails->m_ui.m_txtUsername->lineEdit()->text()); |   new_feed->setUsername(m_authDetails->m_txtUsername->lineEdit()->text()); | ||||||
|   new_feed->setPassword(m_authDetails->m_ui.m_txtPassword->lineEdit()->text()); |   new_feed->setPassword(m_authDetails->m_txtPassword->lineEdit()->text()); | ||||||
|   new_feed->setAutoUpdateType(static_cast<Feed::AutoUpdateType>(m_ui->m_cmbAutoUpdateType->itemData( |   new_feed->setAutoUpdateType(static_cast<Feed::AutoUpdateType>(m_ui->m_cmbAutoUpdateType->itemData( | ||||||
|                                                                   m_ui->m_cmbAutoUpdateType->currentIndex()).toInt())); |                                                                   m_ui->m_cmbAutoUpdateType->currentIndex()).toInt())); | ||||||
|   new_feed->setAutoUpdateInitialInterval(int(m_ui->m_spinAutoUpdateInterval->value())); |   new_feed->setAutoUpdateInitialInterval(int(m_ui->m_spinAutoUpdateInterval->value())); | ||||||
|  | @ -115,7 +115,7 @@ void FormStandardFeedDetails::setEditableFeed(Feed* editable_feed) { | ||||||
|   FormFeedDetails::setEditableFeed(editable_feed); |   FormFeedDetails::setEditableFeed(editable_feed); | ||||||
| 
 | 
 | ||||||
|   m_standardFeedDetails->setExistingFeed(qobject_cast<StandardFeed*>(editable_feed)); |   m_standardFeedDetails->setExistingFeed(qobject_cast<StandardFeed*>(editable_feed)); | ||||||
|   m_authDetails->m_ui.m_gbAuthentication->setChecked(editable_feed->passwordProtected()); |   m_authDetails->m_gbAuthentication->setChecked(editable_feed->passwordProtected()); | ||||||
|   m_authDetails->m_ui.m_txtUsername->lineEdit()->setText(editable_feed->username()); |   m_authDetails->m_txtUsername->lineEdit()->setText(editable_feed->username()); | ||||||
|   m_authDetails->m_ui.m_txtPassword->lineEdit()->setText(editable_feed->password()); |   m_authDetails->m_txtPassword->lineEdit()->setText(editable_feed->password()); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -113,9 +113,8 @@ void StandardServiceRoot::addNewFeed(RootItem* selected_item, const QString& url | ||||||
|     // is quitting.
 |     // is quitting.
 | ||||||
|     qApp->showGuiMessage(tr("Cannot add item"), |     qApp->showGuiMessage(tr("Cannot add item"), | ||||||
|                          tr("Cannot add feed because another critical operation is ongoing."), |                          tr("Cannot add feed because another critical operation is ongoing."), | ||||||
|                          QSystemTrayIcon::Warning, qApp->mainFormWidget(), true); |                          QSystemTrayIcon::MessageIcon::Warning, qApp->mainFormWidget(), true); | ||||||
| 
 | 
 | ||||||
|     // Thus, cannot delete and quit the method.
 |  | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										79
									
								
								src/librssguard/services/tt-rss/gui/formttrssfeeddetails.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										79
									
								
								src/librssguard/services/tt-rss/gui/formttrssfeeddetails.cpp
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,79 @@ | ||||||
|  | // For license of this file, see <project-root-folder>/LICENSE.md.
 | ||||||
|  | 
 | ||||||
|  | #include "services/tt-rss/gui/formttrssfeeddetails.h" | ||||||
|  | 
 | ||||||
|  | #include "miscellaneous/application.h" | ||||||
|  | #include "services/abstract/feed.h" | ||||||
|  | #include "services/abstract/gui/authenticationdetails.h" | ||||||
|  | #include "services/tt-rss/definitions.h" | ||||||
|  | #include "services/tt-rss/gui/ttrssfeeddetails.h" | ||||||
|  | #include "services/tt-rss/network/ttrssnetworkfactory.h" | ||||||
|  | #include "services/tt-rss/ttrssfeed.h" | ||||||
|  | #include "services/tt-rss/ttrssserviceroot.h" | ||||||
|  | 
 | ||||||
|  | #include <QClipboard> | ||||||
|  | #include <QMimeData> | ||||||
|  | #include <QTimer> | ||||||
|  | 
 | ||||||
|  | FormTtRssFeedDetails::FormTtRssFeedDetails(ServiceRoot* service_root, QWidget* parent) | ||||||
|  |   : FormFeedDetails(service_root, parent), m_feedDetails(new TtRssFeedDetails(this)), | ||||||
|  |   m_authDetails(new AuthenticationDetails(this)) {} | ||||||
|  | 
 | ||||||
|  | int FormTtRssFeedDetails::addFeed(RootItem* parent_to_select, const QString& url) { | ||||||
|  |   clearTabs(); | ||||||
|  |   insertCustomTab(m_feedDetails, tr("General"), 0); | ||||||
|  |   insertCustomTab(m_authDetails, tr("Network"), 1); | ||||||
|  |   activateTab(0); | ||||||
|  | 
 | ||||||
|  |   setWindowTitle(tr("Add new feed")); | ||||||
|  |   m_feedDetails->loadCategories(m_serviceRoot->getSubTreeCategories(), m_serviceRoot, parent_to_select); | ||||||
|  | 
 | ||||||
|  |   if (!url.isEmpty()) { | ||||||
|  |     m_feedDetails->ui.m_txtUrl->lineEdit()->setText(url); | ||||||
|  |   } | ||||||
|  |   else if (Application::clipboard()->mimeData()->hasText()) { | ||||||
|  |     m_feedDetails->ui.m_txtUrl->lineEdit()->setText(Application::clipboard()->text()); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   m_feedDetails->ui.m_txtUrl->lineEdit()->selectAll(); | ||||||
|  |   m_feedDetails->ui.m_txtUrl->setFocus(); | ||||||
|  | 
 | ||||||
|  |   return exec(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void FormTtRssFeedDetails::apply() { | ||||||
|  |   if (m_editableFeed != nullptr) { | ||||||
|  |     // NOTE: We can only edit base properties, therefore
 | ||||||
|  |     // base method is fine.
 | ||||||
|  |     FormFeedDetails::apply(); | ||||||
|  |   } | ||||||
|  |   else { | ||||||
|  |     RootItem* parent = static_cast<RootItem*>(m_feedDetails->ui.m_cmbParentCategory->itemData( | ||||||
|  |                                                 m_feedDetails->ui.m_cmbParentCategory->currentIndex()).value<void*>()); | ||||||
|  |     auto* root = qobject_cast<TtRssServiceRoot*>(parent->getParentServiceRoot()); | ||||||
|  |     const int category_id = parent->kind() == RootItem::Kind::ServiceRoot ? | ||||||
|  |                             0 : | ||||||
|  |                             parent->customId().toInt(); | ||||||
|  |     const TtRssSubscribeToFeedResponse response = root->network()->subscribeToFeed(m_feedDetails->ui.m_txtUrl->lineEdit()->text(), | ||||||
|  |                                                                                    category_id, | ||||||
|  |                                                                                    m_authDetails->m_gbAuthentication->isChecked(), | ||||||
|  |                                                                                    m_authDetails->m_txtUsername->lineEdit()->text(), | ||||||
|  |                                                                                    m_authDetails->m_txtPassword->lineEdit()->text()); | ||||||
|  | 
 | ||||||
|  |     if (response.code() == STF_INSERTED) { | ||||||
|  |       // Feed was added online.
 | ||||||
|  |       accept(); | ||||||
|  |       qApp->showGuiMessage(tr("Feed added"), | ||||||
|  |                            tr("Feed was added, triggering sync in now."), | ||||||
|  |                            QSystemTrayIcon::MessageIcon::Information); | ||||||
|  |       QTimer::singleShot(300, root, &TtRssServiceRoot::syncIn); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       qApp->showGuiMessage(tr("Cannot add feed"), | ||||||
|  |                            tr("Feed was not added due to error."), | ||||||
|  |                            QSystemTrayIcon::MessageIcon::Critical, | ||||||
|  |                            qApp->mainFormWidget(), | ||||||
|  |                            true); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										27
									
								
								src/librssguard/services/tt-rss/gui/formttrssfeeddetails.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								src/librssguard/services/tt-rss/gui/formttrssfeeddetails.h
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,27 @@ | ||||||
|  | // For license of this file, see <project-root-folder>/LICENSE.md.
 | ||||||
|  | 
 | ||||||
|  | #ifndef FORMTTRSSFEEDDETAILS_H | ||||||
|  | #define FORMTTRSSFEEDDETAILS_H | ||||||
|  | 
 | ||||||
|  | #include "services/abstract/gui/formfeeddetails.h" | ||||||
|  | 
 | ||||||
|  | class TtRssFeed; | ||||||
|  | class TtRssFeedDetails; | ||||||
|  | class AuthenticationDetails; | ||||||
|  | 
 | ||||||
|  | class FormTtRssFeedDetails : public FormFeedDetails { | ||||||
|  |   public: | ||||||
|  |     explicit FormTtRssFeedDetails(ServiceRoot* service_root, QWidget* parent = nullptr); | ||||||
|  | 
 | ||||||
|  |   public slots: | ||||||
|  |     int addFeed(RootItem* parent_to_select, const QString& url = QString()); | ||||||
|  | 
 | ||||||
|  |   protected slots: | ||||||
|  |     virtual void apply(); | ||||||
|  | 
 | ||||||
|  |   private: | ||||||
|  |     TtRssFeedDetails* m_feedDetails; | ||||||
|  |     AuthenticationDetails* m_authDetails; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // FORMTTRSSFEEDDETAILS_H
 | ||||||
							
								
								
									
										52
									
								
								src/librssguard/services/tt-rss/gui/ttrssfeeddetails.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										52
									
								
								src/librssguard/services/tt-rss/gui/ttrssfeeddetails.cpp
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,52 @@ | ||||||
|  | // For license of this file, see <project-root-folder>/LICENSE.md.
 | ||||||
|  | 
 | ||||||
|  | #include "services/tt-rss/gui/ttrssfeeddetails.h" | ||||||
|  | 
 | ||||||
|  | #include "services/abstract/category.h" | ||||||
|  | 
 | ||||||
|  | TtRssFeedDetails::TtRssFeedDetails(QWidget* parent) : QWidget(parent) { | ||||||
|  |   ui.setupUi(this); | ||||||
|  | 
 | ||||||
|  |   ui.m_txtUrl->lineEdit()->setPlaceholderText(tr("Full feed URL including scheme")); | ||||||
|  |   ui.m_txtUrl->lineEdit()->setToolTip(tr("Provide URL for your feed.")); | ||||||
|  | 
 | ||||||
|  |   connect(ui.m_txtUrl->lineEdit(), &BaseLineEdit::textChanged, this, &TtRssFeedDetails::onUrlChanged); | ||||||
|  |   onUrlChanged(QString()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TtRssFeedDetails::onUrlChanged(const QString& new_url) { | ||||||
|  |   if (QRegularExpression(URL_REGEXP).match(new_url).hasMatch()) { | ||||||
|  |     // New url is well-formed.
 | ||||||
|  |     ui.m_txtUrl->setStatus(LineEditWithStatus::StatusType::Ok, tr("The URL is ok.")); | ||||||
|  |   } | ||||||
|  |   else if (!new_url.simplified().isEmpty()) { | ||||||
|  |     // New url is not well-formed but is not empty on the other hand.
 | ||||||
|  |     ui.m_txtUrl->setStatus(LineEditWithStatus::StatusType::Warning, | ||||||
|  |                            tr(R"(The URL does not meet standard pattern. Does your URL start with "http://" or "https://" prefix.)"));
 | ||||||
|  |   } | ||||||
|  |   else { | ||||||
|  |     // New url is empty.
 | ||||||
|  |     ui.m_txtUrl->setStatus(LineEditWithStatus::StatusType::Error, tr("The URL is empty.")); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TtRssFeedDetails::loadCategories(const QList<Category*>& categories, RootItem* root_item, RootItem* parent_to_select) { | ||||||
|  |   ui.m_cmbParentCategory->addItem(root_item->fullIcon(), root_item->title(), QVariant::fromValue((void*) root_item)); | ||||||
|  | 
 | ||||||
|  |   for (Category* category : categories) { | ||||||
|  |     ui.m_cmbParentCategory->addItem(category->fullIcon(), category->title(), QVariant::fromValue((void*) category)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   if (parent_to_select != nullptr) { | ||||||
|  |     if (parent_to_select->kind() == RootItem::Kind::Category) { | ||||||
|  |       ui.m_cmbParentCategory->setCurrentIndex(ui.m_cmbParentCategory->findData(QVariant::fromValue((void*)parent_to_select))); | ||||||
|  |     } | ||||||
|  |     else if (parent_to_select->kind() == RootItem::Kind::Feed) { | ||||||
|  |       int target_item = ui.m_cmbParentCategory->findData(QVariant::fromValue((void*)parent_to_select->parent())); | ||||||
|  | 
 | ||||||
|  |       if (target_item >= 0) { | ||||||
|  |         ui.m_cmbParentCategory->setCurrentIndex(target_item); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								src/librssguard/services/tt-rss/gui/ttrssfeeddetails.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										31
									
								
								src/librssguard/services/tt-rss/gui/ttrssfeeddetails.h
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | // For license of this file, see <project-root-folder>/LICENSE.md.
 | ||||||
|  | 
 | ||||||
|  | #ifndef TTRSSFEEDDETAILS_H | ||||||
|  | #define TTRSSFEEDDETAILS_H | ||||||
|  | 
 | ||||||
|  | #include <QWidget> | ||||||
|  | 
 | ||||||
|  | #include "ui_ttrssfeeddetails.h" | ||||||
|  | 
 | ||||||
|  | class Category; | ||||||
|  | class RootItem; | ||||||
|  | 
 | ||||||
|  | class TtRssFeedDetails : public QWidget { | ||||||
|  |   Q_OBJECT | ||||||
|  | 
 | ||||||
|  |   friend class FormTtRssFeedDetails; | ||||||
|  | 
 | ||||||
|  |   public: | ||||||
|  |     explicit TtRssFeedDetails(QWidget* parent = nullptr); | ||||||
|  | 
 | ||||||
|  |   private slots: | ||||||
|  |     void onUrlChanged(const QString& new_url); | ||||||
|  | 
 | ||||||
|  |   private: | ||||||
|  |     void loadCategories(const QList<Category*>& categories, RootItem* root_item, RootItem* parent_to_select = nullptr); | ||||||
|  | 
 | ||||||
|  |   private: | ||||||
|  |     Ui::TtRssFeedDetails ui; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // TTRSSFEEDDETAILS_H
 | ||||||
							
								
								
									
										68
									
								
								src/librssguard/services/tt-rss/gui/ttrssfeeddetails.ui
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										68
									
								
								src/librssguard/services/tt-rss/gui/ttrssfeeddetails.ui
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,68 @@ | ||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>TtRssFeedDetails</class> | ||||||
|  |  <widget class="QWidget" name="TtRssFeedDetails"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>367</width> | ||||||
|  |     <height>202</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>Form</string> | ||||||
|  |   </property> | ||||||
|  |   <layout class="QFormLayout" name="formLayout"> | ||||||
|  |    <item row="0" column="0"> | ||||||
|  |     <widget class="QLabel" name="m_lblParentCategory"> | ||||||
|  |      <property name="text"> | ||||||
|  |       <string>Parent category</string> | ||||||
|  |      </property> | ||||||
|  |      <property name="buddy"> | ||||||
|  |       <cstring>m_cmbParentCategory</cstring> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |    <item row="0" column="1"> | ||||||
|  |     <widget class="QComboBox" name="m_cmbParentCategory"> | ||||||
|  |      <property name="toolTip"> | ||||||
|  |       <string>Select parent item for your feed.</string> | ||||||
|  |      </property> | ||||||
|  |      <property name="iconSize"> | ||||||
|  |       <size> | ||||||
|  |        <width>12</width> | ||||||
|  |        <height>12</height> | ||||||
|  |       </size> | ||||||
|  |      </property> | ||||||
|  |      <property name="frame"> | ||||||
|  |       <bool>true</bool> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |    <item row="1" column="0"> | ||||||
|  |     <widget class="QLabel" name="label"> | ||||||
|  |      <property name="text"> | ||||||
|  |       <string>URL</string> | ||||||
|  |      </property> | ||||||
|  |      <property name="buddy"> | ||||||
|  |       <cstring>m_txtUrl</cstring> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|  |    <item row="1" column="1"> | ||||||
|  |     <widget class="LineEditWithStatus" name="m_txtUrl" native="true"/> | ||||||
|  |    </item> | ||||||
|  |   </layout> | ||||||
|  |  </widget> | ||||||
|  |  <customwidgets> | ||||||
|  |   <customwidget> | ||||||
|  |    <class>LineEditWithStatus</class> | ||||||
|  |    <extends>QWidget</extends> | ||||||
|  |    <header>lineeditwithstatus.h</header> | ||||||
|  |    <container>1</container> | ||||||
|  |   </customwidget> | ||||||
|  |  </customwidgets> | ||||||
|  |  <resources/> | ||||||
|  |  <connections/> | ||||||
|  | </ui> | ||||||
|  | @ -14,6 +14,7 @@ | ||||||
| #include "services/abstract/recyclebin.h" | #include "services/abstract/recyclebin.h" | ||||||
| #include "services/tt-rss/definitions.h" | #include "services/tt-rss/definitions.h" | ||||||
| #include "services/tt-rss/gui/formeditttrssaccount.h" | #include "services/tt-rss/gui/formeditttrssaccount.h" | ||||||
|  | #include "services/tt-rss/gui/formttrssfeeddetails.h" | ||||||
| #include "services/tt-rss/network/ttrssnetworkfactory.h" | #include "services/tt-rss/network/ttrssnetworkfactory.h" | ||||||
| #include "services/tt-rss/ttrssfeed.h" | #include "services/tt-rss/ttrssfeed.h" | ||||||
| #include "services/tt-rss/ttrssserviceentrypoint.h" | #include "services/tt-rss/ttrssserviceentrypoint.h" | ||||||
|  | @ -83,13 +84,33 @@ bool TtRssServiceRoot::deleteViaGui() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool TtRssServiceRoot::supportsFeedAdding() const { | bool TtRssServiceRoot::supportsFeedAdding() const { | ||||||
|   return false; |   return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool TtRssServiceRoot::supportsCategoryAdding() const { | bool TtRssServiceRoot::supportsCategoryAdding() const { | ||||||
|   return false; |   return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void TtRssServiceRoot::addNewFeed(RootItem* selected_item, const QString& url) { | ||||||
|  |   if (!qApp->feedUpdateLock()->tryLock()) { | ||||||
|  |     // Lock was not obtained because
 | ||||||
|  |     // it is used probably by feed updater or application
 | ||||||
|  |     // is quitting.
 | ||||||
|  |     qApp->showGuiMessage(tr("Cannot add item"), | ||||||
|  |                          tr("Cannot add feed because another critical operation is ongoing."), | ||||||
|  |                          QSystemTrayIcon::MessageIcon::Warning, | ||||||
|  |                          qApp->mainFormWidget(), | ||||||
|  |                          true); | ||||||
|  | 
 | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   QScopedPointer<FormTtRssFeedDetails> form_pointer(new FormTtRssFeedDetails(this, qApp->mainFormWidget())); | ||||||
|  | 
 | ||||||
|  |   form_pointer->addFeed(selected_item, url); | ||||||
|  |   qApp->feedUpdateLock()->unlock(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool TtRssServiceRoot::canBeEdited() const { | bool TtRssServiceRoot::canBeEdited() const { | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ class TtRssServiceRoot : public ServiceRoot, public CacheForServiceRoot { | ||||||
|     virtual bool deleteViaGui(); |     virtual bool deleteViaGui(); | ||||||
|     virtual bool supportsFeedAdding() const; |     virtual bool supportsFeedAdding() const; | ||||||
|     virtual bool supportsCategoryAdding() const; |     virtual bool supportsCategoryAdding() const; | ||||||
|  |     virtual void addNewFeed(RootItem* selected_item, const QString& url = QString()); | ||||||
|     virtual QString additionalTooltip() const; |     virtual QString additionalTooltip() const; | ||||||
|     virtual void saveAllCachedData(bool async = true); |     virtual void saveAllCachedData(bool async = true); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue