diff --git a/resources/icons.qrc b/resources/icons.qrc index 4bdabddd7..6a56a573d 100644 --- a/resources/icons.qrc +++ b/resources/icons.qrc @@ -12,6 +12,7 @@ ./graphics/Faenza/actions/64/document-revert.png ./graphics/Faenza/actions/64/down.png ./graphics/Faenza/actions/64/edit-clear.png + ./graphics/Faenza/actions/64/edit-copy.png ./graphics/Faenza/actions/64/format-indent-more.png ./graphics/Faenza/actions/64/format-justify-fill.png ./graphics/Faenza/actions/64/forward.png diff --git a/resources/scripts/.generate-used-icons.sh b/resources/scripts/.generate-used-icons.sh old mode 100644 new mode 100755 diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp old mode 100644 new mode 100755 index 5ffa24be6..a72bfb6cf --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -41,6 +41,10 @@ #include #include +#if QT_VERSION >= 0x050E00 // Qt >= 5.14.0 +#include +#endif + #if defined (USE_WEBENGINE) #include "network-web/adblock/adblockicon.h" #include "network-web/adblock/adblockmanager.h" @@ -164,6 +168,7 @@ QList FormMain::allActions() const { actions << m_ui->m_actionUpdateSelectedItems; actions << m_ui->m_actionStopRunningItemsUpdate; actions << m_ui->m_actionEditSelectedItem; + actions << m_ui->m_actionCopyUrlSelectedFeed; actions << m_ui->m_actionDeleteSelectedItem; actions << m_ui->m_actionServiceAdd; actions << m_ui->m_actionServiceEdit; @@ -374,7 +379,7 @@ void FormMain::onFeedUpdatesStarted() { } void FormMain::onFeedUpdatesProgress(const Feed* feed, int current, int total) { - statusBar()->showProgressFeeds((current * 100.0) / total, + statusBar()->showProgressFeeds(int((current * 100.0) / total), //: Text display in status bar when particular feed is updated. tr("Updated feed '%1'").arg(feed->title())); @@ -411,6 +416,7 @@ void FormMain::updateFeedButtonsAvailability() { m_ui->m_actionClearSelectedItems->setEnabled(anything_selected); m_ui->m_actionDeleteSelectedItem->setEnabled(!critical_action_running && anything_selected); m_ui->m_actionEditSelectedItem->setEnabled(!critical_action_running && anything_selected); + m_ui->m_actionCopyUrlSelectedFeed->setEnabled(service_selected || feed_selected || category_selected); m_ui->m_actionMarkSelectedItemsAsRead->setEnabled(anything_selected); m_ui->m_actionMarkSelectedItemsAsUnread->setEnabled(anything_selected); m_ui->m_actionUpdateAllItems->setEnabled(!critical_action_running); @@ -492,6 +498,7 @@ void FormMain::setupIcons() { m_ui->m_actionDeleteSelectedItem->setIcon(icon_theme_factory->fromTheme(QSL("list-remove"))); m_ui->m_actionDeleteSelectedMessages->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-junk"))); m_ui->m_actionEditSelectedItem->setIcon(icon_theme_factory->fromTheme(QSL("document-edit"))); + m_ui->m_actionCopyUrlSelectedFeed->setIcon(icon_theme_factory->fromTheme(QSL("edit-copy"))); m_ui->m_actionMarkAllItemsRead->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-read"))); m_ui->m_actionMarkSelectedItemsAsRead->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-read"))); m_ui->m_actionMarkSelectedItemsAsUnread->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); @@ -530,7 +537,19 @@ void FormMain::setupIcons() { } void FormMain::loadSize() { +#if QT_VERSION >= 0x050E00 // Qt >= 5.14.0 + QScreen* scr = screen(); + + if (scr == nullptr) { + qWarning("Cannot load dialog size, because no screens are detected."); + return; + } + + const QRect screen = scr->geometry(); +#else const QRect screen = qApp->desktop()->screenGeometry(); +#endif + const Settings* settings = qApp->settings(); // Reload main window size & position. @@ -694,6 +713,8 @@ void FormMain::createConnections() { &QAction::triggered, qApp->feedReader(), &FeedReader::updateAllFeeds); connect(m_ui->m_actionStopRunningItemsUpdate, &QAction::triggered, qApp->feedReader(), &FeedReader::stopRunningFeedUpdate); + connect(m_ui->m_actionCopyUrlSelectedFeed, + &QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::copyUrlOfSelectedFeeds); connect(m_ui->m_actionEditSelectedItem, &QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::editSelectedItem); connect(m_ui->m_actionViewSelectedItemsNewspaperMode, diff --git a/src/librssguard/gui/dialogs/formmain.ui b/src/librssguard/gui/dialogs/formmain.ui old mode 100644 new mode 100755 index 4328b08bc..4880618ec --- a/src/librssguard/gui/dialogs/formmain.ui +++ b/src/librssguard/gui/dialogs/formmain.ui @@ -45,7 +45,7 @@ 0 0 1296 - 21 + 22 @@ -122,6 +122,7 @@ + @@ -744,6 +745,11 @@ &Enable message preview + + + &Copy URLs of selected items + + diff --git a/src/librssguard/gui/feedsview.cpp b/src/librssguard/gui/feedsview.cpp old mode 100644 new mode 100755 index d45360b03..f5f95a215 --- a/src/librssguard/gui/feedsview.cpp +++ b/src/librssguard/gui/feedsview.cpp @@ -19,6 +19,7 @@ #include "services/standard/standardcategory.h" #include "services/standard/standardfeed.h" +#include #include #include #include @@ -127,6 +128,21 @@ void FeedsView::loadAllExpandStates() { static_cast(qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortOrderFeeds)).toInt())); } +void FeedsView::copyUrlOfSelectedFeeds() const { + auto feeds = selectedFeeds(); + QStringList urls; + + for (const auto* feed : feeds) { + if (!feed->url().isEmpty()) { + urls << feed->url(); + } + } + + if (qApp->clipboard() != nullptr && !urls.isEmpty()) { + qApp->clipboard()->setText(urls.join(TextFactory::newline())); + } +} + void FeedsView::sortByColumn(int column, Qt::SortOrder order) { const int old_column = header()->sortIndicatorSection(); const Qt::SortOrder old_order = header()->sortIndicatorOrder(); @@ -441,6 +457,7 @@ QMenu* FeedsView::initializeContextMenuService(RootItem* clicked_item) { m_contextMenuService->addActions(QList() << qApp->mainForm()->m_ui->m_actionUpdateSelectedItems << qApp->mainForm()->m_ui->m_actionEditSelectedItem << + qApp->mainForm()->m_ui->m_actionCopyUrlSelectedFeed << qApp->mainForm()->m_ui->m_actionViewSelectedItemsNewspaperMode << qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsRead << qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsUnread << @@ -484,6 +501,7 @@ QMenu* FeedsView::initializeContextMenuCategories(RootItem* clicked_item) { m_contextMenuCategories->addActions(QList() << qApp->mainForm()->m_ui->m_actionUpdateSelectedItems << qApp->mainForm()->m_ui->m_actionEditSelectedItem << + qApp->mainForm()->m_ui->m_actionCopyUrlSelectedFeed << qApp->mainForm()->m_ui->m_actionViewSelectedItemsNewspaperMode << qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsRead << qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsUnread << @@ -509,6 +527,7 @@ QMenu* FeedsView::initializeContextMenuFeeds(RootItem* clicked_item) { m_contextMenuFeeds->addActions(QList() << qApp->mainForm()->m_ui->m_actionUpdateSelectedItems << qApp->mainForm()->m_ui->m_actionEditSelectedItem << + qApp->mainForm()->m_ui->m_actionCopyUrlSelectedFeed << qApp->mainForm()->m_ui->m_actionViewSelectedItemsNewspaperMode << qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsRead << qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsUnread << diff --git a/src/librssguard/gui/feedsview.h b/src/librssguard/gui/feedsview.h old mode 100644 new mode 100755 index ad54672c5..a63e1a63c --- a/src/librssguard/gui/feedsview.h +++ b/src/librssguard/gui/feedsview.h @@ -48,6 +48,7 @@ class RSSGUARD_DLLSPEC FeedsView : public QTreeView { void loadAllExpandStates(); public slots: + void copyUrlOfSelectedFeeds() const; void sortByColumn(int column, Qt::SortOrder order); void addFeedIntoSelectedAccount(); diff --git a/src/librssguard/miscellaneous/textfactory.cpp b/src/librssguard/miscellaneous/textfactory.cpp old mode 100644 new mode 100755 index 1ac6f0499..9d2770a97 --- a/src/librssguard/miscellaneous/textfactory.cpp +++ b/src/librssguard/miscellaneous/textfactory.cpp @@ -114,6 +114,16 @@ QString TextFactory::decrypt(const QString& text) { return SimpleCrypt(initializeSecretEncryptionKey()).decryptToString(text); } +QString TextFactory::newline() { +#if defined(Q_OS_WIN) + return QSL("\r\n"); +#elif defined(Q_OS_MACOS) + return QSL("\r"); +#else + return QSL("\n"); +#endif +} + QString TextFactory::shorten(const QString& input, int text_length_limit) { if (input.size() > text_length_limit) { return input.left(text_length_limit - ELLIPSIS_LENGTH) + QString(ELLIPSIS_LENGTH, QL1C('.')); diff --git a/src/librssguard/miscellaneous/textfactory.h b/src/librssguard/miscellaneous/textfactory.h old mode 100644 new mode 100755 index 3c0cac451..ada853610 --- a/src/librssguard/miscellaneous/textfactory.h +++ b/src/librssguard/miscellaneous/textfactory.h @@ -34,6 +34,7 @@ class TextFactory { static QDateTime parseDateTime(qint64 milis_from_epoch); static QString encrypt(const QString& text); static QString decrypt(const QString& text); + static QString newline(); // Shortens input string according to given length limit. static QString shorten(const QString& input, int text_length_limit = TEXT_TITLE_LIMIT);