Experimental FeedsSelection implementation.
This commit is contained in:
parent
9417dd404b
commit
63d4b93433
13 changed files with 181 additions and 122 deletions
|
@ -394,6 +394,7 @@ set(APP_SOURCES
|
||||||
src/core/feeddownloader.cpp
|
src/core/feeddownloader.cpp
|
||||||
src/core/feedsimportexportmodel.cpp
|
src/core/feedsimportexportmodel.cpp
|
||||||
src/core/feedsmodelrecyclebin.cpp
|
src/core/feedsmodelrecyclebin.cpp
|
||||||
|
src/core/feedsselection.cpp
|
||||||
|
|
||||||
# NETWORK-WEB sources.
|
# NETWORK-WEB sources.
|
||||||
src/network-web/basenetworkaccessmanager.cpp
|
src/network-web/basenetworkaccessmanager.cpp
|
||||||
|
@ -477,6 +478,7 @@ set(APP_HEADERS
|
||||||
src/core/feedsproxymodel.h
|
src/core/feedsproxymodel.h
|
||||||
src/core/feeddownloader.h
|
src/core/feeddownloader.h
|
||||||
src/core/feedsimportexportmodel.h
|
src/core/feedsimportexportmodel.h
|
||||||
|
src/core/feedsselection.h
|
||||||
|
|
||||||
# NETWORK-WEB headers.
|
# NETWORK-WEB headers.
|
||||||
src/network-web/webpage.h
|
src/network-web/webpage.h
|
||||||
|
|
|
@ -620,42 +620,6 @@ QModelIndex FeedsModel::indexForItem(FeedsModelRootItem *item) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
return target_index;
|
return target_index;
|
||||||
|
|
||||||
/*
|
|
||||||
QList<QModelIndex> parents;
|
|
||||||
|
|
||||||
// Start with root item (which obviously has invalid index).
|
|
||||||
parents << indexForItem(m_rootItem);
|
|
||||||
|
|
||||||
while (!parents.isEmpty()) {
|
|
||||||
QModelIndex active_index = parents.takeFirst();
|
|
||||||
int row_count = rowCount(active_index);
|
|
||||||
|
|
||||||
if (row_count > 0) {
|
|
||||||
// This index has children.
|
|
||||||
// Lets take a look if our target item is among them.
|
|
||||||
FeedsModelRootItem *active_item = itemForIndex(active_index);
|
|
||||||
int candidate_index = active_item->childItems().indexOf(item);
|
|
||||||
|
|
||||||
if (candidate_index >= 0) {
|
|
||||||
// We found our item.
|
|
||||||
return index(candidate_index, 0, active_index);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Item is not found, add all "categories" from active_item.
|
|
||||||
for (int i = 0; i < row_count; i++) {
|
|
||||||
FeedsModelRootItem *possible_category = active_item->child(i);
|
|
||||||
|
|
||||||
if (possible_category->kind() == FeedsModelRootItem::Category) {
|
|
||||||
parents << index(i, 0, active_index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return QModelIndex();
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FeedsModel::hasAnyFeedNewMessages() {
|
bool FeedsModel::hasAnyFeedNewMessages() {
|
||||||
|
@ -989,32 +953,12 @@ QList<FeedsModelFeed*> FeedsModel::allFeeds() {
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<FeedsModelFeed*> FeedsModel::feedsForItem(FeedsModelRootItem *root) {
|
QList<FeedsModelFeed*> FeedsModel::feedsForItem(FeedsModelRootItem *root) {
|
||||||
|
QList<FeedsModelRootItem*> children = root->getRecursiveChildren();
|
||||||
QList<FeedsModelFeed*> feeds;
|
QList<FeedsModelFeed*> feeds;
|
||||||
|
|
||||||
if (root->kind() == FeedsModelRootItem::Feed) {
|
foreach (FeedsModelRootItem *child, children) {
|
||||||
// Root itself is a FEED.
|
if (child->kind() == FeedsModelRootItem::Feed) {
|
||||||
feeds.append(root->toFeed());
|
feeds.append(child->toFeed());
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Root itself is a CATEGORY or ROOT item.
|
|
||||||
QList<FeedsModelRootItem*> traversable_items;
|
|
||||||
|
|
||||||
traversable_items.append(root);
|
|
||||||
|
|
||||||
// Iterate all nested categories.
|
|
||||||
while (!traversable_items.isEmpty()) {
|
|
||||||
FeedsModelRootItem *active_category = traversable_items.takeFirst();
|
|
||||||
|
|
||||||
foreach (FeedsModelRootItem *child, active_category->childItems()) {
|
|
||||||
if (child->kind() == FeedsModelRootItem::Feed) {
|
|
||||||
// This child is feed.
|
|
||||||
feeds.append(child->toFeed());
|
|
||||||
}
|
|
||||||
else if (child->kind() == FeedsModelRootItem::Category) {
|
|
||||||
// This child is category, add its child feeds too.
|
|
||||||
traversable_items.append(child->toCategory());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,39 @@ int FeedsModelRootItem::countOfAllMessages() const {
|
||||||
return total_count;
|
return total_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<FeedsModelRootItem*> FeedsModelRootItem::getRecursiveChildren() {
|
||||||
|
QList<FeedsModelRootItem*> children;
|
||||||
|
|
||||||
|
if (kind() == FeedsModelRootItem::Feed) {
|
||||||
|
// Root itself is a FEED.
|
||||||
|
children.append(this);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Root itself is a CATEGORY or ROOT item.
|
||||||
|
QList<FeedsModelRootItem*> traversable_items;
|
||||||
|
|
||||||
|
traversable_items.append(this);
|
||||||
|
|
||||||
|
// Iterate all nested categories.
|
||||||
|
while (!traversable_items.isEmpty()) {
|
||||||
|
FeedsModelRootItem *active_category = traversable_items.takeFirst();
|
||||||
|
|
||||||
|
foreach (FeedsModelRootItem *child, active_category->childItems()) {
|
||||||
|
if (child->kind() == FeedsModelRootItem::Feed) {
|
||||||
|
// This child is feed.
|
||||||
|
children.append(child);
|
||||||
|
}
|
||||||
|
else if (child->kind() == FeedsModelRootItem::Category) {
|
||||||
|
// This child is category, add its child feeds too.
|
||||||
|
traversable_items.append(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
bool FeedsModelRootItem::removeChild(FeedsModelRootItem *child) {
|
bool FeedsModelRootItem::removeChild(FeedsModelRootItem *child) {
|
||||||
return m_childItems.removeOne(child);
|
return m_childItems.removeOne(child);
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,6 +114,8 @@ class FeedsModelRootItem {
|
||||||
m_childItems.clear();
|
m_childItems.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<FeedsModelRootItem*> getRecursiveChildren();
|
||||||
|
|
||||||
// Removes particular child at given index.
|
// Removes particular child at given index.
|
||||||
// NOTE: Child is NOT freed from the memory.
|
// NOTE: Child is NOT freed from the memory.
|
||||||
bool removeChild(int index);
|
bool removeChild(int index);
|
||||||
|
@ -132,7 +134,7 @@ class FeedsModelRootItem {
|
||||||
m_icon = icon;
|
m_icon = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Each item has some kind of id.
|
// Each item has some kind of id. Usually taken from primary key attribute from DB.
|
||||||
inline int id() const {
|
inline int id() const {
|
||||||
return m_id;
|
return m_id;
|
||||||
}
|
}
|
||||||
|
|
68
src/core/feedsselection.cpp
Normal file
68
src/core/feedsselection.cpp
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#include "core/feedsselection.h"
|
||||||
|
|
||||||
|
#include "core/feedsmodelrootitem.h"
|
||||||
|
#include "core/feedsmodelcategory.h"
|
||||||
|
#include "core/feedsmodelfeed.h"
|
||||||
|
|
||||||
|
|
||||||
|
FeedsSelection::FeedsSelection(FeedsModelRootItem *root_of_selection) : m_selectedItem(root_of_selection) {
|
||||||
|
}
|
||||||
|
|
||||||
|
FeedsSelection::FeedsSelection(const FeedsSelection &other) {
|
||||||
|
m_selectedItem = other.selectedItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
FeedsSelection::~FeedsSelection() {
|
||||||
|
}
|
||||||
|
|
||||||
|
FeedsSelection::MessageMode FeedsSelection::mode() {
|
||||||
|
if (m_selectedItem == NULL) {
|
||||||
|
return MessageMode::NoMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (m_selectedItem->kind()) {
|
||||||
|
case FeedsModelRootItem::RecycleBin:
|
||||||
|
return MessageMode::MessagesFromRecycleBin;
|
||||||
|
|
||||||
|
case FeedsModelRootItem::Category:
|
||||||
|
case FeedsModelRootItem::Feed:
|
||||||
|
return MessageMode::MessagesFromFeeds;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return MessageMode::NoMode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FeedsModelRootItem *FeedsSelection::selectedItem() const {
|
||||||
|
return m_selectedItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FeedsSelection::generateDatabaseFilter() {
|
||||||
|
if (m_selectedItem == NULL) {
|
||||||
|
return "feed IN () AND is_deleted = 0";
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (m_selectedItem->kind()) {
|
||||||
|
case FeedsModelRootItem::RecycleBin:
|
||||||
|
return "is_deleted = 1 AND is_pdeleted = 0";
|
||||||
|
|
||||||
|
case FeedsModelRootItem::Category:
|
||||||
|
case FeedsModelRootItem::Feed: {
|
||||||
|
QList<FeedsModelRootItem*> children = m_selectedItem->getRecursiveChildren();
|
||||||
|
QStringList stringy_ids;
|
||||||
|
|
||||||
|
children.append(m_selectedItem);
|
||||||
|
|
||||||
|
foreach (FeedsModelRootItem *child, children) {
|
||||||
|
if (child->kind() == FeedsModelRootItem::Feed) {
|
||||||
|
stringy_ids.append(QString::number(child->id()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QString("feed IN (%1) AND is_deleted = 0").arg(stringy_ids.join(", "));
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return "feed IN () AND is_deleted = 0";
|
||||||
|
}
|
||||||
|
}
|
32
src/core/feedsselection.h
Normal file
32
src/core/feedsselection.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#ifndef FEEDSSELECTION_H
|
||||||
|
#define FEEDSSELECTION_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
|
||||||
|
class FeedsModelRootItem;
|
||||||
|
|
||||||
|
class FeedsSelection {
|
||||||
|
public:
|
||||||
|
enum MessageMode {
|
||||||
|
NoMode,
|
||||||
|
MessagesFromFeeds,
|
||||||
|
MessagesFromRecycleBin
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit FeedsSelection(FeedsModelRootItem *root_of_selection = NULL);
|
||||||
|
FeedsSelection(const FeedsSelection &other);
|
||||||
|
virtual ~FeedsSelection();
|
||||||
|
|
||||||
|
MessageMode mode();
|
||||||
|
FeedsModelRootItem *selectedItem() const;
|
||||||
|
QString generateDatabaseFilter();
|
||||||
|
|
||||||
|
private:
|
||||||
|
FeedsModelRootItem *m_selectedItem;
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(FeedsSelection::MessageMode)
|
||||||
|
|
||||||
|
#endif // FEEDSSELECTION_H
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
MessagesModel::MessagesModel(QObject *parent)
|
MessagesModel::MessagesModel(QObject *parent)
|
||||||
: QSqlTableModel(parent, qApp->database()->connection("MessagesModel", DatabaseFactory::FromSettings)),
|
: QSqlTableModel(parent, qApp->database()->connection("MessagesModel", DatabaseFactory::FromSettings)),
|
||||||
m_messageMode(MessagesFromFeeds), m_messageFilter(NoHighlighting), m_customDateFormat(QString()) {
|
m_messageFilter(NoHighlighting), m_customDateFormat(QString()) {
|
||||||
setObjectName("MessagesModel");
|
setObjectName("MessagesModel");
|
||||||
setupFonts();
|
setupFonts();
|
||||||
setupIcons();
|
setupIcons();
|
||||||
|
@ -42,7 +42,7 @@ MessagesModel::MessagesModel(QObject *parent)
|
||||||
// via model, but via DIRECT SQL calls are used to do persistent messages.
|
// via model, but via DIRECT SQL calls are used to do persistent messages.
|
||||||
setEditStrategy(QSqlTableModel::OnManualSubmit);
|
setEditStrategy(QSqlTableModel::OnManualSubmit);
|
||||||
setTable("Messages");
|
setTable("Messages");
|
||||||
loadMessages(QList<int>());
|
loadMessages(FeedsSelection());
|
||||||
}
|
}
|
||||||
|
|
||||||
MessagesModel::~MessagesModel() {
|
MessagesModel::~MessagesModel() {
|
||||||
|
@ -55,8 +55,8 @@ void MessagesModel::setupIcons() {
|
||||||
m_unreadIcon = qApp->icons()->fromTheme("mail-mark-unread");
|
m_unreadIcon = qApp->icons()->fromTheme("mail-mark-unread");
|
||||||
}
|
}
|
||||||
|
|
||||||
MessagesModel::MessageMode MessagesModel::messageMode() const {
|
FeedsSelection MessagesModel::currentFeeds() const {
|
||||||
return m_messageMode;
|
return m_currentFeeds;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesModel::fetchAll() {
|
void MessagesModel::fetchAll() {
|
||||||
|
@ -71,10 +71,10 @@ void MessagesModel::setupFonts() {
|
||||||
m_boldFont.setBold(true);
|
m_boldFont.setBold(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesModel::loadMessages(const QList<int> feed_ids) {
|
void MessagesModel::loadMessages(const FeedsSelection &selection) {
|
||||||
m_currentFeeds = feed_ids;
|
m_currentFeeds = selection;
|
||||||
|
|
||||||
if (feed_ids.size() == 1 && feed_ids[0] == ID_RECYCLE_BIN) {
|
/* if (selection.size() == 1 && selection[0] == ID_RECYCLE_BIN) {
|
||||||
m_messageMode = MessagesFromRecycleBin;
|
m_messageMode = MessagesFromRecycleBin;
|
||||||
setFilter("is_deleted = 1 AND is_pdeleted = 0");
|
setFilter("is_deleted = 1 AND is_pdeleted = 0");
|
||||||
}
|
}
|
||||||
|
@ -84,8 +84,9 @@ void MessagesModel::loadMessages(const QList<int> feed_ids) {
|
||||||
|
|
||||||
setFilter(QString("feed IN (%1) AND is_deleted = 0").arg(assembled_ids));
|
setFilter(QString("feed IN (%1) AND is_deleted = 0").arg(assembled_ids));
|
||||||
qDebug("Loading messages from feeds: %s.", qPrintable(assembled_ids));
|
qDebug("Loading messages from feeds: %s.", qPrintable(assembled_ids));
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
setFilter(m_currentFeeds.generateDatabaseFilter());
|
||||||
select();
|
select();
|
||||||
fetchAll();
|
fetchAll();
|
||||||
}
|
}
|
||||||
|
@ -96,17 +97,6 @@ void MessagesModel::filterMessages(MessagesModel::MessageFilter filter) {
|
||||||
emit layoutChanged();
|
emit layoutChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList MessagesModel::textualFeeds() const {
|
|
||||||
QStringList stringy_ids;
|
|
||||||
stringy_ids.reserve(m_currentFeeds.size());
|
|
||||||
|
|
||||||
foreach (int feed_id, m_currentFeeds) {
|
|
||||||
stringy_ids.append(QString::number(feed_id));
|
|
||||||
}
|
|
||||||
|
|
||||||
return stringy_ids;
|
|
||||||
}
|
|
||||||
|
|
||||||
int MessagesModel::messageId(int row_index) const {
|
int MessagesModel::messageId(int row_index) const {
|
||||||
return data(row_index, MSG_DB_ID_INDEX, Qt::EditRole).toInt();
|
return data(row_index, MSG_DB_ID_INDEX, Qt::EditRole).toInt();
|
||||||
}
|
}
|
||||||
|
@ -292,7 +282,7 @@ bool MessagesModel::setMessageRead(int row_index, int read) {
|
||||||
// If commit succeeded, then emit changes, so that view
|
// If commit succeeded, then emit changes, so that view
|
||||||
// can reflect.
|
// can reflect.
|
||||||
emit dataChanged(index(row_index, 0), index(row_index, columnCount() - 1));
|
emit dataChanged(index(row_index, 0), index(row_index, columnCount() - 1));
|
||||||
emit messageCountsChanged(m_messageMode, false, false);
|
emit messageCountsChanged(m_currentFeeds.mode(), false, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -391,7 +381,7 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int
|
||||||
|
|
||||||
QString sql_delete_query;
|
QString sql_delete_query;
|
||||||
|
|
||||||
if (m_messageMode == MessagesFromFeeds) {
|
if (m_currentFeeds.mode() == FeedsSelection::MessagesFromFeeds) {
|
||||||
sql_delete_query = QString("UPDATE Messages SET is_deleted = %2 WHERE id IN (%1);").arg(message_ids.join(", "),
|
sql_delete_query = QString("UPDATE Messages SET is_deleted = %2 WHERE id IN (%1);").arg(message_ids.join(", "),
|
||||||
QString::number(deleted));
|
QString::number(deleted));
|
||||||
}
|
}
|
||||||
|
@ -404,7 +394,7 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int
|
||||||
select();
|
select();
|
||||||
fetchAll();
|
fetchAll();
|
||||||
|
|
||||||
emit messageCountsChanged(m_messageMode, true, false);
|
emit messageCountsChanged(m_currentFeeds.mode(), true, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -429,7 +419,7 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int re
|
||||||
select();
|
select();
|
||||||
fetchAll();
|
fetchAll();
|
||||||
|
|
||||||
emit messageCountsChanged(m_messageMode, false, false);
|
emit messageCountsChanged(m_currentFeeds.mode(), false, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -438,7 +428,7 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int re
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MessagesModel::setBatchMessagesRestored(const QModelIndexList &messages) {
|
bool MessagesModel::setBatchMessagesRestored(const QModelIndexList &messages) {
|
||||||
if (m_messageMode == MessagesFromFeeds) {
|
if (m_currentFeeds.mode() == FeedsSelection::MessagesFromFeeds) {
|
||||||
qDebug("Cannot restore non-deleted messages.");
|
qDebug("Cannot restore non-deleted messages.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -460,7 +450,7 @@ bool MessagesModel::setBatchMessagesRestored(const QModelIndexList &messages) {
|
||||||
select();
|
select();
|
||||||
fetchAll();
|
fetchAll();
|
||||||
|
|
||||||
emit messageCountsChanged(m_messageMode, true, true);
|
emit messageCountsChanged(m_currentFeeds.mode(), true, true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
|
|
||||||
#include "definitions/definitions.h"
|
#include "definitions/definitions.h"
|
||||||
|
|
||||||
|
#include "core/feedsselection.h"
|
||||||
|
|
||||||
#include <QSqlTableModel>
|
#include <QSqlTableModel>
|
||||||
#include <QFont>
|
#include <QFont>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
|
@ -83,11 +85,6 @@ class MessagesModel : public QSqlTableModel {
|
||||||
HighlightImportant = 102
|
HighlightImportant = 102
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MessageMode {
|
|
||||||
MessagesFromFeeds,
|
|
||||||
MessagesFromRecycleBin
|
|
||||||
};
|
|
||||||
|
|
||||||
// Constructors and destructors.
|
// Constructors and destructors.
|
||||||
explicit MessagesModel(QObject *parent = 0);
|
explicit MessagesModel(QObject *parent = 0);
|
||||||
virtual ~MessagesModel();
|
virtual ~MessagesModel();
|
||||||
|
@ -102,13 +99,9 @@ class MessagesModel : public QSqlTableModel {
|
||||||
Message messageAt(int row_index) const;
|
Message messageAt(int row_index) const;
|
||||||
int messageId(int row_index) const;
|
int messageId(int row_index) const;
|
||||||
|
|
||||||
// Access to list of currently loaded feed IDs.
|
|
||||||
inline QList<int> currentFeeds() const {
|
|
||||||
return m_currentFeeds;
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateDateFormat();
|
void updateDateFormat();
|
||||||
MessageMode messageMode() const;
|
|
||||||
|
FeedsSelection currentFeeds() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
// To disable persistent changes submissions.
|
// To disable persistent changes submissions.
|
||||||
|
@ -140,21 +133,15 @@ class MessagesModel : public QSqlTableModel {
|
||||||
void fetchAll();
|
void fetchAll();
|
||||||
|
|
||||||
// Loads messages of given feeds.
|
// Loads messages of given feeds.
|
||||||
void loadMessages(const QList<int> feed_ids);
|
void loadMessages(const FeedsSelection &selection);
|
||||||
|
|
||||||
void filterMessages(MessageFilter filter);
|
void filterMessages(MessageFilter filter);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
// Emitted if some persistent change is made which affects count of "unread/all" messages.
|
// Emitted if some persistent change is made which affects count of "unread/all" messages.
|
||||||
void messageCountsChanged(MessagesModel::MessageMode mode,
|
void messageCountsChanged(FeedsSelection::MessageMode mode, bool total_msg_count_changed, bool any_msg_restored);
|
||||||
bool total_msg_count_changed,
|
|
||||||
bool any_msg_restored);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Returns selected feed ids in concatenated textual form,
|
|
||||||
// which is used for SQL queries.
|
|
||||||
QStringList textualFeeds() const;
|
|
||||||
|
|
||||||
// Sets up header data.
|
// Sets up header data.
|
||||||
void setupHeaderData();
|
void setupHeaderData();
|
||||||
|
|
||||||
|
@ -165,11 +152,10 @@ class MessagesModel : public QSqlTableModel {
|
||||||
void setupIcons();
|
void setupIcons();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MessageMode m_messageMode;
|
|
||||||
MessageFilter m_messageFilter;
|
MessageFilter m_messageFilter;
|
||||||
|
|
||||||
QString m_customDateFormat;
|
QString m_customDateFormat;
|
||||||
QList<int> m_currentFeeds;
|
FeedsSelection m_currentFeeds;
|
||||||
QList<QString> m_headerData;
|
QList<QString> m_headerData;
|
||||||
QList<QString> m_tooltipData;
|
QList<QString> m_tooltipData;
|
||||||
|
|
||||||
|
@ -181,7 +167,6 @@ class MessagesModel : public QSqlTableModel {
|
||||||
QIcon m_unreadIcon;
|
QIcon m_unreadIcon;
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(MessagesModel::MessageMode)
|
|
||||||
Q_DECLARE_METATYPE(MessagesModel::MessageFilter)
|
Q_DECLARE_METATYPE(MessagesModel::MessageFilter)
|
||||||
|
|
||||||
#endif // MESSAGESMODEL_H
|
#endif // MESSAGESMODEL_H
|
||||||
|
|
|
@ -197,11 +197,11 @@ void FeedMessageViewer::createConnections() {
|
||||||
connect(m_messagesView, SIGNAL(currentMessagesChanged(QList<Message>)), m_messagesBrowser, SLOT(navigateToMessages(QList<Message>)));
|
connect(m_messagesView, SIGNAL(currentMessagesChanged(QList<Message>)), m_messagesBrowser, SLOT(navigateToMessages(QList<Message>)));
|
||||||
|
|
||||||
// If user selects feeds, load their messages.
|
// If user selects feeds, load their messages.
|
||||||
connect(m_feedsView, SIGNAL(feedsSelected(QList<int>)), m_messagesView, SLOT(loadFeeds(QList<int>)));
|
connect(m_feedsView, SIGNAL(feedsSelected(FeedsSelection)), m_messagesView, SLOT(loadFeeds(FeedsSelection)));
|
||||||
|
|
||||||
// If user changes status of some messages, recalculate message counts.
|
// If user changes status of some messages, recalculate message counts.
|
||||||
connect(m_messagesView->sourceModel(), SIGNAL(messageCountsChanged(MessagesModel::MessageMode,bool,bool)),
|
connect(m_messagesView->sourceModel(), SIGNAL(messageCountsChanged(FeedsSelection::MessageMode,bool,bool)),
|
||||||
m_feedsView, SLOT(receiveMessageCountsChange(MessagesModel::MessageMode,bool,bool)));
|
m_feedsView, SLOT(receiveMessageCountsChange(FeedsSelection::MessageMode,bool,bool)));
|
||||||
|
|
||||||
// State of many messages is changed, then we need
|
// State of many messages is changed, then we need
|
||||||
// to reload selections.
|
// to reload selections.
|
||||||
|
|
|
@ -310,7 +310,7 @@ void FeedsView::editFeed(FeedsModelFeed *feed) {
|
||||||
delete form_pointer.data();
|
delete form_pointer.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedsView::receiveMessageCountsChange(MessagesModel::MessageMode mode,
|
void FeedsView::receiveMessageCountsChange(FeedsSelection::MessageMode mode,
|
||||||
bool total_msg_count_changed,
|
bool total_msg_count_changed,
|
||||||
bool any_msg_restored) {
|
bool any_msg_restored) {
|
||||||
// If the change came from recycle bin mode, then:
|
// If the change came from recycle bin mode, then:
|
||||||
|
@ -328,7 +328,7 @@ void FeedsView::receiveMessageCountsChange(MessagesModel::MessageMode mode,
|
||||||
// total counts.
|
// total counts.
|
||||||
// b) total count of message was not changed - some messages switched state --> we need to update
|
// b) total count of message was not changed - some messages switched state --> we need to update
|
||||||
// counts of just selected feeds.
|
// counts of just selected feeds.
|
||||||
if (mode == MessagesModel::MessagesFromRecycleBin) {
|
if (mode == FeedsSelection::MessagesFromRecycleBin) {
|
||||||
if (total_msg_count_changed) {
|
if (total_msg_count_changed) {
|
||||||
if (any_msg_restored) {
|
if (any_msg_restored) {
|
||||||
updateCountsOfAllFeeds(true);
|
updateCountsOfAllFeeds(true);
|
||||||
|
@ -624,7 +624,7 @@ void FeedsView::setupAppearance() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedsView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) {
|
void FeedsView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) {
|
||||||
QTreeView::selectionChanged(selected, deselected);
|
/*QTreeView::selectionChanged(selected, deselected);
|
||||||
|
|
||||||
QList<FeedsModelFeed*> selected_feeds = selectedFeeds();
|
QList<FeedsModelFeed*> selected_feeds = selectedFeeds();
|
||||||
QList<int> selected_ids;
|
QList<int> selected_ids;
|
||||||
|
@ -641,9 +641,9 @@ void FeedsView::selectionChanged(const QItemSelection &selected, const QItemSele
|
||||||
}
|
}
|
||||||
else if (selectedRecycleBin() != NULL) {
|
else if (selectedRecycleBin() != NULL) {
|
||||||
selected_ids << ID_RECYCLE_BIN;
|
selected_ids << ID_RECYCLE_BIN;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
emit feedsSelected(selected_ids);
|
emit feedsSelected(FeedsSelection(selectedItem()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FeedsView::keyPressEvent(QKeyEvent *event) {
|
void FeedsView::keyPressEvent(QKeyEvent *event) {
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include "core/messagesmodel.h"
|
#include "core/messagesmodel.h"
|
||||||
#include "core/feedsmodel.h"
|
#include "core/feedsmodel.h"
|
||||||
|
#include "core/feedsselection.h"
|
||||||
#include "miscellaneous/settings.h"
|
#include "miscellaneous/settings.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -116,7 +117,7 @@ class FeedsView : public QTreeView {
|
||||||
|
|
||||||
// Is called when counts of messages are changed externally,
|
// Is called when counts of messages are changed externally,
|
||||||
// typically from message view.
|
// typically from message view.
|
||||||
void receiveMessageCountsChange(MessagesModel::MessageMode mode, bool total_msg_count_changed, bool any_msg_restored);
|
void receiveMessageCountsChange(FeedsSelection::MessageMode mode, bool total_msg_count_changed, bool any_msg_restored);
|
||||||
|
|
||||||
// Reloads counts for selected feeds.
|
// Reloads counts for selected feeds.
|
||||||
void updateCountsOfSelectedFeeds(bool update_total_too);
|
void updateCountsOfSelectedFeeds(bool update_total_too);
|
||||||
|
@ -178,7 +179,7 @@ class FeedsView : public QTreeView {
|
||||||
void feedsNeedToBeReloaded(int mark_current_index_read);
|
void feedsNeedToBeReloaded(int mark_current_index_read);
|
||||||
|
|
||||||
// Emitted if user selects new feeds.
|
// Emitted if user selects new feeds.
|
||||||
void feedsSelected(const QList<int> &feed_ids);
|
void feedsSelected(const FeedsSelection &selection);
|
||||||
|
|
||||||
// Requests opening of given messages in newspaper mode.
|
// Requests opening of given messages in newspaper mode.
|
||||||
void openMessagesInNewspaperView(const QList<Message> &messages);
|
void openMessagesInNewspaperView(const QList<Message> &messages);
|
||||||
|
|
|
@ -148,7 +148,7 @@ void MessagesView::contextMenuEvent(QContextMenuEvent *event) {
|
||||||
initializeContextMenu();
|
initializeContextMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sourceModel()->messageMode() != MessagesModel::MessagesFromRecycleBin) {
|
if (sourceModel()->currentFeeds().mode() != FeedsSelection::MessagesFromRecycleBin) {
|
||||||
m_contextMenu->removeAction(qApp->mainForm()->m_ui->m_actionRestoreSelectedMessagesFromRecycleBin);
|
m_contextMenu->removeAction(qApp->mainForm()->m_ui->m_actionRestoreSelectedMessagesFromRecycleBin);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -235,8 +235,8 @@ void MessagesView::selectionChanged(const QItemSelection &selected, const QItemS
|
||||||
QTreeView::selectionChanged(selected, deselected);
|
QTreeView::selectionChanged(selected, deselected);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesView::loadFeeds(const QList<int> &feed_ids) {
|
void MessagesView::loadFeeds(const FeedsSelection &selection) {
|
||||||
m_sourceModel->loadMessages(feed_ids);
|
m_sourceModel->loadMessages(selection);
|
||||||
|
|
||||||
int col = qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortColumnMessages)).toInt();
|
int col = qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortColumnMessages)).toInt();
|
||||||
Qt::SortOrder ord = static_cast<Qt::SortOrder>(qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortOrderMessages)).toInt());
|
Qt::SortOrder ord = static_cast<Qt::SortOrder>(qApp->settings()->value(GROUP(GUI), SETTING(GUI::DefaultSortOrderMessages)).toInt());
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
|
|
||||||
#include "core/messagesmodel.h"
|
#include "core/messagesmodel.h"
|
||||||
|
|
||||||
|
#include "core/feedsselection.h"
|
||||||
|
|
||||||
#include <QTreeView>
|
#include <QTreeView>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
|
|
||||||
|
@ -58,7 +60,7 @@ class MessagesView : public QTreeView {
|
||||||
void reloadSelections(int mark_current_index_read);
|
void reloadSelections(int mark_current_index_read);
|
||||||
|
|
||||||
// Loads un-deleted messages from selected feeds.
|
// Loads un-deleted messages from selected feeds.
|
||||||
void loadFeeds(const QList<int> &feed_ids);
|
void loadFeeds(const FeedsSelection &selection);
|
||||||
|
|
||||||
// Message manipulators.
|
// Message manipulators.
|
||||||
void openSelectedSourceArticlesExternally();
|
void openSelectedSourceArticlesExternally();
|
||||||
|
|
Loading…
Add table
Reference in a new issue