aboutsummaryrefslogtreecommitdiff
path: root/favouritecollection.cpp
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-05-30 19:33:47 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-05-30 19:33:47 +0200
commitea39cc542e17ce592dc3c4f2053d534bc458d88e (patch)
treec3c6a369d5b6d8a6a4e0b3e3667a56ca19e93173 /favouritecollection.cpp
parent79ff338a3427a236ef53adf806c56616faa3426c (diff)
downloadkristall-ea39cc542e17ce592dc3c4f2053d534bc458d88e.tar.gz
More usability, survives conmans torture nearly with 100%
Diffstat (limited to 'favouritecollection.cpp')
-rw-r--r--favouritecollection.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/favouritecollection.cpp b/favouritecollection.cpp
new file mode 100644
index 0000000..79409bb
--- /dev/null
+++ b/favouritecollection.cpp
@@ -0,0 +1,115 @@
+#include "favouritecollection.hpp"
+
+#include <QFile>
+
+FavouriteCollection::FavouriteCollection(QObject *parent) :
+ QAbstractListModel(parent)
+{
+
+}
+
+void FavouriteCollection::add(QUrl const & url)
+{
+ if(contains(url))
+ return;
+
+ beginInsertRows(QModelIndex{}, items.size(), items.size() + 1);
+ items.push_back(url);
+ endInsertRows();
+}
+
+void FavouriteCollection::remove(QUrl const & url)
+{
+ for(int i = 0; i < items.size(); i++)
+ {
+ if(items.at(i) == url) {
+ beginRemoveRows(QModelIndex{}, i, i + 1);
+ items.removeAt(i);
+ endRemoveRows();
+ return;
+ }
+ }
+}
+
+bool FavouriteCollection::contains(const QUrl &url)
+{
+ for(auto const & item : items) {
+ if(item == url)
+ return true;
+ }
+ return false;
+}
+
+QUrl FavouriteCollection::get(const QModelIndex &index) const
+{
+ if(index.isValid()) {
+ return items.at(index.row());
+ } else {
+ return QUrl { };
+ }
+}
+
+bool FavouriteCollection::save(const QString &fileName) const
+{
+ QFile file(fileName);
+ if(not file.open(QFile::WriteOnly))
+ return false;
+
+ for(auto const & url: items)
+ {
+ QByteArray blob = (url.toString() + "\n").toUtf8();
+
+ qint64 offset = 0;
+ while(offset < blob.size())
+ {
+ auto len = file.write(blob.data() + offset, blob.size() - offset);
+ if(len <= 0) {
+ file.close();
+ return false;
+ }
+ offset += len;
+ }
+ }
+
+ file.close();
+ return true;
+}
+
+bool FavouriteCollection::load(const QString &fileName)
+{
+ QFile file(fileName);
+ if(not file.open(QFile::ReadOnly))
+ return false;
+ auto data = file.readAll();
+
+ beginResetModel();
+
+ items.clear();
+ for(auto line : data.split('\n')) {
+ if(line.size() > 0) {
+ items.push_back(QUrl(QString::fromUtf8(line)));
+ }
+ }
+ endResetModel();
+
+ return true;
+}
+
+int FavouriteCollection::rowCount(const QModelIndex &parent) const
+{
+ return items.size();
+}
+
+bool FavouriteCollection::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ return false;
+}
+
+QVariant FavouriteCollection::data(const QModelIndex &index, int role) const
+{
+ if(role != Qt::DisplayRole) {
+ return QVariant{};
+ }
+ return items.at(index.row()).toString();
+}
+