diff --git a/src/core/feedsimportexportmodel.cpp b/src/core/feedsimportexportmodel.cpp index 6f47e0f1c..2c15b1ee7 100644 --- a/src/core/feedsimportexportmodel.cpp +++ b/src/core/feedsimportexportmodel.cpp @@ -30,10 +30,15 @@ FeedsImportExportModel::FeedsImportExportModel(QObject *parent) : QAbstractItemModel(parent), m_checkStates(QHash()), - m_rootItem(NULL), m_recursiveChange(false) { + m_rootItem(NULL), m_recursiveChange(false), m_mode(Import) { } FeedsImportExportModel::~FeedsImportExportModel() { + if (m_rootItem != NULL && m_mode == Import) { + // Delete all model items, but only if we are in import mode. Export mode shares + // root item with main feed model, thus cannot be deleted from memory now. + delete m_rootItem; + } } FeedsModelRootItem *FeedsImportExportModel::itemForIndex(const QModelIndex &index) const { @@ -229,6 +234,14 @@ bool FeedsImportExportModel::importAsOPML20(const QByteArray &data) { return true; } +FeedsImportExportModel::Mode FeedsImportExportModel::mode() const { + return m_mode; +} + +void FeedsImportExportModel::setMode(const FeedsImportExportModel::Mode &mode) { + m_mode = mode; +} + QModelIndex FeedsImportExportModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) { return QModelIndex(); diff --git a/src/core/feedsimportexportmodel.h b/src/core/feedsimportexportmodel.h index 35f2f5d1a..3b1c76a8a 100644 --- a/src/core/feedsimportexportmodel.h +++ b/src/core/feedsimportexportmodel.h @@ -27,6 +27,11 @@ class FeedsImportExportModel : public QAbstractItemModel { Q_OBJECT public: + enum Mode { + Import, + Export + }; + // Constructors and destructors. explicit FeedsImportExportModel(QObject *parent = 0); virtual ~FeedsImportExportModel(); @@ -55,12 +60,16 @@ class FeedsImportExportModel : public QAbstractItemModel { bool exportToOMPL20(QByteArray &result); bool importAsOPML20(const QByteArray &data); + Mode mode() const; + void setMode(const Mode &mode); + private: QHash m_checkStates; FeedsModelRootItem *m_rootItem; // When it's true, then bool m_recursiveChange; + Mode m_mode; }; #endif // FEEDIMPORTEXPORTMODEL_H diff --git a/src/core/feedsmodel.cpp b/src/core/feedsmodel.cpp index 7b0339785..36261204b 100755 --- a/src/core/feedsmodel.cpp +++ b/src/core/feedsmodel.cpp @@ -163,8 +163,7 @@ bool FeedsModel::removeItem(const QModelIndex &index) { return false; } -bool FeedsModel::addCategory(FeedsModelCategory *category, - FeedsModelRootItem *parent) { +bool FeedsModel::addCategory(FeedsModelCategory *category, FeedsModelRootItem *parent) { // Get index of parent item (parent standard category). QModelIndex parent_index = indexForItem(parent); @@ -210,8 +209,7 @@ bool FeedsModel::addCategory(FeedsModelCategory *category, return true; } -bool FeedsModel::editCategory(FeedsModelCategory *original_category, - FeedsModelCategory *new_category) { +bool FeedsModel::editCategory(FeedsModelCategory *original_category, FeedsModelCategory *new_category) { QSqlDatabase database = qApp->database()->connection(objectName(), DatabaseFactory::FromSettings); QSqlQuery query_update_category(database); @@ -245,16 +243,12 @@ bool FeedsModel::editCategory(FeedsModelCategory *original_category, int new_index_of_category = new_parent->childCount(); // Remove the original item from the model... - beginRemoveRows(indexForItem(original_parent), - original_index_of_category, - original_index_of_category); + beginRemoveRows(indexForItem(original_parent), original_index_of_category, original_index_of_category); original_parent->removeChild(original_category); endRemoveRows(); // ... and insert it under the new parent. - beginInsertRows(indexForItem(new_parent), - new_index_of_category, - new_index_of_category); + beginInsertRows(indexForItem(new_parent), new_index_of_category, new_index_of_category); new_parent->appendChild(original_category); endInsertRows(); } @@ -266,13 +260,11 @@ bool FeedsModel::editCategory(FeedsModelCategory *original_category, return true; } -bool FeedsModel::addFeed(FeedsModelFeed *feed, - FeedsModelRootItem *parent) { - // Get index of parent item (parent standard category). +bool FeedsModel::addFeed(FeedsModelFeed *feed, FeedsModelRootItem *parent) { + // Get index of parent item (parent standard category or root item). QModelIndex parent_index = indexForItem(parent); - // Now, add category to persistent storage. - // Children are removed, remove this standard category too. + // Now, add feed to persistent storage. QSqlDatabase database = qApp->database()->connection(objectName(), DatabaseFactory::FromSettings); QSqlQuery query_add_feed(database); @@ -302,8 +294,7 @@ bool FeedsModel::addFeed(FeedsModelFeed *feed, query_add_feed.prepare("SELECT id FROM Feeds WHERE date_created = :date_created;"); query_add_feed.bindValue(":date_created", feed->creationDate().toMSecsSinceEpoch()); if (query_add_feed.exec() && query_add_feed.next()) { - // New category was added, fetch is primary id - // from the database. + // New feed was added, fetch is primary id from the database. feed->setId(query_add_feed.value(0).toInt()); } else { @@ -311,7 +302,7 @@ bool FeedsModel::addFeed(FeedsModelFeed *feed, return false; } - // Category was added to the persistent storage so add it to the model. + // Feed was added to the persistent storage so add it to the model. beginInsertRows(parent_index, parent->childCount(), parent->childCount()); parent->appendChild(feed); endInsertRows(); @@ -319,8 +310,7 @@ bool FeedsModel::addFeed(FeedsModelFeed *feed, return true; } -bool FeedsModel::editFeed(FeedsModelFeed *original_feed, - FeedsModelFeed *new_feed) { +bool FeedsModel::editFeed(FeedsModelFeed *original_feed, FeedsModelFeed *new_feed) { QSqlDatabase database = qApp->database()->connection(objectName(), DatabaseFactory::FromSettings); QSqlQuery query_update_feed(database); diff --git a/src/gui/formimportexport.cpp b/src/gui/formimportexport.cpp index 6ff397d09..84cd8dfb2 100644 --- a/src/gui/formimportexport.cpp +++ b/src/gui/formimportexport.cpp @@ -28,7 +28,7 @@ #include -FormImportExport::FormImportExport(QWidget *parent) : QDialog(parent), m_ui(new Ui::FormImportExport), m_mode(Import) { +FormImportExport::FormImportExport(QWidget *parent) : QDialog(parent), m_ui(new Ui::FormImportExport) { m_ui->setupUi(this); m_model = new FeedsImportExportModel(m_ui->m_treeFeeds); @@ -46,15 +46,11 @@ FormImportExport::~FormImportExport() { delete m_ui; } -FormImportExport::Mode FormImportExport::mode() const { - return m_mode; -} +void FormImportExport::setMode(const FeedsImportExportModel::Mode &mode) { + m_model->setMode(mode); -void FormImportExport::setMode(const Mode &mode) { - m_mode = mode; - - switch (m_mode) { - case Export: { + switch (mode) { + case FeedsImportExportModel::Export: { m_model->setRootItem(qApp->mainForm()->tabWidget()->feedMessageViewer()->feedsView()->sourceModel()->rootItem()); m_ui->m_treeFeeds->setModel(m_model); m_ui->m_treeFeeds->expandAll(); @@ -65,7 +61,7 @@ void FormImportExport::setMode(const Mode &mode) { break; } - case Import: { + case FeedsImportExportModel::Import: { m_ui->m_groupFile->setTitle(tr("Source file")); m_ui->m_groupFeeds->setTitle(tr("Target feeds && categories")); m_ui->m_treeFeeds->setDisabled(true); @@ -82,12 +78,12 @@ void FormImportExport::setMode(const Mode &mode) { } void FormImportExport::selectFile() { - switch (m_mode) { - case Import: + switch (m_model->mode()) { + case FeedsImportExportModel::Import: selectImportFile(); break; - case Export: { + case FeedsImportExportModel::Export: { selectExportFile(); break; } @@ -187,12 +183,12 @@ void FormImportExport::parseImportFile(const QString &file_name) { } void FormImportExport::performAction() { - switch (m_mode) { - case Import: + switch (m_model->mode()) { + case FeedsImportExportModel::Import: importFeeds(); break; - case Export: + case FeedsImportExportModel::Export: exportFeeds(); break; diff --git a/src/gui/formimportexport.h b/src/gui/formimportexport.h index 14c05edf9..bb9a23eac 100644 --- a/src/gui/formimportexport.h +++ b/src/gui/formimportexport.h @@ -21,14 +21,13 @@ #include #include "ui_formimportexport.h" +#include "core/feedsimportexportmodel.h" namespace Ui { class FormExport; } -class FeedsImportExportModel; - class FormImportExport : public QDialog { Q_OBJECT @@ -37,16 +36,10 @@ class FormImportExport : public QDialog { OPML20 = 0 }; - enum Mode { - Import, - Export - }; - explicit FormImportExport(QWidget *parent = 0); virtual ~FormImportExport(); - Mode mode() const; - void setMode(const Mode &mode); + void setMode(const FeedsImportExportModel::Mode &mode); private slots: void performAction(); @@ -61,7 +54,6 @@ class FormImportExport : public QDialog { void importFeeds(); Ui::FormImportExport *m_ui; - Mode m_mode; ConversionType m_conversionType; FeedsImportExportModel *m_model; }; diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp index bf99dface..ad33c4e5d 100755 --- a/src/gui/formmain.cpp +++ b/src/gui/formmain.cpp @@ -439,56 +439,14 @@ void FormMain::loadWebBrowserMenu(int index) { void FormMain::exportFeeds() { QPointer form = new FormImportExport(this); - form.data()->setMode(FormImportExport::Export); + form.data()->setMode(FeedsImportExportModel::Export); form.data()->exec(); delete form.data(); - -/* - QString filter_opml20 = tr("OPML 2.0 files (*.opml)"); - - QString filter; - QString selected_filter; - - // Add more filters here. - filter += filter_opml20; - - QString selected_file = QFileDialog::getSaveFileName(this, tr("Select file for feeds import"), - QDir::homePath(), filter, &selected_filter); - - - if (!selected_file.isEmpty()) { - bool export_result; - QByteArray result_data; - - if (selected_filter == filter_opml20) { - export_result = tabWidget()->feedMessageViewer()->feedsView()->sourceModel()->exportToFile(FeedsModel::OPML20, - result_data); - } - - if (!export_result) { - qApp->showGuiMessage(tr("Export failed"), - tr("Export of feeds failed, is target file writtable?"), - QSystemTrayIcon::Critical); - } - else { - // Save exported data. - QFile output_file(selected_file); - - if (output_file.open(QIODevice::Unbuffered | QIODevice::Truncate | QIODevice::WriteOnly)) { - QTextStream stream(&output_file); - - stream.setCodec("UTF-8"); - stream << QString::fromUtf8(result_data); - output_file.flush(); - output_file.close(); - } - } - }*/ } void FormMain::importFeeds() { QPointer form = new FormImportExport(this); - form.data()->setMode(FormImportExport::Import); + form.data()->setMode(FeedsImportExportModel::Import); form.data()->exec(); delete form.data(); }