From a567674634db589fe2d6d459432799daf47a7287 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Tue, 20 Apr 2021 08:38:11 +0200 Subject: [PATCH] fix #344, polish docs a bit --- .../desktop/com.github.rssguard.appdata.xml | 2 +- resources/docs/Documentation.md | 17 +++-- resources/docs/Downloads.md | 6 +- resources/docs/images/add-acc.png | Bin 0 -> 16728 bytes src/librssguard/gui/dialogs/formmain.cpp | 17 ++++- src/librssguard/gui/dialogs/formmain.ui | 6 ++ src/librssguard/gui/feedsview.cpp | 63 +++++++++++++----- src/librssguard/gui/feedsview.h | 2 +- 8 files changed, 84 insertions(+), 29 deletions(-) create mode 100755 resources/docs/images/add-acc.png diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index 4d3f9db79..3c575bea3 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 e8f06f480..da2650049 100644 --- a/resources/docs/Documentation.md +++ b/resources/docs/Documentation.md @@ -11,6 +11,7 @@ * [RSS Guard 3 vs. RSS Guard 4](#rss-guard-3-vs-rss-guard-4) * [Features](#features) * [List of main features](#list-of-main-features) + * [Core concepts](#core-concepts) * [Supported feed formats and online feed services](Feed-formats.md) * [Message filtering](Message-filters.md) * [Database backends](#database-backends) @@ -120,8 +121,7 @@ RSS Guard is simple (yet powerful) feed reader. It is able to fetch the most kno * support for all feed formats (RSS/RDF/ATOM/JSON), * full support of podcasts (RSS/ATOM/JSON), * import/export of feeds to/from OPML 2.0, - * universal plugin for online services with [Google Reader API](#google-reader-api), - * possibility of using custom 3rd-party feed synchronization services, + * possibility of using custom 3rd-party feed [synchronization services](Feed-formats.md), * feed metadata fetching including icons, * support for [scraping websites](#websites-scraping) which do not offer RSS/ATOM feeds and other related advanced features, * simple internal Chromium-based web viewer (or alternative version with simpler and much more lightweight internal viewer), @@ -144,7 +144,6 @@ RSS Guard is simple (yet powerful) feed reader. It is able to fetch the most kno * support for `feed://` URI scheme. * user interface: * message list filter with regular expressions, - * drag-n-drop for feed list, * able to show unread feeds/messages only, * can be controlled via keyboard, * fully adjustable toolbars (changeable buttons and style), @@ -155,9 +154,18 @@ RSS Guard is simple (yet powerful) feed reader. It is able to fetch the most kno * tabbed interface, * ability to hide list of feeds/categories, * desktop integration via tray icon, - * localizations to some languages, + * localizations to many languages, * ability to tweak columns in displayed list of messages. +## Core concepts +RSS Guard is multi-protocol and multi-account application. If you start it for the first time, `Add account` dialog will pop-up. + + + +You can also display this dialog from main menu `Accounts -> Add new account`. + +You must have added some account to start using RSS Guard. Each account provides access to some specific online service while `Standard online feeds` account is there to provide access to classic `RSS` and `ATOM` feeds. You can have activated many accounts in the same time and even multiple accounts of the same type, for example two distinct `Gmail` accounts. + ## Database backends RSS Guard offers switchable database backends which hold your data. At this point, two backends are available: * MariaDB, @@ -187,7 +195,6 @@ Note that even when all Google Reader API enabled services should follow the API For example The Old Reader does not seem to offer tags/labels functionality, therefore tags/labels in RSS Guard are not synchronized, but you can still use offline labels. ## Websites scraping - > **Only proceed if you consider yourself to be a power user and you know what you are doing!** RSS Guard 3.9.0+ offers extra advanced features which are inspired by [Liferea](https://lzone.de/liferea/). diff --git a/resources/docs/Downloads.md b/resources/docs/Downloads.md index 2f63370ef..6047ba025 100755 --- a/resources/docs/Downloads.md +++ b/resources/docs/Downloads.md @@ -12,7 +12,7 @@ Official downloads are available [here](https://github.com/martinrotter/rssguard Development builds can be downloaded [here](https://github.com/martinrotter/rssguard/releases/tag/devbuild). ## Installation packages naming -**Windows builds** of RSS Guard are generated automatically by the tool called AppVeyor. These builds have auto-generated names. In RSS Guard [downloads page](https://github.com/martinrotter/rssguard/releases) you can see filenames like: +**All builds** of RSS Guard are generated automatically by GitHub. These builds have auto-generated names. In RSS Guard [downloads page](https://github.com/martinrotter/rssguard/releases) you can see filenames like: * `rssguard-3.4.2-7bad9d1-nowebengine-win32.7z`, * `rssguard-3.4.2-7bad9d1-win32.7z`, * `rssguard-3.4.2-95ee6be-nowebengine-win32.exe`, @@ -25,4 +25,6 @@ The structure of these filenames is quite trivial and easily understandable for * `` = `win32` (This is the target platform which the application can run on.), * `` = `exe` (This is self-explanatory.). -Note that same file naming scheme for development builds might be little different. Specifically, `` field is omitted. \ No newline at end of file +Note that same file naming scheme for development builds might be little different. Specifically, `` field is omitted. + +If you use `7z` packages on Windows, then you need to manually install all needed MSVC++ runtime libraries. Their installers are included inside the archive. \ No newline at end of file diff --git a/resources/docs/images/add-acc.png b/resources/docs/images/add-acc.png new file mode 100755 index 0000000000000000000000000000000000000000..0f46df1371ec066af4ae8fe791ce3e24d5815621 GIT binary patch literal 16728 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 literal 0 HcmV?d00001 diff --git a/src/librssguard/gui/dialogs/formmain.cpp b/src/librssguard/gui/dialogs/formmain.cpp index 34129fc4b..29814a4fc 100755 --- a/src/librssguard/gui/dialogs/formmain.cpp +++ b/src/librssguard/gui/dialogs/formmain.cpp @@ -190,6 +190,7 @@ QList FormMain::allActions() const { actions << m_ui->m_actionSelectPreviousMessage; actions << m_ui->m_actionSelectNextUnreadMessage; actions << m_ui->m_actionExpandCollapseItem; + actions << m_ui->m_actionExpandCollapseItemRecursively; actions << m_ui->m_actionMessageFilters; #if defined(USE_WEBENGINE) @@ -448,7 +449,8 @@ void FormMain::updateFeedButtonsAvailability() { m_ui->m_actionUpdateSelectedItemsWithCustomTimers->setEnabled(!critical_action_running); m_ui->m_actionUpdateSelectedItems->setEnabled(!critical_action_running && (feed_selected || category_selected || service_selected)); m_ui->m_actionViewSelectedItemsNewspaperMode->setEnabled(anything_selected); - m_ui->m_actionExpandCollapseItem->setEnabled(anything_selected); + m_ui->m_actionExpandCollapseItem->setEnabled(category_selected || service_selected); + m_ui->m_actionExpandCollapseItemRecursively->setEnabled(category_selected || service_selected); m_ui->m_actionServiceDelete->setEnabled(service_selected); m_ui->m_actionServiceEdit->setEnabled(service_selected); m_ui->m_actionAddFeedIntoSelectedItem->setEnabled(anything_selected); @@ -545,6 +547,7 @@ void FormMain::setupIcons() { m_ui->m_actionShowOnlyUnreadItems->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); m_ui->m_actionShowOnlyUnreadMessages->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-unread"))); m_ui->m_actionExpandCollapseItem->setIcon(icon_theme_factory->fromTheme(QSL("format-indent-more"))); + m_ui->m_actionExpandCollapseItemRecursively->setIcon(icon_theme_factory->fromTheme(QSL("format-indent-more"))); m_ui->m_actionRestoreSelectedMessages->setIcon(icon_theme_factory->fromTheme(QSL("view-refresh"))); m_ui->m_actionRestoreAllRecycleBins->setIcon(icon_theme_factory->fromTheme(QSL("view-refresh"))); m_ui->m_actionEmptyAllRecycleBins->setIcon(icon_theme_factory->fromTheme(QSL("edit-clear"))); @@ -741,7 +744,17 @@ void FormMain::createConnections() { connect(m_ui->m_actionMarkSelectedItemsAsRead, &QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::markSelectedItemRead); connect(m_ui->m_actionExpandCollapseItem, - &QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::expandCollapseCurrentItem); + &QAction::triggered, + tabWidget()->feedMessageViewer()->feedsView(), + [this]() { + tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(false); + }); + connect(m_ui->m_actionExpandCollapseItemRecursively, + &QAction::triggered, + tabWidget()->feedMessageViewer()->feedsView(), + [this]() { + tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(true); + }); connect(m_ui->m_actionMarkSelectedItemsAsUnread, &QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::markSelectedItemUnread); connect(m_ui->m_actionClearSelectedItems, diff --git a/src/librssguard/gui/dialogs/formmain.ui b/src/librssguard/gui/dialogs/formmain.ui index 43edc1194..a256b44c1 100755 --- a/src/librssguard/gui/dialogs/formmain.ui +++ b/src/librssguard/gui/dialogs/formmain.ui @@ -120,6 +120,7 @@ + @@ -805,6 +806,11 @@ Message viewer toolbars + + + Expand/collapse selected item &recursively + + diff --git a/src/librssguard/gui/feedsview.cpp b/src/librssguard/gui/feedsview.cpp index 6e245f8a7..3a76164d1 100755 --- a/src/librssguard/gui/feedsview.cpp +++ b/src/librssguard/gui/feedsview.cpp @@ -191,7 +191,7 @@ void FeedsView::addCategoryIntoSelectedAccount() { } } -void FeedsView::expandCollapseCurrentItem() { +void FeedsView::expandCollapseCurrentItem(bool recursive) { if (selectionModel()->selectedRows().size() == 1) { QModelIndex index = selectionModel()->selectedRows().at(0); @@ -200,7 +200,32 @@ void FeedsView::expandCollapseCurrentItem() { index = index.parent(); } - isExpanded(index) ? collapse(index) : expand(index); + if (recursive) { + QList to_process = { index }; + bool expa = !isExpanded(index); + + while (!to_process.isEmpty()) { + auto idx = to_process.takeFirst(); + + if (idx.isValid()) { + setExpanded(idx, expa); + + for (int i = 0; i < m_proxyModel->rowCount(idx); i++) { + auto new_idx = m_proxyModel->index(i, 0, idx); + + if (new_idx.isValid()) { + to_process << new_idx; + } + } + } + else { + break; + } + } + } + else { + isExpanded(index) ? collapse(index) : expand(index); + } } } @@ -460,14 +485,15 @@ QMenu* FeedsView::initializeContextMenuService(RootItem* clicked_item) { QList specific_actions = clicked_item->contextMenuFeedsList(); - 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 << - qApp->mainForm()->m_ui->m_actionDeleteSelectedItem); + m_contextMenuService->addActions({ 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_actionExpandCollapseItem, + qApp->mainForm()->m_ui->m_actionExpandCollapseItemRecursively, + qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsRead, + qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsUnread, + qApp->mainForm()->m_ui->m_actionDeleteSelectedItem }); auto cat_add = clicked_item->getParentServiceRoot()->supportsCategoryAdding(); auto feed_add = clicked_item->getParentServiceRoot()->supportsFeedAdding(); @@ -545,14 +571,15 @@ QMenu* FeedsView::initializeContextMenuCategories(RootItem* clicked_item) { QList specific_actions = clicked_item->contextMenuFeedsList(); - 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 << - qApp->mainForm()->m_ui->m_actionDeleteSelectedItem); + m_contextMenuCategories->addActions({ 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_actionExpandCollapseItem, + qApp->mainForm()->m_ui->m_actionExpandCollapseItemRecursively, + qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsRead, + qApp->mainForm()->m_ui->m_actionMarkSelectedItemsAsUnread, + qApp->mainForm()->m_ui->m_actionDeleteSelectedItem }); auto cat_add = clicked_item->getParentServiceRoot()->supportsCategoryAdding(); auto feed_add = clicked_item->getParentServiceRoot()->supportsFeedAdding(); diff --git a/src/librssguard/gui/feedsview.h b/src/librssguard/gui/feedsview.h index 2bd7c0ab3..debb5a6d0 100755 --- a/src/librssguard/gui/feedsview.h +++ b/src/librssguard/gui/feedsview.h @@ -45,7 +45,7 @@ class RSSGUARD_DLLSPEC FeedsView : public QTreeView { void addFeedIntoSelectedAccount(); void addCategoryIntoSelectedAccount(); - void expandCollapseCurrentItem(); + void expandCollapseCurrentItem(bool recursive); // Feed updating. void updateSelectedItems();