A title on the webView.

Leonardo Robol [2011-10-24 05:16]
A title on the webView.
Filename
feedpoller.cpp
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
rssparser.cpp
rssparser.h
diff --git a/feedpoller.cpp b/feedpoller.cpp
index 3d7b696..11a6834 100644
--- a/feedpoller.cpp
+++ b/feedpoller.cpp
@@ -29,7 +29,7 @@ FeedPoller::run()

     // Create the timer that will call the function every second.
     QTimer *timer = new QTimer ();
-    timer->setInterval(800);
+    timer->setInterval(1000);
     timer->connect(timer, SIGNAL(timeout()),
                    this, SLOT(poll()));
     timer->start();
@@ -87,12 +87,14 @@ FeedPoller::networkManagerReplyFinished(QNetworkReply *reply)
         query.bindValue("feed", nowLoading - FEEDMODEL_MAX_CATEGORIES);
         if (!query.exec ())
             return;
+
         QStringList links;
-        query.first();
-        do
+        if (query.first())
         {
             links.append(query.value(0).toString());
-        } while (query.next());
+            while (query.next())
+                links.append(query.value(0).toString());
+        }

         QDomElement doc_el = doc.documentElement();
         QDomNodeList items = doc_el.elementsByTagName("item");
@@ -107,6 +109,7 @@ FeedPoller::networkManagerReplyFinished(QNetworkReply *reply)
             QString link = element.elementsByTagName("link").item(0).firstChild().nodeValue();
             QString title = element.elementsByTagName("title").item(0).firstChild().nodeValue();
             QString description = element.elementsByTagName("description").item(0).firstChild().nodeValue();
+            QString content = element.elementsByTagName("content:encoded").item(0).firstChild().nodeValue();

             // We should enable this for RSS 2.0
             // QString guid = element.elementsByTagName("guid").item(0).firstChild().nodeValue();
@@ -121,12 +124,16 @@ FeedPoller::networkManagerReplyFinished(QNetworkReply *reply)
                 record.setValue("title", title);
                 record.setValue("link", link);
                 record.setValue("description", description);
+                record.setValue("content", content);
                 record.setValue("feed", nowLoading - FEEDMODEL_MAX_CATEGORIES);

                 if (!parser->insertRecord(-1, record))
                     qDebug () << "Error inserting record";
             }
         }
+
+        if (!parser->submitAll())
+            qDebug() << "Error submitting new data";
     }
     else
         qDebug () << "Error parsing the document";
diff --git a/main.cpp b/main.cpp
index 778716d..1eea1f3 100644
--- a/main.cpp
+++ b/main.cpp
@@ -5,8 +5,6 @@ int main(int argc, char *argv[])
 {
     QApplication lars_application(argc, argv);
     Larss::MainWindow main_window;
-
     main_window.show();
-
     return lars_application.exec();
 }
diff --git a/mainwindow.cpp b/mainwindow.cpp
index a512f6d..e3da0d8 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -28,13 +28,18 @@ MainWindow::MainWindow(QWidget *parent) :
     ui->newsTableView->setColumnHidden(1, true); // Feed ID
     ui->newsTableView->setColumnHidden(3, true); // Link
     ui->newsTableView->setColumnHidden(4, true); // Description
-    ui->newsTableView->setColumnHidden(5, true); // Time
-    ui->newsTableView->setColumnHidden(6, true); // Read state
+    ui->newsTableView->setColumnHidden(5, true); // Content
+    ui->newsTableView->setColumnHidden(6, true); // Time
+    ui->newsTableView->setColumnHidden(7, true); // Read state
     ui->newsTableView->setEditTriggers(QTableView::NoEditTriggers);
     ui->newsTableView->verticalHeader()->setHidden(true);
+    ui->newsTableView->horizontalHeader()->setHidden(true);
     ui->newsTableView->horizontalHeader()->setStretchLastSection(false);
     ui->newsTableView->horizontalHeader()->setResizeMode(2, QHeaderView::Stretch);

+    // Show only unread elements
+    rssParser->setFilter("read=0");
+
     poller = new FeedPoller (this, rssParser, feedModel);
     poller->start();
 }
@@ -68,6 +73,9 @@ void Larss::MainWindow::on_feedTreeView_clicked(const QModelIndex &index)
     if ((feed_id = rssParser->getFeed (index)))
     {
         rssParser->selectActiveFeed(feed_id);
+
+        // Reset the title
+        ui->webViewTitleLabel->setText("");
     }

 }
@@ -79,11 +87,17 @@ void Larss::MainWindow::on_newsTableView_clicked(const QModelIndex &index)
     quint32 row_number = index.row();

     // A row got activated, so open it in the webview.
-    QString link = rssParser->getLink(index);
-    // ui->webView->load(link);
-    ui->webView->setHtml(rssParser->getDescription(index));
+    ui->webView->setHtml(rssParser->getContent(index));
+
+    // Select the right title
+    ui->webViewTitleLabel->setText(QString("<b>%1</b>").arg(rssParser->getTitle (index)));

     // And then mark it as read
     rssParser->setReadStatus(index, true);
     ui->newsTableView->selectRow(row_number);
 }
+
+void Larss::MainWindow::on_newsTableView_activated(const QModelIndex &index)
+{
+    on_newsTableView_clicked(index);
+}
diff --git a/mainwindow.h b/mainwindow.h
index 11d1003..6c71c04 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -28,6 +28,8 @@ private slots:

     void on_newsTableView_clicked(const QModelIndex &index);

+    void on_newsTableView_activated(const QModelIndex &index);
+
 private:
     Ui::MainWindow *ui;
     void do_exit();
