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 @@
lineeditwithstatus.h
1 + + TextEditWithStatus + QWidget +
lineeditwithstatus.h
+ 1 +