diff --git a/CMakeLists.txt b/CMakeLists.txt index abc9d409e..54846fad0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ set(APP_VERSION "2.0.0-prealpha-2") set(APP_AUTHOR "Martin Rotter") set(APP_URL "http://rssguard.sf.net") -option(USE_QT_5 "Use Qt 5 for building" OFF) +option(USE_QT_5 "Use Qt 5 for building" ON) message(STATUS "[${APP_LOW_NAME}] Welcome to ${APP_NAME} compilation process.") message(STATUS "[${APP_LOW_NAME}] Compilation process begins right now.") diff --git a/resources/misc/db_init.sql b/resources/misc/db_init.sql index de5fe520c..ea131d3a7 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/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index 4b90ad764..9b32fc347 100644 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -5,6 +5,7 @@ #include "qtsingleapplication/qtsingleapplication.h" #include "core/defs.h" +#include "core/datetime.h" #include "core/messagesmodel.h" #include "core/databasefactory.h" #include "gui/iconthemefactory.h" @@ -43,13 +44,12 @@ void MessagesModel::fetchAll() { void MessagesModel::setupFonts() { m_normalFont = QtSingleApplication::font("MessagesView"); + m_boldFont = m_normalFont; m_boldFont.setBold(true); } void MessagesModel::loadMessages(const QList feed_ids) { - // TODO: Doplnit "AND deleted = 0" - // Conversion of parameter. QStringList stringy_ids; stringy_ids.reserve(feed_ids.count()); @@ -59,11 +59,24 @@ void MessagesModel::loadMessages(const QList feed_ids) { } // TODO: časem povolit. - //setFilter(QString("feed IN (%1) ").arg(stringy_ids.join(','))); + //setFilter(QString("feed IN (%1) AND deleted = 0").arg(stringy_ids.join(','))); select(); fetchAll(); } +Message MessagesModel::messageAt(int row_index) const { + QSqlRecord rec = record(row_index); + Message message; + + 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(); + message.m_url = rec.value(MSG_DB_URL_INDEX).toString(); + message.m_updated = DateTime::fromString(rec.value(MSG_DB_DUPDATED_INDEX).toString()); + + return message; +} + void MessagesModel::setupHeaderData() { m_headerData << tr("Id") << tr("Read") << tr("Deleted") << tr("Important") << tr("Feed") << tr("Title") << tr("Url") << tr("Author") << @@ -84,7 +97,19 @@ Qt::ItemFlags MessagesModel::flags(const QModelIndex &idx) const { QVariant MessagesModel::data(const QModelIndex &idx, int role) const { switch (role) { - case Qt::DisplayRole: + // + case Qt::DisplayRole: { + int index_column = idx.column(); + if (index_column != MSG_DB_IMPORTANT_INDEX && + index_column != MSG_DB_READ_INDEX) { + return QSqlTableModel::data(idx, role); + } + else { + return QVariant(); + } + } + + // Return RAW data for EditRole. case Qt::EditRole: return QSqlTableModel::data(idx, role); @@ -101,30 +126,19 @@ QVariant MessagesModel::data(const QModelIndex &idx, int role) const { m_readIcon : m_unreadIcon; } + else if (index_column == MSG_DB_IMPORTANT_INDEX) { + return record(idx.row()).value(MSG_DB_IMPORTANT_INDEX).toInt() == 1 ? + m_favoriteIcon : + QVariant(); + } else { return QVariant(); } } - default: return QVariant(); } - /* - if (role == Qt::FontRole && idx.column() == 1) { - return record(idx.row()).value(1).toInt() == 1 ? m_normalFont : m_boldFont; - } - else if (role == Qt::DecorationRole && idx.column() == 3) { - if (record(idx.row()).value(1).toInt() == 1) { - return IconThemeFactory::getInstance()->fromTheme("mail-mark-read"); - } - else { - return IconThemeFactory::getInstance()->fromTheme("mail-mark-unread"); - } - } - else { - return QSqlTableModel::data(idx, role); - }*/ } bool MessagesModel::setData(const QModelIndex &idx, const QVariant &value, int role) { diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h index 581a7d1aa..8177f576b 100644 --- a/src/core/messagesmodel.h +++ b/src/core/messagesmodel.h @@ -4,10 +4,27 @@ #include #include #include +#include #include "core/defs.h" +// Represents single message. +// NOTE: This is primarily used for transfering data +// to WebBrowser responsible for displaying of messages. +class Message { + private: + QString m_title; + QString m_url; + QString m_author; + QString m_contents; + QDateTime m_updated; + + friend class WebBrowser; + friend class MessagesModel; +}; + + class MessagesModel : public QSqlTableModel { Q_OBJECT @@ -26,6 +43,9 @@ 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. + Message messageAt(int row_index) const; + public slots: // Fetches ALL available data to the model. // NOTE: This is almost needed when sorting @@ -48,6 +68,7 @@ class MessagesModel : public QSqlTableModel { QFont m_normalFont; QFont m_boldFont; + QIcon m_favoriteIcon; QIcon m_readIcon; QIcon m_unreadIcon; diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index aed2c264b..51b1e4df1 100644 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -12,8 +12,28 @@ MessagesView::MessagesView(QWidget *parent) : QTreeView(parent) { setModel(m_proxyModel); - hideColumn(0); - header()->setSectionResizeMode(3, QHeaderView::ResizeToContents); + // Setup column resize strategies. + header()->setSectionResizeMode(MSG_DB_ID_INDEX, QHeaderView::Interactive); + header()->setSectionResizeMode(MSG_DB_READ_INDEX, QHeaderView::ResizeToContents); + header()->setSectionResizeMode(MSG_DB_DELETED_INDEX, QHeaderView::Interactive); + header()->setSectionResizeMode(MSG_DB_IMPORTANT_INDEX, QHeaderView::ResizeToContents); + header()->setSectionResizeMode(MSG_DB_FEED_INDEX, QHeaderView::Interactive); + header()->setSectionResizeMode(MSG_DB_TITLE_INDEX, QHeaderView::Stretch); + header()->setSectionResizeMode(MSG_DB_URL_INDEX, QHeaderView::Interactive); + header()->setSectionResizeMode(MSG_DB_AUTHOR_INDEX, QHeaderView::Interactive); + header()->setSectionResizeMode(MSG_DB_DCREATED_INDEX, QHeaderView::Interactive); + header()->setSectionResizeMode(MSG_DB_DUPDATED_INDEX, QHeaderView::Interactive); + header()->setSectionResizeMode(MSG_DB_CONTENTS_INDEX, QHeaderView::Interactive); + + // Hide columns. + hideColumn(MSG_DB_ID_INDEX); + hideColumn(MSG_DB_DELETED_INDEX); + hideColumn(MSG_DB_FEED_INDEX); + hideColumn(MSG_DB_URL_INDEX); + hideColumn(MSG_DB_CONTENTS_INDEX); + + + //hideColumn(0); // NOTE: It is recommended to call this after the model is set // due to sorting performance. @@ -32,9 +52,13 @@ MessagesProxyModel *MessagesView::model() { return m_proxyModel; } -void MessagesView::setupAppearance() { - header()->setStretchLastSection(true); +void MessagesView::setSortingEnabled(bool enable) { + QTreeView::setSortingEnabled(enable); + header()->setSortIndicatorShown(false); +} +void MessagesView::setupAppearance() { + header()->setStretchLastSection(false); setUniformRowHeights(true); setAcceptDrops(false); setDragEnabled(false); @@ -67,5 +91,7 @@ void MessagesView::currentChanged(const QModelIndex ¤t, m_sourceModel->setData(m_sourceModel->index(ind.row(), 1), 1, Qt::EditRole); + emit currentMessageChanged(m_sourceModel->messageAt(ind.row())); + QTreeView::currentChanged(current, previous); } diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index 74d2155b9..89658cd31 100644 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -16,6 +16,8 @@ class MessagesView : public QTreeView { explicit MessagesView(QWidget *parent = 0); virtual ~MessagesView(); + void setSortingEnabled(bool enable); + // Model accessors. MessagesProxyModel *model(); MessagesModel *sourceModel(); @@ -33,13 +35,12 @@ class MessagesView : public QTreeView { signals: // TODO: dodělat signál. - void currentMessageChanged(/* const Message &message */); + void currentMessageChanged(const Message &message); void currentMessageRemoved(); private: MessagesProxyModel *m_proxyModel; MessagesModel *m_sourceModel; - }; #endif // MESSAGESVIEW_H diff --git a/src/gui/webbrowser.cpp b/src/gui/webbrowser.cpp index d2497d661..7b3ebb01f 100644 --- a/src/gui/webbrowser.cpp +++ b/src/gui/webbrowser.cpp @@ -167,21 +167,13 @@ void WebBrowser::navigateToUrl(const QUrl &url) { } } -void WebBrowser::navigateToMessage() { +void WebBrowser::navigateToMessage(const Message &message) { // TODO: dodělat. - /* - m_webView->setHtml(SkinFactory::getInstance()->getCurrentMarkup().arg(message.m_data.at(MSG_DB_TITLE_INDEX).toString(), - tr("Check your internet connection or website address"), - QString(), - tr("This failure can be caused by:
    " - "
  • non-functional internet connection,
  • " - "
  • incorrect website address,
  • " - "
  • bad proxy server settings,
  • " - "
  • target destination outage,
  • " - "
  • many other things.
  • " - "
"), - "aa")); - */ + m_webView->setHtml(SkinFactory::getInstance()->getCurrentMarkup().arg(message.m_title, + tr("Written by ") + message.m_author, + message.m_url, + message.m_contents, + message.m_updated.toString(Qt::ISODate))); } void WebBrowser::updateZoomGui() { diff --git a/src/gui/webbrowser.h b/src/gui/webbrowser.h index d864bbad1..ba181a552 100644 --- a/src/gui/webbrowser.h +++ b/src/gui/webbrowser.h @@ -61,7 +61,7 @@ class WebBrowser : public TabContent { void navigateToUrl(const QUrl &url); // Navigates to message. - void navigateToMessage(); + void navigateToMessage(const Message &message); // Zoom manipulators. void increaseZoom();