Working on file integration to the model
This commit is contained in:
parent
aa8daf89f5
commit
c319dd1050
3 changed files with 112 additions and 33 deletions
|
@ -64,7 +64,7 @@ ApplicationWindow
|
||||||
if (sortBy == "none")
|
if (sortBy == "none")
|
||||||
notesProxyModel.invalidate()
|
notesProxyModel.invalidate()
|
||||||
else
|
else
|
||||||
notesProxyModel.sortRole = notesProxyModel.roleFromName(sortBy)
|
notesProxyModel.sortRole = notesModel.roleFromName(sortBy)
|
||||||
}
|
}
|
||||||
onFavoritesOnTopChanged: {
|
onFavoritesOnTopChanged: {
|
||||||
notesProxyModel.favoritesOnTop = favoritesOnTop
|
notesProxyModel.favoritesOnTop = favoritesOnTop
|
||||||
|
|
|
@ -6,7 +6,9 @@
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
NotesProxyModel::NotesProxyModel(QObject *parent) : QSortFilterProxyModel(parent) {
|
NotesProxyModel::NotesProxyModel(QObject *parent) : QSortFilterProxyModel(parent) {
|
||||||
m_favoritesOnTop = true;
|
m_favoritesOnTop = false;
|
||||||
|
m_sortByRole = -1;
|
||||||
|
m_searchFilterString = "";
|
||||||
//connect(this, SIGNAL(favoritesOnTopChanged(bool)), this, SLOT(resort()));
|
//connect(this, SIGNAL(favoritesOnTopChanged(bool)), this, SLOT(resort()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,12 +21,27 @@ void NotesProxyModel::setFavoritesOnTop(bool favoritesOnTop) {
|
||||||
if (favoritesOnTop != m_favoritesOnTop) {
|
if (favoritesOnTop != m_favoritesOnTop) {
|
||||||
m_favoritesOnTop = favoritesOnTop;
|
m_favoritesOnTop = favoritesOnTop;
|
||||||
emit favoritesOnTopChanged(m_favoritesOnTop);
|
emit favoritesOnTopChanged(m_favoritesOnTop);
|
||||||
|
sort(0);
|
||||||
}
|
}
|
||||||
sort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int NotesProxyModel::roleFromName(const QString &name) const {
|
void NotesProxyModel::setSortBy(const QString sortBy) {
|
||||||
return roleNames().key(name.toLocal8Bit());
|
qDebug() << "Sort by: " << sortBy;
|
||||||
|
int role = roleNames().key(sortBy.toLocal8Bit(), -1);
|
||||||
|
if (role >= 0 && role != m_sortByRole) {
|
||||||
|
m_sortByRole = role;
|
||||||
|
emit sortByChanged(sortBy);
|
||||||
|
setSortRole(role);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotesProxyModel::setSearchFilter(const QString searchFilter) {
|
||||||
|
qDebug() << "Search by:" << searchFilter;
|
||||||
|
if (searchFilter != m_searchFilterString) {
|
||||||
|
m_searchFilterString = searchFilter;
|
||||||
|
emit searchFilterChanged(m_searchFilterString);
|
||||||
|
setFilterFixedString(m_searchFilterString);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NotesProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const {
|
bool NotesProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const {
|
||||||
|
@ -37,10 +54,10 @@ bool NotesProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex
|
||||||
return QSortFilterProxyModel::lessThan(source_left, source_right);
|
return QSortFilterProxyModel::lessThan(source_left, source_right);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotesProxyModel::sort() {
|
/*void NotesProxyModel::sort() {
|
||||||
//invalidate();
|
//invalidate();
|
||||||
QSortFilterProxyModel::sort(0);
|
QSortFilterProxyModel::sort(0);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
const QHash<int, QByteArray> NotesModel::m_roleNames = QHash<int, QByteArray> ( {
|
const QHash<int, QByteArray> NotesModel::m_roleNames = QHash<int, QByteArray> ( {
|
||||||
{NotesModel::IdRole, "id"},
|
{NotesModel::IdRole, "id"},
|
||||||
|
@ -58,6 +75,10 @@ const QHash<int, QByteArray> NotesModel::m_roleNames = QHash<int, QByteArray> (
|
||||||
NotesModel::NotesModel(QObject *parent) : QAbstractListModel(parent) {
|
NotesModel::NotesModel(QObject *parent) : QAbstractListModel(parent) {
|
||||||
mp_notesApi = nullptr;
|
mp_notesApi = nullptr;
|
||||||
mp_notesStore = nullptr;
|
mp_notesStore = nullptr;
|
||||||
|
//m_fileDir.setCurrent(directory);
|
||||||
|
m_fileDir.setPath("");
|
||||||
|
m_fileDir.setFilter(QDir::Files);
|
||||||
|
m_fileDir.setNameFilters( { "*." + m_fileSuffix } );
|
||||||
}
|
}
|
||||||
|
|
||||||
NotesModel::~NotesModel() {
|
NotesModel::~NotesModel() {
|
||||||
|
@ -103,35 +124,78 @@ void NotesModel::setNotesStore(NotesStore *notesStore) {
|
||||||
}
|
}
|
||||||
|
|
||||||
QString NotesModel::account() const {
|
QString NotesModel::account() const {
|
||||||
QString account;
|
if (m_fileDir != QDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation))) {
|
||||||
if (mp_notesStore)
|
return m_fileDir.path();
|
||||||
account = mp_notesStore->account();
|
}
|
||||||
else if (mp_notesApi)
|
return QString();
|
||||||
account = mp_notesApi->account();
|
|
||||||
return account;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotesModel::setAccount(const QString &account) {
|
void NotesModel::setAccount(const QString& account) {
|
||||||
if (mp_notesApi)
|
qDebug() << "Setting account: " << account;
|
||||||
mp_notesApi->setAccount(account);
|
if (account != m_fileDir.path()) {
|
||||||
if (mp_notesStore)
|
if (m_fileDir != QDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation))) {
|
||||||
mp_notesStore->setAccount(account);
|
m_fileDir = QDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation));
|
||||||
|
}
|
||||||
|
if (!account.isEmpty()) {
|
||||||
|
m_fileDir.setPath(account);
|
||||||
|
if (m_fileDir.mkpath(".")) {
|
||||||
|
emit accountChanged(m_fileDir.path());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug() << "Failed to create or already present: " << m_fileDir.path();
|
||||||
|
m_fileDir = QDir(QStandardPaths::writableLocation(QStandardPaths::DataLocation));
|
||||||
|
//emit noteError(DirCannotWriteError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//qDebug() << account << m_dir.path();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const QList<int> NotesModel::noteIds() {
|
const QList<int> NotesModel::noteIds() {
|
||||||
return mp_notesStore->noteIds();
|
QList<int> ids;
|
||||||
|
if (m_fileDir.exists() && !account().isEmpty()) {
|
||||||
|
QFileInfoList files = m_fileDir.entryInfoList();
|
||||||
|
for (int i = 0; i < files.size(); ++i) {
|
||||||
|
bool ok;
|
||||||
|
int id = files[i].baseName().toInt(&ok);
|
||||||
|
if (ok) {
|
||||||
|
ids << id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//qDebug() << errorMessage(DirNotFoundError);
|
||||||
|
//emit noteError(DirCannotReadError);
|
||||||
|
}
|
||||||
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NotesModel::noteExists(const int id) {
|
bool NotesModel::noteExists(const int id) {
|
||||||
return mp_notesStore->noteExists(id);
|
QFileInfo fileinfo(m_fileDir, QString("%1.%2").arg(id).arg(m_fileSuffix));
|
||||||
|
return fileinfo.exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
int NotesModel::noteModified(const int id) {
|
int NotesModel::noteModified(const int id) {
|
||||||
return mp_notesStore->noteModified(id);
|
return Note::modified(QJsonObject::fromVariantMap(getNoteById(id)));
|
||||||
}
|
}
|
||||||
|
|
||||||
const QVariantMap NotesModel::getNoteById(const int id) const {
|
const QVariantMap NotesModel::getNoteById(const int id) const {
|
||||||
return mp_notesStore->readNoteFile(id).toVariantMap();
|
QVariantMap json;
|
||||||
|
QFileInfo fileinfo(m_fileDir, QString("%1.%2").arg(id).arg(m_fileSuffix));
|
||||||
|
QFile file(fileinfo.filePath());
|
||||||
|
if (file.exists()) {
|
||||||
|
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
json = QJsonDocument::fromJson(file.readAll()).object().toVariantMap();
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//emit noteError(FileCannotReadError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//emit noteError(FileNotFoundError);
|
||||||
|
}
|
||||||
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NotesModel::getAllNotes(const QStringList &exclude) {
|
bool NotesModel::getAllNotes(const QStringList &exclude) {
|
||||||
|
@ -274,9 +338,13 @@ QHash<int, QByteArray> NotesModel::roleNames() const {
|
||||||
return m_roleNames;
|
return m_roleNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int NotesModel::roleFromName(const QString &name) const {
|
||||||
|
return roleNames().key(name.toLocal8Bit());
|
||||||
|
}
|
||||||
|
|
||||||
Qt::ItemFlags NotesModel::flags(const QModelIndex &index) const {
|
Qt::ItemFlags NotesModel::flags(const QModelIndex &index) const {
|
||||||
if (index.isValid()) {
|
if (index.isValid()) {
|
||||||
return Qt::ItemIsEnabled | Qt::ItemIsEditable; // | Qt::ItemIsSelectable
|
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return Qt::NoItemFlags;
|
return Qt::NoItemFlags;
|
||||||
|
|
|
@ -12,34 +12,41 @@
|
||||||
class NotesProxyModel : public QSortFilterProxyModel {
|
class NotesProxyModel : public QSortFilterProxyModel {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(bool favoritesOnTop READ favoritesOnTop WRITE setFavoritesOnTop NOTIFY favoritesOnTopChanged)
|
Q_PROPERTY(bool favoritesOnTop READ favoritesOnTop WRITE setFavoritesOnTop NOTIFY favoritesOnTopChanged)
|
||||||
|
Q_PROPERTY(QString sortBy READ sortBy WRITE setSortBy NOTIFY sortByChanged)
|
||||||
|
Q_PROPERTY(QString searchFilter READ searchFilter WRITE setSearchFilter NOTIFY searchFilterChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit NotesProxyModel(QObject *parent = 0);
|
explicit NotesProxyModel(QObject *parent = nullptr);
|
||||||
virtual ~NotesProxyModel();
|
virtual ~NotesProxyModel();
|
||||||
|
|
||||||
bool favoritesOnTop() const { return m_favoritesOnTop; }
|
bool favoritesOnTop() const { return m_favoritesOnTop; }
|
||||||
void setFavoritesOnTop(bool favoritesOnTop);
|
void setFavoritesOnTop(bool favoritesOnTop);
|
||||||
|
QString sortBy() const { return roleNames().value(m_sortByRole); }
|
||||||
|
void setSortBy(const QString sortBy);
|
||||||
|
QString searchFilter() const { return m_searchFilterString; }
|
||||||
|
void setSearchFilter(const QString searchFilter);
|
||||||
|
|
||||||
Q_INVOKABLE void sort();
|
//Q_INVOKABLE void sort();
|
||||||
Q_INVOKABLE int roleFromName(const QString &name) const;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const;
|
virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const;
|
||||||
|
|
||||||
private slots:
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void favoritesOnTopChanged(bool favoritesOnTop);
|
void favoritesOnTopChanged(bool favoritesOnTop);
|
||||||
|
void sortByChanged(QString sortBy);
|
||||||
|
void searchFilterChanged(QString searchFilter);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_favoritesOnTop;
|
bool m_favoritesOnTop;
|
||||||
|
int m_sortByRole;
|
||||||
|
QString m_searchFilterString;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NotesModel : public QAbstractListModel {
|
class NotesModel : public QAbstractListModel {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit NotesModel(QObject *parent = 0);
|
explicit NotesModel(QObject *parent = nullptr);
|
||||||
virtual ~NotesModel();
|
virtual ~NotesModel();
|
||||||
|
|
||||||
enum NoteRoles {
|
enum NoteRoles {
|
||||||
|
@ -56,11 +63,15 @@ public:
|
||||||
NoneRole = Qt::UserRole + 10
|
NoneRole = Qt::UserRole + 10
|
||||||
};
|
};
|
||||||
QHash<int, QByteArray> roleNames() const;
|
QHash<int, QByteArray> roleNames() const;
|
||||||
|
Q_INVOKABLE int roleFromName(const QString &roleName) const;
|
||||||
|
|
||||||
Qt::ItemFlags flags(const QModelIndex &index) const;
|
Qt::ItemFlags flags(const QModelIndex &index) const;
|
||||||
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||||
virtual QVariant data(const QModelIndex &index, int role) const;
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
||||||
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||||
virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
|
virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
|
||||||
|
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
|
||||||
|
virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
|
||||||
QMap<int, QVariant> itemData(const QModelIndex &index) const;
|
QMap<int, QVariant> itemData(const QModelIndex &index) const;
|
||||||
virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles);
|
virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles);
|
||||||
|
|
||||||
|
@ -70,10 +81,6 @@ public:
|
||||||
QString account() const;
|
QString account() const;
|
||||||
void setAccount(const QString& account);
|
void setAccount(const QString& account);
|
||||||
|
|
||||||
const QList<int> noteIds();
|
|
||||||
bool noteExists(const int id);
|
|
||||||
int noteModified(const int id);
|
|
||||||
|
|
||||||
Q_INVOKABLE const QVariantMap getNoteById(const int id) const;
|
Q_INVOKABLE const QVariantMap getNoteById(const int id) const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -104,6 +111,10 @@ private:
|
||||||
QMap<int, QJsonObject> m_notes;
|
QMap<int, QJsonObject> m_notes;
|
||||||
const static QHash<int, QByteArray> m_roleNames;
|
const static QHash<int, QByteArray> m_roleNames;
|
||||||
|
|
||||||
|
QMap<int, QFile> m_files;
|
||||||
|
QDir m_fileDir;
|
||||||
|
const static QString m_fileSuffix;
|
||||||
|
|
||||||
NotesApi* mp_notesApi;
|
NotesApi* mp_notesApi;
|
||||||
NotesStore* mp_notesStore;
|
NotesStore* mp_notesStore;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue