acsacqwdfw

This commit is contained in:
Martin Rotter 2013-12-14 15:45:47 +01:00
parent a3803ee6bc
commit 41911f7f3e
3 changed files with 68 additions and 39 deletions

View file

@ -31,12 +31,15 @@ class FeedsModel : public QAbstractItemModel {
void loadFromDatabase(); void loadFromDatabase();
// Returns all categories.
QHash<int, FeedsModelCategory*> getCategories(); QHash<int, FeedsModelCategory*> getCategories();
// Returns categories from the subtree with given root node.
QHash<int, FeedsModelCategory*> getCategories(FeedsModelRootItem *root); QHash<int, FeedsModelCategory*> getCategories(FeedsModelRootItem *root);
bool addFeed(FeedsModelFeed *feed, int parent_id);
protected: protected:
// Takes lists of feeds/categories and assembles
// them into the tree structure.
void assembleCategories(CategoryAssignment categories); void assembleCategories(CategoryAssignment categories);
void assembleFeeds(FeedAssignment feeds); void assembleFeeds(FeedAssignment feeds);

View file

@ -33,7 +33,7 @@ MessagesModel::~MessagesModel() {
} }
bool MessagesModel::submitAll() { bool MessagesModel::submitAll() {
qFatal("Submittting changes via model is not allowed."); qFatal("Submitting changes via model is not allowed.");
return false; return false;
} }
@ -51,7 +51,6 @@ void MessagesModel::fetchAll() {
void MessagesModel::setupFonts() { void MessagesModel::setupFonts() {
m_normalFont = QtSingleApplication::font("MessagesView"); m_normalFont = QtSingleApplication::font("MessagesView");
m_boldFont = m_normalFont; m_boldFont = m_normalFont;
m_boldFont.setBold(true); m_boldFont.setBold(true);
} }
@ -103,8 +102,8 @@ void MessagesModel::setupHeaderData() {
tr("Date of the most recent update of the message.") << tr("Contents of the message."); tr("Date of the most recent update of the message.") << tr("Contents of the message.");
} }
Qt::ItemFlags MessagesModel::flags(const QModelIndex &idx) const { Qt::ItemFlags MessagesModel::flags(const QModelIndex &index) const {
Q_UNUSED(idx) Q_UNUSED(index)
#if QT_VERSION >= 0x050000 #if QT_VERSION >= 0x050000
if (m_isInEditingMode) { if (m_isInEditingMode) {
@ -123,39 +122,38 @@ QVariant MessagesModel::data(int row, int column, int role) const {
return data(index(row, column), role); return data(index(row, column), role);
} }
QVariant MessagesModel::data(const QModelIndex &idx, int role) const { QVariant MessagesModel::data(const QModelIndex &index, int role) const {
switch (role) { switch (role) {
// Human readable data for viewing. // Human readable data for viewing.
case Qt::DisplayRole: { case Qt::DisplayRole: {
int index_column = idx.column(); int index_column = index.column();
if (index_column != MSG_DB_IMPORTANT_INDEX && if (index_column != MSG_DB_IMPORTANT_INDEX &&
index_column != MSG_DB_READ_INDEX) { index_column != MSG_DB_READ_INDEX) {
return QSqlTableModel::data(idx, role); return QSqlTableModel::data(index, role);
} }
else { else {
return QVariant(); return QVariant();
} }
} }
// Return RAW data for EditRole.
case Qt::EditRole: case Qt::EditRole:
return QSqlTableModel::data(idx, role); return QSqlTableModel::data(index, role);
case Qt::FontRole: case Qt::FontRole:
return record(idx.row()).value(MSG_DB_READ_INDEX).toInt() == 1 ? return record(index.row()).value(MSG_DB_READ_INDEX).toInt() == 1 ?
m_normalFont : m_normalFont :
m_boldFont; m_boldFont;
case Qt::DecorationRole: { case Qt::DecorationRole: {
int index_column = idx.column(); int index_column = index.column();
if (index_column == MSG_DB_READ_INDEX) { if (index_column == MSG_DB_READ_INDEX) {
return record(idx.row()).value(MSG_DB_READ_INDEX).toInt() == 1 ? return record(index.row()).value(MSG_DB_READ_INDEX).toInt() == 1 ?
m_readIcon : m_readIcon :
m_unreadIcon; m_unreadIcon;
} }
else if (index_column == MSG_DB_IMPORTANT_INDEX) { else if (index_column == MSG_DB_IMPORTANT_INDEX) {
return record(idx.row()).value(MSG_DB_IMPORTANT_INDEX).toInt() == 1 ? return record(index.row()).value(MSG_DB_IMPORTANT_INDEX).toInt() == 1 ?
m_favoriteIcon : m_favoriteIcon :
QVariant(); QVariant();
} }
@ -169,13 +167,14 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const {
} }
} }
bool MessagesModel::setData(const QModelIndex &idx, const QVariant &value, int role) { bool MessagesModel::setData(const QModelIndex &index,
const QVariant &value,
int role) {
#if QT_VERSION >= 0x050000 #if QT_VERSION >= 0x050000
m_isInEditingMode = true; m_isInEditingMode = true;
#endif #endif
bool set_data_result = QSqlTableModel::setData(idx, value, role); bool set_data_result = QSqlTableModel::setData(index, value, role);
#if QT_VERSION >= 0x050000 #if QT_VERSION >= 0x050000
m_isInEditingMode = false; m_isInEditingMode = false;
@ -185,8 +184,16 @@ bool MessagesModel::setData(const QModelIndex &idx, const QVariant &value, int r
} }
bool MessagesModel::setMessageRead(int row_index, int read) { bool MessagesModel::setMessageRead(int row_index, int read) {
if (!database().transaction()) { if (data(row_index, MSG_DB_READ_INDEX, Qt::EditRole).toInt() == read) {
qWarning("Starting transaction for batch message read change."); // Read status is the same is the one currently set.
// In that case, no extra work is needed.
return true;
}
QSqlDatabase db_handle = database();
if (!db_handle.transaction()) {
qWarning("Starting transaction for message read change.");
return false; return false;
} }
@ -196,15 +203,19 @@ bool MessagesModel::setMessageRead(int row_index, int read) {
if (!working_change) { if (!working_change) {
// If rewriting in the model failed, then cancel all actions. // If rewriting in the model failed, then cancel all actions.
qDebug("Setting of new data to the model failed for message read change.");
db_handle.rollback();
return false; return false;
} }
QSqlDatabase db_handle = database();
int message_id; int message_id;
QSqlQuery query_delete_msg(db_handle); QSqlQuery query_delete_msg(db_handle);
if (!query_delete_msg.prepare("UPDATE messages SET read = :read " if (!query_delete_msg.prepare("UPDATE messages SET read = :read "
"WHERE id = :id")) { "WHERE id = :id")) {
qWarning("Query preparation failed for message read change."); qWarning("Query preparation failed for message read change.");
db_handle.rollback();
return false; return false;
} }
@ -228,8 +239,10 @@ bool MessagesModel::setMessageRead(int row_index, int read) {
} }
bool MessagesModel::switchMessageImportance(int row_index) { bool MessagesModel::switchMessageImportance(int row_index) {
if (!database().transaction()) { QSqlDatabase db_handle = database();
qWarning("Starting transaction for batch message importance switch failed.");
if (!db_handle.transaction()) {
qWarning("Starting transaction for message importance switch failed.");
return false; return false;
} }
@ -243,15 +256,19 @@ bool MessagesModel::switchMessageImportance(int row_index) {
if (!working_change) { if (!working_change) {
// If rewriting in the model failed, then cancel all actions. // If rewriting in the model failed, then cancel all actions.
qDebug("Setting of new data to the model failed for message importance change.");
db_handle.rollback();
return false; return false;
} }
QSqlDatabase db_handle = database();
int message_id; int message_id;
QSqlQuery query_delete_msg(db_handle); QSqlQuery query_delete_msg(db_handle);
if (!query_delete_msg.prepare("UPDATE messages SET important = :important " if (!query_delete_msg.prepare("UPDATE messages SET important = :important "
"WHERE id = :id")) { "WHERE id = :id")) {
qWarning("Query preparation failed for message importance switch."); qWarning("Query preparation failed for message importance switch.");
db_handle.rollback();
return false; return false;
} }
@ -275,17 +292,20 @@ bool MessagesModel::switchMessageImportance(int row_index) {
} }
bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages) { bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages) {
if (!database().transaction()) { QSqlDatabase db_handle = database();
if (!db_handle.transaction()) {
qWarning("Starting transaction for batch message importance switch failed."); qWarning("Starting transaction for batch message importance switch failed.");
return false; return false;
} }
QSqlDatabase db_handle = database();
int message_id, importance; int message_id, importance;
QSqlQuery query_delete_msg(db_handle); QSqlQuery query_delete_msg(db_handle);
if (!query_delete_msg.prepare("UPDATE messages SET important = :important " if (!query_delete_msg.prepare("UPDATE messages SET important = :important "
"WHERE id = :id")) { "WHERE id = :id")) {
qWarning("Query preparation failed for message importance switch."); qWarning("Query preparation failed for message importance switch.");
db_handle.rollback();
return false; return false;
} }
@ -312,17 +332,20 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages
} }
bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int deleted) { bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int deleted) {
if (!database().transaction()) { QSqlDatabase db_handle = database();
if (!db_handle.transaction()) {
qWarning("Starting transaction for batch message deletion."); qWarning("Starting transaction for batch message deletion.");
return false; return false;
} }
QSqlDatabase db_handle = database();
int message_id; int message_id;
QSqlQuery query_delete_msg(db_handle); QSqlQuery query_delete_msg(db_handle);
if (!query_delete_msg.prepare("UPDATE messages SET deleted = :deleted " if (!query_delete_msg.prepare("UPDATE messages SET deleted = :deleted "
"WHERE id = :id")) { "WHERE id = :id")) {
qWarning("Query preparation failed for message deletion."); qWarning("Query preparation failed for message deletion.");
db_handle.rollback();
return false; return false;
} }
@ -346,17 +369,20 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages, int
} }
bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int read) { bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, int read) {
if (!database().transaction()) { QSqlDatabase db_handle = database();
if (!db_handle.transaction()) {
qWarning("Starting transaction for batch message read change."); qWarning("Starting transaction for batch message read change.");
return false; return false;
} }
QSqlDatabase db_handle = database();
int message_id; int message_id;
QSqlQuery query_delete_msg(db_handle); QSqlQuery query_delete_msg(db_handle);
if (!query_delete_msg.prepare("UPDATE messages SET read = :read " if (!query_delete_msg.prepare("UPDATE messages SET read = :read "
"WHERE id = :id")) { "WHERE id = :id")) {
qWarning("Query preparation failed for message read change."); qWarning("Query preparation failed for message read change.");
db_handle.rollback();
return false; return false;
} }

View file

@ -13,16 +13,16 @@
// NOTE: This is primarily used for transfering data // NOTE: This is primarily used for transfering data
// to WebBrowser responsible for displaying of messages. // to WebBrowser responsible for displaying of messages.
class Message { class Message {
friend class WebBrowser;
friend class MessagesModel;
friend class MessagesView;
private: private:
QString m_title; QString m_title;
QString m_url; QString m_url;
QString m_author; QString m_author;
QString m_contents; QString m_contents;
QDateTime m_updated; QDateTime m_updated;
friend class WebBrowser;
friend class MessagesModel;
friend class MessagesView;
}; };
@ -35,11 +35,11 @@ class MessagesModel : public QSqlTableModel {
virtual ~MessagesModel(); virtual ~MessagesModel();
// Model implementation. // Model implementation.
bool setData(const QModelIndex &idx, const QVariant &value, int role = Qt::EditRole); bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
QVariant data(int row, int column, int role = Qt::DisplayRole) const; QVariant data(int row, int column, int role = Qt::DisplayRole) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const;
Qt::ItemFlags flags(const QModelIndex &idx) const; Qt::ItemFlags flags(const QModelIndex &index) const;
public: public:
// Sets up all icons which are used directly by this model. // Sets up all icons which are used directly by this model.