Many fixes in message model.
This commit is contained in:
parent
9d040f82bf
commit
1a9a121709
10 changed files with 73 additions and 84 deletions
|
@ -29,7 +29,8 @@
|
|||
|
||||
|
||||
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) {
|
||||
setObjectName("MessagesModel");
|
||||
setupFonts();
|
||||
setupIcons();
|
||||
|
@ -69,9 +70,11 @@ void MessagesModel::loadMessages(const QList<int> feed_ids) {
|
|||
m_currentFeeds = feed_ids;
|
||||
|
||||
if (feed_ids.size() == 1 && feed_ids[0] == ID_RECYCLE_BIN) {
|
||||
m_messageMode = MessagesFromRecycleBin;
|
||||
setFilter("is_deleted = 1");
|
||||
}
|
||||
else {
|
||||
m_messageMode = MessagesFromFeeds;
|
||||
QString assembled_ids = textualFeeds().join(", ");
|
||||
|
||||
setFilter(QString("feed IN (%1) AND is_deleted = 0").arg(assembled_ids));
|
||||
|
@ -82,8 +85,8 @@ void MessagesModel::loadMessages(const QList<int> feed_ids) {
|
|||
fetchAll();
|
||||
}
|
||||
|
||||
void MessagesModel::filterMessages(MessagesModel::DisplayFilter filter) {
|
||||
m_filter = filter;
|
||||
void MessagesModel::filterMessages(MessagesModel::MessageFilter filter) {
|
||||
m_messageFilter = filter;
|
||||
emit layoutAboutToBeChanged();
|
||||
emit layoutChanged();
|
||||
}
|
||||
|
@ -167,8 +170,7 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const {
|
|||
return QSqlTableModel::data(index(idx.row(), MSG_DB_TITLE_INDEX, idx.parent()));
|
||||
}
|
||||
*/
|
||||
else if (index_column != MSG_DB_IMPORTANT_INDEX &&
|
||||
index_column != MSG_DB_READ_INDEX) {
|
||||
else if (index_column != MSG_DB_IMPORTANT_INDEX && index_column != MSG_DB_READ_INDEX) {
|
||||
return QSqlTableModel::data(idx, role);
|
||||
}
|
||||
else {
|
||||
|
@ -180,26 +182,17 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const {
|
|||
return QSqlTableModel::data(idx, role);
|
||||
|
||||
case Qt::FontRole:
|
||||
return QSqlTableModel::data(index(idx.row(),
|
||||
MSG_DB_READ_INDEX)).toInt() == 1 ?
|
||||
m_normalFont :
|
||||
m_boldFont;
|
||||
return QSqlTableModel::data(index(idx.row(), MSG_DB_READ_INDEX)).toInt() == 1 ? m_normalFont : m_boldFont;
|
||||
|
||||
case Qt::ForegroundRole:
|
||||
switch (m_filter) {
|
||||
case DisplayImportant:
|
||||
return QSqlTableModel::data(index(idx.row(),
|
||||
MSG_DB_IMPORTANT_INDEX)).toInt() == 1 ?
|
||||
QColor(Qt::blue) :
|
||||
QVariant();
|
||||
switch (m_messageFilter) {
|
||||
case HighlightImportant:
|
||||
return QSqlTableModel::data(index(idx.row(), MSG_DB_IMPORTANT_INDEX)).toInt() == 1 ? QColor(Qt::blue) : QVariant();
|
||||
|
||||
case DisplayUnread:
|
||||
return QSqlTableModel::data(index(idx.row(),
|
||||
MSG_DB_READ_INDEX)).toInt() == 0 ?
|
||||
QColor(Qt::blue) :
|
||||
QVariant();
|
||||
case HighlightUnread:
|
||||
return QSqlTableModel::data(index(idx.row(), MSG_DB_READ_INDEX)).toInt() == 0 ? QColor(Qt::blue) : QVariant();
|
||||
|
||||
case DisplayAll:
|
||||
case NoHighlighting:
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
|
@ -208,14 +201,10 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const {
|
|||
int index_column = idx.column();
|
||||
|
||||
if (index_column == MSG_DB_READ_INDEX) {
|
||||
return QSqlTableModel::data(idx).toInt() == 1 ?
|
||||
m_readIcon :
|
||||
m_unreadIcon;
|
||||
return QSqlTableModel::data(idx).toInt() == 1 ? m_readIcon : m_unreadIcon;
|
||||
}
|
||||
else if (index_column == MSG_DB_IMPORTANT_INDEX) {
|
||||
return QSqlTableModel::data(idx).toInt() == 1 ?
|
||||
m_favoriteIcon :
|
||||
QVariant();
|
||||
return QSqlTableModel::data(idx).toInt() == 1 ? m_favoriteIcon : QVariant();
|
||||
}
|
||||
else {
|
||||
return QVariant();
|
||||
|
@ -242,8 +231,7 @@ bool MessagesModel::setMessageRead(int row_index, int read) {
|
|||
}
|
||||
|
||||
// Rewrite "visible" data in the model.
|
||||
bool working_change = setData(index(row_index, MSG_DB_READ_INDEX),
|
||||
read);
|
||||
bool working_change = setData(index(row_index, MSG_DB_READ_INDEX), read);
|
||||
|
||||
if (!working_change) {
|
||||
// If rewriting in the model failed, then cancel all actions.
|
||||
|
@ -257,8 +245,7 @@ bool MessagesModel::setMessageRead(int row_index, int read) {
|
|||
QSqlQuery query_read_msg(db_handle);
|
||||
query_read_msg.setForwardOnly(true);
|
||||
|
||||
if (!query_read_msg.prepare("UPDATE messages SET is_read = :read "
|
||||
"WHERE id = :id")) {
|
||||
if (!query_read_msg.prepare("UPDATE Messages SET is_read = :read WHERE id = :id;")) {
|
||||
qWarning("Query preparation failed for message read change.");
|
||||
|
||||
db_handle.rollback();
|
||||
|
@ -313,8 +300,7 @@ bool MessagesModel::switchMessageImportance(int row_index) {
|
|||
QSqlQuery query_importance_msg(db_handle);
|
||||
query_importance_msg.setForwardOnly(true);
|
||||
|
||||
if (!query_importance_msg.prepare("UPDATE messages SET is_important = :important "
|
||||
"WHERE id = :id")) {
|
||||
if (!query_importance_msg.prepare("UPDATE Messages SET is_important = :important WHERE id = :id;")) {
|
||||
qWarning("Query preparation failed for message importance switch.");
|
||||
|
||||
db_handle.rollback();
|
||||
|
@ -323,16 +309,14 @@ bool MessagesModel::switchMessageImportance(int row_index) {
|
|||
|
||||
message_id = messageId(row_index);
|
||||
query_importance_msg.bindValue(":id", message_id);
|
||||
query_importance_msg.bindValue(":important",
|
||||
current_importance == 1 ? 0 : 1);
|
||||
query_importance_msg.bindValue(":important", current_importance == 1 ? 0 : 1);
|
||||
query_importance_msg.exec();
|
||||
|
||||
// Commit changes.
|
||||
if (db_handle.commit()) {
|
||||
// If commit succeeded, then emit changes, so that view
|
||||
// can reflect.
|
||||
emit dataChanged(index(row_index, 0),
|
||||
index(row_index, columnCount() - 1));
|
||||
emit dataChanged(index(row_index, 0), index(row_index, columnCount() - 1));
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
|
@ -352,8 +336,8 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages
|
|||
message_ids.append(QString::number(messageId(message.row())));
|
||||
}
|
||||
|
||||
if (query_read_msg.exec(QString("UPDATE messages SET is_important = NOT is_important "
|
||||
"WHERE id IN (%1)").arg(message_ids.join(", ")))) {
|
||||
if (query_read_msg.exec(QString("UPDATE Messages SET is_important = NOT is_important "
|
||||
"WHERE id IN (%1);").arg(message_ids.join(", ")))) {
|
||||
select();
|
||||
fetchAll();
|
||||
|
||||
|
@ -365,8 +349,7 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages
|
|||
}
|
||||
}
|
||||
|
||||
bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages,
|
||||
int deleted) {
|
||||
bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int deleted) {
|
||||
QSqlDatabase db_handle = database();
|
||||
QSqlQuery query_read_msg(db_handle);
|
||||
QStringList message_ids;
|
||||
|
@ -378,9 +361,17 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages,
|
|||
message_ids.append(QString::number(messageId(message.row())));
|
||||
}
|
||||
|
||||
if (query_read_msg.exec(QString("UPDATE messages SET is_deleted = %2 "
|
||||
"WHERE id IN (%1)").arg(message_ids.join(", "),
|
||||
QString::number(deleted)))) {
|
||||
QString sql_delete_query;
|
||||
|
||||
if (m_messageMode == MessagesFromFeeds) {
|
||||
sql_delete_query = QString("UPDATE Messages SET is_deleted = %2 WHERE id IN (%1);").arg(message_ids.join(", "),
|
||||
QString::number(deleted));
|
||||
}
|
||||
else {
|
||||
sql_delete_query = QString("DELETE FROM Messages WHERE id in (%1);").arg(message_ids.join(", "));
|
||||
}
|
||||
|
||||
if (query_read_msg.exec(sql_delete_query)) {
|
||||
select();
|
||||
fetchAll();
|
||||
|
||||
|
@ -404,9 +395,8 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int re
|
|||
message_ids.append(QString::number(messageId(message.row())));
|
||||
}
|
||||
|
||||
if (query_read_msg.exec(QString("UPDATE messages SET is_read = %2 "
|
||||
"WHERE id IN (%1)").arg(message_ids.join(", "),
|
||||
QString::number(read)))) {
|
||||
if (query_read_msg.exec(QString("UPDATE Messages SET is_read = %2 "
|
||||
"WHERE id IN (%1);").arg(message_ids.join(", "), QString::number(read)))) {
|
||||
select();
|
||||
fetchAll();
|
||||
|
||||
|
@ -418,9 +408,7 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int re
|
|||
}
|
||||
}
|
||||
|
||||
QVariant MessagesModel::headerData(int section,
|
||||
Qt::Orientation orientation,
|
||||
int role) const {
|
||||
QVariant MessagesModel::headerData(int section, Qt::Orientation orientation, int role) const {
|
||||
Q_UNUSED(orientation)
|
||||
|
||||
switch (role) {
|
||||
|
|
|
@ -50,10 +50,15 @@ class MessagesModel : public QSqlTableModel {
|
|||
public:
|
||||
// Enum which describes basic filtering schemes
|
||||
// for messages.
|
||||
enum DisplayFilter {
|
||||
DisplayAll = 100,
|
||||
DisplayUnread = 101,
|
||||
DisplayImportant = 102
|
||||
enum MessageFilter {
|
||||
NoHighlighting = 100,
|
||||
HighlightUnread = 101,
|
||||
HighlightImportant = 102
|
||||
};
|
||||
|
||||
enum MessageMode {
|
||||
MessagesFromFeeds,
|
||||
MessagesFromRecycleBin
|
||||
};
|
||||
|
||||
// Constructors and destructors.
|
||||
|
@ -104,7 +109,7 @@ class MessagesModel : public QSqlTableModel {
|
|||
// Loads messages of given feeds.
|
||||
void loadMessages(const QList<int> feed_ids);
|
||||
|
||||
void filterMessages(DisplayFilter filter);
|
||||
void filterMessages(MessageFilter filter);
|
||||
|
||||
signals:
|
||||
// Emitted if some persistent change is made which affects
|
||||
|
@ -126,7 +131,8 @@ class MessagesModel : public QSqlTableModel {
|
|||
void setupIcons();
|
||||
|
||||
private:
|
||||
DisplayFilter m_filter;
|
||||
MessageMode m_messageMode;
|
||||
MessageFilter m_messageFilter;
|
||||
|
||||
QList<int> m_currentFeeds;
|
||||
QList<QString> m_headerData;
|
||||
|
@ -140,6 +146,6 @@ class MessagesModel : public QSqlTableModel {
|
|||
QIcon m_unreadIcon;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(MessagesModel::DisplayFilter)
|
||||
Q_DECLARE_METATYPE(MessagesModel::MessageFilter)
|
||||
|
||||
#endif // MESSAGESMODEL_H
|
||||
|
|
|
@ -195,8 +195,8 @@ void FeedMessageViewer::createConnections() {
|
|||
// Filtering & searching.
|
||||
connect(m_toolBarMessages, SIGNAL(messageSearchPatternChanged(QString)),
|
||||
m_messagesView, SLOT(searchMessages(QString)));
|
||||
connect(m_toolBarMessages, SIGNAL(messageFilterChanged(MessagesModel::DisplayFilter)),
|
||||
m_messagesView, SLOT(filterMessages(MessagesModel::DisplayFilter)));
|
||||
connect(m_toolBarMessages, SIGNAL(messageFilterChanged(MessagesModel::MessageFilter)),
|
||||
m_messagesView, SLOT(filterMessages(MessagesModel::MessageFilter)));
|
||||
|
||||
// Message changers.
|
||||
connect(m_messagesView, SIGNAL(currentMessagesRemoved()), m_messagesBrowser, SLOT(clear()));
|
||||
|
|
|
@ -561,29 +561,25 @@ void FeedsView::setupAppearance() {
|
|||
void FeedsView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) {
|
||||
QTreeView::selectionChanged(selected, deselected);
|
||||
|
||||
m_selectedFeeds.clear();
|
||||
QList<FeedsModelFeed*> selected_feeds = selectedFeeds();
|
||||
QList<int> selected_ids;
|
||||
|
||||
foreach (FeedsModelFeed *feed, selectedFeeds()) {
|
||||
if (!selected_feeds.isEmpty()) {
|
||||
foreach (FeedsModelFeed *feed, selected_feeds) {
|
||||
#if defined(DEBUG)
|
||||
QModelIndex index_for_feed = m_sourceModel->indexForItem(feed);
|
||||
|
||||
qDebug("Selecting feed '%s' (source index [%d, %d]).", qPrintable(feed->title()), index_for_feed.row(), index_for_feed.column());
|
||||
#endif
|
||||
|
||||
m_selectedFeeds << feed->id();
|
||||
}
|
||||
|
||||
if (m_selectedFeeds.isEmpty() && selectionModel()->selectedIndexes().size() > 0) {
|
||||
QModelIndex selected_index = selectionModel()->selectedIndexes().at(0);
|
||||
QModelIndex mapped_index = model()->mapToSource(selected_index);
|
||||
FeedsModelRootItem *item = sourceModel()->itemForIndex(mapped_index);
|
||||
|
||||
if (item->kind() == FeedsModelRootItem::RecycleBin) {
|
||||
m_selectedFeeds.append(ID_RECYCLE_BIN);
|
||||
selected_ids << feed->id();
|
||||
}
|
||||
}
|
||||
else if (selectedRecycleBin() != NULL) {
|
||||
selected_ids << ID_RECYCLE_BIN;
|
||||
}
|
||||
|
||||
emit feedsSelected(m_selectedFeeds);
|
||||
emit feedsSelected(selected_ids);
|
||||
}
|
||||
|
||||
void FeedsView::keyPressEvent(QKeyEvent *event) {
|
||||
|
|
|
@ -174,7 +174,6 @@ class FeedsView : public QTreeView {
|
|||
QMenu *m_contextMenuEmptySpace;
|
||||
QMenu *m_contextMenuRecycleBin;
|
||||
|
||||
QList<int> m_selectedFeeds;
|
||||
FeedsModel *m_sourceModel;
|
||||
FeedsProxyModel *m_proxyModel;
|
||||
|
||||
|
|
|
@ -224,7 +224,7 @@ void FormUpdate::startUpdate() {
|
|||
// Initialie downloader.
|
||||
m_downloader = new Downloader(this);
|
||||
|
||||
connect(m_downloader, SIGNAL(progress(qint64,qint64)), this, SLOT(updateProgress(qint64,qint64)));
|
||||
//connect(m_downloader, SIGNAL(progress(qint64,qint64)), this, SLOT(updateProgress(qint64,qint64)));
|
||||
connect(m_downloader, SIGNAL(completed(QNetworkReply::NetworkError,QByteArray)), this, SLOT(updateCompleted(QNetworkReply::NetworkError,QByteArray)));
|
||||
}
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ void MessagesToolBar::handleMessageHighlighterChange(QAction *action) {
|
|||
m_btnMessageHighlighter->setIcon(action->icon());
|
||||
m_btnMessageHighlighter->setToolTip(action->text());
|
||||
|
||||
emit messageFilterChanged(action->data().value<MessagesModel::DisplayFilter>());
|
||||
emit messageFilterChanged(action->data().value<MessagesModel::MessageFilter>());
|
||||
}
|
||||
|
||||
void MessagesToolBar::initializeSearchBox() {
|
||||
|
@ -128,11 +128,11 @@ void MessagesToolBar::initializeSearchBox() {
|
|||
void MessagesToolBar::initializeHighlighter() {
|
||||
m_menuMessageHighlighter = new QMenu(tr("Menu for highlighting messages"), this);
|
||||
m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme("mail-mark-read"),
|
||||
tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::DisplayAll));
|
||||
tr("No extra highlighting"))->setData(QVariant::fromValue(MessagesModel::NoHighlighting));
|
||||
m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme("mail-mark-unread"),
|
||||
tr("Highlight unread messages"))->setData(QVariant::fromValue(MessagesModel::DisplayUnread));
|
||||
tr("Highlight unread messages"))->setData(QVariant::fromValue(MessagesModel::HighlightUnread));
|
||||
m_menuMessageHighlighter->addAction(qApp->icons()->fromTheme("mail-mark-favorite"),
|
||||
tr("Highlight important messages"))->setData(QVariant::fromValue(MessagesModel::DisplayImportant));
|
||||
tr("Highlight important messages"))->setData(QVariant::fromValue(MessagesModel::HighlightImportant));
|
||||
|
||||
m_btnMessageHighlighter = new QToolButton(this);
|
||||
m_btnMessageHighlighter->setToolTip(tr("Display all messages"));
|
||||
|
|
|
@ -56,7 +56,7 @@ class MessagesToolBar : public BaseToolBar {
|
|||
void messageSearchPatternChanged(const QString &pattern);
|
||||
|
||||
// Emitted if message filter is changed.
|
||||
void messageFilterChanged(MessagesModel::DisplayFilter filter);
|
||||
void messageFilterChanged(MessagesModel::MessageFilter filter);
|
||||
|
||||
private slots:
|
||||
// Called when highlighter gets changed.
|
||||
|
|
|
@ -420,7 +420,7 @@ void MessagesView::searchMessages(const QString &pattern) {
|
|||
}
|
||||
}
|
||||
|
||||
void MessagesView::filterMessages(MessagesModel::DisplayFilter filter) {
|
||||
void MessagesView::filterMessages(MessagesModel::MessageFilter filter) {
|
||||
m_sourceModel->filterMessages(filter);
|
||||
}
|
||||
|
||||
|
|
|
@ -72,15 +72,15 @@ class MessagesView : public QTreeView {
|
|||
void setSelectedMessagesReadStatus(int read);
|
||||
void markSelectedMessagesRead();
|
||||
void markSelectedMessagesUnread();
|
||||
void deleteSelectedMessages();
|
||||
void switchSelectedMessagesImportance();
|
||||
void deleteSelectedMessages();
|
||||
|
||||
void selectNextItem();
|
||||
void selectPreviousItem();
|
||||
|
||||
// Searchs the visible message according to given pattern.
|
||||
void searchMessages(const QString &pattern);
|
||||
void filterMessages(MessagesModel::DisplayFilter filter);
|
||||
void filterMessages(MessagesModel::MessageFilter filter);
|
||||
|
||||
protected slots:
|
||||
// Marks given indexes as selected.
|
||||
|
|
Loading…
Add table
Reference in a new issue