try to fix #697 upstream
This commit is contained in:
parent
3ccce27dd5
commit
ac1b88b481
6 changed files with 471 additions and 317 deletions
|
@ -53,7 +53,8 @@
|
||||||
|
|
||||||
FormMain::FormMain(QWidget* parent, Qt::WindowFlags f)
|
FormMain::FormMain(QWidget* parent, Qt::WindowFlags f)
|
||||||
: QMainWindow(parent, f), m_ui(new Ui::FormMain), m_trayMenu(nullptr), m_statusBar(nullptr) {
|
: QMainWindow(parent, f), m_ui(new Ui::FormMain), m_trayMenu(nullptr), m_statusBar(nullptr) {
|
||||||
qDebugNN << LOGSEC_GUI << "Creating main application form in thread:" << QUOTE_W_SPACE_DOT(QThread::currentThreadId());
|
qDebugNN << LOGSEC_GUI
|
||||||
|
<< "Creating main application form in thread:" << QUOTE_W_SPACE_DOT(QThread::currentThreadId());
|
||||||
|
|
||||||
m_ui->setupUi(this);
|
m_ui->setupUi(this);
|
||||||
qApp->setMainForm(this);
|
qApp->setMainForm(this);
|
||||||
|
@ -148,10 +149,10 @@ void FormMain::showDbCleanupAssistant() {
|
||||||
qApp->feedReader()->feedsModel()->reloadCountsOfWholeModel();
|
qApp->feedReader()->feedsModel()->reloadCountsOfWholeModel();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
qApp->showGuiMessage(Notification::Event::GeneralEvent, {
|
qApp->showGuiMessage(Notification::Event::GeneralEvent,
|
||||||
tr("Cannot cleanup database"),
|
{tr("Cannot cleanup database"),
|
||||||
tr("Cannot cleanup database, because another critical action is running."),
|
tr("Cannot cleanup database, because another critical action is running."),
|
||||||
QSystemTrayIcon::MessageIcon::Warning });
|
QSystemTrayIcon::MessageIcon::Warning});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,25 +299,21 @@ void FormMain::updateAddItemMenu() {
|
||||||
QList<QAction*> specific_root_actions = activated_root->addItemMenu();
|
QList<QAction*> specific_root_actions = activated_root->addItemMenu();
|
||||||
|
|
||||||
if (activated_root->supportsCategoryAdding()) {
|
if (activated_root->supportsCategoryAdding()) {
|
||||||
QAction* action_new_category = new QAction(qApp->icons()->fromTheme(QSL("folder")),
|
QAction* action_new_category =
|
||||||
tr("Add new category"),
|
new QAction(qApp->icons()->fromTheme(QSL("folder")), tr("Add new category"), m_ui->m_menuAddItem);
|
||||||
m_ui->m_menuAddItem);
|
|
||||||
|
|
||||||
root_menu->addAction(action_new_category);
|
root_menu->addAction(action_new_category);
|
||||||
connect(action_new_category, &QAction::triggered,
|
connect(action_new_category, &QAction::triggered, activated_root, [activated_root]() {
|
||||||
activated_root, [activated_root]() {
|
|
||||||
activated_root->addNewCategory(activated_root);
|
activated_root->addNewCategory(activated_root);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activated_root->supportsFeedAdding()) {
|
if (activated_root->supportsFeedAdding()) {
|
||||||
QAction* action_new_feed = new QAction(qApp->icons()->fromTheme(QSL("application-rss+xml")),
|
QAction* action_new_feed =
|
||||||
tr("Add new feed"),
|
new QAction(qApp->icons()->fromTheme(QSL("application-rss+xml")), tr("Add new feed"), m_ui->m_menuAddItem);
|
||||||
m_ui->m_menuAddItem);
|
|
||||||
|
|
||||||
root_menu->addAction(action_new_feed);
|
root_menu->addAction(action_new_feed);
|
||||||
connect(action_new_feed, &QAction::triggered,
|
connect(action_new_feed, &QAction::triggered, activated_root, [activated_root]() {
|
||||||
activated_root, [activated_root]() {
|
|
||||||
activated_root->addNewFeed(activated_root);
|
activated_root->addNewFeed(activated_root);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -356,17 +353,15 @@ void FormMain::updateRecycleBinMenu() {
|
||||||
QList<QAction*> context_menu;
|
QList<QAction*> context_menu;
|
||||||
|
|
||||||
if (bin == nullptr) {
|
if (bin == nullptr) {
|
||||||
QAction* no_action = new QAction(qApp->icons()->fromTheme(QSL("dialog-error")),
|
QAction* no_action =
|
||||||
tr("No recycle bin"),
|
new QAction(qApp->icons()->fromTheme(QSL("dialog-error")), tr("No recycle bin"), m_ui->m_menuRecycleBin);
|
||||||
m_ui->m_menuRecycleBin);
|
|
||||||
|
|
||||||
no_action->setEnabled(false);
|
no_action->setEnabled(false);
|
||||||
root_menu->addAction(no_action);
|
root_menu->addAction(no_action);
|
||||||
}
|
}
|
||||||
else if ((context_menu = bin->contextMenuFeedsList()).isEmpty()) {
|
else if ((context_menu = bin->contextMenuFeedsList()).isEmpty()) {
|
||||||
QAction* no_action = new QAction(qApp->icons()->fromTheme(QSL("dialog-error")),
|
QAction* no_action =
|
||||||
tr("No actions possible"),
|
new QAction(qApp->icons()->fromTheme(QSL("dialog-error")), tr("No actions possible"), m_ui->m_menuRecycleBin);
|
||||||
m_ui->m_menuRecycleBin);
|
|
||||||
|
|
||||||
no_action->setEnabled(false);
|
no_action->setEnabled(false);
|
||||||
root_menu->addAction(no_action);
|
root_menu->addAction(no_action);
|
||||||
|
@ -399,9 +394,8 @@ void FormMain::updateAccountsMenu() {
|
||||||
QList<QAction*> root_actions = activated_root->serviceMenu();
|
QList<QAction*> root_actions = activated_root->serviceMenu();
|
||||||
|
|
||||||
if (root_actions.isEmpty()) {
|
if (root_actions.isEmpty()) {
|
||||||
QAction* no_action = new QAction(qApp->icons()->fromTheme(QSL("dialog-error")),
|
QAction* no_action =
|
||||||
tr("No possible actions"),
|
new QAction(qApp->icons()->fromTheme(QSL("dialog-error")), tr("No possible actions"), m_ui->m_menuAccounts);
|
||||||
m_ui->m_menuAccounts);
|
|
||||||
|
|
||||||
no_action->setEnabled(false);
|
no_action->setEnabled(false);
|
||||||
root_menu->addAction(no_action);
|
root_menu->addAction(no_action);
|
||||||
|
@ -440,15 +434,17 @@ void FormMain::onFeedUpdatesStarted() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormMain::onFeedUpdatesProgress(const Feed* feed, int current, int total) {
|
void FormMain::onFeedUpdatesProgress(const Feed* feed, int current, int total) {
|
||||||
statusBar()->showProgressFeeds(int((current * 100.0) / total),
|
statusBar()->showProgressFeeds(int((current * 100.0) / total), feed->sanitizedTitle());
|
||||||
feed->sanitizedTitle());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormMain::updateMessageButtonsAvailability() {
|
void FormMain::updateMessageButtonsAvailability() {
|
||||||
const bool one_message_selected = tabWidget()->feedMessageViewer()->messagesView()->selectionModel()->selectedRows().size() == 1;
|
const bool one_message_selected =
|
||||||
const bool atleast_one_message_selected = !tabWidget()->feedMessageViewer()->messagesView()->selectionModel()->selectedRows().isEmpty();
|
tabWidget()->feedMessageViewer()->messagesView()->selectionModel()->selectedRows().size() == 1;
|
||||||
const bool bin_loaded = tabWidget()->feedMessageViewer()->messagesView()->sourceModel()->loadedItem() != nullptr
|
const bool atleast_one_message_selected =
|
||||||
&& tabWidget()->feedMessageViewer()->messagesView()->sourceModel()->loadedItem()->kind() == RootItem::Kind::Bin;
|
!tabWidget()->feedMessageViewer()->messagesView()->selectionModel()->selectedRows().isEmpty();
|
||||||
|
const bool bin_loaded =
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView()->sourceModel()->loadedItem() != nullptr &&
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView()->sourceModel()->loadedItem()->kind() == RootItem::Kind::Bin;
|
||||||
|
|
||||||
m_ui->m_actionDeleteSelectedMessages->setEnabled(atleast_one_message_selected);
|
m_ui->m_actionDeleteSelectedMessages->setEnabled(atleast_one_message_selected);
|
||||||
m_ui->m_actionRestoreSelectedMessages->setEnabled(atleast_one_message_selected && bin_loaded);
|
m_ui->m_actionRestoreSelectedMessages->setEnabled(atleast_one_message_selected && bin_loaded);
|
||||||
|
@ -483,7 +479,8 @@ void FormMain::updateFeedButtonsAvailability() {
|
||||||
m_ui->m_actionMarkSelectedItemsAsUnread->setEnabled(anything_selected);
|
m_ui->m_actionMarkSelectedItemsAsUnread->setEnabled(anything_selected);
|
||||||
m_ui->m_actionUpdateAllItems->setEnabled(!critical_action_running);
|
m_ui->m_actionUpdateAllItems->setEnabled(!critical_action_running);
|
||||||
m_ui->m_actionUpdateSelectedItemsWithCustomTimers->setEnabled(!critical_action_running);
|
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_actionUpdateSelectedItems->setEnabled(!critical_action_running &&
|
||||||
|
(feed_selected || category_selected || service_selected));
|
||||||
m_ui->m_actionViewSelectedItemsNewspaperMode->setEnabled(anything_selected);
|
m_ui->m_actionViewSelectedItemsNewspaperMode->setEnabled(anything_selected);
|
||||||
m_ui->m_actionExpandCollapseItem->setEnabled(category_selected || service_selected);
|
m_ui->m_actionExpandCollapseItem->setEnabled(category_selected || service_selected);
|
||||||
m_ui->m_actionExpandCollapseItemRecursively->setEnabled(category_selected || service_selected);
|
m_ui->m_actionExpandCollapseItemRecursively->setEnabled(category_selected || service_selected);
|
||||||
|
@ -495,10 +492,11 @@ void FormMain::updateFeedButtonsAvailability() {
|
||||||
m_ui->m_menuAccounts->setEnabled(!critical_action_running);
|
m_ui->m_menuAccounts->setEnabled(!critical_action_running);
|
||||||
m_ui->m_menuRecycleBin->setEnabled(!critical_action_running);
|
m_ui->m_menuRecycleBin->setEnabled(!critical_action_running);
|
||||||
|
|
||||||
m_ui->m_actionFeedMoveUp->setEnabled(manual_feed_sort &&(feed_selected || category_selected || service_selected));
|
m_ui->m_actionFeedMoveUp->setEnabled(manual_feed_sort && (feed_selected || category_selected || service_selected));
|
||||||
m_ui->m_actionFeedMoveDown->setEnabled(manual_feed_sort &&(feed_selected || category_selected || service_selected));
|
m_ui->m_actionFeedMoveDown->setEnabled(manual_feed_sort && (feed_selected || category_selected || service_selected));
|
||||||
m_ui->m_actionFeedMoveTop->setEnabled(manual_feed_sort &&(feed_selected || category_selected || service_selected));
|
m_ui->m_actionFeedMoveTop->setEnabled(manual_feed_sort && (feed_selected || category_selected || service_selected));
|
||||||
m_ui->m_actionFeedMoveBottom->setEnabled(manual_feed_sort &&(feed_selected || category_selected || service_selected));
|
m_ui->m_actionFeedMoveBottom->setEnabled(manual_feed_sort &&
|
||||||
|
(feed_selected || category_selected || service_selected));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormMain::switchVisibility(bool force_hide) {
|
void FormMain::switchVisibility(bool force_hide) {
|
||||||
|
@ -506,10 +504,10 @@ void FormMain::switchVisibility(bool force_hide) {
|
||||||
if (SystemTrayIcon::isSystemTrayDesired() && SystemTrayIcon::isSystemTrayAreaAvailable()) {
|
if (SystemTrayIcon::isSystemTrayDesired() && SystemTrayIcon::isSystemTrayAreaAvailable()) {
|
||||||
|
|
||||||
if (QApplication::activeModalWidget() != nullptr) {
|
if (QApplication::activeModalWidget() != nullptr) {
|
||||||
qApp->showGuiMessage(Notification::Event::GeneralEvent, {
|
qApp->showGuiMessage(Notification::Event::GeneralEvent,
|
||||||
tr("Close dialogs"),
|
{tr("Close dialogs"),
|
||||||
tr("Close opened modal dialogs first."),
|
tr("Close opened modal dialogs first."),
|
||||||
QSystemTrayIcon::MessageIcon::Warning });
|
QSystemTrayIcon::MessageIcon::Warning});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hide();
|
hide();
|
||||||
|
@ -572,7 +570,8 @@ void FormMain::setupIcons() {
|
||||||
m_ui->m_actionStopRunningItemsUpdate->setIcon(icon_theme_factory->fromTheme(QSL("process-stop")));
|
m_ui->m_actionStopRunningItemsUpdate->setIcon(icon_theme_factory->fromTheme(QSL("process-stop")));
|
||||||
m_ui->m_actionUpdateAllItems->setIcon(icon_theme_factory->fromTheme(QSL("download"), QSL("browser-download")));
|
m_ui->m_actionUpdateAllItems->setIcon(icon_theme_factory->fromTheme(QSL("download"), QSL("browser-download")));
|
||||||
m_ui->m_actionUpdateSelectedItems->setIcon(icon_theme_factory->fromTheme(QSL("download"), QSL("browser-download")));
|
m_ui->m_actionUpdateSelectedItems->setIcon(icon_theme_factory->fromTheme(QSL("download"), QSL("browser-download")));
|
||||||
m_ui->m_actionUpdateSelectedItemsWithCustomTimers->setIcon(icon_theme_factory->fromTheme(QSL("download"), QSL("browser-download")));
|
m_ui->m_actionUpdateSelectedItemsWithCustomTimers->setIcon(icon_theme_factory->fromTheme(QSL("download"),
|
||||||
|
QSL("browser-download")));
|
||||||
m_ui->m_actionClearSelectedItems->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-junk")));
|
m_ui->m_actionClearSelectedItems->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-junk")));
|
||||||
m_ui->m_actionClearAllItems->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-junk")));
|
m_ui->m_actionClearAllItems->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-junk")));
|
||||||
m_ui->m_actionDeleteSelectedItem->setIcon(icon_theme_factory->fromTheme(QSL("list-remove")));
|
m_ui->m_actionDeleteSelectedItem->setIcon(icon_theme_factory->fromTheme(QSL("list-remove")));
|
||||||
|
@ -654,7 +653,8 @@ void FormMain::loadSize() {
|
||||||
qApp->processEvents();
|
qApp->processEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_ui->m_actionMessagePreviewEnabled->setChecked(settings->value(GROUP(Messages), SETTING(Messages::EnableMessagePreview)).toBool());
|
m_ui->m_actionMessagePreviewEnabled
|
||||||
|
->setChecked(settings->value(GROUP(Messages), SETTING(Messages::EnableMessagePreview)).toBool());
|
||||||
|
|
||||||
// If user exited the application while in fullsreen mode,
|
// If user exited the application while in fullsreen mode,
|
||||||
// then re-enable it now.
|
// then re-enable it now.
|
||||||
|
@ -669,20 +669,20 @@ void FormMain::loadSize() {
|
||||||
m_ui->m_tabWidget->feedMessageViewer()->loadSize();
|
m_ui->m_tabWidget->feedMessageViewer()->loadSize();
|
||||||
m_ui->m_actionSwitchToolBars->setChecked(settings->value(GROUP(GUI), SETTING(GUI::ToolbarsVisible)).toBool());
|
m_ui->m_actionSwitchToolBars->setChecked(settings->value(GROUP(GUI), SETTING(GUI::ToolbarsVisible)).toBool());
|
||||||
m_ui->m_actionSwitchListHeaders->setChecked(settings->value(GROUP(GUI), SETTING(GUI::ListHeadersVisible)).toBool());
|
m_ui->m_actionSwitchListHeaders->setChecked(settings->value(GROUP(GUI), SETTING(GUI::ListHeadersVisible)).toBool());
|
||||||
m_ui->m_actionSwitchMessageViewerToolbars->setChecked(settings->value(GROUP(GUI), SETTING(GUI::MessageViewerToolbarsVisible)).toBool());
|
m_ui->m_actionSwitchMessageViewerToolbars
|
||||||
|
->setChecked(settings->value(GROUP(GUI), SETTING(GUI::MessageViewerToolbarsVisible)).toBool());
|
||||||
m_ui->m_actionSwitchStatusBar->setChecked(settings->value(GROUP(GUI), SETTING(GUI::StatusBarVisible)).toBool());
|
m_ui->m_actionSwitchStatusBar->setChecked(settings->value(GROUP(GUI), SETTING(GUI::StatusBarVisible)).toBool());
|
||||||
|
|
||||||
// Other startup GUI-related settings.
|
// Other startup GUI-related settings.
|
||||||
m_ui->m_actionSortFeedsAlphabetically->setChecked(settings->value(GROUP(Feeds),
|
m_ui->m_actionSortFeedsAlphabetically
|
||||||
SETTING(Feeds::SortAlphabetically)).toBool());
|
->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::SortAlphabetically)).toBool());
|
||||||
m_ui->m_actionShowOnlyUnreadItems->setChecked(settings->value(GROUP(Feeds),
|
m_ui->m_actionShowOnlyUnreadItems
|
||||||
SETTING(Feeds::ShowOnlyUnreadFeeds)).toBool());
|
->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::ShowOnlyUnreadFeeds)).toBool());
|
||||||
m_ui->m_actionShowTreeBranches->setChecked(settings->value(GROUP(Feeds),
|
m_ui->m_actionShowTreeBranches->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::ShowTreeBranches)).toBool());
|
||||||
SETTING(Feeds::ShowTreeBranches)).toBool());
|
m_ui->m_actionAutoExpandItemsWhenSelected
|
||||||
m_ui->m_actionAutoExpandItemsWhenSelected->setChecked(settings->value(GROUP(Feeds),
|
->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::AutoExpandOnSelection)).toBool());
|
||||||
SETTING(Feeds::AutoExpandOnSelection)).toBool());
|
m_ui->m_actionAlternateColorsInLists
|
||||||
m_ui->m_actionAlternateColorsInLists->setChecked(settings->value(GROUP(GUI),
|
->setChecked(settings->value(GROUP(GUI), SETTING(GUI::AlternateRowColorsInLists)).toBool());
|
||||||
SETTING(GUI::AlternateRowColorsInLists)).toBool());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormMain::saveSize() {
|
void FormMain::saveSize() {
|
||||||
|
@ -734,8 +734,10 @@ void FormMain::createConnections() {
|
||||||
connect(m_ui->m_actionRestart, &QAction::triggered, qApp, &Application::restart);
|
connect(m_ui->m_actionRestart, &QAction::triggered, qApp, &Application::restart);
|
||||||
|
|
||||||
// Menu "View" connections.
|
// Menu "View" connections.
|
||||||
connect(m_ui->m_actionSwitchFeedsList, &QAction::toggled,
|
connect(m_ui->m_actionSwitchFeedsList,
|
||||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::switchFeedComponentVisibility);
|
&QAction::toggled,
|
||||||
|
tabWidget()->feedMessageViewer(),
|
||||||
|
&FeedMessageViewer::switchFeedComponentVisibility);
|
||||||
connect(m_ui->m_actionFullscreen, &QAction::toggled, this, &FormMain::switchFullscreenMode);
|
connect(m_ui->m_actionFullscreen, &QAction::toggled, this, &FormMain::switchFullscreenMode);
|
||||||
connect(m_ui->m_actionSwitchMainMenu, &QAction::toggled, m_ui->m_menuBar, &QMenuBar::setVisible);
|
connect(m_ui->m_actionSwitchMainMenu, &QAction::toggled, m_ui->m_menuBar, &QMenuBar::setVisible);
|
||||||
connect(m_ui->m_actionSwitchMainWindow, &QAction::triggered, this, &FormMain::switchVisibility);
|
connect(m_ui->m_actionSwitchMainWindow, &QAction::triggered, this, &FormMain::switchVisibility);
|
||||||
|
@ -765,131 +767,228 @@ void FormMain::createConnections() {
|
||||||
// Tab widget connections.
|
// Tab widget connections.
|
||||||
connect(m_ui->m_actionTabsNext, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::gotoNextTab);
|
connect(m_ui->m_actionTabsNext, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::gotoNextTab);
|
||||||
connect(m_ui->m_actionTabsPrevious, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::gotoPreviousTab);
|
connect(m_ui->m_actionTabsPrevious, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::gotoPreviousTab);
|
||||||
connect(m_ui->m_actionTabsCloseAllExceptCurrent, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::closeAllTabsExceptCurrent);
|
connect(m_ui->m_actionTabsCloseAllExceptCurrent,
|
||||||
|
&QAction::triggered,
|
||||||
|
m_ui->m_tabWidget,
|
||||||
|
&TabWidget::closeAllTabsExceptCurrent);
|
||||||
connect(m_ui->m_actionTabsCloseAll, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::closeAllTabs);
|
connect(m_ui->m_actionTabsCloseAll, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::closeAllTabs);
|
||||||
connect(m_ui->m_actionTabsCloseCurrent, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::closeCurrentTab);
|
connect(m_ui->m_actionTabsCloseCurrent, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::closeCurrentTab);
|
||||||
connect(m_ui->m_actionTabNewWebBrowser, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::addEmptyBrowser);
|
connect(m_ui->m_actionTabNewWebBrowser, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::addEmptyBrowser);
|
||||||
connect(tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::itemSelected, this, &FormMain::updateFeedButtonsAvailability);
|
connect(tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::itemSelected,
|
||||||
|
this,
|
||||||
|
&FormMain::updateFeedButtonsAvailability);
|
||||||
connect(qApp->feedUpdateLock(), &Mutex::locked, this, &FormMain::updateFeedButtonsAvailability);
|
connect(qApp->feedUpdateLock(), &Mutex::locked, this, &FormMain::updateFeedButtonsAvailability);
|
||||||
connect(qApp->feedUpdateLock(), &Mutex::unlocked, this, &FormMain::updateFeedButtonsAvailability);
|
connect(qApp->feedUpdateLock(), &Mutex::unlocked, this, &FormMain::updateFeedButtonsAvailability);
|
||||||
connect(tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::currentMessageRemoved,
|
connect(tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
this, &FormMain::updateMessageButtonsAvailability);
|
&MessagesView::currentMessageRemoved,
|
||||||
connect(tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::currentMessageChanged,
|
this,
|
||||||
this, &FormMain::updateMessageButtonsAvailability);
|
&FormMain::updateMessageButtonsAvailability);
|
||||||
|
connect(tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::currentMessageChanged,
|
||||||
|
this,
|
||||||
|
&FormMain::updateMessageButtonsAvailability);
|
||||||
connect(tabWidget(), &TabWidget::currentChanged, this, &FormMain::updateTabsButtonsAvailability);
|
connect(tabWidget(), &TabWidget::currentChanged, this, &FormMain::updateTabsButtonsAvailability);
|
||||||
connect(qApp->feedReader(), &FeedReader::feedUpdatesStarted, this, &FormMain::onFeedUpdatesStarted);
|
connect(qApp->feedReader(), &FeedReader::feedUpdatesStarted, this, &FormMain::onFeedUpdatesStarted);
|
||||||
connect(qApp->feedReader(), &FeedReader::feedUpdatesProgress, this, &FormMain::onFeedUpdatesProgress);
|
connect(qApp->feedReader(), &FeedReader::feedUpdatesProgress, this, &FormMain::onFeedUpdatesProgress);
|
||||||
connect(qApp->feedReader(), &FeedReader::feedUpdatesFinished, this, &FormMain::onFeedUpdatesFinished);
|
connect(qApp->feedReader(), &FeedReader::feedUpdatesFinished, this, &FormMain::onFeedUpdatesFinished);
|
||||||
|
|
||||||
// Toolbar forwardings.
|
// Toolbar forwardings.
|
||||||
connect(m_ui->m_actionAddFeedIntoSelectedItem, &QAction::triggered,
|
connect(m_ui->m_actionAddFeedIntoSelectedItem,
|
||||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::addFeedIntoSelectedAccount);
|
&QAction::triggered,
|
||||||
connect(m_ui->m_actionAddCategoryIntoSelectedItem, &QAction::triggered,
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::addCategoryIntoSelectedAccount);
|
&FeedsView::addFeedIntoSelectedAccount);
|
||||||
|
connect(m_ui->m_actionAddCategoryIntoSelectedItem,
|
||||||
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::addCategoryIntoSelectedAccount);
|
||||||
connect(m_ui->m_actionSwitchImportanceOfSelectedMessages,
|
connect(m_ui->m_actionSwitchImportanceOfSelectedMessages,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::switchSelectedMessagesImportance);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::switchSelectedMessagesImportance);
|
||||||
connect(m_ui->m_actionDeleteSelectedMessages,
|
connect(m_ui->m_actionDeleteSelectedMessages,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::deleteSelectedMessages);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::deleteSelectedMessages);
|
||||||
connect(m_ui->m_actionMarkSelectedMessagesAsRead,
|
connect(m_ui->m_actionMarkSelectedMessagesAsRead,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::markSelectedMessagesRead);
|
&QAction::triggered,
|
||||||
connect(m_ui->m_actionMarkSelectedMessagesAsUnread, &QAction::triggered,
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::markSelectedMessagesUnread);
|
&MessagesView::markSelectedMessagesRead);
|
||||||
|
connect(m_ui->m_actionMarkSelectedMessagesAsUnread,
|
||||||
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::markSelectedMessagesUnread);
|
||||||
connect(m_ui->m_actionOpenSelectedSourceArticlesExternally,
|
connect(m_ui->m_actionOpenSelectedSourceArticlesExternally,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::openSelectedSourceMessagesExternally);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::openSelectedSourceMessagesExternally);
|
||||||
connect(m_ui->m_actionOpenSelectedMessagesInternally,
|
connect(m_ui->m_actionOpenSelectedMessagesInternally,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::openSelectedMessagesInternally);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::openSelectedMessagesInternally);
|
||||||
|
|
||||||
connect(m_ui->m_actionOpenSelectedMessagesInternallyNoTab,
|
connect(m_ui->m_actionOpenSelectedMessagesInternallyNoTab,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::openSelectedMessageUrl);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::openSelectedMessageUrl);
|
||||||
|
|
||||||
connect(m_ui->m_actionSendMessageViaEmail,
|
connect(m_ui->m_actionSendMessageViaEmail,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::sendSelectedMessageViaEmail);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::sendSelectedMessageViaEmail);
|
||||||
connect(m_ui->m_actionMarkAllItemsRead,
|
connect(m_ui->m_actionMarkAllItemsRead,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::markAllItemsRead);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::markAllItemsRead);
|
||||||
connect(m_ui->m_actionMarkSelectedItemsAsRead,
|
connect(m_ui->m_actionMarkSelectedItemsAsRead,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::markSelectedItemRead);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::markSelectedItemRead);
|
||||||
connect(m_ui->m_actionExpandCollapseItem,
|
connect(m_ui->m_actionExpandCollapseItem,
|
||||||
&QAction::triggered,
|
&QAction::triggered,
|
||||||
tabWidget()->feedMessageViewer()->feedsView(),
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
[this]() {
|
[this]() {
|
||||||
tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(false);
|
tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(false);
|
||||||
});
|
});
|
||||||
connect(m_ui->m_actionExpandCollapseItemRecursively,
|
connect(m_ui->m_actionExpandCollapseItemRecursively,
|
||||||
&QAction::triggered,
|
&QAction::triggered,
|
||||||
tabWidget()->feedMessageViewer()->feedsView(),
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
[this]() {
|
[this]() {
|
||||||
tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(true);
|
tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(true);
|
||||||
});
|
});
|
||||||
connect(m_ui->m_actionMarkSelectedItemsAsUnread,
|
connect(m_ui->m_actionMarkSelectedItemsAsUnread,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::markSelectedItemUnread);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::markSelectedItemUnread);
|
||||||
connect(m_ui->m_actionClearSelectedItems,
|
connect(m_ui->m_actionClearSelectedItems,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::clearSelectedFeeds);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::clearSelectedFeeds);
|
||||||
connect(m_ui->m_actionClearAllItems,
|
connect(m_ui->m_actionClearAllItems,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::clearAllFeeds);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::clearAllFeeds);
|
||||||
connect(m_ui->m_actionUpdateSelectedItems,
|
connect(m_ui->m_actionUpdateSelectedItems,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::updateSelectedItems);
|
&QAction::triggered,
|
||||||
connect(m_ui->m_actionUpdateAllItems,
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
&QAction::triggered, qApp->feedReader(), &FeedReader::updateAllFeeds);
|
&FeedsView::updateSelectedItems);
|
||||||
|
connect(m_ui->m_actionUpdateAllItems, &QAction::triggered, qApp->feedReader(), &FeedReader::updateAllFeeds);
|
||||||
connect(m_ui->m_actionUpdateSelectedItemsWithCustomTimers,
|
connect(m_ui->m_actionUpdateSelectedItemsWithCustomTimers,
|
||||||
&QAction::triggered, qApp->feedReader(), &FeedReader::updateManuallyIntervaledFeeds);
|
&QAction::triggered,
|
||||||
|
qApp->feedReader(),
|
||||||
|
&FeedReader::updateManuallyIntervaledFeeds);
|
||||||
connect(m_ui->m_actionStopRunningItemsUpdate,
|
connect(m_ui->m_actionStopRunningItemsUpdate,
|
||||||
&QAction::triggered, qApp->feedReader(), &FeedReader::stopRunningFeedUpdate);
|
&QAction::triggered,
|
||||||
|
qApp->feedReader(),
|
||||||
|
&FeedReader::stopRunningFeedUpdate);
|
||||||
connect(m_ui->m_actionCopyUrlSelectedFeed,
|
connect(m_ui->m_actionCopyUrlSelectedFeed,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::copyUrlOfSelectedFeeds);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::copyUrlOfSelectedFeeds);
|
||||||
connect(m_ui->m_actionCopyUrlSelectedArticles,
|
connect(m_ui->m_actionCopyUrlSelectedArticles,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::copyUrlOfSelectedArticles);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::copyUrlOfSelectedArticles);
|
||||||
connect(m_ui->m_actionEditSelectedItem,
|
connect(m_ui->m_actionEditSelectedItem,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::editSelectedItem);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::editSelectedItem);
|
||||||
connect(m_ui->m_actionViewSelectedItemsNewspaperMode,
|
connect(m_ui->m_actionViewSelectedItemsNewspaperMode,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::openSelectedItemsInNewspaperMode);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::openSelectedItemsInNewspaperMode);
|
||||||
connect(m_ui->m_actionDeleteSelectedItem,
|
connect(m_ui->m_actionDeleteSelectedItem,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::deleteSelectedItem);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::deleteSelectedItem);
|
||||||
connect(m_ui->m_actionSelectNextItem,
|
connect(m_ui->m_actionSelectNextItem,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::selectNextItem);
|
&QAction::triggered,
|
||||||
connect(m_ui->m_actionSwitchToolBars, &QAction::toggled,
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::setToolBarsEnabled);
|
&FeedsView::selectNextItem);
|
||||||
connect(m_ui->m_actionSwitchListHeaders, &QAction::toggled,
|
connect(m_ui->m_actionSwitchToolBars,
|
||||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::setListHeadersEnabled);
|
&QAction::toggled,
|
||||||
connect(m_ui->m_actionSwitchMessageViewerToolbars, &QAction::toggled,
|
tabWidget()->feedMessageViewer(),
|
||||||
tabWidget()->feedMessageViewer()->messagesBrowser(), &MessagePreviewer::setToolbarsVisible);
|
&FeedMessageViewer::setToolBarsEnabled);
|
||||||
|
connect(m_ui->m_actionSwitchListHeaders,
|
||||||
|
&QAction::toggled,
|
||||||
|
tabWidget()->feedMessageViewer(),
|
||||||
|
&FeedMessageViewer::setListHeadersEnabled);
|
||||||
|
connect(m_ui->m_actionSwitchMessageViewerToolbars,
|
||||||
|
&QAction::toggled,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesBrowser(),
|
||||||
|
&MessagePreviewer::setToolbarsVisible);
|
||||||
connect(m_ui->m_actionSelectPreviousItem,
|
connect(m_ui->m_actionSelectPreviousItem,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::selectPreviousItem);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::selectPreviousItem);
|
||||||
connect(m_ui->m_actionSelectNextMessage,
|
connect(m_ui->m_actionSelectNextMessage,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::selectNextItem);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::selectNextItem);
|
||||||
connect(m_ui->m_actionSelectNextUnreadMessage,
|
connect(m_ui->m_actionSelectNextUnreadMessage,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::selectNextUnreadItem);
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::selectNextUnreadItem);
|
||||||
connect(m_ui->m_actionSelectPreviousMessage,
|
connect(m_ui->m_actionSelectPreviousMessage,
|
||||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::selectPreviousItem);
|
&QAction::triggered,
|
||||||
connect(m_ui->m_actionSwitchMessageListOrientation, &QAction::triggered,
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::switchMessageSplitterOrientation);
|
&MessagesView::selectPreviousItem);
|
||||||
connect(m_ui->m_actionShowOnlyUnreadItems, &QAction::toggled,
|
connect(m_ui->m_actionSwitchMessageListOrientation,
|
||||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::toggleShowOnlyUnreadFeeds);
|
&QAction::triggered,
|
||||||
connect(m_ui->m_actionSortFeedsAlphabetically, &QAction::toggled,
|
tabWidget()->feedMessageViewer(),
|
||||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::toggleFeedSortingMode);
|
&FeedMessageViewer::switchMessageSplitterOrientation);
|
||||||
connect(m_ui->m_actionShowTreeBranches, &QAction::toggled,
|
connect(m_ui->m_actionShowOnlyUnreadItems,
|
||||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::toggleShowFeedTreeBranches);
|
&QAction::toggled,
|
||||||
connect(m_ui->m_actionAutoExpandItemsWhenSelected, &QAction::toggled,
|
tabWidget()->feedMessageViewer(),
|
||||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::toggleItemsAutoExpandingOnSelection);
|
&FeedMessageViewer::toggleShowOnlyUnreadFeeds);
|
||||||
connect(m_ui->m_actionAlternateColorsInLists, &QAction::toggled,
|
connect(m_ui->m_actionSortFeedsAlphabetically,
|
||||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::alternateRowColorsInLists);
|
&QAction::toggled,
|
||||||
connect(m_ui->m_actionRestoreSelectedMessages, &QAction::triggered,
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::restoreSelectedMessages);
|
&FeedsView::toggleFeedSortingMode);
|
||||||
connect(m_ui->m_actionRestoreAllRecycleBins, &QAction::triggered,
|
connect(m_ui->m_actionShowTreeBranches,
|
||||||
tabWidget()->feedMessageViewer()->feedsView()->sourceModel(), &FeedsModel::restoreAllBins);
|
&QAction::toggled,
|
||||||
connect(m_ui->m_actionEmptyAllRecycleBins, &QAction::triggered,
|
tabWidget()->feedMessageViewer(),
|
||||||
tabWidget()->feedMessageViewer()->feedsView()->sourceModel(), &FeedsModel::emptyAllBins);
|
&FeedMessageViewer::toggleShowFeedTreeBranches);
|
||||||
|
connect(m_ui->m_actionAutoExpandItemsWhenSelected,
|
||||||
|
&QAction::toggled,
|
||||||
|
tabWidget()->feedMessageViewer(),
|
||||||
|
&FeedMessageViewer::toggleItemsAutoExpandingOnSelection);
|
||||||
|
connect(m_ui->m_actionAlternateColorsInLists,
|
||||||
|
&QAction::toggled,
|
||||||
|
tabWidget()->feedMessageViewer(),
|
||||||
|
&FeedMessageViewer::alternateRowColorsInLists);
|
||||||
|
connect(m_ui->m_actionRestoreSelectedMessages,
|
||||||
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->messagesView(),
|
||||||
|
&MessagesView::restoreSelectedMessages);
|
||||||
|
connect(m_ui->m_actionRestoreAllRecycleBins,
|
||||||
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView()->sourceModel(),
|
||||||
|
&FeedsModel::restoreAllBins);
|
||||||
|
connect(m_ui->m_actionEmptyAllRecycleBins,
|
||||||
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView()->sourceModel(),
|
||||||
|
&FeedsModel::emptyAllBins);
|
||||||
connect(m_ui->m_actionMessageFilters, &QAction::triggered, this, [this]() {
|
connect(m_ui->m_actionMessageFilters, &QAction::triggered, this, [this]() {
|
||||||
qApp->feedReader()->showMessageFiltersManager();
|
qApp->feedReader()->showMessageFiltersManager();
|
||||||
tabWidget()->feedMessageViewer()->messagesView()->reloadSelections();
|
tabWidget()->feedMessageViewer()->messagesView()->reloadSelections();
|
||||||
});
|
});
|
||||||
connect(m_ui->m_actionFeedMoveUp, &QAction::triggered,
|
connect(m_ui->m_actionFeedMoveUp,
|
||||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::moveSelectedItemUp);
|
&QAction::triggered,
|
||||||
connect(m_ui->m_actionFeedMoveDown, &QAction::triggered,
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::moveSelectedItemDown);
|
&FeedsView::moveSelectedItemUp);
|
||||||
connect(m_ui->m_actionFeedMoveTop, &QAction::triggered,
|
connect(m_ui->m_actionFeedMoveDown,
|
||||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::moveSelectedItemTop);
|
&QAction::triggered,
|
||||||
connect(m_ui->m_actionFeedMoveBottom, &QAction::triggered,
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::moveSelectedItemBottom);
|
&FeedsView::moveSelectedItemDown);
|
||||||
|
connect(m_ui->m_actionFeedMoveTop,
|
||||||
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::moveSelectedItemTop);
|
||||||
|
connect(m_ui->m_actionFeedMoveBottom,
|
||||||
|
&QAction::triggered,
|
||||||
|
tabWidget()->feedMessageViewer()->feedsView(),
|
||||||
|
&FeedsView::moveSelectedItemBottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormMain::backupDatabaseSettings() {
|
void FormMain::backupDatabaseSettings() {
|
||||||
|
@ -912,8 +1011,7 @@ void FormMain::changeEvent(QEvent* event) {
|
||||||
switch (event->type()) {
|
switch (event->type()) {
|
||||||
case QEvent::Type::WindowStateChange: {
|
case QEvent::Type::WindowStateChange: {
|
||||||
if ((windowState() & Qt::WindowState::WindowMinimized) == Qt::WindowState::WindowMinimized &&
|
if ((windowState() & Qt::WindowState::WindowMinimized) == Qt::WindowState::WindowMinimized &&
|
||||||
SystemTrayIcon::isSystemTrayDesired() &&
|
SystemTrayIcon::isSystemTrayDesired() && SystemTrayIcon::isSystemTrayAreaAvailable() &&
|
||||||
SystemTrayIcon::isSystemTrayAreaAvailable() &&
|
|
||||||
qApp->settings()->value(GROUP(GUI), SETTING(GUI::HideMainWindowWhenMinimized)).toBool()) {
|
qApp->settings()->value(GROUP(GUI), SETTING(GUI::HideMainWindowWhenMinimized)).toBool()) {
|
||||||
event->ignore();
|
event->ignore();
|
||||||
QTimer::singleShot(CHANGE_EVENT_DELAY, this, [this]() {
|
QTimer::singleShot(CHANGE_EVENT_DELAY, this, [this]() {
|
||||||
|
|
|
@ -24,17 +24,20 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent
|
||||||
|
|
||||||
initializeMessageDateFormats();
|
initializeMessageDateFormats();
|
||||||
|
|
||||||
m_ui->m_helpCountsFeedsFormat->setHelpText(tr("Enter format for count of articles displayed next to each "
|
m_ui->m_helpCountsFeedsFormat
|
||||||
"feed/category in feed list. Use \"%all\" and \"%unread\" strings "
|
->setHelpText(tr("Enter format for count of articles displayed next to each "
|
||||||
"which are placeholders for the actual count of all (or unread) articles."),
|
"feed/category in feed list. Use \"%all\" and \"%unread\" strings "
|
||||||
false);
|
"which are placeholders for the actual count of all (or unread) articles."),
|
||||||
|
false);
|
||||||
m_ui->m_helpMultilineArticleList->setHelpText(tr("Note that enabling this might have drastic consequences on "
|
m_ui->m_helpMultilineArticleList->setHelpText(tr("Note that enabling this might have drastic consequences on "
|
||||||
"performance of article list with big number of articles."),
|
"performance of article list with big number of articles."),
|
||||||
true);
|
true);
|
||||||
|
|
||||||
connect(m_ui->m_cbShowEnclosuresDirectly, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_cbShowEnclosuresDirectly, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_spinHeightImageAttachments, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
connect(m_ui->m_spinHeightImageAttachments,
|
||||||
this, &SettingsFeedsMessages::dirtifySettings);
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
|
this,
|
||||||
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
|
||||||
connect(m_ui->m_spinRelativeArticleTime, QOverload<int>::of(&QSpinBox::valueChanged), this, [=](int value) {
|
connect(m_ui->m_spinRelativeArticleTime, QOverload<int>::of(&QSpinBox::valueChanged), this, [=](int value) {
|
||||||
if (value <= 0) {
|
if (value <= 0) {
|
||||||
|
@ -45,6 +48,15 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(m_ui->m_spinHeightImageAttachments, QOverload<int>::of(&QSpinBox::valueChanged), this, [=](int value) {
|
||||||
|
if (value <= 0) {
|
||||||
|
m_ui->m_spinHeightImageAttachments->setSuffix(QSL(" px") + tr(" = unchanged size"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_ui->m_spinHeightImageAttachments->setSuffix(QSL(" px"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
connect(m_ui->m_cbListsRestrictedShortcuts, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_cbListsRestrictedShortcuts, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_cmbIgnoreContentsChanges, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_cmbIgnoreContentsChanges, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_cbHideCountsIfNoUnread, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_cbHideCountsIfNoUnread, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
|
@ -54,60 +66,96 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent
|
||||||
connect(m_ui->m_checkKeppMessagesInTheMiddle, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_checkKeppMessagesInTheMiddle, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
|
|
||||||
connect(m_ui->m_checkMessagesDateTimeFormat, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_checkMessagesDateTimeFormat, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_checkMessagesDateTimeFormat, &QCheckBox::toggled, m_ui->m_cmbMessagesDateTimeFormat, &QComboBox::setEnabled);
|
connect(m_ui->m_checkMessagesDateTimeFormat,
|
||||||
|
&QCheckBox::toggled,
|
||||||
|
m_ui->m_cmbMessagesDateTimeFormat,
|
||||||
|
&QComboBox::setEnabled);
|
||||||
|
|
||||||
connect(m_ui->m_checkMessagesTimeFormat, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_checkMessagesTimeFormat, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_checkMessagesTimeFormat, &QCheckBox::toggled, m_ui->m_cmbMessagesTimeFormat, &QComboBox::setEnabled);
|
connect(m_ui->m_checkMessagesTimeFormat, &QCheckBox::toggled, m_ui->m_cmbMessagesTimeFormat, &QComboBox::setEnabled);
|
||||||
|
|
||||||
connect(m_ui->m_checkRemoveReadMessagesOnExit, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_checkRemoveReadMessagesOnExit, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_checkBringToForegroundAfterMsgOpened, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_checkBringToForegroundAfterMsgOpened,
|
||||||
|
&QCheckBox::toggled,
|
||||||
|
this,
|
||||||
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_checkUpdateAllFeedsOnStartup, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_checkUpdateAllFeedsOnStartup, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_spinAutoUpdateInterval, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
|
connect(m_ui->m_spinAutoUpdateInterval,
|
||||||
this, &SettingsFeedsMessages::dirtifySettings);
|
static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
|
||||||
connect(m_ui->m_spinStartupUpdateDelay, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
|
this,
|
||||||
this, &SettingsFeedsMessages::dirtifySettings);
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
connect(m_ui->m_spinStartupUpdateDelay,
|
||||||
|
static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
|
||||||
|
this,
|
||||||
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
|
||||||
connect(m_ui->m_spinHeightRowsMessages, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
connect(m_ui->m_spinHeightRowsMessages,
|
||||||
this, &SettingsFeedsMessages::dirtifySettings);
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
connect(m_ui->m_spinHeightRowsMessages, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
this,
|
||||||
this, &SettingsFeedsMessages::requireRestart);
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
connect(m_ui->m_spinHeightRowsMessages,
|
||||||
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
|
this,
|
||||||
|
&SettingsFeedsMessages::requireRestart);
|
||||||
|
|
||||||
connect(m_ui->m_spinHeightRowsFeeds, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
connect(m_ui->m_spinHeightRowsFeeds,
|
||||||
this, &SettingsFeedsMessages::dirtifySettings);
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
connect(m_ui->m_spinHeightRowsFeeds, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
this,
|
||||||
this, &SettingsFeedsMessages::requireRestart);
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
connect(m_ui->m_spinHeightRowsFeeds,
|
||||||
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
|
this,
|
||||||
|
&SettingsFeedsMessages::requireRestart);
|
||||||
|
|
||||||
connect(m_ui->m_spinPaddingRowsMessages, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
connect(m_ui->m_spinPaddingRowsMessages,
|
||||||
this, &SettingsFeedsMessages::dirtifySettings);
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
connect(m_ui->m_spinPaddingRowsMessages, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
this,
|
||||||
this, &SettingsFeedsMessages::requireRestart);
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
connect(m_ui->m_spinPaddingRowsMessages,
|
||||||
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
|
this,
|
||||||
|
&SettingsFeedsMessages::requireRestart);
|
||||||
|
|
||||||
connect(m_ui->m_spinRelativeArticleTime, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
connect(m_ui->m_spinRelativeArticleTime,
|
||||||
this, &SettingsFeedsMessages::dirtifySettings);
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
|
this,
|
||||||
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
|
||||||
connect(m_ui->m_checkAutoUpdate, &QCheckBox::toggled, m_ui->m_spinAutoUpdateInterval, &TimeSpinBox::setEnabled);
|
connect(m_ui->m_checkAutoUpdate, &QCheckBox::toggled, m_ui->m_spinAutoUpdateInterval, &TimeSpinBox::setEnabled);
|
||||||
connect(m_ui->m_checkUpdateAllFeedsOnStartup, &QCheckBox::toggled, m_ui->m_spinStartupUpdateDelay, &TimeSpinBox::setEnabled);
|
connect(m_ui->m_checkUpdateAllFeedsOnStartup,
|
||||||
connect(m_ui->m_spinFeedUpdateTimeout, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,
|
&QCheckBox::toggled,
|
||||||
|
m_ui->m_spinStartupUpdateDelay,
|
||||||
|
&TimeSpinBox::setEnabled);
|
||||||
|
connect(m_ui->m_spinFeedUpdateTimeout,
|
||||||
|
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||||
|
this,
|
||||||
&SettingsFeedsMessages::dirtifySettings);
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
|
||||||
connect(m_ui->m_cmbMessagesDateTimeFormat, &QComboBox::currentTextChanged, this,
|
connect(m_ui->m_cmbMessagesDateTimeFormat,
|
||||||
&SettingsFeedsMessages::dirtifySettings);
|
&QComboBox::currentTextChanged,
|
||||||
connect(m_ui->m_cmbMessagesTimeFormat, &QComboBox::currentTextChanged, this,
|
this,
|
||||||
&SettingsFeedsMessages::dirtifySettings);
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
|
connect(m_ui->m_cmbMessagesTimeFormat, &QComboBox::currentTextChanged, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
|
|
||||||
connect(m_ui->m_cbFixupArticleDatetime, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_cbFixupArticleDatetime, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
|
|
||||||
connect(m_ui->m_cmbCountsFeedList, &QComboBox::currentTextChanged, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_cmbCountsFeedList, &QComboBox::currentTextChanged, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_cmbCountsFeedList, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
|
connect(m_ui->m_cmbCountsFeedList,
|
||||||
|
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||||
|
this,
|
||||||
&SettingsFeedsMessages::dirtifySettings);
|
&SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_checkShowTooltips, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_checkShowTooltips, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_checkMultilineArticleList, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
connect(m_ui->m_checkMultilineArticleList, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||||
connect(m_ui->m_checkMultilineArticleList, &QCheckBox::toggled, this, &SettingsFeedsMessages::requireRestart);
|
connect(m_ui->m_checkMultilineArticleList, &QCheckBox::toggled, this, &SettingsFeedsMessages::requireRestart);
|
||||||
|
|
||||||
connect(m_ui->m_cmbMessagesDateTimeFormat, &QComboBox::currentTextChanged,
|
connect(m_ui->m_cmbMessagesDateTimeFormat,
|
||||||
this, &SettingsFeedsMessages::updateDateTimeTooltip);
|
&QComboBox::currentTextChanged,
|
||||||
connect(m_ui->m_cmbMessagesTimeFormat, &QComboBox::currentTextChanged,
|
this,
|
||||||
this, &SettingsFeedsMessages::updateDateTimeTooltip);
|
&SettingsFeedsMessages::updateDateTimeTooltip);
|
||||||
|
connect(m_ui->m_cmbMessagesTimeFormat,
|
||||||
|
&QComboBox::currentTextChanged,
|
||||||
|
this,
|
||||||
|
&SettingsFeedsMessages::updateDateTimeTooltip);
|
||||||
|
|
||||||
emit m_ui->m_cmbMessagesDateTimeFormat->currentTextChanged({});
|
emit m_ui->m_cmbMessagesDateTimeFormat->currentTextChanged({});
|
||||||
emit m_ui->m_cmbMessagesTimeFormat->currentTextChanged({});
|
emit m_ui->m_cmbMessagesTimeFormat->currentTextChanged({});
|
||||||
|
@ -153,9 +201,7 @@ void SettingsFeedsMessages::initializeMessageDateFormats() {
|
||||||
|
|
||||||
void SettingsFeedsMessages::changeFont(QLabel& lbl) {
|
void SettingsFeedsMessages::changeFont(QLabel& lbl) {
|
||||||
bool ok;
|
bool ok;
|
||||||
QFont new_font = QFontDialog::getFont(&ok, lbl.font(),
|
QFont new_font = QFontDialog::getFont(&ok, lbl.font(), this, tr("Select new font"), QFontDialog::DontUseNativeDialog);
|
||||||
this, tr("Select new font"),
|
|
||||||
QFontDialog::DontUseNativeDialog);
|
|
||||||
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
lbl.setFont(new_font);
|
lbl.setFont(new_font);
|
||||||
|
@ -166,70 +212,82 @@ void SettingsFeedsMessages::changeFont(QLabel& lbl) {
|
||||||
void SettingsFeedsMessages::loadSettings() {
|
void SettingsFeedsMessages::loadSettings() {
|
||||||
onBeginLoadSettings();
|
onBeginLoadSettings();
|
||||||
|
|
||||||
m_ui->m_spinRelativeArticleTime->setValue(settings()->value(GROUP(Messages), SETTING(Messages::RelativeTimeForNewerArticles)).toInt());
|
m_ui->m_spinRelativeArticleTime
|
||||||
m_ui->m_spinPaddingRowsMessages->setValue(settings()->value(GROUP(Messages), SETTING(Messages::ArticleListPadding)).toInt());
|
->setValue(settings()->value(GROUP(Messages), SETTING(Messages::RelativeTimeForNewerArticles)).toInt());
|
||||||
|
m_ui->m_spinPaddingRowsMessages
|
||||||
|
->setValue(settings()->value(GROUP(Messages), SETTING(Messages::ArticleListPadding)).toInt());
|
||||||
m_ui->m_spinHeightRowsMessages->setValue(settings()->value(GROUP(GUI), SETTING(GUI::HeightRowMessages)).toInt());
|
m_ui->m_spinHeightRowsMessages->setValue(settings()->value(GROUP(GUI), SETTING(GUI::HeightRowMessages)).toInt());
|
||||||
m_ui->m_spinHeightRowsFeeds->setValue(settings()->value(GROUP(GUI), SETTING(GUI::HeightRowFeeds)).toInt());
|
m_ui->m_spinHeightRowsFeeds->setValue(settings()->value(GROUP(GUI), SETTING(GUI::HeightRowFeeds)).toInt());
|
||||||
|
|
||||||
m_ui->m_cbListsRestrictedShortcuts->setChecked(settings()->value(GROUP(Feeds),
|
m_ui->m_cbListsRestrictedShortcuts
|
||||||
SETTING(Feeds::OnlyBasicShortcutsInLists)).toBool());
|
->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::OnlyBasicShortcutsInLists)).toBool());
|
||||||
m_ui->m_cbHideCountsIfNoUnread->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::HideCountsIfNoUnread)).toBool());
|
m_ui->m_cbHideCountsIfNoUnread
|
||||||
m_ui->m_checkDisplayFeedIcons->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::DisplayFeedIconsInList)).toBool());
|
->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::HideCountsIfNoUnread)).toBool());
|
||||||
m_ui->m_checkBringToForegroundAfterMsgOpened->setChecked(settings()->value(GROUP(Messages),
|
m_ui->m_checkDisplayFeedIcons
|
||||||
SETTING(Messages::BringAppToFrontAfterMessageOpenedExternally)).toBool());
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::DisplayFeedIconsInList)).toBool());
|
||||||
m_ui->m_checkKeppMessagesInTheMiddle->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool());
|
m_ui->m_checkBringToForegroundAfterMsgOpened
|
||||||
m_ui->m_checkRemoveReadMessagesOnExit->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::ClearReadOnExit)).toBool());
|
->setChecked(settings()
|
||||||
|
->value(GROUP(Messages), SETTING(Messages::BringAppToFrontAfterMessageOpenedExternally))
|
||||||
|
.toBool());
|
||||||
|
m_ui->m_checkKeppMessagesInTheMiddle
|
||||||
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::KeepCursorInCenter)).toBool());
|
||||||
|
m_ui->m_checkRemoveReadMessagesOnExit
|
||||||
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::ClearReadOnExit)).toBool());
|
||||||
m_ui->m_checkAutoUpdate->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::AutoUpdateEnabled)).toBool());
|
m_ui->m_checkAutoUpdate->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::AutoUpdateEnabled)).toBool());
|
||||||
m_ui->m_checkAutoUpdateOnlyUnfocused->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::AutoUpdateOnlyUnfocused)).toBool());
|
m_ui->m_checkAutoUpdateOnlyUnfocused
|
||||||
|
->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::AutoUpdateOnlyUnfocused)).toBool());
|
||||||
m_ui->m_spinAutoUpdateInterval->setValue(settings()->value(GROUP(Feeds), SETTING(Feeds::AutoUpdateInterval)).toInt());
|
m_ui->m_spinAutoUpdateInterval->setValue(settings()->value(GROUP(Feeds), SETTING(Feeds::AutoUpdateInterval)).toInt());
|
||||||
m_ui->m_spinFeedUpdateTimeout->setValue(settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt());
|
m_ui->m_spinFeedUpdateTimeout->setValue(settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt());
|
||||||
m_ui->m_checkUpdateAllFeedsOnStartup->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::FeedsUpdateOnStartup)).toBool());
|
m_ui->m_checkUpdateAllFeedsOnStartup
|
||||||
m_ui->m_spinStartupUpdateDelay->setValue(settings()->value(GROUP(Feeds), SETTING(Feeds::FeedsUpdateStartupDelay)).toDouble());
|
->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::FeedsUpdateOnStartup)).toBool());
|
||||||
m_ui->m_cmbCountsFeedList->addItems({ QSL("(%unread)"), QSL("[%unread]"), QSL("%unread/%all"),
|
m_ui->m_spinStartupUpdateDelay
|
||||||
QSL("%unread-%all"), QSL("[%unread|%all]") });
|
->setValue(settings()->value(GROUP(Feeds), SETTING(Feeds::FeedsUpdateStartupDelay)).toDouble());
|
||||||
|
m_ui->m_cmbCountsFeedList
|
||||||
|
->addItems({QSL("(%unread)"), QSL("[%unread]"), QSL("%unread/%all"), QSL("%unread-%all"), QSL("[%unread|%all]")});
|
||||||
m_ui->m_cmbCountsFeedList->setEditText(settings()->value(GROUP(Feeds), SETTING(Feeds::CountFormat)).toString());
|
m_ui->m_cmbCountsFeedList->setEditText(settings()->value(GROUP(Feeds), SETTING(Feeds::CountFormat)).toString());
|
||||||
m_ui->m_checkShowTooltips->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::EnableTooltipsFeedsMessages)).toBool());
|
m_ui->m_checkShowTooltips
|
||||||
m_ui->m_cmbIgnoreContentsChanges->setChecked(settings()->value(GROUP(Messages),
|
->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::EnableTooltipsFeedsMessages)).toBool());
|
||||||
SETTING(Messages::IgnoreContentsChanges)).toBool());
|
m_ui->m_cmbIgnoreContentsChanges
|
||||||
m_ui->m_checkMultilineArticleList->setChecked(settings()->value(GROUP(Messages),
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::IgnoreContentsChanges)).toBool());
|
||||||
SETTING(Messages::MultilineArticleList)).toBool());
|
m_ui->m_checkMultilineArticleList
|
||||||
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::MultilineArticleList)).toBool());
|
||||||
|
|
||||||
m_ui->m_spinHeightImageAttachments->setValue(settings()->value(GROUP(Messages),
|
m_ui->m_spinHeightImageAttachments
|
||||||
SETTING(Messages::MessageHeadImageHeight)).toInt());
|
->setValue(settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toInt());
|
||||||
m_ui->m_cbShowEnclosuresDirectly->setChecked(settings()->value(GROUP(Messages),
|
m_ui->m_cbShowEnclosuresDirectly
|
||||||
SETTING(Messages::DisplayEnclosuresInMessage)).toBool());
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::DisplayEnclosuresInMessage)).toBool());
|
||||||
|
|
||||||
m_ui->m_cbFixupArticleDatetime->setChecked(settings()->value(GROUP(Messages),
|
m_ui->m_cbFixupArticleDatetime
|
||||||
SETTING(Messages::FixupFutureArticleDateTimes)).toBool());
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::FixupFutureArticleDateTimes)).toBool());
|
||||||
|
|
||||||
m_ui->m_checkMessagesDateTimeFormat->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::UseCustomDate)).toBool());
|
m_ui->m_checkMessagesDateTimeFormat
|
||||||
m_ui->m_cmbMessagesDateTimeFormat->setCurrentText(settings()->value(GROUP(Messages),
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::UseCustomDate)).toBool());
|
||||||
SETTING(Messages::CustomDateFormat)).toString());
|
m_ui->m_cmbMessagesDateTimeFormat
|
||||||
|
->setCurrentText(settings()->value(GROUP(Messages), SETTING(Messages::CustomDateFormat)).toString());
|
||||||
|
|
||||||
m_ui->m_checkMessagesTimeFormat->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::UseCustomTime)).toBool());
|
m_ui->m_checkMessagesTimeFormat
|
||||||
m_ui->m_cmbMessagesTimeFormat->setCurrentText(settings()->value(GROUP(Messages),
|
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::UseCustomTime)).toBool());
|
||||||
SETTING(Messages::CustomTimeFormat)).toString());
|
m_ui->m_cmbMessagesTimeFormat
|
||||||
|
->setCurrentText(settings()->value(GROUP(Messages), SETTING(Messages::CustomTimeFormat)).toString());
|
||||||
|
|
||||||
QFont fon;
|
QFont fon;
|
||||||
|
|
||||||
fon.fromString(settings()->value(GROUP(Messages),
|
fon.fromString(settings()->value(GROUP(Messages), SETTING(Messages::PreviewerFontStandard)).toString());
|
||||||
SETTING(Messages::PreviewerFontStandard)).toString());
|
|
||||||
m_ui->m_lblMessagesFont->setFont(fon);
|
m_ui->m_lblMessagesFont->setFont(fon);
|
||||||
|
|
||||||
QFont fon2;
|
QFont fon2;
|
||||||
|
|
||||||
// Keep in sync with void MessagesModel::setupFonts().
|
// Keep in sync with void MessagesModel::setupFonts().
|
||||||
fon2.fromString(settings()->value(GROUP(Messages),
|
fon2.fromString(settings()
|
||||||
Messages::ListFont,
|
->value(GROUP(Messages), Messages::ListFont, Application::font("MessagesView").toString())
|
||||||
Application::font("MessagesView").toString()).toString());
|
.toString());
|
||||||
m_ui->m_lblMessageListFont->setFont(fon2);
|
m_ui->m_lblMessageListFont->setFont(fon2);
|
||||||
|
|
||||||
QFont fon3;
|
QFont fon3;
|
||||||
|
|
||||||
// Keep in sync with void FeedsModel::setupFonts().
|
// Keep in sync with void FeedsModel::setupFonts().
|
||||||
fon3.fromString(settings()->value(GROUP(Feeds),
|
fon3
|
||||||
Feeds::ListFont,
|
.fromString(settings()->value(GROUP(Feeds), Feeds::ListFont, Application::font("FeedsView").toString()).toString());
|
||||||
Application::font("FeedsView").toString()).toString());
|
|
||||||
m_ui->m_lblFeedListFont->setFont(fon3);
|
m_ui->m_lblFeedListFont->setFont(fon3);
|
||||||
|
|
||||||
onEndLoadSettings();
|
onEndLoadSettings();
|
||||||
|
@ -238,19 +296,23 @@ void SettingsFeedsMessages::loadSettings() {
|
||||||
void SettingsFeedsMessages::saveSettings() {
|
void SettingsFeedsMessages::saveSettings() {
|
||||||
onBeginSaveSettings();
|
onBeginSaveSettings();
|
||||||
|
|
||||||
settings()->setValue(GROUP(Messages), Messages::RelativeTimeForNewerArticles, m_ui->m_spinRelativeArticleTime->value());
|
settings()->setValue(GROUP(Messages),
|
||||||
|
Messages::RelativeTimeForNewerArticles,
|
||||||
|
m_ui->m_spinRelativeArticleTime->value());
|
||||||
settings()->setValue(GROUP(Messages), Messages::ArticleListPadding, m_ui->m_spinPaddingRowsMessages->value());
|
settings()->setValue(GROUP(Messages), Messages::ArticleListPadding, m_ui->m_spinPaddingRowsMessages->value());
|
||||||
settings()->setValue(GROUP(GUI), GUI::HeightRowMessages, m_ui->m_spinHeightRowsMessages->value());
|
settings()->setValue(GROUP(GUI), GUI::HeightRowMessages, m_ui->m_spinHeightRowsMessages->value());
|
||||||
settings()->setValue(GROUP(GUI), GUI::HeightRowFeeds, m_ui->m_spinHeightRowsFeeds->value());
|
settings()->setValue(GROUP(GUI), GUI::HeightRowFeeds, m_ui->m_spinHeightRowsFeeds->value());
|
||||||
|
|
||||||
settings()->setValue(GROUP(Feeds), Feeds::OnlyBasicShortcutsInLists,
|
settings()->setValue(GROUP(Feeds), Feeds::OnlyBasicShortcutsInLists, m_ui->m_cbListsRestrictedShortcuts->isChecked());
|
||||||
m_ui->m_cbListsRestrictedShortcuts->isChecked());
|
|
||||||
|
|
||||||
settings()->setValue(GROUP(Feeds), Feeds::HideCountsIfNoUnread, m_ui->m_cbHideCountsIfNoUnread->isChecked());
|
settings()->setValue(GROUP(Feeds), Feeds::HideCountsIfNoUnread, m_ui->m_cbHideCountsIfNoUnread->isChecked());
|
||||||
settings()->setValue(GROUP(Messages), Messages::DisplayFeedIconsInList, m_ui->m_checkDisplayFeedIcons->isChecked());
|
settings()->setValue(GROUP(Messages), Messages::DisplayFeedIconsInList, m_ui->m_checkDisplayFeedIcons->isChecked());
|
||||||
settings()->setValue(GROUP(Messages), Messages::BringAppToFrontAfterMessageOpenedExternally,
|
settings()->setValue(GROUP(Messages),
|
||||||
|
Messages::BringAppToFrontAfterMessageOpenedExternally,
|
||||||
m_ui->m_checkBringToForegroundAfterMsgOpened->isChecked());
|
m_ui->m_checkBringToForegroundAfterMsgOpened->isChecked());
|
||||||
settings()->setValue(GROUP(Messages), Messages::KeepCursorInCenter, m_ui->m_checkKeppMessagesInTheMiddle->isChecked());
|
settings()->setValue(GROUP(Messages),
|
||||||
|
Messages::KeepCursorInCenter,
|
||||||
|
m_ui->m_checkKeppMessagesInTheMiddle->isChecked());
|
||||||
settings()->setValue(GROUP(Messages), Messages::ClearReadOnExit, m_ui->m_checkRemoveReadMessagesOnExit->isChecked());
|
settings()->setValue(GROUP(Messages), Messages::ClearReadOnExit, m_ui->m_checkRemoveReadMessagesOnExit->isChecked());
|
||||||
settings()->setValue(GROUP(Feeds), Feeds::AutoUpdateEnabled, m_ui->m_checkAutoUpdate->isChecked());
|
settings()->setValue(GROUP(Feeds), Feeds::AutoUpdateEnabled, m_ui->m_checkAutoUpdate->isChecked());
|
||||||
settings()->setValue(GROUP(Feeds), Feeds::AutoUpdateOnlyUnfocused, m_ui->m_checkAutoUpdateOnlyUnfocused->isChecked());
|
settings()->setValue(GROUP(Feeds), Feeds::AutoUpdateOnlyUnfocused, m_ui->m_checkAutoUpdateOnlyUnfocused->isChecked());
|
||||||
|
@ -267,7 +329,9 @@ void SettingsFeedsMessages::saveSettings() {
|
||||||
Messages::DisplayEnclosuresInMessage,
|
Messages::DisplayEnclosuresInMessage,
|
||||||
m_ui->m_cbShowEnclosuresDirectly->isChecked());
|
m_ui->m_cbShowEnclosuresDirectly->isChecked());
|
||||||
|
|
||||||
settings()->setValue(GROUP(Messages), Messages::FixupFutureArticleDateTimes, m_ui->m_cbFixupArticleDatetime->isChecked());
|
settings()->setValue(GROUP(Messages),
|
||||||
|
Messages::FixupFutureArticleDateTimes,
|
||||||
|
m_ui->m_cbFixupArticleDatetime->isChecked());
|
||||||
|
|
||||||
settings()->setValue(GROUP(Messages), Messages::UseCustomDate, m_ui->m_checkMessagesDateTimeFormat->isChecked());
|
settings()->setValue(GROUP(Messages), Messages::UseCustomDate, m_ui->m_checkMessagesDateTimeFormat->isChecked());
|
||||||
settings()->setValue(GROUP(Messages), Messages::UseCustomTime, m_ui->m_checkMessagesTimeFormat->isChecked());
|
settings()->setValue(GROUP(Messages), Messages::UseCustomTime, m_ui->m_checkMessagesTimeFormat->isChecked());
|
||||||
|
|
|
@ -330,14 +330,14 @@
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="5" column="1">
|
||||||
<widget class="QSpinBox" name="m_spinHeightImageAttachments">
|
<widget class="QSpinBox" name="m_spinHeightImageAttachments">
|
||||||
<property name="suffix">
|
|
||||||
<string notr="true"> px</string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>22</number>
|
<number>-1</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>1000</number>
|
<number>4000</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>-1</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -67,17 +67,14 @@ QPair<QString, QUrl> TextBrowserViewer::prepareHtmlForMessage(const QList<Messag
|
||||||
pictures_html += QString("<br/>[%1] <a href=\"%2\">%2</a>").arg(tr("image"), match.captured(1));
|
pictures_html += QString("<br/>[%1] <a href=\"%2\">%2</a>").arg(tr("image"), match.captured(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayImagePlaceholders)).toBool()) {
|
|
||||||
html += message.m_contents;
|
|
||||||
}
|
|
||||||
else {*/
|
|
||||||
QString cnts = message.m_contents;
|
QString cnts = message.m_contents;
|
||||||
|
|
||||||
html += cnts;
|
auto forced_img_size = qApp->settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toInt();
|
||||||
// html += cnts.replace(imgTagRegex, QString());
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
// Fixup all "img" tags.
|
||||||
|
html += cnts.replace(img_tag_rgx,
|
||||||
|
QSL("<a href=\"\\1\"><img width=\"%1\" src=\"\\1\" /></a>")
|
||||||
|
.arg(forced_img_size <= 0 ? QString() : QString::number(forced_img_size)));
|
||||||
html += pictures_html;
|
html += pictures_html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,13 +344,13 @@ void TextBrowserViewer::reloadWithImages() {
|
||||||
m_document.data()->m_reloadingWithResources = true;
|
m_document.data()->m_reloadingWithResources = true;
|
||||||
m_document.data()->m_loadedResources.clear();
|
m_document.data()->m_loadedResources.clear();
|
||||||
|
|
||||||
for (const QUrl& url : m_document.data()->m_resourcesForHtml) {
|
QEventLoop loop;
|
||||||
|
|
||||||
|
for (const QUrl& url : m_document.data()->m_neededResourcesForHtml) {
|
||||||
if (m_document.data()->m_loadedResources.contains(url)) {
|
if (m_document.data()->m_loadedResources.contains(url)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
QEventLoop loop;
|
|
||||||
|
|
||||||
connect(m_downloader.data(), &Downloader::completed, &loop, &QEventLoop::quit);
|
connect(m_downloader.data(), &Downloader::completed, &loop, &QEventLoop::quit);
|
||||||
m_downloader->manipulateData(url.toString(), QNetworkAccessManager::Operation::GetOperation, {}, 5000);
|
m_downloader->manipulateData(url.toString(), QNetworkAccessManager::Operation::GetOperation, {}, 5000);
|
||||||
|
|
||||||
|
@ -414,7 +411,7 @@ void TextBrowserViewer::onAnchorClicked(const QUrl& url) {
|
||||||
void TextBrowserViewer::setHtml(const QString& html, const QUrl& base_url) {
|
void TextBrowserViewer::setHtml(const QString& html, const QUrl& base_url) {
|
||||||
m_document.data()->m_reloadingWithResources = false;
|
m_document.data()->m_reloadingWithResources = false;
|
||||||
m_document.data()->m_loadedResources.clear();
|
m_document.data()->m_loadedResources.clear();
|
||||||
m_document.data()->m_resourcesForHtml.clear();
|
m_document.data()->m_neededResourcesForHtml.clear();
|
||||||
|
|
||||||
setHtmlPrivate(html, base_url);
|
setHtmlPrivate(html, base_url);
|
||||||
|
|
||||||
|
@ -433,7 +430,7 @@ void TextBrowserViewer::setHtmlPrivate(const QString& html, const QUrl& base_url
|
||||||
m_currentUrl = base_url;
|
m_currentUrl = base_url;
|
||||||
|
|
||||||
if (!m_document.data()->m_reloadingWithResources) {
|
if (!m_document.data()->m_reloadingWithResources) {
|
||||||
m_document.data()->m_resourcesForHtml.clear();
|
m_document.data()->m_neededResourcesForHtml.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
QTextBrowser::setHtml(html);
|
QTextBrowser::setHtml(html);
|
||||||
|
@ -448,8 +445,8 @@ TextBrowserDocument::TextBrowserDocument(QObject* parent) : QTextDocument(parent
|
||||||
|
|
||||||
QVariant TextBrowserDocument::loadResource(int type, const QUrl& name) {
|
QVariant TextBrowserDocument::loadResource(int type, const QUrl& name) {
|
||||||
if (!m_reloadingWithResources) {
|
if (!m_reloadingWithResources) {
|
||||||
if (type == QTextDocument::ResourceType::ImageResource && !m_resourcesForHtml.contains(name)) {
|
if (type == QTextDocument::ResourceType::ImageResource && !m_neededResourcesForHtml.contains(name)) {
|
||||||
m_resourcesForHtml.append(name);
|
m_neededResourcesForHtml.append(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -29,7 +29,7 @@ class TextBrowserDocument : public QTextDocument {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_reloadingWithResources;
|
bool m_reloadingWithResources;
|
||||||
QList<QUrl> m_resourcesForHtml;
|
QList<QUrl> m_neededResourcesForHtml;
|
||||||
QMap<QUrl, QByteArray> m_loadedResources;
|
QMap<QUrl, QByteArray> m_loadedResources;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
SkinFactory::SkinFactory(QObject* parent) : QObject(parent), m_styleIsFrozen(false) {}
|
SkinFactory::SkinFactory(QObject* parent) : QObject(parent), m_styleIsFrozen(false) {}
|
||||||
|
|
||||||
void SkinFactory::loadCurrentSkin() {
|
void SkinFactory::loadCurrentSkin() {
|
||||||
QList<QString> skin_names_to_try = { selectedSkinName(), QSL(APP_SKIN_DEFAULT) };
|
QList<QString> skin_names_to_try = {selectedSkinName(), QSL(APP_SKIN_DEFAULT)};
|
||||||
bool skin_parsed;
|
bool skin_parsed;
|
||||||
Skin skin_data;
|
Skin skin_data;
|
||||||
QString skin_name;
|
QString skin_name;
|
||||||
|
@ -60,8 +60,7 @@ void SkinFactory::loadSkinFromData(const Skin& skin) {
|
||||||
m_styleIsFrozen = false;
|
m_styleIsFrozen = false;
|
||||||
|
|
||||||
if (!skin.m_forcedStyles.isEmpty()) {
|
if (!skin.m_forcedStyles.isEmpty()) {
|
||||||
qDebugNN << LOGSEC_GUI << "Forcing one of skin's declared styles:"
|
qDebugNN << LOGSEC_GUI << "Forcing one of skin's declared styles:" << QUOTE_W_SPACE_DOT(skin.m_forcedStyles);
|
||||||
<< QUOTE_W_SPACE_DOT(skin.m_forcedStyles);
|
|
||||||
|
|
||||||
for (const QString& skin_forced_style : skin.m_forcedStyles) {
|
for (const QString& skin_forced_style : skin.m_forcedStyles) {
|
||||||
if (qApp->setStyle(skin_forced_style) != nullptr) {
|
if (qApp->setStyle(skin_forced_style) != nullptr) {
|
||||||
|
@ -86,12 +85,10 @@ void SkinFactory::loadSkinFromData(const Skin& skin) {
|
||||||
// they specifically set object name to style name.
|
// they specifically set object name to style name.
|
||||||
m_currentStyle = qApp->style()->objectName();
|
m_currentStyle = qApp->style()->objectName();
|
||||||
|
|
||||||
const bool use_skin_colors = skin.m_forcedSkinColors ||
|
const bool use_skin_colors =
|
||||||
qApp->settings()->value(GROUP(GUI), SETTING(GUI::ForcedSkinColors)).toBool();
|
skin.m_forcedSkinColors || qApp->settings()->value(GROUP(GUI), SETTING(GUI::ForcedSkinColors)).toBool();
|
||||||
|
|
||||||
if (isStyleGoodForAlternativeStylePalette(m_currentStyle) &&
|
if (isStyleGoodForAlternativeStylePalette(m_currentStyle) && !skin.m_stylePalette.isEmpty() && use_skin_colors) {
|
||||||
!skin.m_stylePalette.isEmpty() &&
|
|
||||||
use_skin_colors) {
|
|
||||||
qDebugNN << LOGSEC_GUI << "Activating alternative palette.";
|
qDebugNN << LOGSEC_GUI << "Activating alternative palette.";
|
||||||
|
|
||||||
QPalette pal = skin.extractPalette();
|
QPalette pal = skin.extractPalette();
|
||||||
|
@ -124,9 +121,9 @@ QString SkinFactory::selectedSkinName() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SkinFactory::adBlockedPage(const QString& url, const QString& filter) {
|
QString SkinFactory::adBlockedPage(const QString& url, const QString& filter) {
|
||||||
const QString& adblocked = currentSkin().m_adblocked.arg(tr("This page was blocked by AdBlock"),
|
const QString& adblocked =
|
||||||
tr(R"(Blocked URL: "%1"<br/>Used filter: "%2")").arg(url,
|
currentSkin().m_adblocked.arg(tr("This page was blocked by AdBlock"),
|
||||||
filter));
|
tr(R"(Blocked URL: "%1"<br/>Used filter: "%2")").arg(url, filter));
|
||||||
|
|
||||||
return currentSkin().m_layoutMarkupWrapper.arg(tr("This page was blocked by AdBlock"), adblocked);
|
return currentSkin().m_layoutMarkupWrapper.arg(tr("This page was blocked by AdBlock"), adblocked);
|
||||||
}
|
}
|
||||||
|
@ -135,6 +132,8 @@ QPair<QString, QUrl> SkinFactory::generateHtmlOfArticles(const QList<Message>& m
|
||||||
Skin skin = currentSkin();
|
Skin skin = currentSkin();
|
||||||
QString messages_layout;
|
QString messages_layout;
|
||||||
QString single_message_layout = skin.m_layoutMarkup;
|
QString single_message_layout = skin.m_layoutMarkup;
|
||||||
|
const auto forced_img_size =
|
||||||
|
qApp->settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toInt();
|
||||||
|
|
||||||
for (const Message& message : messages) {
|
for (const Message& message : messages) {
|
||||||
QString enclosures;
|
QString enclosures;
|
||||||
|
@ -143,46 +142,45 @@ QPair<QString, QUrl> SkinFactory::generateHtmlOfArticles(const QList<Message>& m
|
||||||
for (const Enclosure& enclosure : message.m_enclosures) {
|
for (const Enclosure& enclosure : message.m_enclosures) {
|
||||||
QString enc_url = QUrl::fromPercentEncoding(enclosure.m_url.toUtf8());
|
QString enc_url = QUrl::fromPercentEncoding(enclosure.m_url.toUtf8());
|
||||||
|
|
||||||
enclosures += skin.m_enclosureMarkup.arg(enc_url,
|
enclosures += skin.m_enclosureMarkup.arg(enc_url, QSL("🧷"), enclosure.m_mimeType);
|
||||||
QSL("🧷"),
|
|
||||||
enclosure.m_mimeType);
|
|
||||||
|
|
||||||
if (enclosure.m_mimeType.startsWith(QSL("image/")) &&
|
if (enclosure.m_mimeType.startsWith(QSL("image/")) &&
|
||||||
qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayEnclosuresInMessage)).toBool()) {
|
qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayEnclosuresInMessage)).toBool()) {
|
||||||
// Add thumbnail image.
|
// Add thumbnail image.
|
||||||
enclosure_images += skin.m_enclosureImageMarkup.arg(
|
enclosure_images +=
|
||||||
enclosure.m_url,
|
skin.m_enclosureImageMarkup.arg(enclosure.m_url,
|
||||||
enclosure.m_mimeType,
|
enclosure.m_mimeType,
|
||||||
qApp->settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toString());
|
forced_img_size <= 0 ? QString() : QString::number(forced_img_size));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString msg_date = qApp->settings()->value(GROUP(Messages), SETTING(Messages::UseCustomDate)).toBool()
|
QString msg_date =
|
||||||
? message.m_created.toLocalTime().toString(qApp->settings()->value(GROUP(Messages),
|
qApp->settings()->value(GROUP(Messages), SETTING(Messages::UseCustomDate)).toBool()
|
||||||
SETTING(Messages::CustomDateFormat)).toString())
|
? message.m_created.toLocalTime()
|
||||||
: qApp->localization()->loadedLocale().toString(message.m_created.toLocalTime(),
|
.toString(qApp->settings()->value(GROUP(Messages), SETTING(Messages::CustomDateFormat)).toString())
|
||||||
QLocale::FormatType::ShortFormat);
|
: qApp->localization()->loadedLocale().toString(message.m_created.toLocalTime(),
|
||||||
|
QLocale::FormatType::ShortFormat);
|
||||||
|
|
||||||
messages_layout.append(single_message_layout
|
messages_layout.append(single_message_layout.arg(message.m_title,
|
||||||
.arg(message.m_title,
|
tr("Written by ") + (message.m_author.isEmpty()
|
||||||
tr("Written by ") + (message.m_author.isEmpty() ?
|
? tr("unknown author")
|
||||||
tr("unknown author") :
|
: message.m_author),
|
||||||
message.m_author),
|
message.m_url,
|
||||||
message.m_url,
|
message.m_contents,
|
||||||
message.m_contents,
|
msg_date,
|
||||||
msg_date,
|
enclosures,
|
||||||
enclosures,
|
enclosure_images,
|
||||||
enclosure_images,
|
QString::number(message.m_id)));
|
||||||
QString::number(message.m_id)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString msg_contents = skin.m_layoutMarkupWrapper.arg(messages.size() == 1
|
QString msg_contents =
|
||||||
? messages.at(0).m_title
|
skin.m_layoutMarkupWrapper.arg(messages.size() == 1 ? messages.at(0).m_title : tr("Newspaper view"),
|
||||||
: tr("Newspaper view"),
|
messages_layout);
|
||||||
messages_layout);
|
auto* feed = root->getParentServiceRoot()
|
||||||
auto* feed = root->getParentServiceRoot()->getItemFromSubTree([messages](const RootItem* it) {
|
->getItemFromSubTree([messages](const RootItem* it) {
|
||||||
return it->kind() == RootItem::Kind::Feed && it->customId() == messages.at(0).m_feedId;
|
return it->kind() == RootItem::Kind::Feed && it->customId() == messages.at(0).m_feedId;
|
||||||
})->toFeed();
|
})
|
||||||
|
->toFeed();
|
||||||
QString base_url;
|
QString base_url;
|
||||||
|
|
||||||
if (feed != nullptr) {
|
if (feed != nullptr) {
|
||||||
|
@ -193,15 +191,12 @@ QPair<QString, QUrl> SkinFactory::generateHtmlOfArticles(const QList<Message>& m
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return { msg_contents, base_url };
|
return {msg_contents, base_url};
|
||||||
}
|
}
|
||||||
|
|
||||||
Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||||
Skin skin;
|
Skin skin;
|
||||||
const QStringList skins_root_folders = {
|
const QStringList skins_root_folders = {APP_SKIN_PATH, customSkinBaseFolder()};
|
||||||
APP_SKIN_PATH,
|
|
||||||
customSkinBaseFolder()
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const QString& skins_root_folder : skins_root_folders) {
|
for (const QString& skins_root_folder : skins_root_folders) {
|
||||||
const QString skin_parent = QString(skins_root_folder).replace(QDir::separator(), QL1C('/')) + QL1C('/');
|
const QString skin_parent = QString(skins_root_folder).replace(QDir::separator(), QL1C('/')) + QL1C('/');
|
||||||
|
@ -223,7 +218,8 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
const QDomNode skin_node = document.namedItem(QSL("skin"));
|
const QDomNode skin_node = document.namedItem(QSL("skin"));
|
||||||
const QString base_skin_name = skin_node.toElement().attribute(QSL("base"));;
|
const QString base_skin_name = skin_node.toElement().attribute(QSL("base"));
|
||||||
|
;
|
||||||
QString real_base_skin_folder;
|
QString real_base_skin_folder;
|
||||||
|
|
||||||
if (!base_skin_name.isEmpty()) {
|
if (!base_skin_name.isEmpty()) {
|
||||||
|
@ -279,17 +275,18 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||||
skin.m_colorPalette = palette;
|
skin.m_colorPalette = palette;
|
||||||
|
|
||||||
// Obtain alternative style palette.
|
// Obtain alternative style palette.
|
||||||
skin.m_forcedStyles = skin_node
|
skin.m_forcedStyles = skin_node.namedItem(QSL("forced-styles"))
|
||||||
.namedItem(QSL("forced-styles"))
|
.toElement()
|
||||||
.toElement().text().split(',',
|
.text()
|
||||||
|
.split(',',
|
||||||
#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
|
#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
|
||||||
Qt::SplitBehaviorFlags::SkipEmptyParts);
|
Qt::SplitBehaviorFlags::SkipEmptyParts);
|
||||||
#else
|
#else
|
||||||
QString::SplitBehavior::SkipEmptyParts);
|
QString::SplitBehavior::SkipEmptyParts);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
skin.m_forcedSkinColors = skin_node.namedItem(QSL("forced-skin-colors")).toElement().text() ==
|
skin.m_forcedSkinColors =
|
||||||
QVariant(true).toString();
|
skin_node.namedItem(QSL("forced-skin-colors")).toElement().text() == QVariant(true).toString();
|
||||||
|
|
||||||
QDomElement style_palette_root = skin_node.namedItem(QSL("style-palette")).toElement();
|
QDomElement style_palette_root = skin_node.namedItem(QSL("style-palette")).toElement();
|
||||||
|
|
||||||
|
@ -306,7 +303,8 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||||
|
|
||||||
for (int i = 0; i < groups_of_palette.size(); i++) {
|
for (int i = 0; i < groups_of_palette.size(); i++) {
|
||||||
const QDomNode& group_root_nd = groups_of_palette.at(i);
|
const QDomNode& group_root_nd = groups_of_palette.at(i);
|
||||||
QPalette::ColorGroup group = QPalette::ColorGroup(enumerp.keyToValue(group_root_nd.toElement().attribute(QSL("id")).toLatin1()));
|
QPalette::ColorGroup group =
|
||||||
|
QPalette::ColorGroup(enumerp.keyToValue(group_root_nd.toElement().attribute(QSL("id")).toLatin1()));
|
||||||
|
|
||||||
QDomNodeList colors_of_group = group_root_nd.toElement().elementsByTagName(QSL("color"));
|
QDomNodeList colors_of_group = group_root_nd.toElement().elementsByTagName(QSL("color"));
|
||||||
|
|
||||||
|
@ -314,11 +312,12 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||||
const QDomNode& color_nd = colors_of_group.at(j);
|
const QDomNode& color_nd = colors_of_group.at(j);
|
||||||
|
|
||||||
QColor color(color_nd.toElement().text());
|
QColor color(color_nd.toElement().text());
|
||||||
QPalette::ColorRole role = QPalette::ColorRole(enumerx.keyToValue(color_nd.toElement().attribute(QSL("role")).toLatin1()));
|
QPalette::ColorRole role =
|
||||||
Qt::BrushStyle brush = Qt::BrushStyle(enumery.keyToValue(color_nd.toElement().attribute(QSL("brush")).toLatin1()));
|
QPalette::ColorRole(enumerx.keyToValue(color_nd.toElement().attribute(QSL("role")).toLatin1()));
|
||||||
|
Qt::BrushStyle brush =
|
||||||
|
Qt::BrushStyle(enumery.keyToValue(color_nd.toElement().attribute(QSL("brush")).toLatin1()));
|
||||||
|
|
||||||
groups.insert(group, QPair<QPalette::ColorRole, QPair<QColor, Qt::BrushStyle>>(role,
|
groups.insert(group, QPair<QPalette::ColorRole, QPair<QColor, Qt::BrushStyle>>(role, {color, brush}));
|
||||||
{ color, brush }));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,21 +346,19 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||||
skin.m_layoutMarkupWrapper = skin.m_layoutMarkupWrapper.replace(QSL(SKIN_STYLE_PLACEHOLDER), custom_css);
|
skin.m_layoutMarkupWrapper = skin.m_layoutMarkupWrapper.replace(QSL(SKIN_STYLE_PLACEHOLDER), custom_css);
|
||||||
}
|
}
|
||||||
catch (...) {
|
catch (...) {
|
||||||
qWarningNN << "Skin"
|
qWarningNN << "Skin" << QUOTE_W_SPACE(skin_name) << "does not support separated custom CSS.";
|
||||||
<< QUOTE_W_SPACE(skin_name)
|
|
||||||
<< "does not support separated custom CSS.";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
skin.m_enclosureImageMarkup = loadSkinFile(skin_folder_no_sep, QSL("html_enclosure_image.html"), real_base_skin_folder);
|
skin.m_enclosureImageMarkup =
|
||||||
|
loadSkinFile(skin_folder_no_sep, QSL("html_enclosure_image.html"), real_base_skin_folder);
|
||||||
skin.m_layoutMarkup = loadSkinFile(skin_folder_no_sep, QSL("html_single_message.html"), real_base_skin_folder);
|
skin.m_layoutMarkup = loadSkinFile(skin_folder_no_sep, QSL("html_single_message.html"), real_base_skin_folder);
|
||||||
skin.m_enclosureMarkup = loadSkinFile(skin_folder_no_sep, QSL("html_enclosure_every.html"), real_base_skin_folder);
|
skin.m_enclosureMarkup =
|
||||||
|
loadSkinFile(skin_folder_no_sep, QSL("html_enclosure_every.html"), real_base_skin_folder);
|
||||||
skin.m_rawData = loadSkinFile(skin_folder_no_sep, QSL("qt_style.qss"), real_base_skin_folder);
|
skin.m_rawData = loadSkinFile(skin_folder_no_sep, QSL("qt_style.qss"), real_base_skin_folder);
|
||||||
skin.m_adblocked = loadSkinFile(skin_folder_no_sep, QSL("html_adblocked.html"), real_base_skin_folder);
|
skin.m_adblocked = loadSkinFile(skin_folder_no_sep, QSL("html_adblocked.html"), real_base_skin_folder);
|
||||||
|
|
||||||
if (ok != nullptr) {
|
if (ok != nullptr) {
|
||||||
*ok = !skin.m_author.isEmpty() &&
|
*ok = !skin.m_author.isEmpty() && !skin.m_version.isEmpty() && !skin.m_baseName.isEmpty() &&
|
||||||
!skin.m_version.isEmpty() &&
|
|
||||||
!skin.m_baseName.isEmpty() &&
|
|
||||||
!skin.m_layoutMarkup.isEmpty();
|
!skin.m_layoutMarkup.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +373,9 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||||
return skin;
|
return skin;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SkinFactory::loadSkinFile(const QString& skin_folder, const QString& file_name, const QString& base_folder) const {
|
QString SkinFactory::loadSkinFile(const QString& skin_folder,
|
||||||
|
const QString& file_name,
|
||||||
|
const QString& base_folder) const {
|
||||||
QString local_file = QDir::toNativeSeparators(skin_folder + QDir::separator() + file_name);
|
QString local_file = QDir::toNativeSeparators(skin_folder + QDir::separator() + file_name);
|
||||||
QString base_file = QDir::toNativeSeparators(base_folder + QDir::separator() + file_name);
|
QString base_file = QDir::toNativeSeparators(base_folder + QDir::separator() + file_name);
|
||||||
QString data;
|
QString data;
|
||||||
|
@ -404,13 +403,11 @@ bool SkinFactory::styleIsFrozen() const {
|
||||||
QList<Skin> SkinFactory::installedSkins() const {
|
QList<Skin> SkinFactory::installedSkins() const {
|
||||||
QList<Skin> skins;
|
QList<Skin> skins;
|
||||||
bool skin_load_ok;
|
bool skin_load_ok;
|
||||||
QStringList skin_directories = QDir(APP_SKIN_PATH).entryList(QDir::Filter::Dirs |
|
QStringList skin_directories =
|
||||||
QDir::Filter::NoDotAndDotDot |
|
QDir(APP_SKIN_PATH).entryList(QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot | QDir::Filter::Readable);
|
||||||
QDir::Filter::Readable);
|
|
||||||
|
|
||||||
skin_directories.append(QDir(customSkinBaseFolder()).entryList(QDir::Filter::Dirs |
|
skin_directories.append(QDir(customSkinBaseFolder())
|
||||||
QDir::Filter::NoDotAndDotDot |
|
.entryList(QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot | QDir::Filter::Readable));
|
||||||
QDir::Filter::Readable));
|
|
||||||
|
|
||||||
for (const QString& base_directory : skin_directories) {
|
for (const QString& base_directory : skin_directories) {
|
||||||
const Skin skin_info = skinInfo(base_directory, &skin_load_ok);
|
const Skin skin_info = skinInfo(base_directory, &skin_load_ok);
|
||||||
|
@ -429,8 +426,7 @@ uint qHash(const SkinEnums::PaletteColors& key) {
|
||||||
|
|
||||||
QVariant Skin::colorForModel(SkinEnums::PaletteColors type, bool ignore_custom_colors) const {
|
QVariant Skin::colorForModel(SkinEnums::PaletteColors type, bool ignore_custom_colors) const {
|
||||||
if (!ignore_custom_colors) {
|
if (!ignore_custom_colors) {
|
||||||
bool enabled = qApp->settings()->value(GROUP(CustomSkinColors),
|
bool enabled = qApp->settings()->value(GROUP(CustomSkinColors), SETTING(CustomSkinColors::Enabled)).toBool();
|
||||||
SETTING(CustomSkinColors::Enabled)).toBool();
|
|
||||||
|
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
const QMetaObject& mo = SkinEnums::staticMetaObject;
|
const QMetaObject& mo = SkinEnums::staticMetaObject;
|
||||||
|
@ -443,9 +439,7 @@ QVariant Skin::colorForModel(SkinEnums::PaletteColors type, bool ignore_custom_c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_colorPalette.contains(type)
|
return m_colorPalette.contains(type) ? m_colorPalette[type] : QVariant();
|
||||||
? m_colorPalette[type]
|
|
||||||
: QVariant();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QPalette Skin::extractPalette() const {
|
QPalette Skin::extractPalette() const {
|
||||||
|
@ -480,7 +474,8 @@ QString SkinEnums::palleteColorText(PaletteColors col) {
|
||||||
return QObject::tr("interesting stuff");
|
return QObject::tr("interesting stuff");
|
||||||
|
|
||||||
case SkinEnums::PaletteColors::FgSelectedInteresting:
|
case SkinEnums::PaletteColors::FgSelectedInteresting:
|
||||||
return QObject::tr("interesting stuff (highlighted)");;
|
return QObject::tr("interesting stuff (highlighted)");
|
||||||
|
;
|
||||||
|
|
||||||
case SkinEnums::PaletteColors::FgError:
|
case SkinEnums::PaletteColors::FgError:
|
||||||
return QObject::tr("errored items");
|
return QObject::tr("errored items");
|
||||||
|
|
Loading…
Add table
Reference in a new issue