From 6d25c63f29103f53fc151de0f2dfa91fdb852093 Mon Sep 17 00:00:00 2001 From: aqua Date: Sun, 8 Jan 2023 13:22:41 +0200 Subject: Initial commit --- playlist/CMakeLists.txt | 6 ++++++ playlist/playlist.cpp | 36 ++++++++++++++++++++++++++++++++++++ playlist/playlist.hpp | 39 +++++++++++++++++++++++++++++++++++++++ playlist/playlistmodel.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ playlist/playlistmodel.hpp | 28 ++++++++++++++++++++++++++++ 5 files changed, 155 insertions(+) create mode 100644 playlist/CMakeLists.txt create mode 100644 playlist/playlist.cpp create mode 100644 playlist/playlist.hpp create mode 100644 playlist/playlistmodel.cpp create mode 100644 playlist/playlistmodel.hpp (limited to 'playlist') diff --git a/playlist/CMakeLists.txt b/playlist/CMakeLists.txt new file mode 100644 index 0000000..54b397b --- /dev/null +++ b/playlist/CMakeLists.txt @@ -0,0 +1,6 @@ +add_library(playlist STATIC + playlist.cpp playlist.hpp + playlistmodel.cpp playlistmodel.hpp +) +target_link_libraries(playlist PUBLIC Qt6::Core) +target_include_directories(playlist INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/playlist/playlist.cpp b/playlist/playlist.cpp new file mode 100644 index 0000000..778fae1 --- /dev/null +++ b/playlist/playlist.cpp @@ -0,0 +1,36 @@ +/* ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2023 aqua + * ============================================================ */ + +#include "playlist.hpp" +#include "playlistmodel.hpp" +#include +#include + +Playlist::Playlist(QObject *parent) : QObject{parent}, m_model(new PlaylistModel(this)) {} + +void Playlist::appendUrl(const QUrl &url) +{ + const QFileInfo info(url.toLocalFile()); + if (!info.exists()) return; // if file doesn't exist, return + + if (info.isFile()) { + emit mediaAboutToBeInserted(m_urls.count(), m_urls.count() + 1); + m_urls.append(url.toLocalFile()); + emit mediaInserted(); + } + else if (info.isFile()) { + QDir dir(info.absoluteFilePath()); + const auto list = dir.entryInfoList(QDir::Files); + emit mediaAboutToBeInserted(m_urls.count(), m_urls.count() + list.count()); + for (const auto &i : list) { m_urls.append(i.absoluteFilePath()); } + emit mediaInserted(); + } +} + +QUrl Playlist::operator[](const int index) const +{ + if (index < m_urls.count()) return m_urls.at(index); + return {}; +} diff --git a/playlist/playlist.hpp b/playlist/playlist.hpp new file mode 100644 index 0000000..4c9e385 --- /dev/null +++ b/playlist/playlist.hpp @@ -0,0 +1,39 @@ +/* ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2023 aqua + * ============================================================ */ + +#pragma once + +#include +#include + +class PlaylistModel; +class Playlist : public QObject { + Q_OBJECT +public: + explicit Playlist(QObject *parent = nullptr); + +public slots: + void appendUrl(const QUrl &url); + +public: + void appendList(const QList &urllist) + { + for (const auto &url : urllist) appendUrl(url); + } + + [[nodiscard]] QUrl operator[](const int index) const; + [[nodiscard]] auto count() const { return m_urls.count(); } + [[nodiscard]] auto model() { return m_model; } + +signals: + void mediaAboutToBeInserted(int start, int end); + void mediaInserted(); + void mediaAboutToBeRemoved(int start, int end); + void mediaRemoved(); + +private: + QVector m_urls; + PlaylistModel *m_model; +}; diff --git a/playlist/playlistmodel.cpp b/playlist/playlistmodel.cpp new file mode 100644 index 0000000..9eb2629 --- /dev/null +++ b/playlist/playlistmodel.cpp @@ -0,0 +1,46 @@ +/* ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2023 aqua + * ============================================================ */ + +#include "playlistmodel.hpp" +#include "playlist.hpp" + +PlaylistModel::PlaylistModel(Playlist *parent) : QAbstractItemModel{parent}, playlist(parent) +{ + Q_CHECK_PTR(parent); + connect(parent, &Playlist::mediaAboutToBeInserted, this, &PlaylistModel::beginInsertItems); + connect(parent, &Playlist::mediaInserted, this, &PlaylistModel::endInsertItems); +} + +QModelIndex PlaylistModel::index(int row, int column, const QModelIndex &parent) const +{ + if (parent.isValid()) return {}; + return createIndex(row, column); +} + +QModelIndex PlaylistModel::parent(const QModelIndex &child) const { return {}; } + +int PlaylistModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) return 0; + return playlist->count(); +} + +int PlaylistModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) return 0; + return 1; +} + +QVariant PlaylistModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) return {}; + + switch (role) { + case Qt::DisplayRole: + return (*playlist)[index.row()]; + default: + return {}; + } +} diff --git a/playlist/playlistmodel.hpp b/playlist/playlistmodel.hpp new file mode 100644 index 0000000..e5cedfe --- /dev/null +++ b/playlist/playlistmodel.hpp @@ -0,0 +1,28 @@ +/* ============================================================ + * SPDX-License-Identifier: GPL-3.0-only + * Copyright (C) 2023 aqua + * ============================================================ */ + +#pragma once + +#include + +class Playlist; +class PlaylistModel : public QAbstractItemModel { +public: + explicit PlaylistModel(Playlist *parent); + ~PlaylistModel() = default; + + QModelIndex index(int row, int column, const QModelIndex &parent) const; + QModelIndex parent(const QModelIndex &child) const; + int rowCount(const QModelIndex &parent) const; + int columnCount(const QModelIndex &parent) const; + QVariant data(const QModelIndex &index, int role) const; + +private slots: + void beginInsertItems(int start, int end) { beginInsertRows(QModelIndex(), start, end); } + void endInsertItems() { endInsertRows(); } + +private: + Playlist *playlist; +}; -- cgit v1.2.1