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
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);