diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml
index 6640de9a1..0743bf1c4 100644
--- a/resources/desktop/com.github.rssguard.appdata.xml
+++ b/resources/desktop/com.github.rssguard.appdata.xml
@@ -30,7 +30,7 @@
https://martinrotter.github.io/donate/
-
+
none
diff --git a/resources/docs/Documentation.md b/resources/docs/Documentation.md
index 626ca81e4..1a8a137bf 100644
--- a/resources/docs/Documentation.md
+++ b/resources/docs/Documentation.md
@@ -3,6 +3,7 @@
* [Downloads](Downloads.md)
* [Philosophy](#philosophy)
* [Versioning](#versioning)
+ * [How to contribute](#how-to-contribute)
* [Reporting bugs](#reporting-bugs)
* [Localizations](#localizations)
* [Web-based and lite app variants](#web-based-and-lite-app-variants)
@@ -34,7 +35,7 @@ I am glad to accept any kind of donations, see ♥ **Sponsor** button on the top
Note that some more elaborate parts of this documentation are placed in separate files for practical purposes.
## Philosophy
-RSS Guard tends to be independent software. It's free, it's open-source. RSS Guard accepts donations but only as a way of saying "thank you for RSS Guard".
+RSS Guard tends to be independent software. It's free, it's open-source.
## Versioning
RSS Guard uses [semantic versioning](https://semver.org/). The versioning scheme is `X.Y.Z`, where:
@@ -43,6 +44,16 @@ RSS Guard uses [semantic versioning](https://semver.org/). The versioning scheme
* `Y` indicates that there is new major feature available.
* `Z` indicates that there are newly fixed bugs or small features introduced.
+## How to contribute
+RSS Guard is open source application with free GNU GPLv3 license. Everyone willing to contribute is welcomed. You can contribute in many ways by:
+* fixing bugs and requesting PRs (pull requests),
+* [localizing](#localizations) to other languages,
+* supporting author with [donations](https://github.com/sponsors/martinrotter),
+* spreading the word,
+* reporting discovered [bugs](#reporting-bugs).
+
+If you decide to contribute code, then please try to follow the style and formatting of existing source code. Also, I use [uncrustify](https://github.com/martinrotter/rssguard/blob/master/resources/scripts/uncrustify/uncrustify.cfg) to format source code.
+
## Reporting bugs
Please report all issues/bugs/ideas to [Issues](https://github.com/martinrotter/rssguard/issues) section. Describe your problem as precisely as possible, along with steps taken leading up to the issue occurring.
diff --git a/resources/scripts/7za b/resources/scripts/7za
index 9c10723bf..47f412575 160000
--- a/resources/scripts/7za
+++ b/resources/scripts/7za
@@ -1 +1 @@
-Subproject commit 9c10723bfbaf6cb85107d6ee16e0324e9e487749
+Subproject commit 47f4125753452eff8800dbd6600c5a05540b15d9
diff --git a/src/librssguard/gui/lineeditwithstatus.cpp b/src/librssguard/gui/lineeditwithstatus.cpp
index 1e26943dd..8a93f0ae6 100644
--- a/src/librssguard/gui/lineeditwithstatus.cpp
+++ b/src/librssguard/gui/lineeditwithstatus.cpp
@@ -21,3 +21,18 @@ LineEditWithStatus::LineEditWithStatus(QWidget* parent)
m_layout->addWidget(m_wdgInput);
m_layout->addWidget(m_btnStatus);
}
+
+TextEditWithStatus::TextEditWithStatus(QWidget* parent)
+ : WidgetWithStatus(parent) {
+ m_wdgInput = new QPlainTextEdit(this);
+ setFocusProxy(m_wdgInput);
+
+ // Set correct size for the tool button.
+ const int txt_input_height = QLineEdit().sizeHint().height();
+
+ m_btnStatus->setFixedSize(txt_input_height, txt_input_height);
+
+ // Compose the layout.
+ m_layout->addWidget(m_wdgInput);
+ m_layout->addWidget(m_btnStatus);
+}
diff --git a/src/librssguard/gui/lineeditwithstatus.h b/src/librssguard/gui/lineeditwithstatus.h
index 9675a6abb..996418e92 100644
--- a/src/librssguard/gui/lineeditwithstatus.h
+++ b/src/librssguard/gui/lineeditwithstatus.h
@@ -7,6 +7,8 @@
#include "gui/baselineedit.h"
+#include
+
class LineEditWithStatus : public WidgetWithStatus {
Q_OBJECT
@@ -21,4 +23,18 @@ inline BaseLineEdit* LineEditWithStatus::lineEdit() const {
return static_cast(m_wdgInput);
}
+class TextEditWithStatus : public WidgetWithStatus {
+ Q_OBJECT
+
+ public:
+ explicit TextEditWithStatus(QWidget* parent = nullptr);
+
+ // Access to line edit.
+ QPlainTextEdit* textEdit() const;
+};
+
+inline QPlainTextEdit* TextEditWithStatus::textEdit() const {
+ return static_cast(m_wdgInput);
+}
+
#endif // LINEEDITWITHSTATUS_H
diff --git a/src/librssguard/services/abstract/gui/formfeeddetails.ui b/src/librssguard/services/abstract/gui/formfeeddetails.ui
index 016b3d393..04b215008 100644
--- a/src/librssguard/services/abstract/gui/formfeeddetails.ui
+++ b/src/librssguard/services/abstract/gui/formfeeddetails.ui
@@ -7,7 +7,7 @@
0
0
500
- 450
+ 600
diff --git a/src/librssguard/services/standard/gui/formstandardfeeddetails.cpp b/src/librssguard/services/standard/gui/formstandardfeeddetails.cpp
index 7b7f6fa86..aa5d70f8b 100644
--- a/src/librssguard/services/standard/gui/formstandardfeeddetails.cpp
+++ b/src/librssguard/services/standard/gui/formstandardfeeddetails.cpp
@@ -48,16 +48,16 @@ int FormStandardFeedDetails::addEditFeed(StandardFeed* input_feed, RootItem* par
void FormStandardFeedDetails::guessFeed() {
m_standardFeedDetails->guessFeed(m_standardFeedDetails->sourceType(),
- m_standardFeedDetails->m_ui.m_txtSource->lineEdit()->text(),
- m_standardFeedDetails->m_ui.m_txtPostProcessScript->lineEdit()->text(),
+ m_standardFeedDetails->m_ui.m_txtSource->textEdit()->toPlainText(),
+ m_standardFeedDetails->m_ui.m_txtPostProcessScript->textEdit()->toPlainText(),
m_authDetails->m_txtUsername->lineEdit()->text(),
m_authDetails->m_txtPassword->lineEdit()->text());
}
void FormStandardFeedDetails::guessIconOnly() {
m_standardFeedDetails->guessIconOnly(m_standardFeedDetails->sourceType(),
- m_standardFeedDetails->m_ui.m_txtSource->lineEdit()->text(),
- m_standardFeedDetails->m_ui.m_txtPostProcessScript->lineEdit()->text(),
+ m_standardFeedDetails->m_ui.m_txtSource->textEdit()->toPlainText(),
+ m_standardFeedDetails->m_ui.m_txtPostProcessScript->textEdit()->toPlainText(),
m_authDetails->m_txtUsername->lineEdit()->text(),
m_authDetails->m_txtPassword->lineEdit()->text());
}
@@ -79,8 +79,8 @@ void FormStandardFeedDetails::apply() {
new_feed->setEncoding(m_standardFeedDetails->m_ui.m_cmbEncoding->currentText());
new_feed->setType(type);
new_feed->setSourceType(m_standardFeedDetails->sourceType());
- new_feed->setPostProcessScript(m_standardFeedDetails->m_ui.m_txtPostProcessScript->lineEdit()->text());
- new_feed->setUrl(m_standardFeedDetails->m_ui.m_txtSource->lineEdit()->text());
+ new_feed->setPostProcessScript(m_standardFeedDetails->m_ui.m_txtPostProcessScript->textEdit()->toPlainText());
+ new_feed->setUrl(m_standardFeedDetails->m_ui.m_txtSource->textEdit()->toPlainText());
new_feed->setPasswordProtected(m_authDetails->m_gbAuthentication->isChecked());
new_feed->setUsername(m_authDetails->m_txtUsername->lineEdit()->text());
new_feed->setPassword(m_authDetails->m_txtPassword->lineEdit()->text());
diff --git a/src/librssguard/services/standard/gui/standardfeeddetails.cpp b/src/librssguard/services/standard/gui/standardfeeddetails.cpp
index 31bcb19bc..7d6e37148 100755
--- a/src/librssguard/services/standard/gui/standardfeeddetails.cpp
+++ b/src/librssguard/services/standard/gui/standardfeeddetails.cpp
@@ -21,10 +21,10 @@ StandardFeedDetails::StandardFeedDetails(QWidget* parent) : QWidget(parent) {
m_ui.m_txtTitle->lineEdit()->setToolTip(tr("Set title for your feed."));
m_ui.m_txtDescription->lineEdit()->setPlaceholderText(tr("Feed description"));
m_ui.m_txtDescription->lineEdit()->setToolTip(tr("Set description for your feed."));
- m_ui.m_txtSource->lineEdit()->setPlaceholderText(tr("Full feed source identifier"));
- m_ui.m_txtSource->lineEdit()->setToolTip(tr("Full feed source identifier which can be URL."));
- m_ui.m_txtPostProcessScript->lineEdit()->setPlaceholderText(tr("Full command to execute"));
- m_ui.m_txtPostProcessScript->lineEdit()->setToolTip(tr("You can enter full command including interpreter here."));
+ m_ui.m_txtSource->textEdit()->setPlaceholderText(tr("Full feed source identifier"));
+ m_ui.m_txtSource->textEdit()->setToolTip(tr("Full feed source identifier which can be URL."));
+ m_ui.m_txtPostProcessScript->textEdit()->setPlaceholderText(tr("Full command to execute"));
+ m_ui.m_txtPostProcessScript->textEdit()->setToolTip(tr("You can enter full command including interpreter here."));
// Add source types.
m_ui.m_cmbSourceType->addItem(StandardFeed::sourceTypeToString(StandardFeed::SourceType::Url),
@@ -71,7 +71,7 @@ StandardFeedDetails::StandardFeedDetails(QWidget* parent) : QWidget(parent) {
m_iconMenu->addAction(m_actionLoadIconFromFile);
m_iconMenu->addAction(m_actionUseDefaultIcon);
m_ui.m_btnIcon->setMenu(m_iconMenu);
- m_ui.m_txtSource->lineEdit()->setFocus(Qt::TabFocusReason);
+ m_ui.m_txtSource->textEdit()->setFocus(Qt::FocusReason::TabFocusReason);
// Set feed metadata fetch label.
m_ui.m_lblFetchMetadata->setStatus(WidgetWithStatus::StatusType::Information,
@@ -82,10 +82,14 @@ StandardFeedDetails::StandardFeedDetails(QWidget* parent) : QWidget(parent) {
connect(m_ui.m_txtDescription->lineEdit(), &BaseLineEdit::textChanged, this, &StandardFeedDetails::onDescriptionChanged);
connect(m_ui.m_cmbSourceType, QOverload::of(&QComboBox::currentIndexChanged),
this, [this]() {
- onUrlChanged(m_ui.m_txtSource->lineEdit()->text());
+ onUrlChanged(m_ui.m_txtSource->textEdit()->toPlainText());
+ });
+ connect(m_ui.m_txtSource->textEdit(), &QPlainTextEdit::textChanged, this, [this]() {
+ onUrlChanged(m_ui.m_txtSource->textEdit()->toPlainText());
+ });
+ connect(m_ui.m_txtPostProcessScript->textEdit(), &QPlainTextEdit::textChanged, this, [this]() {
+ onPostProcessScriptChanged(m_ui.m_txtPostProcessScript->textEdit()->toPlainText());
});
- connect(m_ui.m_txtSource->lineEdit(), &BaseLineEdit::textChanged, this, &StandardFeedDetails::onUrlChanged);
- connect(m_ui.m_txtPostProcessScript->lineEdit(), &BaseLineEdit::textChanged, this, &StandardFeedDetails::onPostProcessScriptChanged);
connect(m_actionLoadIconFromFile, &QAction::triggered, this, &StandardFeedDetails::onLoadIconFromFile);
connect(m_actionUseDefaultIcon, &QAction::triggered, this, &StandardFeedDetails::onUseDefaultIcon);
@@ -94,9 +98,9 @@ StandardFeedDetails::StandardFeedDetails(QWidget* parent) : QWidget(parent) {
setTabOrder(m_ui.m_cmbEncoding, m_ui.m_txtTitle->lineEdit());
setTabOrder(m_ui.m_txtTitle->lineEdit(), m_ui.m_txtDescription->lineEdit());
setTabOrder(m_ui.m_txtDescription->lineEdit(), m_ui.m_cmbSourceType);
- setTabOrder(m_ui.m_cmbSourceType, m_ui.m_txtSource->lineEdit());
- setTabOrder(m_ui.m_txtSource->lineEdit(), m_ui.m_txtPostProcessScript->lineEdit());
- setTabOrder(m_ui.m_txtPostProcessScript->lineEdit(), m_ui.m_btnFetchMetadata);
+ setTabOrder(m_ui.m_cmbSourceType, m_ui.m_txtSource->textEdit());
+ setTabOrder(m_ui.m_txtSource->textEdit(), m_ui.m_txtPostProcessScript->textEdit());
+ setTabOrder(m_ui.m_txtPostProcessScript->textEdit(), m_ui.m_btnFetchMetadata);
setTabOrder(m_ui.m_btnFetchMetadata, m_ui.m_btnIcon);
GuiUtilities::setLabelAsNotice(*m_ui.m_lblScriptInfo, false);
@@ -309,10 +313,10 @@ void StandardFeedDetails::prepareForNewFeed(RootItem* parent_to_select, const QS
}
if (!url.isEmpty()) {
- m_ui.m_txtSource->lineEdit()->setText(url);
+ m_ui.m_txtSource->textEdit()->setPlainText(url);
}
else if (Application::clipboard()->mimeData()->hasText()) {
- m_ui.m_txtSource->lineEdit()->setText(Application::clipboard()->text());
+ m_ui.m_txtSource->textEdit()->setPlainText(Application::clipboard()->text());
}
m_ui.m_txtSource->setFocus();
@@ -324,8 +328,8 @@ void StandardFeedDetails::setExistingFeed(StandardFeed* feed) {
m_ui.m_txtTitle->lineEdit()->setText(feed->title());
m_ui.m_txtDescription->lineEdit()->setText(feed->description());
m_ui.m_btnIcon->setIcon(feed->icon());
- m_ui.m_txtSource->lineEdit()->setText(feed->url());
- m_ui.m_txtPostProcessScript->lineEdit()->setText(feed->postProcessScript());
+ m_ui.m_txtSource->textEdit()->setPlainText(feed->url());
+ m_ui.m_txtPostProcessScript->textEdit()->setPlainText(feed->postProcessScript());
m_ui.m_cmbType->setCurrentIndex(m_ui.m_cmbType->findData(QVariant::fromValue(int(feed->type()))));
m_ui.m_cmbEncoding->setCurrentIndex(m_ui.m_cmbEncoding->findData(feed->encoding(),
Qt::ItemDataRole::DisplayRole,
diff --git a/src/librssguard/services/standard/gui/standardfeeddetails.ui b/src/librssguard/services/standard/gui/standardfeeddetails.ui
index 8fbce5426..486192617 100755
--- a/src/librssguard/services/standard/gui/standardfeeddetails.ui
+++ b/src/librssguard/services/standard/gui/standardfeeddetails.ui
@@ -6,8 +6,8 @@
0
0
- 429
- 321
+ 400
+ 460
@@ -111,23 +111,61 @@
-
-
-
-
-
-
- -
-
-
-
- 1
- 0
-
-
-
-
-
+
- -
+
-
+
+
+
+ 0
+ 50
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+ -
+
+
+ Post-process script
+
+
+
+ -
+
+
+
+ 0
+ 50
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+ -
+
+
+ You can use URL as a source of your feed or you can produce your feed with custom script. Also, you can post-process generated feed data with yet another script if you wish. These are advanced features and make sure to read the documentation before your use them.
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+
+ -
Fetch metadata
@@ -137,7 +175,7 @@
- -
+
-
-
@@ -161,7 +199,7 @@
- -
+
-
Icon
@@ -171,7 +209,7 @@
- -
+
-
@@ -208,28 +246,18 @@
- -
-
-
- -
-
-
- Post-process script
+
-
+
+
+ Qt::Vertical
-
-
- -
-
-
- You can use URL as a source of your feed or you can produce your feed with custom script. Also, you can post-process generated feed data with yet another script if you wish. These are advanced features and make sure to read the documentation before your use them.
+
+
+ 20
+ 40
+
-
- Qt::AlignCenter
-
-
- true
-
-
+
@@ -246,6 +274,12 @@
1
+
+ TextEditWithStatus
+ QWidget
+
+ 1
+