mirror of
https://github.com/KDE/kasts.git
synced 2024-12-08 14:36:18 +01:00
4b2da3533c
This commit adds keyboard navigation to entry lists. Selection of items can be done through keyboard (shift+up/down), mouse (left, left+shift, left+ctrl) or touch (long press). When items are selected, contextual actions will show up on the page (useful for touch screens), or, alternatively, a context menu with the same actions can be opened through right mouse click (useful for desktop). If a single entry is selected, then only the relevant actions will be shown (e.g. only "Mark as Played" if the entry has not been played yet). Additionally, (database) transactions for the actions have been optimized. This was necessary to make sure that actions on large selections of entries finish within an acceptable time. E.g. actions on a list of 1000 items should finish within a few seconds (on all but underpowered hardware). BUG: 441764
109 lines
4.1 KiB
C++
109 lines
4.1 KiB
C++
/**
|
|
* SPDX-FileCopyrightText: 2021 Bart De Vries <bart@mogwai.be>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <QHash>
|
|
#include <QObject>
|
|
#include <QString>
|
|
#include <QStringList>
|
|
|
|
#include "models/episodemodel.h"
|
|
|
|
class Entry;
|
|
class Feed;
|
|
|
|
class DataManager : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
static DataManager &instance()
|
|
{
|
|
static DataManager _instance;
|
|
return _instance;
|
|
}
|
|
|
|
Feed *getFeed(const int index) const;
|
|
Feed *getFeed(const QString &feedurl) const;
|
|
Entry *getEntry(const int feed_index, const int entry_index) const;
|
|
Entry *getEntry(const Feed *feed, const int entry_index) const;
|
|
Q_INVOKABLE Entry *getEntry(const QString &id) const;
|
|
int feedCount() const;
|
|
QStringList getIdList(const Feed *feed) const;
|
|
int entryCount(const int feed_index) const;
|
|
int entryCount(const Feed *feed) const;
|
|
int unreadEntryCount(const Feed *feed) const;
|
|
int newEntryCount(const Feed *feed) const;
|
|
Q_INVOKABLE void addFeed(const QString &url);
|
|
void addFeed(const QString &url, const bool fetch);
|
|
void addFeeds(const QStringList &urls);
|
|
Q_INVOKABLE void removeFeed(Feed *feed);
|
|
void removeFeed(const int index);
|
|
|
|
Entry *getQueueEntry(int index) const;
|
|
int queueCount() const;
|
|
QStringList queue() const;
|
|
bool entryInQueue(const Entry *entry);
|
|
bool entryInQueue(const QString &id) const;
|
|
Q_INVOKABLE void moveQueueItem(const int from, const int to);
|
|
void addToQueue(const QString &id);
|
|
void removeFromQueue(const QString &id);
|
|
|
|
Q_INVOKABLE QString lastPlayingEntry();
|
|
Q_INVOKABLE void setLastPlayingEntry(const QString &id);
|
|
|
|
Q_INVOKABLE void deletePlayedEnclosures();
|
|
|
|
Q_INVOKABLE void importFeeds(const QString &path);
|
|
Q_INVOKABLE void exportFeeds(const QString &path);
|
|
Q_INVOKABLE bool isFeedExists(const QString &url);
|
|
|
|
Q_INVOKABLE void bulkMarkRead(bool state, QStringList list);
|
|
Q_INVOKABLE void bulkMarkNew(bool state, QStringList list);
|
|
Q_INVOKABLE void bulkQueueStatus(bool state, QStringList list);
|
|
Q_INVOKABLE void bulkDownloadEnclosures(QStringList list);
|
|
Q_INVOKABLE void bulkDeleteEnclosures(QStringList list);
|
|
|
|
Q_INVOKABLE void bulkMarkReadByIndex(bool state, QModelIndexList list);
|
|
Q_INVOKABLE void bulkMarkNewByIndex(bool state, QModelIndexList list);
|
|
Q_INVOKABLE void bulkQueueStatusByIndex(bool state, QModelIndexList list);
|
|
Q_INVOKABLE void bulkDownloadEnclosuresByIndex(QModelIndexList list);
|
|
Q_INVOKABLE void bulkDeleteEnclosuresByIndex(QModelIndexList list);
|
|
|
|
Q_SIGNALS:
|
|
void feedAdded(const QString &url);
|
|
void feedRemoved(const int &index);
|
|
void entryAdded(const QString &feedurl, const QString &id);
|
|
// void entryRemoved(const Feed*, const int &index); // TODO: implement this signal, is this needed?
|
|
void feedEntriesUpdated(const QString &url);
|
|
void queueEntryAdded(const int &index, const QString &id);
|
|
void queueEntryRemoved(const int &index, const QString &id);
|
|
void queueEntryMoved(const int &from, const int &to);
|
|
|
|
void unreadEntryCountChanged(const QString &url);
|
|
void newEntryCountChanged(const QString &url);
|
|
|
|
void bulkReadStatusActionFinished();
|
|
void bulkNewStatusActionFinished();
|
|
|
|
private:
|
|
DataManager();
|
|
void loadFeed(QString feedurl) const;
|
|
void loadEntry(QString id) const;
|
|
bool feedExists(const QString &url);
|
|
void updateQueueListnrs() const;
|
|
|
|
QStringList getIdsFromModelIndexList(const QModelIndexList &list) const;
|
|
|
|
mutable QHash<QString, Feed *> m_feeds; // hash of pointers to all feeds in db, key = url (lazy loading)
|
|
mutable QHash<QString, Entry *> m_entries; // hash of pointers to all entries in db, key = id (lazy loading)
|
|
|
|
QStringList m_feedmap; // list of feedurls in the order that they should appear in feedlist
|
|
QHash<QString, QStringList> m_entrymap; // list of entries (per feed; key = url) in the order that they should appear in entrylist
|
|
QStringList m_queuemap; // list of entries/enclosures in the order that they should show up in queuelist
|
|
};
|