Lot of fixes to make things work again.

Leonardo Robol [2011-10-25 06:41]
Lot of fixes to make things work again.
Filename
include/editfeeddialog.h
include/feedmodel.h
larss/editfeeddialog.cpp
larss/feedmodel.cpp
larss/feedpoller.cpp
larss/mainwindow.cpp
diff --git a/include/editfeeddialog.h b/include/editfeeddialog.h
index fd95659..e76191c 100644
--- a/include/editfeeddialog.h
+++ b/include/editfeeddialog.h
@@ -29,9 +29,9 @@ namespace Larss {
         QString getFeedUrl();

         /**
-         * @brief Return the ID of the selected category.
+         * @brief Return the FeedNode of the selected category.
          */
-        quint64 getCategoryId();
+        FeedNode* getCategory();

     private:
         Ui::EditFeedDialog *ui;
diff --git a/include/feedmodel.h b/include/feedmodel.h
index 2c4334d..a7a2859 100644
--- a/include/feedmodel.h
+++ b/include/feedmodel.h
@@ -45,7 +45,7 @@ public:
     /**
      * @brief Add a new feed in the specified category.
      */
-    bool addFeed (QString name, QString url, quint32 category_id);
+    bool addFeed (QString name, QString url, FeedNode* categoryNode);

     /**
      * @brief Select data from the database.
diff --git a/larss/editfeeddialog.cpp b/larss/editfeeddialog.cpp
index db426f7..1f1d5ba 100644
--- a/larss/editfeeddialog.cpp
+++ b/larss/editfeeddialog.cpp
@@ -32,8 +32,11 @@ EditFeedDialog::getFeedUrl()
     return ui->newFeedUrl->text();
 }

-quint64
-EditFeedDialog::getCategoryId()
+FeedNode*
+EditFeedDialog::getCategory()
 {
-    return ui->categoryComboBox->currentIndex() + 1;
+    QModelIndex root = feedModel->indexFromItem(feedModel->invisibleRootItem());
+    QModelIndex selectedCategory = feedModel->index (ui->categoryComboBox->currentIndex(),
+                                                     0, root);
+    return feedModel->itemFromIndex(selectedCategory);
 }
diff --git a/larss/feedmodel.cpp b/larss/feedmodel.cpp
index 81048dd..944d2b8 100644
--- a/larss/feedmodel.cpp
+++ b/larss/feedmodel.cpp
@@ -80,34 +80,69 @@ FeedModel::select()
 bool
 FeedModel::setData(const QModelIndex &index, const QVariant &value, int role)
 {
-    return QStandardItemModel::setData(index, value, role);
+    // Get the involved node
+    FeedNode *node = itemFromIndex(index);
+
+    // First we need to update the data in the database.
+    QSqlQuery query(db);
+    if (node->type() == FeedNode::Category)
+    {
+        query.prepare("UPDATE categories SET name=:value WHERE id=:id;");
+        query.bindValue("value", value);
+        query.bindValue("id", node->id());
+    }
+    else
+    {
+        query.prepare("UPDATE feeds SET name=:value WHERE id=:id;");
+        query.bindValue("value", value);
+        query.bindValue("id", node->id());
+    }
+
+    // Check if the query has gone well
+    if (query.exec())
+        return QStandardItemModel::setData(index, value, role);
+    else
+    {
+        qDebug() << query.executedQuery() << query.lastError();
+        return false;
+    }
 }

 bool
 FeedModel::addCategory(QString name)
 {
+    // First push the data in the database.
     QSqlQuery query(db);
     query.prepare("INSERT INTO categories VALUES (NULL, :name);");
     query.bindValue("name", name);

+    // If the insertion works then update the QStandardItemModel
     bool successful = query.exec();
     if (successful)
-        reset();
+    {
+        FeedNode *node = new FeedNode (query.lastInsertId().toInt(), name);
+        QStandardItem *root = invisibleRootItem();
+        root->appendRow(node);
+    }
     return successful;
 }

 bool
-FeedModel::addFeed(QString name, QString url, quint32 category_id)
+FeedModel::addFeed(QString name, QString url, FeedNode* categoryNode)
 {
     QSqlQuery query(db);
     query.prepare("INSERT INTO feeds VALUES (NULL, :category, :name, :url);");
-    query.bindValue("category", category_id);
+    query.bindValue("category", categoryNode->id());
     query.bindValue("name", name);
     query.bindValue("url", url);

     bool successful = query.exec();
     if (successful)
-        reset();
+    {
+        FeedNode *node = new FeedNode (query.lastInsertId().toInt(),
+                                       name, url);
+        categoryNode->appendRow(node);
+    }
     else
     {
         qDebug() << "Query failed: " << query.executedQuery() << query.lastError();
diff --git a/larss/feedpoller.cpp b/larss/feedpoller.cpp
index b6f56f1..92f808f 100644
--- a/larss/feedpoller.cpp
+++ b/larss/feedpoller.cpp
@@ -49,7 +49,7 @@ FeedPoller::poll()
         else
         {
             QModelIndex next_item = workQueue->takeFirst();
-            FeedNode *node = (FeedNode*) next_item.internalPointer();
+            FeedNode *node = model->itemFromIndex(next_item);
             nowLoading = node->id();
             manager->get(QNetworkRequest(QUrl(model->getUrl(next_item))));
             return true;
@@ -69,7 +69,6 @@ FeedPoller::stopPolling ()
 void
 FeedPoller::queueWork(const QModelIndex &index)
 {
-    qDebug() << index;
     if (!index.isValid())
         return;
     FeedNode *node = model->itemFromIndex(index);
diff --git a/larss/mainwindow.cpp b/larss/mainwindow.cpp
index 579993c..671c9d6 100644
--- a/larss/mainwindow.cpp
+++ b/larss/mainwindow.cpp
@@ -116,7 +116,7 @@ void Larss::MainWindow::on_actionAdd_Feed_triggered()
     if (dialog.exec() == QDialog::Accepted)
     {
         feedModel->addFeed(dialog.getFeedName(),
-                           dialog.getFeedUrl(), dialog.getCategoryId());
+                           dialog.getFeedUrl(), dialog.getCategory());
     }
 }
ViewGit