This commit is contained in:
Martin Rotter 2021-01-25 08:23:30 +01:00
parent 273655b1b3
commit 14fc33755b
11 changed files with 91 additions and 13 deletions

View File

@ -18,11 +18,12 @@
MessagesModel::MessagesModel(QObject* parent)
: QSqlQueryModel(parent), m_cache(new MessagesModelCache(this)), m_messageHighlighter(MessageHighlighter::NoHighlighting),
m_customDateFormat(QString()), m_selectedItem(nullptr), m_itemHeight(-1) {
m_customDateFormat(QString()), m_selectedItem(nullptr), m_itemHeight(-1), m_displayFeedIcons(false) {
setupFonts();
setupIcons();
setupHeaderData();
updateDateFormat();
updateFeedIconsDisplay();
loadMessages(nullptr);
}
@ -156,6 +157,10 @@ void MessagesModel::updateDateFormat() {
}
}
void MessagesModel::updateFeedIconsDisplay() {
m_displayFeedIcons = qApp->settings()->value(GROUP(Messages), SETTING(Messages::DisplayFeedIconsInList)).toBool();
}
void MessagesModel::reloadWholeLayout() {
emit layoutAboutToBeChanged();
emit layoutChanged();
@ -261,7 +266,9 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
return author_name.isEmpty() ? QSL("-") : author_name;
}
else if (index_column != MSG_DB_IMPORTANT_INDEX && index_column != MSG_DB_READ_INDEX && index_column != MSG_DB_HAS_ENCLOSURES) {
else if (index_column != MSG_DB_IMPORTANT_INDEX &&
index_column != MSG_DB_READ_INDEX &&
index_column != MSG_DB_HAS_ENCLOSURES) {
return QSqlQueryModel::data(idx, role);
}
else {
@ -324,10 +331,22 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
const int index_column = idx.column();
if (index_column == MSG_DB_READ_INDEX) {
QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX);
QVariant dta = m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read);
if (m_displayFeedIcons && m_selectedItem != nullptr) {
QModelIndex idx_feedid = index(idx.row(), MSG_DB_FEED_CUSTOM_ID_INDEX);
QVariant dta = m_cache->containsData(idx_feedid.row())
? m_cache->data(idx_feedid)
: QSqlQueryModel::data(idx_feedid);
QString feed_custom_id = dta.toString();
auto acc = m_selectedItem->getParentServiceRoot()->feedIconForMessage(feed_custom_id);
return dta.toInt() == 1 ? m_readIcon : m_unreadIcon;
return acc;
}
else {
QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX);
QVariant dta = m_cache->containsData(idx_read.row()) ? m_cache->data(idx_read) : QSqlQueryModel::data(idx_read);
return dta.toInt() == 1 ? m_readIcon : m_unreadIcon;
}
}
else if (index_column == MSG_DB_IMPORTANT_INDEX) {
QModelIndex idx_important = index(idx.row(), MSG_DB_IMPORTANT_INDEX);

View File

@ -55,6 +55,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer {
void setupFonts();
void updateDateFormat();
void updateFeedIconsDisplay();
void reloadWholeLayout();
// SINGLE message manipulators.
@ -99,6 +100,7 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer {
QIcon m_unreadIcon;
QIcon m_enclosuresIcon;
int m_itemHeight;
bool m_displayFeedIcons;
};
Q_DECLARE_METATYPE(MessagesModel::MessageHighlighter)

View File

@ -34,7 +34,7 @@ MessagesView::MessagesView(QWidget* parent) : QTreeView(parent), m_contextMenu(n
createConnections();
setModel(m_proxyModel);
setupAppearance();
header()->setContextMenuPolicy(Qt::CustomContextMenu);
header()->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
connect(header(), &QHeaderView::customContextMenuRequested, this, [=](const QPoint& point) {
TreeViewColumnsMenu mm(header());
mm.exec(header()->mapToGlobal(point));

View File

@ -40,6 +40,7 @@ SettingsFeedsMessages::SettingsFeedsMessages(Settings* settings, QWidget* parent
connect(m_ui->m_checkAutoUpdateNotification, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
connect(m_ui->m_checkAutoUpdate, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
connect(m_ui->m_checkAutoUpdateOnlyUnfocused, &QCheckBox::toggled, this, &SettingsFeedsMessages::dirtifySettings);
connect(m_ui->m_checkDisplayFeedIcons, &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, m_ui->m_cmbMessagesDateTimeFormat, &QComboBox::setEnabled);
@ -125,6 +126,7 @@ void SettingsFeedsMessages::loadSettings() {
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_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_checkAutoUpdateNotification->setChecked(settings()->value(GROUP(Feeds), SETTING(Feeds::EnableAutoUpdateNotification)).toBool());
@ -183,6 +185,7 @@ void SettingsFeedsMessages::saveSettings() {
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(Messages), Messages::DisplayFeedIconsInList, m_ui->m_checkDisplayFeedIcons->isChecked());
settings()->setValue(GROUP(Messages), Messages::BringAppToFrontAfterMessageOpenedExternally,
m_ui->m_checkBringToForegroundAfterMsgOpened->isChecked());
settings()->setValue(GROUP(Feeds), Feeds::EnableAutoUpdateNotification, m_ui->m_checkAutoUpdateNotification->isChecked());
@ -216,6 +219,7 @@ void SettingsFeedsMessages::saveSettings() {
qApp->feedReader()->feedsModel()->reloadWholeLayout();
qApp->feedReader()->messagesModel()->updateDateFormat();
qApp->feedReader()->messagesModel()->updateFeedIconsDisplay();
qApp->feedReader()->messagesModel()->reloadWholeLayout();
onEndSaveSettings();

View File

@ -266,21 +266,21 @@
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QCheckBox" name="m_checkBringToForegroundAfterMsgOpened">
<property name="text">
<string>Bring application window to front once message is opened in external web browser</string>
</property>
</widget>
</item>
<item row="3" column="0">
<item row="4" column="0">
<widget class="QCheckBox" name="m_checkKeppMessagesInTheMiddle">
<property name="text">
<string>Keep message selection in the middle of the message list viewport</string>
</property>
</widget>
</item>
<item row="4" column="0">
<item row="5" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_2">
@ -304,7 +304,7 @@
</item>
</layout>
</item>
<item row="5" column="0">
<item row="6" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
@ -328,7 +328,7 @@
</item>
</layout>
</item>
<item row="6" column="0">
<item row="7" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="QCheckBox" name="m_checkMessagesDateTimeFormat">
@ -348,7 +348,7 @@
</item>
</layout>
</item>
<item row="7" column="0">
<item row="8" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QGroupBox" name="groupBox_5">
@ -404,7 +404,7 @@
</item>
</layout>
</item>
<item row="8" column="0" colspan="2">
<item row="9" column="0" colspan="2">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -417,6 +417,13 @@
</property>
</spacer>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="m_checkDisplayFeedIcons">
<property name="text">
<string>Display real icons of feeds in list of messages instead of read/unread icons</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
@ -444,6 +451,7 @@
<tabstop>m_cmbCountsFeedList</tabstop>
<tabstop>m_checkRemoveReadMessagesOnExit</tabstop>
<tabstop>m_checkDisplayPlaceholders</tabstop>
<tabstop>m_checkDisplayFeedIcons</tabstop>
<tabstop>m_checkBringToForegroundAfterMsgOpened</tabstop>
<tabstop>m_checkKeppMessagesInTheMiddle</tabstop>
<tabstop>m_spinHeightRowsMessages</tabstop>

View File

@ -91,6 +91,9 @@ DVALUE(char*) Messages::CustomDateFormatDef = "";
DKEY Messages::ClearReadOnExit = "clear_read_on_exit";
DVALUE(bool) Messages::ClearReadOnExitDef = false;
DKEY Messages::DisplayFeedIconsInList = "display_feed_icons_in_message_list";
DVALUE(bool) Messages::DisplayFeedIconsInListDef = false;
DKEY Messages::BringAppToFrontAfterMessageOpenedExternally = "bring_app_to_front_after_msg_opened";
DVALUE(bool) Messages::BringAppToFrontAfterMessageOpenedExternallyDef = true;

View File

@ -112,6 +112,9 @@ namespace Messages {
KEY ClearReadOnExit;
VALUE(bool) ClearReadOnExitDef;
KEY DisplayFeedIconsInList;
VALUE(bool) DisplayFeedIconsInListDef;
KEY BringAppToFrontAfterMessageOpenedExternally;
VALUE(bool) BringAppToFrontAfterMessageOpenedExternallyDef;

View File

@ -303,6 +303,27 @@ QList<Category*> RootItem::getSubTreeCategories() const {
return children;
}
RootItem* RootItem::getItemFromSubTree(std::function<bool(const RootItem*)> tester) const {
QList<RootItem*> children;
QList<RootItem*> traversable_items;
traversable_items.append(const_cast<RootItem* const>(this));
// Iterate all nested items.
while (!traversable_items.isEmpty()) {
RootItem* active_item = traversable_items.takeFirst();
if (tester(active_item)) {
return active_item;
}
children.append(active_item);
traversable_items.append(active_item->childItems());
}
return nullptr;
}
QHash<int, Category*> RootItem::getHashedSubTreeCategories() const {
QHash<int, Category*> children;
QList<RootItem*> traversable_items;

View File

@ -134,6 +134,8 @@ class RSSGUARD_DLLSPEC RootItem : public QObject {
QList<RootItem*> getSubTree(RootItem::Kind kind_of_item) const;
QList<Category*> getSubTreeCategories() const;
RootItem* getItemFromSubTree(std::function<bool(const RootItem*)> tester) const;
// Returns list of categories complemented by their own integer primary ID.
QHash<int, Category*> getHashedSubTreeCategories() const;

View File

@ -166,6 +166,20 @@ void ServiceRoot::completelyRemoveAllData() {
requestReloadMessageList(true);
}
QIcon ServiceRoot::feedIconForMessage(const QString& feed_custom_id) const {
QString low_id = feed_custom_id.toLower();
RootItem* found_item = getItemFromSubTree([low_id](const RootItem* it) {
return it->kind() == RootItem::Kind::Feed && it->customId().toLower() == low_id;
});
if (found_item != nullptr) {
return found_item->icon();
}
else {
return QIcon();
}
}
void ServiceRoot::removeOldAccountFromDatabase(bool including_messages) {
QSqlDatabase database = qApp->database()->connection(metaObject()->className());

View File

@ -167,6 +167,8 @@ class ServiceRoot : public RootItem {
// and from model.
void completelyRemoveAllData();
QIcon feedIconForMessage(const QString& feed_custom_id) const;
// Removes all/read only messages from given underlying feeds.
bool cleanFeeds(QList<Feed*> items, bool clean_read_only);