diff --git a/resources/misc/db_init.sql b/resources/misc/db_init.sql
index ea131d3a7..de5fe520c 100644
--- a/resources/misc/db_init.sql
+++ b/resources/misc/db_init.sql
@@ -1,50 +1,50 @@
-DROP TABLE IF EXISTS Information;
--- !
-CREATE TABLE IF NOT EXISTS Information (
- key TEXT PRIMARY KEY,
- value TEXT NOT NULL
-);
--- !
-INSERT INTO Information VALUES ('schema_version', '0.0.1');
--- !
-DROP TABLE IF EXISTS Categories;
--- !
-CREATE TABLE IF NOT EXISTS Categories (
- id INTEGER PRIMARY KEY,
- title TEXT NOT NULL UNIQUE CHECK (title != ''),
- description TEXT,
- date_created TEXT NOT NULL CHECK (date_created != ''),
- icon BLOB
-);
--- !
-DROP TABLE IF EXISTS Feeds;
--- !
-CREATE TABLE IF NOT EXISTS Feeds (
- id INTEGER PRIMARY KEY,
- title TEXT NOT NULL CHECK (title != ''),
- description TEXT,
- date_created TEXT NOT NULL CHECK (date_created != ''),
- icon BLOB,
- category INTEGER NOT NULL CHECK (category >= -1),
- encoding TEXT NOT NULL CHECK (encoding != ''),
- url TEXT NOT NULL UNIQUE CHECK (url != ''),
- type INTEGER NOT NULL
-);
--- !
-DROP TABLE IF EXISTS Messages;
--- !
-CREATE TABLE IF NOT EXISTS Messages (
- id INTEGER PRIMARY KEY,
- read INTEGER(1) NOT NULL CHECK (read >= 0 AND read <= 1) DEFAULT (0),
- deleted INTEGER(1) NOT NULL CHECK (deleted >= 0 AND deleted <= 1) DEFAULT (0),
- important INTEGER(1) NOT NULL CHECK (important >= 0 AND important <= 1) DEFAULT (0),
- feed INTEGER NOT NULL,
- title TEXT NOT NULL CHECK (title != ''),
- url TEXT,
- author TEXT,
- date_created TEXT NOT NULL CHECK (date_created != ''),
- date_updated TEXT,
- contents TEXT,
-
- FOREIGN KEY (feed) REFERENCES Feeds (id)
+DROP TABLE IF EXISTS Information;
+-- !
+CREATE TABLE IF NOT EXISTS Information (
+ key TEXT PRIMARY KEY,
+ value TEXT NOT NULL
+);
+-- !
+INSERT INTO Information VALUES ('schema_version', '0.0.1');
+-- !
+DROP TABLE IF EXISTS Categories;
+-- !
+CREATE TABLE IF NOT EXISTS Categories (
+ id INTEGER PRIMARY KEY,
+ title TEXT NOT NULL UNIQUE CHECK (title != ''),
+ description TEXT,
+ date_created TEXT NOT NULL CHECK (date_created != ''),
+ icon BLOB
+);
+-- !
+DROP TABLE IF EXISTS Feeds;
+-- !
+CREATE TABLE IF NOT EXISTS Feeds (
+ id INTEGER PRIMARY KEY,
+ title TEXT NOT NULL CHECK (title != ''),
+ description TEXT,
+ date_created TEXT NOT NULL CHECK (date_created != ''),
+ icon BLOB,
+ category INTEGER NOT NULL CHECK (category >= -1),
+ encoding TEXT NOT NULL CHECK (encoding != ''),
+ url TEXT NOT NULL UNIQUE CHECK (url != ''),
+ type INTEGER NOT NULL
+);
+-- !
+DROP TABLE IF EXISTS Messages;
+-- !
+CREATE TABLE IF NOT EXISTS Messages (
+ id INTEGER PRIMARY KEY,
+ read INTEGER(1) NOT NULL CHECK (read >= 0 AND read <= 1) DEFAULT (0),
+ deleted INTEGER(1) NOT NULL CHECK (deleted >= 0 AND deleted <= 1) DEFAULT (0),
+ important INTEGER(1) NOT NULL CHECK (important >= 0 AND important <= 1) DEFAULT (0),
+ feed INTEGER NOT NULL,
+ title TEXT NOT NULL CHECK (title != ''),
+ url TEXT,
+ author TEXT,
+ date_created TEXT NOT NULL CHECK (date_created != ''),
+ date_updated TEXT,
+ contents TEXT,
+
+ FOREIGN KEY (feed) REFERENCES Feeds (id)
);
\ No newline at end of file
diff --git a/resources/skins/base/vergilius.xml b/resources/skins/base/vergilius.xml
index 3af5cb344..9bfa44622 100644
--- a/resources/skins/base/vergilius.xml
+++ b/resources/skins/base/vergilius.xml
@@ -6,31 +6,40 @@
rotter.martinos@gmail.com
- PGh0bWw+IDxoZWFkPiA8c3R5bGU+cHJle3doaXRlLXNwYWNlOnByZS13cmFwfS5oZWFkZXJ0ZXh0
-e2ZvbnQtc2l6ZToxOXB4O21hcmdpbi1ib3R0b206MTBweH0uaGVhZGVye2ZvbnQtc2l6ZToxNXB4
-Oy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDFzIGVhc2Utb3V0O2JhY2tncm91bmQ6LXdl
-YmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sY29sb3Itc3RvcCgwJSwj
-NDU0ODRkKSxjb2xvci1zdG9wKDEwMCUsIzAwMDAwMCkpO2JhY2tncm91bmQ6LXdlYmtpdC1saW5l
-YXItZ3JhZGllbnQodG9wLCM0NTQ4NGQgMCwjMDAwMDAwIDEwMCUpOy13ZWJraXQtYm9yZGVyLXJh
-ZGl1czozcHg7dGV4dC1zaGFkb3c6MCAwIDFweCAjZmZmO2ZpbHRlcjpkcm9wc2hhZG93KGNvbG9y
-PSNmZmZmZmYsb2ZmeD0wLG9mZnk9MCk7cGFkZGluZzo4cHg7bWFyZ2luOjVweCBhdXRvIDVweCBh
-dXRvO2NvbG9yOndoaXRlfS5oZWFkZXIgYXtjb2xvcjp3aGl0ZX0uY29udGVudHtmb250LXNpemU6
-MTRweDtiYWNrZ3JvdW5kOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90
-dG9tLGNvbG9yLXN0b3AoMCUscmdiYSgyMzgsMjM4LDIzOCwwLjY2KSksY29sb3Itc3RvcCgxMDAl
-LHJnYmEoMjM4LDIzOCwyMzgsMC42NikpKTtiYWNrZ3JvdW5kOi13ZWJraXQtbGluZWFyLWdyYWRp
-ZW50KHRvcCxyZ2JhKDIzOCwyMzgsMjM4LDAuNjYpIDAscmdiYSgyMzgsMjM4LDIzOCwwLjY2KSAx
-MDAlKTstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4O21hcmdpbjo1cHggYXV0byA1cHggYXV0bztw
-YWRkaW5nOjhweH0uZm9vdGVye2ZvbnQtc2l6ZToxMnB4O3RleHQtYWxpZ246Y2VudGVyO3ZlcnRp
-Y2FsLWFsaWduOm1pZGRsZTstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAxcyBlYXNlLW91
-dDtiYWNrZ3JvdW5kOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90dG9t
-LGNvbG9yLXN0b3AoMCUsIzQ1NDg0ZCksY29sb3Itc3RvcCgxMDAlLCMwMDAwMDApKTtiYWNrZ3Jv
-dW5kOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjNDU0ODRkIDAsIzAwMDAwMCAxMDAlKTst
-d2Via2l0LWJvcmRlci1yYWRpdXM6M3B4O3RleHQtc2hhZG93OjAgMCAxcHggI2ZmZjtmaWx0ZXI6
-ZHJvcHNoYWRvdyhjb2xvcj0jZmZmZmZmLG9mZng9MCxvZmZ5PTApO3BhZGRpbmc6OHB4O21hcmdp
-bjo1cHggYXV0byA1cHggYXV0bztjb2xvcjp3aGl0ZX08L3N0eWxlPiA8dGl0bGU+JTE8L3RpdGxl
-PiA8L2hlYWQ+IDxib2R5PiA8ZGl2IGNsYXNzPSJoZWFkZXIiPiA8ZGl2IGNsYXNzPSJoZWFkZXJ0
-ZXh0Ij4lMTwvZGl2PiAlMjxicj4gPGEgaHJlZj0iJTMiPiUzPC9hPiA8L2Rpdj4gPGRpdiBjbGFz
-cz0iY29udGVudCI+ICU0IDwvZGl2PiA8ZGl2IGNsYXNzPSJmb290ZXIiPiAlNSA8L2Rpdj4gPC9i
-b2R5PiA8L2h0bWw+
+ PGh0bWw+DQogIDxoZWFkPg0KICAgIDxzdHlsZT4NCiAgICAgIHByZXsNCiAgICAgICAgd2hpdGUt
+c3BhY2U6cHJlLXdyYXB9DQogICAgICAuaGVhZGVydGV4dHsNCiAgICAgICAgZm9udC1zaXplOjE5
+cHg7DQogICAgICAgIG1hcmdpbi1ib3R0b206MTBweH0NCiAgICAgIC5oZWFkZXJ7DQogICAgICAg
+IGZvbnQtc2l6ZToxNXB4Ow0KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAx
+cyBlYXNlLW91dDsNCiAgICAgICAgYmFja2dyb3VuZDotd2Via2l0LWdyYWRpZW50KGxpbmVhcixs
+ZWZ0IHRvcCxsZWZ0IGJvdHRvbSxjb2xvci1zdG9wKDAlLCM0NTQ4NGQpLGNvbG9yLXN0b3AoMTAw
+JSwjMDAwMDAwKSk7DQogICAgICAgIGJhY2tncm91bmQ6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQo
+dG9wLCM0NTQ4NGQgMCwjMDAwMDAwIDEwMCUpOw0KICAgICAgICAtd2Via2l0LWJvcmRlci1yYWRp
+dXM6MXB4Ow0KICAgICAgICB0ZXh0LXNoYWRvdzowIDAgMXB4ICNmZmY7DQogICAgICAgIGZpbHRl
+cjpkcm9wc2hhZG93KGNvbG9yPSNmZmZmZmYsb2ZmeD0wLG9mZnk9MCk7DQogICAgICAgIHBhZGRp
+bmc6OHB4Ow0KICAgICAgICBtYXJnaW46NXB4IGF1dG8gNXB4IGF1dG87DQogICAgICAgIGNvbG9y
+OndoaXRlfQ0KICAgICAgLmhlYWRlciBhew0KICAgICAgICBjb2xvcjp3aGl0ZX0NCiAgICAgIC5j
+b250ZW50ew0KICAgICAgICBmb250LXNpemU6MTRweDsNCiAgICAgICAgYmFja2dyb3VuZDotd2Vi
+a2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCxsZWZ0IGJvdHRvbSxjb2xvci1zdG9wKDAlLHJn
+YmEoMjM4LDIzOCwyMzgsMC42NikpLGNvbG9yLXN0b3AoMTAwJSxyZ2JhKDIzOCwyMzgsMjM4LDAu
+NjYpKSk7DQogICAgICAgIGJhY2tncm91bmQ6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLHJn
+YmEoMjM4LDIzOCwyMzgsMC42NikgMCxyZ2JhKDIzOCwyMzgsMjM4LDAuNjYpIDEwMCUpOw0KICAg
+ICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6MXB4Ow0KICAgICAgICBtYXJnaW46NXB4IGF1dG8g
+NXB4IGF1dG87DQogICAgICAgIHBhZGRpbmc6OHB4fQ0KICAgICAgLmZvb3RlcnsNCiAgICAgICAg
+Zm9udC1zaXplOjEycHg7DQogICAgICAgIHRleHQtYWxpZ246Y2VudGVyOw0KICAgICAgICB2ZXJ0
+aWNhbC1hbGlnbjptaWRkbGU7DQogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5k
+IDFzIGVhc2Utb3V0Ow0KICAgICAgICBiYWNrZ3JvdW5kOi13ZWJraXQtZ3JhZGllbnQobGluZWFy
+LGxlZnQgdG9wLGxlZnQgYm90dG9tLGNvbG9yLXN0b3AoMCUsIzQ1NDg0ZCksY29sb3Itc3RvcCgx
+MDAlLCMwMDAwMDApKTsNCiAgICAgICAgYmFja2dyb3VuZDotd2Via2l0LWxpbmVhci1ncmFkaWVu
+dCh0b3AsIzQ1NDg0ZCAwLCMwMDAwMDAgMTAwJSk7DQogICAgICAgIC13ZWJraXQtYm9yZGVyLXJh
+ZGl1czoxcHg7DQogICAgICAgIHRleHQtc2hhZG93OjAgMCAxcHggI2ZmZjsNCiAgICAgICAgZmls
+dGVyOmRyb3BzaGFkb3coY29sb3I9I2ZmZmZmZixvZmZ4PTAsb2ZmeT0wKTsNCiAgICAgICAgcGFk
+ZGluZzo4cHg7DQogICAgICAgIG1hcmdpbjo1cHggYXV0byA1cHggYXV0bzsNCiAgICAgICAgY29s
+b3I6d2hpdGV9DQogICAgPC9zdHlsZT4NCiAgICA8dGl0bGU+DQogICAgICAlMQ0KICAgIDwvdGl0
+bGU+DQogIDwvaGVhZD4NCiAgPGJvZHk+DQogICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4NCiAgICAg
+IDxkaXYgY2xhc3M9ImhlYWRlcnRleHQiPg0KICAgICAgICAlMQ0KICAgICAgPC9kaXY+DQogICAg
+ICAlMg0KICAgICAgPGJyPg0KICAgICAgPGEgaHJlZj0iJTMiPg0KICAgICAgICAlMw0KICAgICAg
+PC9hPg0KICAgIDwvZGl2Pg0KICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPg0KICAgICAgJTQgDQog
+ICAgPC9kaXY+DQogICAgPGRpdiBjbGFzcz0iZm9vdGVyIj4NCiAgICAgICU1IA0KICAgIDwvZGl2
+Pg0KICA8L2JvZHk+DQo8L2h0bWw+
\ No newline at end of file
diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp
index 9b32fc347..6372a9f97 100644
--- a/src/core/messagesmodel.cpp
+++ b/src/core/messagesmodel.cpp
@@ -20,7 +20,7 @@ MessagesModel::MessagesModel(QObject *parent)
setupHeaderData();
// Set desired table and edit strategy.
- setEditStrategy(QSqlTableModel::OnFieldChange);
+ setEditStrategy(QSqlTableModel::OnManualSubmit);
setTable("Messages");
loadMessages(QList());
@@ -50,7 +50,11 @@ void MessagesModel::setupFonts() {
}
void MessagesModel::loadMessages(const QList feed_ids) {
+ // Submit changes first.
+ submitAll();
+
// Conversion of parameter.
+ m_currentFeeds = feed_ids;
QStringList stringy_ids;
stringy_ids.reserve(feed_ids.count());
@@ -68,6 +72,7 @@ Message MessagesModel::messageAt(int row_index) const {
QSqlRecord rec = record(row_index);
Message message;
+ // Fill Message object with details.
message.m_author = rec.value(MSG_DB_AUTHOR_INDEX).toString();
message.m_contents = rec.value(MSG_DB_CONTENTS_INDEX).toString();
message.m_title = rec.value(MSG_DB_TITLE_INDEX).toString();
@@ -95,6 +100,10 @@ Qt::ItemFlags MessagesModel::flags(const QModelIndex &idx) const {
}
}
+QVariant MessagesModel::data(int row, int column, int role) const {
+ return data(index(row, column), role);
+}
+
QVariant MessagesModel::data(const QModelIndex &idx, int role) const {
switch (role) {
//
@@ -142,10 +151,6 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const {
}
bool MessagesModel::setData(const QModelIndex &idx, const QVariant &value, int role) {
- if (!idx.isValid()) {
- return false;
- }
-
m_isInEditingMode = true;
bool set_data_result = QSqlTableModel::setData(idx, value, role);
m_isInEditingMode = false;
@@ -153,6 +158,25 @@ bool MessagesModel::setData(const QModelIndex &idx, const QVariant &value, int r
return set_data_result;
}
+bool MessagesModel::setMessageRead(int row_index, int read) {
+ return setData(index(row_index, MSG_DB_READ_INDEX),
+ read);
+}
+
+bool MessagesModel::setMessageDeleted(int row_index, int deleted) {
+ return setData(index(row_index, MSG_DB_DELETED_INDEX),
+ deleted);
+}
+
+bool MessagesModel::switchMessageImportance(int row_index) {
+ QModelIndex target_index = index(row_index, MSG_DB_IMPORTANT_INDEX);
+ int current_importance = data(target_index).toInt();
+
+ return current_importance == 1 ?
+ setData(target_index, 0) :
+ setData(target_index, 1);
+}
+
QVariant MessagesModel::headerData(int section,
Qt::Orientation orientation,
int role) const {
diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h
index 8177f576b..fd955cf91 100644
--- a/src/core/messagesmodel.h
+++ b/src/core/messagesmodel.h
@@ -35,7 +35,8 @@ class MessagesModel : public QSqlTableModel {
// Model implementation.
bool setData(const QModelIndex &idx, const QVariant &value, int role = Qt::EditRole);
- QVariant data(const QModelIndex &idx, int role) const;
+ QVariant data(const QModelIndex &idx, 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;
Qt::ItemFlags flags(const QModelIndex &idx) const;
@@ -43,12 +44,17 @@ class MessagesModel : public QSqlTableModel {
// Sets up all icons which are used directly by this model.
void setupIcons();
- // Returns const reference to message at given index.
+ // Returns message at given index.
Message messageAt(int row_index) const;
public slots:
+ // Message manipulators.
+ bool switchMessageImportance(int row_index);
+ bool setMessageDeleted(int row_index, int deleted);
+ bool setMessageRead(int row_index, int read);
+
// Fetches ALL available data to the model.
- // NOTE: This is almost needed when sorting
+ // NOTE: This is almost always needed when sorting
// and makes the model more predictable.
void fetchAll();
@@ -63,6 +69,7 @@ class MessagesModel : public QSqlTableModel {
void setupFonts();
private:
+ QList m_currentFeeds;
QList m_headerData;
bool m_isInEditingMode;
diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp
index 5a3df7fd8..4e74e5f97 100644
--- a/src/gui/feedmessageviewer.cpp
+++ b/src/gui/feedmessageviewer.cpp
@@ -3,11 +3,13 @@
#include
#include
#include
+#include
#include "gui/feedmessageviewer.h"
#include "gui/webbrowser.h"
#include "gui/messagesview.h"
#include "gui/feedsview.h"
+#include "core/messagesproxymodel.h"
FeedMessageViewer::FeedMessageViewer(QWidget *parent)
@@ -31,7 +33,11 @@ void FeedMessageViewer::initialize() {
m_toolBar->setMovable(false);
m_toolBar->setAllowedAreas(Qt::TopToolBarArea);
+ // TODO: testovaci
m_toolBar->addAction(QIcon::fromTheme("application-exit"), "aaa");
+ QAction *ac = m_toolBar->actions().at(0);
+ connect(ac, SIGNAL(triggered()),
+ m_messagesView->model()->sourceModel(), SLOT(submitAll()));
// Finish web/message browser setup.
m_messagesBrowser->setNavigationBarVisible(false);
diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp
index 51b1e4df1..da9b56dc8 100644
--- a/src/gui/messagesview.cpp
+++ b/src/gui/messagesview.cpp
@@ -89,7 +89,7 @@ void MessagesView::currentChanged(const QModelIndex ¤t,
current.row(), current.column(),
ind.row(), ind.column());
- m_sourceModel->setData(m_sourceModel->index(ind.row(), 1), 1, Qt::EditRole);
+ m_sourceModel->setMessageRead(ind.row(), 1);
emit currentMessageChanged(m_sourceModel->messageAt(ind.row()));
diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h
index 89658cd31..3ae0afca3 100644
--- a/src/gui/messagesview.h
+++ b/src/gui/messagesview.h
@@ -22,6 +22,14 @@ class MessagesView : public QTreeView {
MessagesProxyModel *model();
MessagesModel *sourceModel();
+ public slots:
+ // Message manipulators.
+ // TODO: sem pridat metody jako
+ // setSelectedMessagesRead....
+ // setSelectedMessagesUnread.....
+ // deleteSelectedMessages....
+ // ......
+
protected:
void setupAppearance();
@@ -34,7 +42,6 @@ class MessagesView : public QTreeView {
const QItemSelection &deselected);
signals:
- // TODO: dodělat signál.
void currentMessageChanged(const Message &message);
void currentMessageRemoved();