try to fix #697 upstream
This commit is contained in:
parent
3ccce27dd5
commit
ac1b88b481
@ -53,7 +53,8 @@
|
||||
|
||||
FormMain::FormMain(QWidget* parent, Qt::WindowFlags f)
|
||||
: 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);
|
||||
qApp->setMainForm(this);
|
||||
@ -148,10 +149,10 @@ void FormMain::showDbCleanupAssistant() {
|
||||
qApp->feedReader()->feedsModel()->reloadCountsOfWholeModel();
|
||||
}
|
||||
else {
|
||||
qApp->showGuiMessage(Notification::Event::GeneralEvent, {
|
||||
tr("Cannot cleanup database"),
|
||||
tr("Cannot cleanup database, because another critical action is running."),
|
||||
QSystemTrayIcon::MessageIcon::Warning });
|
||||
qApp->showGuiMessage(Notification::Event::GeneralEvent,
|
||||
{tr("Cannot cleanup database"),
|
||||
tr("Cannot cleanup database, because another critical action is running."),
|
||||
QSystemTrayIcon::MessageIcon::Warning});
|
||||
}
|
||||
}
|
||||
|
||||
@ -298,25 +299,21 @@ void FormMain::updateAddItemMenu() {
|
||||
QList<QAction*> specific_root_actions = activated_root->addItemMenu();
|
||||
|
||||
if (activated_root->supportsCategoryAdding()) {
|
||||
QAction* action_new_category = new QAction(qApp->icons()->fromTheme(QSL("folder")),
|
||||
tr("Add new category"),
|
||||
m_ui->m_menuAddItem);
|
||||
QAction* action_new_category =
|
||||
new QAction(qApp->icons()->fromTheme(QSL("folder")), tr("Add new category"), m_ui->m_menuAddItem);
|
||||
|
||||
root_menu->addAction(action_new_category);
|
||||
connect(action_new_category, &QAction::triggered,
|
||||
activated_root, [activated_root]() {
|
||||
connect(action_new_category, &QAction::triggered, activated_root, [activated_root]() {
|
||||
activated_root->addNewCategory(activated_root);
|
||||
});
|
||||
}
|
||||
|
||||
if (activated_root->supportsFeedAdding()) {
|
||||
QAction* action_new_feed = new QAction(qApp->icons()->fromTheme(QSL("application-rss+xml")),
|
||||
tr("Add new feed"),
|
||||
m_ui->m_menuAddItem);
|
||||
QAction* action_new_feed =
|
||||
new QAction(qApp->icons()->fromTheme(QSL("application-rss+xml")), tr("Add new feed"), m_ui->m_menuAddItem);
|
||||
|
||||
root_menu->addAction(action_new_feed);
|
||||
connect(action_new_feed, &QAction::triggered,
|
||||
activated_root, [activated_root]() {
|
||||
connect(action_new_feed, &QAction::triggered, activated_root, [activated_root]() {
|
||||
activated_root->addNewFeed(activated_root);
|
||||
});
|
||||
}
|
||||
@ -356,17 +353,15 @@ void FormMain::updateRecycleBinMenu() {
|
||||
QList<QAction*> context_menu;
|
||||
|
||||
if (bin == nullptr) {
|
||||
QAction* no_action = new QAction(qApp->icons()->fromTheme(QSL("dialog-error")),
|
||||
tr("No recycle bin"),
|
||||
m_ui->m_menuRecycleBin);
|
||||
QAction* no_action =
|
||||
new QAction(qApp->icons()->fromTheme(QSL("dialog-error")), tr("No recycle bin"), m_ui->m_menuRecycleBin);
|
||||
|
||||
no_action->setEnabled(false);
|
||||
root_menu->addAction(no_action);
|
||||
}
|
||||
else if ((context_menu = bin->contextMenuFeedsList()).isEmpty()) {
|
||||
QAction* no_action = new QAction(qApp->icons()->fromTheme(QSL("dialog-error")),
|
||||
tr("No actions possible"),
|
||||
m_ui->m_menuRecycleBin);
|
||||
QAction* no_action =
|
||||
new QAction(qApp->icons()->fromTheme(QSL("dialog-error")), tr("No actions possible"), m_ui->m_menuRecycleBin);
|
||||
|
||||
no_action->setEnabled(false);
|
||||
root_menu->addAction(no_action);
|
||||
@ -399,9 +394,8 @@ void FormMain::updateAccountsMenu() {
|
||||
QList<QAction*> root_actions = activated_root->serviceMenu();
|
||||
|
||||
if (root_actions.isEmpty()) {
|
||||
QAction* no_action = new QAction(qApp->icons()->fromTheme(QSL("dialog-error")),
|
||||
tr("No possible actions"),
|
||||
m_ui->m_menuAccounts);
|
||||
QAction* no_action =
|
||||
new QAction(qApp->icons()->fromTheme(QSL("dialog-error")), tr("No possible actions"), m_ui->m_menuAccounts);
|
||||
|
||||
no_action->setEnabled(false);
|
||||
root_menu->addAction(no_action);
|
||||
@ -440,15 +434,17 @@ void FormMain::onFeedUpdatesStarted() {
|
||||
}
|
||||
|
||||
void FormMain::onFeedUpdatesProgress(const Feed* feed, int current, int total) {
|
||||
statusBar()->showProgressFeeds(int((current * 100.0) / total),
|
||||
feed->sanitizedTitle());
|
||||
statusBar()->showProgressFeeds(int((current * 100.0) / total), feed->sanitizedTitle());
|
||||
}
|
||||
|
||||
void FormMain::updateMessageButtonsAvailability() {
|
||||
const bool one_message_selected = tabWidget()->feedMessageViewer()->messagesView()->selectionModel()->selectedRows().size() == 1;
|
||||
const bool atleast_one_message_selected = !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;
|
||||
const bool one_message_selected =
|
||||
tabWidget()->feedMessageViewer()->messagesView()->selectionModel()->selectedRows().size() == 1;
|
||||
const bool atleast_one_message_selected =
|
||||
!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_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_actionUpdateAllItems->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_actionExpandCollapseItem->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_menuRecycleBin->setEnabled(!critical_action_running);
|
||||
|
||||
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_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_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_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));
|
||||
}
|
||||
|
||||
void FormMain::switchVisibility(bool force_hide) {
|
||||
@ -506,10 +504,10 @@ void FormMain::switchVisibility(bool force_hide) {
|
||||
if (SystemTrayIcon::isSystemTrayDesired() && SystemTrayIcon::isSystemTrayAreaAvailable()) {
|
||||
|
||||
if (QApplication::activeModalWidget() != nullptr) {
|
||||
qApp->showGuiMessage(Notification::Event::GeneralEvent, {
|
||||
tr("Close dialogs"),
|
||||
tr("Close opened modal dialogs first."),
|
||||
QSystemTrayIcon::MessageIcon::Warning });
|
||||
qApp->showGuiMessage(Notification::Event::GeneralEvent,
|
||||
{tr("Close dialogs"),
|
||||
tr("Close opened modal dialogs first."),
|
||||
QSystemTrayIcon::MessageIcon::Warning});
|
||||
}
|
||||
else {
|
||||
hide();
|
||||
@ -572,7 +570,8 @@ void FormMain::setupIcons() {
|
||||
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_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_actionClearAllItems->setIcon(icon_theme_factory->fromTheme(QSL("mail-mark-junk")));
|
||||
m_ui->m_actionDeleteSelectedItem->setIcon(icon_theme_factory->fromTheme(QSL("list-remove")));
|
||||
@ -654,7 +653,8 @@ void FormMain::loadSize() {
|
||||
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,
|
||||
// then re-enable it now.
|
||||
@ -669,20 +669,20 @@ void FormMain::loadSize() {
|
||||
m_ui->m_tabWidget->feedMessageViewer()->loadSize();
|
||||
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_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());
|
||||
|
||||
// Other startup GUI-related settings.
|
||||
m_ui->m_actionSortFeedsAlphabetically->setChecked(settings->value(GROUP(Feeds),
|
||||
SETTING(Feeds::SortAlphabetically)).toBool());
|
||||
m_ui->m_actionShowOnlyUnreadItems->setChecked(settings->value(GROUP(Feeds),
|
||||
SETTING(Feeds::ShowOnlyUnreadFeeds)).toBool());
|
||||
m_ui->m_actionShowTreeBranches->setChecked(settings->value(GROUP(Feeds),
|
||||
SETTING(Feeds::ShowTreeBranches)).toBool());
|
||||
m_ui->m_actionAutoExpandItemsWhenSelected->setChecked(settings->value(GROUP(Feeds),
|
||||
SETTING(Feeds::AutoExpandOnSelection)).toBool());
|
||||
m_ui->m_actionAlternateColorsInLists->setChecked(settings->value(GROUP(GUI),
|
||||
SETTING(GUI::AlternateRowColorsInLists)).toBool());
|
||||
m_ui->m_actionSortFeedsAlphabetically
|
||||
->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::SortAlphabetically)).toBool());
|
||||
m_ui->m_actionShowOnlyUnreadItems
|
||||
->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::ShowOnlyUnreadFeeds)).toBool());
|
||||
m_ui->m_actionShowTreeBranches->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::ShowTreeBranches)).toBool());
|
||||
m_ui->m_actionAutoExpandItemsWhenSelected
|
||||
->setChecked(settings->value(GROUP(Feeds), SETTING(Feeds::AutoExpandOnSelection)).toBool());
|
||||
m_ui->m_actionAlternateColorsInLists
|
||||
->setChecked(settings->value(GROUP(GUI), SETTING(GUI::AlternateRowColorsInLists)).toBool());
|
||||
}
|
||||
|
||||
void FormMain::saveSize() {
|
||||
@ -734,8 +734,10 @@ void FormMain::createConnections() {
|
||||
connect(m_ui->m_actionRestart, &QAction::triggered, qApp, &Application::restart);
|
||||
|
||||
// Menu "View" connections.
|
||||
connect(m_ui->m_actionSwitchFeedsList, &QAction::toggled,
|
||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::switchFeedComponentVisibility);
|
||||
connect(m_ui->m_actionSwitchFeedsList,
|
||||
&QAction::toggled,
|
||||
tabWidget()->feedMessageViewer(),
|
||||
&FeedMessageViewer::switchFeedComponentVisibility);
|
||||
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_actionSwitchMainWindow, &QAction::triggered, this, &FormMain::switchVisibility);
|
||||
@ -765,131 +767,228 @@ void FormMain::createConnections() {
|
||||
// Tab widget connections.
|
||||
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_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_actionTabsCloseCurrent, &QAction::triggered, m_ui->m_tabWidget, &TabWidget::closeCurrentTab);
|
||||
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::unlocked, this, &FormMain::updateFeedButtonsAvailability);
|
||||
connect(tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::currentMessageRemoved,
|
||||
this, &FormMain::updateMessageButtonsAvailability);
|
||||
connect(tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::currentMessageChanged,
|
||||
this, &FormMain::updateMessageButtonsAvailability);
|
||||
connect(tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::currentMessageRemoved,
|
||||
this,
|
||||
&FormMain::updateMessageButtonsAvailability);
|
||||
connect(tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::currentMessageChanged,
|
||||
this,
|
||||
&FormMain::updateMessageButtonsAvailability);
|
||||
connect(tabWidget(), &TabWidget::currentChanged, this, &FormMain::updateTabsButtonsAvailability);
|
||||
connect(qApp->feedReader(), &FeedReader::feedUpdatesStarted, this, &FormMain::onFeedUpdatesStarted);
|
||||
connect(qApp->feedReader(), &FeedReader::feedUpdatesProgress, this, &FormMain::onFeedUpdatesProgress);
|
||||
connect(qApp->feedReader(), &FeedReader::feedUpdatesFinished, this, &FormMain::onFeedUpdatesFinished);
|
||||
|
||||
// Toolbar forwardings.
|
||||
connect(m_ui->m_actionAddFeedIntoSelectedItem, &QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::addFeedIntoSelectedAccount);
|
||||
connect(m_ui->m_actionAddCategoryIntoSelectedItem, &QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::addCategoryIntoSelectedAccount);
|
||||
connect(m_ui->m_actionAddFeedIntoSelectedItem,
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::addFeedIntoSelectedAccount);
|
||||
connect(m_ui->m_actionAddCategoryIntoSelectedItem,
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::addCategoryIntoSelectedAccount);
|
||||
connect(m_ui->m_actionSwitchImportanceOfSelectedMessages,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::switchSelectedMessagesImportance);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::switchSelectedMessagesImportance);
|
||||
connect(m_ui->m_actionDeleteSelectedMessages,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::deleteSelectedMessages);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::deleteSelectedMessages);
|
||||
connect(m_ui->m_actionMarkSelectedMessagesAsRead,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::markSelectedMessagesRead);
|
||||
connect(m_ui->m_actionMarkSelectedMessagesAsUnread, &QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::markSelectedMessagesUnread);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::markSelectedMessagesRead);
|
||||
connect(m_ui->m_actionMarkSelectedMessagesAsUnread,
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::markSelectedMessagesUnread);
|
||||
connect(m_ui->m_actionOpenSelectedSourceArticlesExternally,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::openSelectedSourceMessagesExternally);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::openSelectedSourceMessagesExternally);
|
||||
connect(m_ui->m_actionOpenSelectedMessagesInternally,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::openSelectedMessagesInternally);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::openSelectedMessagesInternally);
|
||||
|
||||
connect(m_ui->m_actionOpenSelectedMessagesInternallyNoTab,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::openSelectedMessageUrl);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::openSelectedMessageUrl);
|
||||
|
||||
connect(m_ui->m_actionSendMessageViaEmail,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::sendSelectedMessageViaEmail);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::sendSelectedMessageViaEmail);
|
||||
connect(m_ui->m_actionMarkAllItemsRead,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::markAllItemsRead);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::markAllItemsRead);
|
||||
connect(m_ui->m_actionMarkSelectedItemsAsRead,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::markSelectedItemRead);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::markSelectedItemRead);
|
||||
connect(m_ui->m_actionExpandCollapseItem,
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
[this]() {
|
||||
tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(false);
|
||||
});
|
||||
tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(false);
|
||||
});
|
||||
connect(m_ui->m_actionExpandCollapseItemRecursively,
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
[this]() {
|
||||
tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(true);
|
||||
});
|
||||
tabWidget()->feedMessageViewer()->feedsView()->expandCollapseCurrentItem(true);
|
||||
});
|
||||
connect(m_ui->m_actionMarkSelectedItemsAsUnread,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::markSelectedItemUnread);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::markSelectedItemUnread);
|
||||
connect(m_ui->m_actionClearSelectedItems,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::clearSelectedFeeds);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::clearSelectedFeeds);
|
||||
connect(m_ui->m_actionClearAllItems,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::clearAllFeeds);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::clearAllFeeds);
|
||||
connect(m_ui->m_actionUpdateSelectedItems,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::updateSelectedItems);
|
||||
connect(m_ui->m_actionUpdateAllItems,
|
||||
&QAction::triggered, qApp->feedReader(), &FeedReader::updateAllFeeds);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::updateSelectedItems);
|
||||
connect(m_ui->m_actionUpdateAllItems, &QAction::triggered, qApp->feedReader(), &FeedReader::updateAllFeeds);
|
||||
connect(m_ui->m_actionUpdateSelectedItemsWithCustomTimers,
|
||||
&QAction::triggered, qApp->feedReader(), &FeedReader::updateManuallyIntervaledFeeds);
|
||||
&QAction::triggered,
|
||||
qApp->feedReader(),
|
||||
&FeedReader::updateManuallyIntervaledFeeds);
|
||||
connect(m_ui->m_actionStopRunningItemsUpdate,
|
||||
&QAction::triggered, qApp->feedReader(), &FeedReader::stopRunningFeedUpdate);
|
||||
&QAction::triggered,
|
||||
qApp->feedReader(),
|
||||
&FeedReader::stopRunningFeedUpdate);
|
||||
connect(m_ui->m_actionCopyUrlSelectedFeed,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::copyUrlOfSelectedFeeds);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::copyUrlOfSelectedFeeds);
|
||||
connect(m_ui->m_actionCopyUrlSelectedArticles,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::copyUrlOfSelectedArticles);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::copyUrlOfSelectedArticles);
|
||||
connect(m_ui->m_actionEditSelectedItem,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::editSelectedItem);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::editSelectedItem);
|
||||
connect(m_ui->m_actionViewSelectedItemsNewspaperMode,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::openSelectedItemsInNewspaperMode);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::openSelectedItemsInNewspaperMode);
|
||||
connect(m_ui->m_actionDeleteSelectedItem,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::deleteSelectedItem);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::deleteSelectedItem);
|
||||
connect(m_ui->m_actionSelectNextItem,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::selectNextItem);
|
||||
connect(m_ui->m_actionSwitchToolBars, &QAction::toggled,
|
||||
tabWidget()->feedMessageViewer(), &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);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::selectNextItem);
|
||||
connect(m_ui->m_actionSwitchToolBars,
|
||||
&QAction::toggled,
|
||||
tabWidget()->feedMessageViewer(),
|
||||
&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,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::selectPreviousItem);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::selectPreviousItem);
|
||||
connect(m_ui->m_actionSelectNextMessage,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::selectNextItem);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::selectNextItem);
|
||||
connect(m_ui->m_actionSelectNextUnreadMessage,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::selectNextUnreadItem);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::selectNextUnreadItem);
|
||||
connect(m_ui->m_actionSelectPreviousMessage,
|
||||
&QAction::triggered, tabWidget()->feedMessageViewer()->messagesView(), &MessagesView::selectPreviousItem);
|
||||
connect(m_ui->m_actionSwitchMessageListOrientation, &QAction::triggered,
|
||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::switchMessageSplitterOrientation);
|
||||
connect(m_ui->m_actionShowOnlyUnreadItems, &QAction::toggled,
|
||||
tabWidget()->feedMessageViewer(), &FeedMessageViewer::toggleShowOnlyUnreadFeeds);
|
||||
connect(m_ui->m_actionSortFeedsAlphabetically, &QAction::toggled,
|
||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::toggleFeedSortingMode);
|
||||
connect(m_ui->m_actionShowTreeBranches, &QAction::toggled,
|
||||
tabWidget()->feedMessageViewer(), &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);
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->messagesView(),
|
||||
&MessagesView::selectPreviousItem);
|
||||
connect(m_ui->m_actionSwitchMessageListOrientation,
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer(),
|
||||
&FeedMessageViewer::switchMessageSplitterOrientation);
|
||||
connect(m_ui->m_actionShowOnlyUnreadItems,
|
||||
&QAction::toggled,
|
||||
tabWidget()->feedMessageViewer(),
|
||||
&FeedMessageViewer::toggleShowOnlyUnreadFeeds);
|
||||
connect(m_ui->m_actionSortFeedsAlphabetically,
|
||||
&QAction::toggled,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::toggleFeedSortingMode);
|
||||
connect(m_ui->m_actionShowTreeBranches,
|
||||
&QAction::toggled,
|
||||
tabWidget()->feedMessageViewer(),
|
||||
&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]() {
|
||||
qApp->feedReader()->showMessageFiltersManager();
|
||||
tabWidget()->feedMessageViewer()->messagesView()->reloadSelections();
|
||||
});
|
||||
connect(m_ui->m_actionFeedMoveUp, &QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(), &FeedsView::moveSelectedItemUp);
|
||||
connect(m_ui->m_actionFeedMoveDown, &QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(), &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);
|
||||
connect(m_ui->m_actionFeedMoveUp,
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&FeedsView::moveSelectedItemUp);
|
||||
connect(m_ui->m_actionFeedMoveDown,
|
||||
&QAction::triggered,
|
||||
tabWidget()->feedMessageViewer()->feedsView(),
|
||||
&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() {
|
||||
@ -912,8 +1011,7 @@ void FormMain::changeEvent(QEvent* event) {
|
||||
switch (event->type()) {
|
||||
case QEvent::Type::WindowStateChange: {
|
||||
if ((windowState() & Qt::WindowState::WindowMinimized) == Qt::WindowState::WindowMinimized &&
|
||||
SystemTrayIcon::isSystemTrayDesired() &&
|
||||
SystemTrayIcon::isSystemTrayAreaAvailable() &&
|
||||
SystemTrayIcon::isSystemTrayDesired() && SystemTrayIcon::isSystemTrayAreaAvailable() &&
|
||||
qApp->settings()->value(GROUP(GUI), SETTING(GUI::HideMainWindowWhenMinimized)).toBool()) {
|
||||
event->ignore();
|
||||
QTimer::singleShot(CHANGE_EVENT_DELAY, this, [this]() {
|
||||
|
@ -24,17 +24,20 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent
|
||||
|
||||
initializeMessageDateFormats();
|
||||
|
||||
m_ui->m_helpCountsFeedsFormat->setHelpText(tr("Enter format for count of articles displayed next to each "
|
||||
"feed/category in feed list. Use \"%all\" and \"%unread\" strings "
|
||||
"which are placeholders for the actual count of all (or unread) articles."),
|
||||
false);
|
||||
m_ui->m_helpCountsFeedsFormat
|
||||
->setHelpText(tr("Enter format for count of articles displayed next to each "
|
||||
"feed/category in feed list. Use \"%all\" and \"%unread\" strings "
|
||||
"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 "
|
||||
"performance of article list with big number of articles."),
|
||||
true);
|
||||
|
||||
connect(m_ui->m_cbShowEnclosuresDirectly, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_spinHeightImageAttachments, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this, &SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_spinHeightImageAttachments,
|
||||
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this,
|
||||
&SettingsFeedsMessages::dirtifySettings);
|
||||
|
||||
connect(m_ui->m_spinRelativeArticleTime, QOverload<int>::of(&QSpinBox::valueChanged), this, [=](int value) {
|
||||
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_cmbIgnoreContentsChanges, &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_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, m_ui->m_cmbMessagesTimeFormat, &QComboBox::setEnabled);
|
||||
|
||||
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_spinAutoUpdateInterval, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
|
||||
this, &SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_spinStartupUpdateDelay, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
|
||||
this, &SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_spinAutoUpdateInterval,
|
||||
static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
|
||||
this,
|
||||
&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),
|
||||
this, &SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_spinHeightRowsMessages, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this, &SettingsFeedsMessages::requireRestart);
|
||||
connect(m_ui->m_spinHeightRowsMessages,
|
||||
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this,
|
||||
&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),
|
||||
this, &SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_spinHeightRowsFeeds, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this, &SettingsFeedsMessages::requireRestart);
|
||||
connect(m_ui->m_spinHeightRowsFeeds,
|
||||
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this,
|
||||
&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),
|
||||
this, &SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_spinPaddingRowsMessages, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this, &SettingsFeedsMessages::requireRestart);
|
||||
connect(m_ui->m_spinPaddingRowsMessages,
|
||||
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this,
|
||||
&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),
|
||||
this, &SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_spinRelativeArticleTime,
|
||||
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_checkUpdateAllFeedsOnStartup, &QCheckBox::toggled, m_ui->m_spinStartupUpdateDelay, &TimeSpinBox::setEnabled);
|
||||
connect(m_ui->m_spinFeedUpdateTimeout, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,
|
||||
connect(m_ui->m_checkUpdateAllFeedsOnStartup,
|
||||
&QCheckBox::toggled,
|
||||
m_ui->m_spinStartupUpdateDelay,
|
||||
&TimeSpinBox::setEnabled);
|
||||
connect(m_ui->m_spinFeedUpdateTimeout,
|
||||
static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this,
|
||||
&SettingsFeedsMessages::dirtifySettings);
|
||||
|
||||
connect(m_ui->m_cmbMessagesDateTimeFormat, &QComboBox::currentTextChanged, this,
|
||||
&SettingsFeedsMessages::dirtifySettings);
|
||||
connect(m_ui->m_cmbMessagesTimeFormat, &QComboBox::currentTextChanged, this,
|
||||
connect(m_ui->m_cmbMessagesDateTimeFormat,
|
||||
&QComboBox::currentTextChanged,
|
||||
this,
|
||||
&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_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);
|
||||
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::requireRestart);
|
||||
|
||||
connect(m_ui->m_cmbMessagesDateTimeFormat, &QComboBox::currentTextChanged,
|
||||
this, &SettingsFeedsMessages::updateDateTimeTooltip);
|
||||
connect(m_ui->m_cmbMessagesTimeFormat, &QComboBox::currentTextChanged,
|
||||
this, &SettingsFeedsMessages::updateDateTimeTooltip);
|
||||
connect(m_ui->m_cmbMessagesDateTimeFormat,
|
||||
&QComboBox::currentTextChanged,
|
||||
this,
|
||||
&SettingsFeedsMessages::updateDateTimeTooltip);
|
||||
connect(m_ui->m_cmbMessagesTimeFormat,
|
||||
&QComboBox::currentTextChanged,
|
||||
this,
|
||||
&SettingsFeedsMessages::updateDateTimeTooltip);
|
||||
|
||||
emit m_ui->m_cmbMessagesDateTimeFormat->currentTextChanged({});
|
||||
emit m_ui->m_cmbMessagesTimeFormat->currentTextChanged({});
|
||||
@ -153,9 +201,7 @@ void SettingsFeedsMessages::initializeMessageDateFormats() {
|
||||
|
||||
void SettingsFeedsMessages::changeFont(QLabel& lbl) {
|
||||
bool ok;
|
||||
QFont new_font = QFontDialog::getFont(&ok, lbl.font(),
|
||||
this, tr("Select new font"),
|
||||
QFontDialog::DontUseNativeDialog);
|
||||
QFont new_font = QFontDialog::getFont(&ok, lbl.font(), this, tr("Select new font"), QFontDialog::DontUseNativeDialog);
|
||||
|
||||
if (ok) {
|
||||
lbl.setFont(new_font);
|
||||
@ -166,70 +212,82 @@ void SettingsFeedsMessages::changeFont(QLabel& lbl) {
|
||||
void SettingsFeedsMessages::loadSettings() {
|
||||
onBeginLoadSettings();
|
||||
|
||||
m_ui->m_spinRelativeArticleTime->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_spinRelativeArticleTime
|
||||
->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_spinHeightRowsFeeds->setValue(settings()->value(GROUP(GUI), SETTING(GUI::HeightRowFeeds)).toInt());
|
||||
|
||||
m_ui->m_cbListsRestrictedShortcuts->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_checkDisplayFeedIcons->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::DisplayFeedIconsInList)).toBool());
|
||||
m_ui->m_checkBringToForegroundAfterMsgOpened->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_cbListsRestrictedShortcuts
|
||||
->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_checkDisplayFeedIcons
|
||||
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::DisplayFeedIconsInList)).toBool());
|
||||
m_ui->m_checkBringToForegroundAfterMsgOpened
|
||||
->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_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_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_spinStartupUpdateDelay->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_checkUpdateAllFeedsOnStartup
|
||||
->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::FeedsUpdateOnStartup)).toBool());
|
||||
m_ui->m_spinStartupUpdateDelay
|
||||
->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_checkShowTooltips->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::EnableTooltipsFeedsMessages)).toBool());
|
||||
m_ui->m_cmbIgnoreContentsChanges->setChecked(settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::IgnoreContentsChanges)).toBool());
|
||||
m_ui->m_checkMultilineArticleList->setChecked(settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::MultilineArticleList)).toBool());
|
||||
m_ui->m_checkShowTooltips
|
||||
->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::EnableTooltipsFeedsMessages)).toBool());
|
||||
m_ui->m_cmbIgnoreContentsChanges
|
||||
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::IgnoreContentsChanges)).toBool());
|
||||
m_ui->m_checkMultilineArticleList
|
||||
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::MultilineArticleList)).toBool());
|
||||
|
||||
m_ui->m_spinHeightImageAttachments->setValue(settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::MessageHeadImageHeight)).toInt());
|
||||
m_ui->m_cbShowEnclosuresDirectly->setChecked(settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::DisplayEnclosuresInMessage)).toBool());
|
||||
m_ui->m_spinHeightImageAttachments
|
||||
->setValue(settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toInt());
|
||||
m_ui->m_cbShowEnclosuresDirectly
|
||||
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::DisplayEnclosuresInMessage)).toBool());
|
||||
|
||||
m_ui->m_cbFixupArticleDatetime->setChecked(settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::FixupFutureArticleDateTimes)).toBool());
|
||||
m_ui->m_cbFixupArticleDatetime
|
||||
->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_cmbMessagesDateTimeFormat->setCurrentText(settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::CustomDateFormat)).toString());
|
||||
m_ui->m_checkMessagesDateTimeFormat
|
||||
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::UseCustomDate)).toBool());
|
||||
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_cmbMessagesTimeFormat->setCurrentText(settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::CustomTimeFormat)).toString());
|
||||
m_ui->m_checkMessagesTimeFormat
|
||||
->setChecked(settings()->value(GROUP(Messages), SETTING(Messages::UseCustomTime)).toBool());
|
||||
m_ui->m_cmbMessagesTimeFormat
|
||||
->setCurrentText(settings()->value(GROUP(Messages), SETTING(Messages::CustomTimeFormat)).toString());
|
||||
|
||||
QFont fon;
|
||||
|
||||
fon.fromString(settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::PreviewerFontStandard)).toString());
|
||||
fon.fromString(settings()->value(GROUP(Messages), SETTING(Messages::PreviewerFontStandard)).toString());
|
||||
m_ui->m_lblMessagesFont->setFont(fon);
|
||||
|
||||
QFont fon2;
|
||||
|
||||
// Keep in sync with void MessagesModel::setupFonts().
|
||||
fon2.fromString(settings()->value(GROUP(Messages),
|
||||
Messages::ListFont,
|
||||
Application::font("MessagesView").toString()).toString());
|
||||
fon2.fromString(settings()
|
||||
->value(GROUP(Messages), Messages::ListFont, Application::font("MessagesView").toString())
|
||||
.toString());
|
||||
m_ui->m_lblMessageListFont->setFont(fon2);
|
||||
|
||||
QFont fon3;
|
||||
|
||||
// Keep in sync with void FeedsModel::setupFonts().
|
||||
fon3.fromString(settings()->value(GROUP(Feeds),
|
||||
Feeds::ListFont,
|
||||
Application::font("FeedsView").toString()).toString());
|
||||
fon3
|
||||
.fromString(settings()->value(GROUP(Feeds), Feeds::ListFont, Application::font("FeedsView").toString()).toString());
|
||||
m_ui->m_lblFeedListFont->setFont(fon3);
|
||||
|
||||
onEndLoadSettings();
|
||||
@ -238,19 +296,23 @@ void SettingsFeedsMessages::loadSettings() {
|
||||
void SettingsFeedsMessages::saveSettings() {
|
||||
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(GUI), GUI::HeightRowMessages, m_ui->m_spinHeightRowsMessages->value());
|
||||
settings()->setValue(GROUP(GUI), GUI::HeightRowFeeds, m_ui->m_spinHeightRowsFeeds->value());
|
||||
|
||||
settings()->setValue(GROUP(Feeds), Feeds::OnlyBasicShortcutsInLists,
|
||||
m_ui->m_cbListsRestrictedShortcuts->isChecked());
|
||||
settings()->setValue(GROUP(Feeds), Feeds::OnlyBasicShortcutsInLists, m_ui->m_cbListsRestrictedShortcuts->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::BringAppToFrontAfterMessageOpenedExternally,
|
||||
settings()->setValue(GROUP(Messages),
|
||||
Messages::BringAppToFrontAfterMessageOpenedExternally,
|
||||
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(Feeds), Feeds::AutoUpdateEnabled, m_ui->m_checkAutoUpdate->isChecked());
|
||||
settings()->setValue(GROUP(Feeds), Feeds::AutoUpdateOnlyUnfocused, m_ui->m_checkAutoUpdateOnlyUnfocused->isChecked());
|
||||
@ -267,7 +329,9 @@ void SettingsFeedsMessages::saveSettings() {
|
||||
Messages::DisplayEnclosuresInMessage,
|
||||
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::UseCustomTime, m_ui->m_checkMessagesTimeFormat->isChecked());
|
||||
|
@ -330,14 +330,14 @@
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QSpinBox" name="m_spinHeightImageAttachments">
|
||||
<property name="suffix">
|
||||
<string notr="true"> px</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>22</number>
|
||||
<number>-1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1000</number>
|
||||
<number>4000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>-1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</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));
|
||||
}
|
||||
|
||||
/*if (qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayImagePlaceholders)).toBool()) {
|
||||
html += message.m_contents;
|
||||
}
|
||||
else {*/
|
||||
QString cnts = message.m_contents;
|
||||
|
||||
html += cnts;
|
||||
// html += cnts.replace(imgTagRegex, QString());
|
||||
|
||||
//}
|
||||
auto forced_img_size = qApp->settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toInt();
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
@ -347,13 +344,13 @@ void TextBrowserViewer::reloadWithImages() {
|
||||
m_document.data()->m_reloadingWithResources = true;
|
||||
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)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
QEventLoop loop;
|
||||
|
||||
connect(m_downloader.data(), &Downloader::completed, &loop, &QEventLoop::quit);
|
||||
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) {
|
||||
m_document.data()->m_reloadingWithResources = false;
|
||||
m_document.data()->m_loadedResources.clear();
|
||||
m_document.data()->m_resourcesForHtml.clear();
|
||||
m_document.data()->m_neededResourcesForHtml.clear();
|
||||
|
||||
setHtmlPrivate(html, base_url);
|
||||
|
||||
@ -433,7 +430,7 @@ void TextBrowserViewer::setHtmlPrivate(const QString& html, const QUrl& base_url
|
||||
m_currentUrl = base_url;
|
||||
|
||||
if (!m_document.data()->m_reloadingWithResources) {
|
||||
m_document.data()->m_resourcesForHtml.clear();
|
||||
m_document.data()->m_neededResourcesForHtml.clear();
|
||||
}
|
||||
|
||||
QTextBrowser::setHtml(html);
|
||||
@ -448,8 +445,8 @@ TextBrowserDocument::TextBrowserDocument(QObject* parent) : QTextDocument(parent
|
||||
|
||||
QVariant TextBrowserDocument::loadResource(int type, const QUrl& name) {
|
||||
if (!m_reloadingWithResources) {
|
||||
if (type == QTextDocument::ResourceType::ImageResource && !m_resourcesForHtml.contains(name)) {
|
||||
m_resourcesForHtml.append(name);
|
||||
if (type == QTextDocument::ResourceType::ImageResource && !m_neededResourcesForHtml.contains(name)) {
|
||||
m_neededResourcesForHtml.append(name);
|
||||
}
|
||||
|
||||
return {};
|
||||
|
@ -29,7 +29,7 @@ class TextBrowserDocument : public QTextDocument {
|
||||
|
||||
private:
|
||||
bool m_reloadingWithResources;
|
||||
QList<QUrl> m_resourcesForHtml;
|
||||
QList<QUrl> m_neededResourcesForHtml;
|
||||
QMap<QUrl, QByteArray> m_loadedResources;
|
||||
};
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
SkinFactory::SkinFactory(QObject* parent) : QObject(parent), m_styleIsFrozen(false) {}
|
||||
|
||||
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;
|
||||
Skin skin_data;
|
||||
QString skin_name;
|
||||
@ -60,8 +60,7 @@ void SkinFactory::loadSkinFromData(const Skin& skin) {
|
||||
m_styleIsFrozen = false;
|
||||
|
||||
if (!skin.m_forcedStyles.isEmpty()) {
|
||||
qDebugNN << LOGSEC_GUI << "Forcing one of skin's declared styles:"
|
||||
<< QUOTE_W_SPACE_DOT(skin.m_forcedStyles);
|
||||
qDebugNN << LOGSEC_GUI << "Forcing one of skin's declared styles:" << QUOTE_W_SPACE_DOT(skin.m_forcedStyles);
|
||||
|
||||
for (const QString& skin_forced_style : skin.m_forcedStyles) {
|
||||
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.
|
||||
m_currentStyle = qApp->style()->objectName();
|
||||
|
||||
const bool use_skin_colors = skin.m_forcedSkinColors ||
|
||||
qApp->settings()->value(GROUP(GUI), SETTING(GUI::ForcedSkinColors)).toBool();
|
||||
const bool use_skin_colors =
|
||||
skin.m_forcedSkinColors || qApp->settings()->value(GROUP(GUI), SETTING(GUI::ForcedSkinColors)).toBool();
|
||||
|
||||
if (isStyleGoodForAlternativeStylePalette(m_currentStyle) &&
|
||||
!skin.m_stylePalette.isEmpty() &&
|
||||
use_skin_colors) {
|
||||
if (isStyleGoodForAlternativeStylePalette(m_currentStyle) && !skin.m_stylePalette.isEmpty() && use_skin_colors) {
|
||||
qDebugNN << LOGSEC_GUI << "Activating alternative palette.";
|
||||
|
||||
QPalette pal = skin.extractPalette();
|
||||
@ -124,9 +121,9 @@ QString SkinFactory::selectedSkinName() const {
|
||||
}
|
||||
|
||||
QString SkinFactory::adBlockedPage(const QString& url, const QString& filter) {
|
||||
const QString& adblocked = currentSkin().m_adblocked.arg(tr("This page was blocked by AdBlock"),
|
||||
tr(R"(Blocked URL: "%1"<br/>Used filter: "%2")").arg(url,
|
||||
filter));
|
||||
const QString& adblocked =
|
||||
currentSkin().m_adblocked.arg(tr("This page was blocked by AdBlock"),
|
||||
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);
|
||||
}
|
||||
@ -135,6 +132,8 @@ QPair<QString, QUrl> SkinFactory::generateHtmlOfArticles(const QList<Message>& m
|
||||
Skin skin = currentSkin();
|
||||
QString messages_layout;
|
||||
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) {
|
||||
QString enclosures;
|
||||
@ -143,46 +142,45 @@ QPair<QString, QUrl> SkinFactory::generateHtmlOfArticles(const QList<Message>& m
|
||||
for (const Enclosure& enclosure : message.m_enclosures) {
|
||||
QString enc_url = QUrl::fromPercentEncoding(enclosure.m_url.toUtf8());
|
||||
|
||||
enclosures += skin.m_enclosureMarkup.arg(enc_url,
|
||||
QSL("🧷"),
|
||||
enclosure.m_mimeType);
|
||||
enclosures += skin.m_enclosureMarkup.arg(enc_url, QSL("🧷"), enclosure.m_mimeType);
|
||||
|
||||
if (enclosure.m_mimeType.startsWith(QSL("image/")) &&
|
||||
qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayEnclosuresInMessage)).toBool()) {
|
||||
// Add thumbnail image.
|
||||
enclosure_images += skin.m_enclosureImageMarkup.arg(
|
||||
enclosure.m_url,
|
||||
enclosure.m_mimeType,
|
||||
qApp->settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toString());
|
||||
enclosure_images +=
|
||||
skin.m_enclosureImageMarkup.arg(enclosure.m_url,
|
||||
enclosure.m_mimeType,
|
||||
forced_img_size <= 0 ? QString() : QString::number(forced_img_size));
|
||||
}
|
||||
}
|
||||
|
||||
QString msg_date = qApp->settings()->value(GROUP(Messages), SETTING(Messages::UseCustomDate)).toBool()
|
||||
? message.m_created.toLocalTime().toString(qApp->settings()->value(GROUP(Messages),
|
||||
SETTING(Messages::CustomDateFormat)).toString())
|
||||
: qApp->localization()->loadedLocale().toString(message.m_created.toLocalTime(),
|
||||
QLocale::FormatType::ShortFormat);
|
||||
QString msg_date =
|
||||
qApp->settings()->value(GROUP(Messages), SETTING(Messages::UseCustomDate)).toBool()
|
||||
? message.m_created.toLocalTime()
|
||||
.toString(qApp->settings()->value(GROUP(Messages), SETTING(Messages::CustomDateFormat)).toString())
|
||||
: qApp->localization()->loadedLocale().toString(message.m_created.toLocalTime(),
|
||||
QLocale::FormatType::ShortFormat);
|
||||
|
||||
messages_layout.append(single_message_layout
|
||||
.arg(message.m_title,
|
||||
tr("Written by ") + (message.m_author.isEmpty() ?
|
||||
tr("unknown author") :
|
||||
message.m_author),
|
||||
message.m_url,
|
||||
message.m_contents,
|
||||
msg_date,
|
||||
enclosures,
|
||||
enclosure_images,
|
||||
QString::number(message.m_id)));
|
||||
messages_layout.append(single_message_layout.arg(message.m_title,
|
||||
tr("Written by ") + (message.m_author.isEmpty()
|
||||
? tr("unknown author")
|
||||
: message.m_author),
|
||||
message.m_url,
|
||||
message.m_contents,
|
||||
msg_date,
|
||||
enclosures,
|
||||
enclosure_images,
|
||||
QString::number(message.m_id)));
|
||||
}
|
||||
|
||||
QString msg_contents = skin.m_layoutMarkupWrapper.arg(messages.size() == 1
|
||||
? messages.at(0).m_title
|
||||
: tr("Newspaper view"),
|
||||
messages_layout);
|
||||
auto* feed = root->getParentServiceRoot()->getItemFromSubTree([messages](const RootItem* it) {
|
||||
return it->kind() == RootItem::Kind::Feed && it->customId() == messages.at(0).m_feedId;
|
||||
})->toFeed();
|
||||
QString msg_contents =
|
||||
skin.m_layoutMarkupWrapper.arg(messages.size() == 1 ? messages.at(0).m_title : tr("Newspaper view"),
|
||||
messages_layout);
|
||||
auto* feed = root->getParentServiceRoot()
|
||||
->getItemFromSubTree([messages](const RootItem* it) {
|
||||
return it->kind() == RootItem::Kind::Feed && it->customId() == messages.at(0).m_feedId;
|
||||
})
|
||||
->toFeed();
|
||||
QString base_url;
|
||||
|
||||
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 skin;
|
||||
const QStringList skins_root_folders = {
|
||||
APP_SKIN_PATH,
|
||||
customSkinBaseFolder()
|
||||
};
|
||||
const QStringList skins_root_folders = {APP_SKIN_PATH, customSkinBaseFolder()};
|
||||
|
||||
for (const QString& skins_root_folder : skins_root_folders) {
|
||||
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 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;
|
||||
|
||||
if (!base_skin_name.isEmpty()) {
|
||||
@ -279,17 +275,18 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||
skin.m_colorPalette = palette;
|
||||
|
||||
// Obtain alternative style palette.
|
||||
skin.m_forcedStyles = skin_node
|
||||
.namedItem(QSL("forced-styles"))
|
||||
.toElement().text().split(',',
|
||||
skin.m_forcedStyles = skin_node.namedItem(QSL("forced-styles"))
|
||||
.toElement()
|
||||
.text()
|
||||
.split(',',
|
||||
#if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
|
||||
Qt::SplitBehaviorFlags::SkipEmptyParts);
|
||||
Qt::SplitBehaviorFlags::SkipEmptyParts);
|
||||
#else
|
||||
QString::SplitBehavior::SkipEmptyParts);
|
||||
QString::SplitBehavior::SkipEmptyParts);
|
||||
#endif
|
||||
|
||||
skin.m_forcedSkinColors = skin_node.namedItem(QSL("forced-skin-colors")).toElement().text() ==
|
||||
QVariant(true).toString();
|
||||
skin.m_forcedSkinColors =
|
||||
skin_node.namedItem(QSL("forced-skin-colors")).toElement().text() == QVariant(true).toString();
|
||||
|
||||
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++) {
|
||||
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"));
|
||||
|
||||
@ -314,11 +312,12 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||
const QDomNode& color_nd = colors_of_group.at(j);
|
||||
|
||||
QColor color(color_nd.toElement().text());
|
||||
QPalette::ColorRole role = 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()));
|
||||
QPalette::ColorRole role =
|
||||
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,
|
||||
{ color, brush }));
|
||||
groups.insert(group, QPair<QPalette::ColorRole, QPair<QColor, Qt::BrushStyle>>(role, {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);
|
||||
}
|
||||
catch (...) {
|
||||
qWarningNN << "Skin"
|
||||
<< QUOTE_W_SPACE(skin_name)
|
||||
<< "does not support separated custom CSS.";
|
||||
qWarningNN << "Skin" << 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_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_adblocked = loadSkinFile(skin_folder_no_sep, QSL("html_adblocked.html"), real_base_skin_folder);
|
||||
|
||||
if (ok != nullptr) {
|
||||
*ok = !skin.m_author.isEmpty() &&
|
||||
!skin.m_version.isEmpty() &&
|
||||
!skin.m_baseName.isEmpty() &&
|
||||
*ok = !skin.m_author.isEmpty() && !skin.m_version.isEmpty() && !skin.m_baseName.isEmpty() &&
|
||||
!skin.m_layoutMarkup.isEmpty();
|
||||
}
|
||||
|
||||
@ -376,7 +373,9 @@ Skin SkinFactory::skinInfo(const QString& skin_name, bool* ok) const {
|
||||
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 base_file = QDir::toNativeSeparators(base_folder + QDir::separator() + file_name);
|
||||
QString data;
|
||||
@ -404,13 +403,11 @@ bool SkinFactory::styleIsFrozen() const {
|
||||
QList<Skin> SkinFactory::installedSkins() const {
|
||||
QList<Skin> skins;
|
||||
bool skin_load_ok;
|
||||
QStringList skin_directories = QDir(APP_SKIN_PATH).entryList(QDir::Filter::Dirs |
|
||||
QDir::Filter::NoDotAndDotDot |
|
||||
QDir::Filter::Readable);
|
||||
QStringList skin_directories =
|
||||
QDir(APP_SKIN_PATH).entryList(QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot | QDir::Filter::Readable);
|
||||
|
||||
skin_directories.append(QDir(customSkinBaseFolder()).entryList(QDir::Filter::Dirs |
|
||||
QDir::Filter::NoDotAndDotDot |
|
||||
QDir::Filter::Readable));
|
||||
skin_directories.append(QDir(customSkinBaseFolder())
|
||||
.entryList(QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot | QDir::Filter::Readable));
|
||||
|
||||
for (const QString& base_directory : skin_directories) {
|
||||
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 {
|
||||
if (!ignore_custom_colors) {
|
||||
bool enabled = qApp->settings()->value(GROUP(CustomSkinColors),
|
||||
SETTING(CustomSkinColors::Enabled)).toBool();
|
||||
bool enabled = qApp->settings()->value(GROUP(CustomSkinColors), SETTING(CustomSkinColors::Enabled)).toBool();
|
||||
|
||||
if (enabled) {
|
||||
const QMetaObject& mo = SkinEnums::staticMetaObject;
|
||||
@ -443,9 +439,7 @@ QVariant Skin::colorForModel(SkinEnums::PaletteColors type, bool ignore_custom_c
|
||||
}
|
||||
}
|
||||
|
||||
return m_colorPalette.contains(type)
|
||||
? m_colorPalette[type]
|
||||
: QVariant();
|
||||
return m_colorPalette.contains(type) ? m_colorPalette[type] : QVariant();
|
||||
}
|
||||
|
||||
QPalette Skin::extractPalette() const {
|
||||
@ -480,7 +474,8 @@ QString SkinEnums::palleteColorText(PaletteColors col) {
|
||||
return QObject::tr("interesting stuff");
|
||||
|
||||
case SkinEnums::PaletteColors::FgSelectedInteresting:
|
||||
return QObject::tr("interesting stuff (highlighted)");;
|
||||
return QObject::tr("interesting stuff (highlighted)");
|
||||
;
|
||||
|
||||
case SkinEnums::PaletteColors::FgError:
|
||||
return QObject::tr("errored items");
|
||||
|
Loading…
x
Reference in New Issue
Block a user