Some memory fixes for import/export.

This commit is contained in:
Martin Rotter 2014-09-01 17:43:22 +02:00
parent 1d65d99f71
commit 1d45832c7b
6 changed files with 49 additions and 91 deletions

View File

@ -30,10 +30,15 @@
FeedsImportExportModel::FeedsImportExportModel(QObject *parent)
: QAbstractItemModel(parent), m_checkStates(QHash<FeedsModelRootItem*, Qt::CheckState>()),
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();

View File

@ -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<FeedsModelRootItem*, Qt::CheckState> m_checkStates;
FeedsModelRootItem *m_rootItem;
// When it's true, then
bool m_recursiveChange;
Mode m_mode;
};
#endif // FEEDIMPORTEXPORTMODEL_H

View File

@ -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);

View File

@ -28,7 +28,7 @@
#include <QTextStream>
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;

View File

@ -21,14 +21,13 @@
#include <QDialog>
#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;
};

View File

@ -439,56 +439,14 @@ void FormMain::loadWebBrowserMenu(int index) {
void FormMain::exportFeeds() {
QPointer<FormImportExport> 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<FormImportExport> form = new FormImportExport(this);
form.data()->setMode(FormImportExport::Import);
form.data()->setMode(FeedsImportExportModel::Import);
form.data()->exec();
delete form.data();
}