diff --git a/mainwindow.ui b/mainwindow.ui
index dbf773b..f297349 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -14,7 +14,7 @@
    <string>Larss 0.1</string>
   </property>
   <widget class="QWidget" name="centralWidget">
-   <layout class="QVBoxLayout" name="verticalLayout_2">
+   <layout class="QVBoxLayout" name="verticalLayout_3">
     <item>
      <widget class="QSplitter" name="splitter_2">
       <property name="orientation">
@@ -36,33 +36,46 @@
          <bool>false</bool>
         </attribute>
        </widget>
-       <widget class="QFrame" name="frame">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="frameShape">
-         <enum>QFrame::StyledPanel</enum>
-        </property>
-        <property name="frameShadow">
-         <enum>QFrame::Raised</enum>
-        </property>
-        <layout class="QVBoxLayout" name="verticalLayout">
-         <property name="spacing">
-          <number>0</number>
-         </property>
-         <property name="margin">
-          <number>0</number>
-         </property>
+       <widget class="QWidget" name="">
+        <layout class="QVBoxLayout" name="verticalLayout_2">
          <item>
-          <widget class="QWebView" name="webView">
-           <property name="url">
-            <url>
-             <string>about:blank</string>
-            </url>
+          <widget class="QLabel" name="webViewTitleLabel">
+           <property name="text">
+            <string/>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QFrame" name="frame">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="frameShape">
+            <enum>QFrame::StyledPanel</enum>
+           </property>
+           <property name="frameShadow">
+            <enum>QFrame::Raised</enum>
            </property>
+           <layout class="QVBoxLayout" name="verticalLayout">
+            <property name="spacing">
+             <number>0</number>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QWebView" name="webView">
+              <property name="url">
+               <url>
+                <string>about:blank</string>
+               </url>
+              </property>
+             </widget>
+            </item>
+           </layout>
           </widget>
          </item>
         </layout>
diff --git a/rssparser.cpp b/rssparser.cpp
index 3322a0c..03e1ac1 100644
--- a/rssparser.cpp
+++ b/rssparser.cpp
@@ -16,7 +16,7 @@ Larss::RssParser::RssParser(QSqlDatabase db, FeedModel *model, QObject *parent)
     {
         qDebug () << "Creating table news that is not in database...";
         QSqlQuery query(db);
-        query.prepare("CREATE TABLE news (id INTEGER PRIMARY KEY, feed INTEGER, title TEXT, link TEXT, description TEXT, time INTEGER, read INTEGER);");
+        query.prepare("CREATE TABLE news (id INTEGER PRIMARY KEY, feed INTEGER, title TEXT, link TEXT, description TEXT, content TEXT, time INTEGER, read INTEGER);");
         if (!query.exec())
             qDebug () << "Error occurred while creating the database:" << query.lastError();
     }
@@ -25,7 +25,7 @@ Larss::RssParser::RssParser(QSqlDatabase db, FeedModel *model, QObject *parent)
     setTable("news");

     // Select manual submit so user cannot modify content directly
-    setEditStrategy(QSqlTableModel::OnRowChange);
+    setEditStrategy(QSqlTableModel::OnManualSubmit);
     this->model = model;
     select();
 }
@@ -55,9 +55,12 @@ Larss::RssParser::headerData(int section, Qt::Orientation orientation, int role)
                 return tr("Description");
                 break;
             case 5:
-                return tr("Time");
+                return tr("Content");
                 break;
             case 6:
+                return tr("Time");
+                break;
+            case 7:
                 return tr("Read");
             }
         }
@@ -98,8 +101,10 @@ Larss::RssParser::getLink(const QModelIndex &index)
 void
 Larss::RssParser::setReadStatus(const QModelIndex& index, bool read)
 {
-    QModelIndex read_index = createIndex(index.row(), 6, index.internalPointer());
+    QModelIndex read_index = createIndex(index.row(), 7, index.internalPointer());
     setData(read_index, read ? 1 : 0);
+    if (!submitAll())
+        qDebug() << "Error while setting the read flag";
 }

 quint64
@@ -113,12 +118,19 @@ Larss::RssParser::getFeed(const QModelIndex &index)
 }

 QString
-Larss::RssParser::getDescription(const QModelIndex &index)
+Larss::RssParser::getContent(const QModelIndex &index)
 {
-    QModelIndex description_index = createIndex(index.row(), 4, index.internalPointer());
+    QModelIndex description_index = createIndex(index.row(), 5, index.internalPointer());
     return data(description_index, Qt::DisplayRole).toString();
 }

+QString
+Larss::RssParser::getTitle(const QModelIndex &index)
+{
+    QModelIndex title_index = createIndex(index.row(), 2, index.internalPointer());
+    return data(title_index, Qt::DisplayRole).toString();
+}
+
 void
 Larss::RssParser::selectActiveFeed(quint64 feed_id)
 {
diff --git a/rssparser.h b/rssparser.h
index bd9b772..1070b43 100644
--- a/rssparser.h
+++ b/rssparser.h
@@ -42,9 +42,14 @@ namespace Larss {
         quint64 getFeed (const QModelIndex& index);

         /**
-         * @brief Get the description associated with the feed.
+         * @brief Get the content associated with the feed.
          */
-        QString getDescription (const QModelIndex& index);
+        QString getContent (const QModelIndex& index);
+
+        /**
+         * @brief Get the title of a news pointed by index
+         */
+        QString getTitle (const QModelIndex& index);

         /**
          * @brief Set the read status on a news.
ViewGit