fix: should now be able to show property dialog for all supported files
This commit is contained in:
		@ -43,6 +43,7 @@ set (PPIC_CPP_FILES
 | 
			
		||||
    app/metadatamodel.cpp
 | 
			
		||||
    app/metadatadialog.cpp
 | 
			
		||||
    app/exiv2wrapper.cpp
 | 
			
		||||
    app/playlistmanager.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set (PPIC_HEADER_FILES
 | 
			
		||||
@ -61,6 +62,7 @@ set (PPIC_HEADER_FILES
 | 
			
		||||
    app/metadatamodel.h
 | 
			
		||||
    app/metadatadialog.h
 | 
			
		||||
    app/exiv2wrapper.h
 | 
			
		||||
    app/playlistmanager.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set (PPIC_QRC_FILES
 | 
			
		||||
 | 
			
		||||
@ -25,12 +25,10 @@ GraphicsView::GraphicsView(QWidget *parent)
 | 
			
		||||
    connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &GraphicsView::viewportRectChanged);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GraphicsView::showFileFromUrl(const QUrl &url, bool doRequestGallery)
 | 
			
		||||
void GraphicsView::showFileFromPath(const QString &filePath, bool doRequestGallery)
 | 
			
		||||
{
 | 
			
		||||
    emit navigatorViewRequired(false, 0);
 | 
			
		||||
 | 
			
		||||
    QString filePath(url.toLocalFile());
 | 
			
		||||
 | 
			
		||||
    if (filePath.endsWith(".svg")) {
 | 
			
		||||
        showSvg(filePath);
 | 
			
		||||
    } else if (filePath.endsWith(".gif")) {
 | 
			
		||||
@ -43,12 +41,15 @@ void GraphicsView::showFileFromUrl(const QUrl &url, bool doRequestGallery)
 | 
			
		||||
        // So we cannot use imageFormat() and check if it returns QImage::Format_Invalid to detect if we support the file.
 | 
			
		||||
        // QImage::Format imageFormat = imageReader.imageFormat();
 | 
			
		||||
        if (imageReader.format().isEmpty()) {
 | 
			
		||||
            doRequestGallery = false;
 | 
			
		||||
            showText(tr("File is not a valid image"));
 | 
			
		||||
        } else if (!imageReader.supportsAnimation() && !imageReader.canRead()) {
 | 
			
		||||
            doRequestGallery = false;
 | 
			
		||||
            showText(tr("Image data is invalid or currently unsupported"));
 | 
			
		||||
        } else {
 | 
			
		||||
            const QPixmap & pixmap = QPixmap::fromImageReader(&imageReader);
 | 
			
		||||
            if (pixmap.isNull()) {
 | 
			
		||||
                doRequestGallery = false;
 | 
			
		||||
                showText(tr("Image data is invalid or currently unsupported"));
 | 
			
		||||
            } else {
 | 
			
		||||
                showImage(pixmap);
 | 
			
		||||
@ -253,7 +254,7 @@ void GraphicsView::dropEvent(QDropEvent *event)
 | 
			
		||||
        if (urls.isEmpty()) {
 | 
			
		||||
            showText(tr("File url list is empty"));
 | 
			
		||||
        } else {
 | 
			
		||||
            showFileFromUrl(urls.first(), true);
 | 
			
		||||
            showFileFromPath(urls.first().toLocalFile(), true);
 | 
			
		||||
        }
 | 
			
		||||
    } else if (mimeData->hasImage()) {
 | 
			
		||||
        QImage img = qvariant_cast<QImage>(mimeData->imageData());
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ class GraphicsView : public QGraphicsView
 | 
			
		||||
public:
 | 
			
		||||
    GraphicsView(QWidget *parent = nullptr);
 | 
			
		||||
 | 
			
		||||
    void showFileFromUrl(const QUrl &url, bool requestGallery = false);
 | 
			
		||||
    void showFileFromPath(const QString &filePath, bool requestGallery = false);
 | 
			
		||||
 | 
			
		||||
    void showImage(const QPixmap &pixmap);
 | 
			
		||||
    void showImage(const QImage &image);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								app/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								app/main.cpp
									
									
									
									
									
								
							@ -1,4 +1,7 @@
 | 
			
		||||
#include "mainwindow.h"
 | 
			
		||||
 | 
			
		||||
#include "playlistmanager.h"
 | 
			
		||||
 | 
			
		||||
#include <QApplication>
 | 
			
		||||
#include <QCommandLineParser>
 | 
			
		||||
#include <QDir>
 | 
			
		||||
@ -35,13 +38,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
    parser.process(a);
 | 
			
		||||
 | 
			
		||||
    QStringList urlStrList = parser.positionalArguments();
 | 
			
		||||
    QList<QUrl> urlList;
 | 
			
		||||
    for (const QString & str : qAsConst(urlStrList)) {
 | 
			
		||||
        QUrl url = QUrl::fromLocalFile(str);
 | 
			
		||||
        if (url.isValid()) {
 | 
			
		||||
            urlList.append(url);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    QList<QUrl> && urlList = PlaylistManager::convertToUrlList(urlStrList);
 | 
			
		||||
 | 
			
		||||
    MainWindow w;
 | 
			
		||||
    w.show();
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,7 @@
 | 
			
		||||
#include "metadatamodel.h"
 | 
			
		||||
#include "metadatadialog.h"
 | 
			
		||||
#include "actionmanager.h"
 | 
			
		||||
#include "playlistmanager.h"
 | 
			
		||||
 | 
			
		||||
#include <QMouseEvent>
 | 
			
		||||
#include <QMovie>
 | 
			
		||||
@ -21,7 +22,6 @@
 | 
			
		||||
#include <QScreen>
 | 
			
		||||
#include <QMenu>
 | 
			
		||||
#include <QShortcut>
 | 
			
		||||
#include <QDir>
 | 
			
		||||
#include <QCollator>
 | 
			
		||||
#include <QClipboard>
 | 
			
		||||
#include <QMimeData>
 | 
			
		||||
@ -31,6 +31,7 @@
 | 
			
		||||
MainWindow::MainWindow(QWidget *parent)
 | 
			
		||||
    : FramelessWindow(parent)
 | 
			
		||||
    , m_am(new ActionManager)
 | 
			
		||||
    , m_pm(new PlaylistManager(PlaylistManager::PL_SAMEFOLDER, this))
 | 
			
		||||
{
 | 
			
		||||
    if (Settings::instance()->stayOnTop()) {
 | 
			
		||||
        this->setWindowFlag(Qt::WindowStaysOnTopHint);
 | 
			
		||||
@ -128,9 +129,9 @@ MainWindow::MainWindow(QWidget *parent)
 | 
			
		||||
    m_gv->setOpacity(0, false);
 | 
			
		||||
    m_closeButton->setOpacity(0, false);
 | 
			
		||||
 | 
			
		||||
    connect(this, &MainWindow::galleryLoaded, this, [this]() {
 | 
			
		||||
        m_prevButton->setVisible(isGalleryAvailable());
 | 
			
		||||
        m_nextButton->setVisible(isGalleryAvailable());
 | 
			
		||||
    connect(m_pm, &PlaylistManager::loaded, this, [this](int galleryFileCount) {
 | 
			
		||||
        m_prevButton->setVisible(galleryFileCount > 1);
 | 
			
		||||
        m_nextButton->setVisible(galleryFileCount > 1);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    QShortcut * prevPictureShorucut = new QShortcut(QKeySequence(Qt::Key_PageUp), this);
 | 
			
		||||
@ -163,11 +164,11 @@ void MainWindow::showUrls(const QList<QUrl> &urls)
 | 
			
		||||
{
 | 
			
		||||
    if (!urls.isEmpty()) {
 | 
			
		||||
        if (urls.count() == 1) {
 | 
			
		||||
            m_graphicsView->showFileFromUrl(urls.first(), true);
 | 
			
		||||
            m_graphicsView->showFileFromPath(urls.first().toLocalFile(), true);
 | 
			
		||||
        } else {
 | 
			
		||||
            m_graphicsView->showFileFromUrl(urls.first(), false);
 | 
			
		||||
            m_files = urls;
 | 
			
		||||
            m_currentFileIndex = 0;
 | 
			
		||||
            m_graphicsView->showFileFromPath(urls.first().toLocalFile(), false);
 | 
			
		||||
            m_pm->setPlaylist(urls);
 | 
			
		||||
            m_pm->setCurrentIndex(0);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        m_graphicsView->showText(tr("File url list is empty"));
 | 
			
		||||
@ -208,77 +209,44 @@ void MainWindow::adjustWindowSizeBySceneRect()
 | 
			
		||||
// can be empty if it is NOT from a local file.
 | 
			
		||||
QUrl MainWindow::currentImageFileUrl() const
 | 
			
		||||
{
 | 
			
		||||
    if (m_currentFileIndex != -1) {
 | 
			
		||||
        return m_files.value(m_currentFileIndex);
 | 
			
		||||
    }
 | 
			
		||||
    QUrl url;
 | 
			
		||||
    std::tie(std::ignore, url) = m_pm->currentFileUrl();
 | 
			
		||||
 | 
			
		||||
    return QUrl();
 | 
			
		||||
    return url;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::clearGallery()
 | 
			
		||||
{
 | 
			
		||||
    m_currentFileIndex = -1;
 | 
			
		||||
    m_files.clear();
 | 
			
		||||
    m_pm->clear();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::loadGalleryBySingleLocalFile(const QString &path)
 | 
			
		||||
{
 | 
			
		||||
    QFileInfo info(path);
 | 
			
		||||
    QDir dir(info.path());
 | 
			
		||||
    QString currentFileName = info.fileName();
 | 
			
		||||
    QStringList entryList = dir.entryList({"*.jpg", "*.jpeg", "*.jfif", "*.png", "*.gif", "*.svg", "*.bmp"},
 | 
			
		||||
                                          QDir::Files | QDir::NoSymLinks, QDir::NoSort);
 | 
			
		||||
 | 
			
		||||
    QCollator collator;
 | 
			
		||||
    collator.setNumericMode(true);
 | 
			
		||||
 | 
			
		||||
    std::sort(entryList.begin(), entryList.end(), collator);
 | 
			
		||||
 | 
			
		||||
    clearGallery();
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < entryList.count(); i++) {
 | 
			
		||||
        const QString & fileName = entryList.at(i);
 | 
			
		||||
        const QString & oneEntry = dir.absoluteFilePath(fileName);
 | 
			
		||||
        const QUrl & url = QUrl::fromLocalFile(oneEntry);
 | 
			
		||||
        m_files.append(url);
 | 
			
		||||
        if (fileName == currentFileName) {
 | 
			
		||||
            m_currentFileIndex = i;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    emit galleryLoaded();
 | 
			
		||||
    m_pm->setCurrentFile(path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::galleryPrev()
 | 
			
		||||
{
 | 
			
		||||
    int count = m_files.count();
 | 
			
		||||
    if (!isGalleryAvailable()) {
 | 
			
		||||
        return;
 | 
			
		||||
    int index;
 | 
			
		||||
    QString filePath;
 | 
			
		||||
    std::tie(index, filePath) = m_pm->previousFile();
 | 
			
		||||
 | 
			
		||||
    if (index >= 0) {
 | 
			
		||||
        m_graphicsView->showFileFromPath(filePath, false);
 | 
			
		||||
        m_pm->setCurrentIndex(index);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_currentFileIndex = m_currentFileIndex - 1 < 0 ? count - 1 : m_currentFileIndex - 1;
 | 
			
		||||
 | 
			
		||||
    m_graphicsView->showFileFromUrl(m_files.at(m_currentFileIndex), false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::galleryNext()
 | 
			
		||||
{
 | 
			
		||||
    int count = m_files.count();
 | 
			
		||||
    if (!isGalleryAvailable()) {
 | 
			
		||||
        return;
 | 
			
		||||
    int index;
 | 
			
		||||
    QString filePath;
 | 
			
		||||
    std::tie(index, filePath) = m_pm->nextFile();
 | 
			
		||||
 | 
			
		||||
    if (index >= 0) {
 | 
			
		||||
        m_graphicsView->showFileFromPath(filePath, false);
 | 
			
		||||
        m_pm->setCurrentIndex(index);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_currentFileIndex = m_currentFileIndex + 1 == count ? 0 : m_currentFileIndex + 1;
 | 
			
		||||
 | 
			
		||||
    m_graphicsView->showFileFromUrl(m_files.at(m_currentFileIndex), false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool MainWindow::isGalleryAvailable()
 | 
			
		||||
{
 | 
			
		||||
    if (m_currentFileIndex < 0 || m_files.isEmpty() || m_currentFileIndex >= m_files.count()) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::showEvent(QShowEvent *event)
 | 
			
		||||
@ -601,10 +569,12 @@ void MainWindow::on_actionPaste_triggered()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!clipboardImage.isNull()) {
 | 
			
		||||
        clearGallery();
 | 
			
		||||
        m_graphicsView->showImage(clipboardImage);
 | 
			
		||||
        clearGallery();
 | 
			
		||||
    } else if (clipboardFileUrl.isValid()) {
 | 
			
		||||
        m_graphicsView->showFileFromUrl(clipboardFileUrl, true);
 | 
			
		||||
        QString localFile(clipboardFileUrl.toLocalFile());
 | 
			
		||||
        m_graphicsView->showFileFromPath(localFile, true);
 | 
			
		||||
        m_pm->setCurrentFile(localFile);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -13,6 +13,7 @@ class QGraphicsView;
 | 
			
		||||
QT_END_NAMESPACE
 | 
			
		||||
 | 
			
		||||
class ActionManager;
 | 
			
		||||
class PlaylistManager;
 | 
			
		||||
class ToolButton;
 | 
			
		||||
class GraphicsView;
 | 
			
		||||
class NavigatorView;
 | 
			
		||||
@ -33,10 +34,6 @@ public:
 | 
			
		||||
    void loadGalleryBySingleLocalFile(const QString &path);
 | 
			
		||||
    void galleryPrev();
 | 
			
		||||
    void galleryNext();
 | 
			
		||||
    bool isGalleryAvailable();
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
    void galleryLoaded();
 | 
			
		||||
 | 
			
		||||
protected slots:
 | 
			
		||||
    void showEvent(QShowEvent *event) override;
 | 
			
		||||
@ -77,6 +74,7 @@ private slots:
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    ActionManager *m_am;
 | 
			
		||||
    PlaylistManager *m_pm;
 | 
			
		||||
 | 
			
		||||
    QPoint m_oldMousePos;
 | 
			
		||||
    QPropertyAnimation *m_fadeOutAnimation;
 | 
			
		||||
@ -90,9 +88,6 @@ private:
 | 
			
		||||
    BottomButtonGroup *m_bottomButtonGroup;
 | 
			
		||||
    bool m_protectedMode = false;
 | 
			
		||||
    bool m_clickedOnWindow = false;
 | 
			
		||||
 | 
			
		||||
    QList<QUrl> m_files;
 | 
			
		||||
    int m_currentFileIndex = -1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // MAINWINDOW_H
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										153
									
								
								app/playlistmanager.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								app/playlistmanager.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,153 @@
 | 
			
		||||
#include "playlistmanager.h"
 | 
			
		||||
 | 
			
		||||
#include <QCollator>
 | 
			
		||||
#include <QDir>
 | 
			
		||||
#include <QFileInfo>
 | 
			
		||||
#include <QUrl>
 | 
			
		||||
 | 
			
		||||
PlaylistManager::PlaylistManager(PlaylistType type, QObject *parent)
 | 
			
		||||
    : QObject(parent)
 | 
			
		||||
    , m_type(type)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PlaylistManager::~PlaylistManager()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlaylistManager::setPlaylistType(PlaylistManager::PlaylistType type)
 | 
			
		||||
{
 | 
			
		||||
    m_type = type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PlaylistManager::PlaylistType PlaylistManager::playlistType() const
 | 
			
		||||
{
 | 
			
		||||
    return m_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlaylistManager::clear()
 | 
			
		||||
{
 | 
			
		||||
    m_currentIndex = -1;
 | 
			
		||||
    m_playlist.clear();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlaylistManager::setPlaylist(const QList<QUrl> &urls)
 | 
			
		||||
{
 | 
			
		||||
    m_playlist = urls;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlaylistManager::setCurrentFile(const QString & filePath)
 | 
			
		||||
{
 | 
			
		||||
    QFileInfo info(filePath);
 | 
			
		||||
    QDir dir(info.path());
 | 
			
		||||
    QString && currentFileName = info.fileName();
 | 
			
		||||
 | 
			
		||||
    switch (playlistType()) {
 | 
			
		||||
    case PL_SAMEFOLDER: {
 | 
			
		||||
        if (dir.path() == m_currentDir) {
 | 
			
		||||
            int index = indexOf(filePath);
 | 
			
		||||
            m_currentIndex = index == -1 ? appendFile(filePath) : index;
 | 
			
		||||
        } else {
 | 
			
		||||
            QStringList entryList = dir.entryList({"*.jpg", "*.jpeg", "*.jfif", "*.png", "*.gif", "*.svg", "*.bmp"},
 | 
			
		||||
                                                  QDir::Files | QDir::NoSymLinks, QDir::NoSort);
 | 
			
		||||
 | 
			
		||||
            QCollator collator;
 | 
			
		||||
            collator.setNumericMode(true);
 | 
			
		||||
 | 
			
		||||
            std::sort(entryList.begin(), entryList.end(), collator);
 | 
			
		||||
 | 
			
		||||
            clear();
 | 
			
		||||
 | 
			
		||||
            int index = -1;
 | 
			
		||||
            for (int i = 0; i < entryList.count(); i++) {
 | 
			
		||||
                const QString & fileName = entryList.at(i);
 | 
			
		||||
                const QString & oneEntry = dir.absoluteFilePath(fileName);
 | 
			
		||||
                const QUrl & url = QUrl::fromLocalFile(oneEntry);
 | 
			
		||||
                m_playlist.append(url);
 | 
			
		||||
                if (fileName == currentFileName) {
 | 
			
		||||
                    index = i;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            m_currentIndex = index == -1 ? appendFile(filePath) : index;
 | 
			
		||||
            m_currentDir = dir.path();
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    case PL_USERPLAYLIST:{
 | 
			
		||||
        int index = indexOf(filePath);
 | 
			
		||||
        m_currentIndex = index == -1 ? appendFile(filePath) : index;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    default:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    emit loaded(m_playlist.count());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PlaylistManager::setCurrentIndex(int index)
 | 
			
		||||
{
 | 
			
		||||
    if (index < 0 || index >= m_playlist.count()) return;
 | 
			
		||||
    m_currentIndex = index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int PlaylistManager::appendFile(const QString &filePath)
 | 
			
		||||
{
 | 
			
		||||
    int index = m_playlist.length();
 | 
			
		||||
    m_playlist.append(QUrl::fromLocalFile(filePath));
 | 
			
		||||
 | 
			
		||||
    return index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int PlaylistManager::indexOf(const QString &filePath)
 | 
			
		||||
{
 | 
			
		||||
    const QUrl & url = QUrl::fromLocalFile(filePath);
 | 
			
		||||
    return m_playlist.indexOf(url);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::tuple<int, QString> PlaylistManager::previousFile() const
 | 
			
		||||
{
 | 
			
		||||
    int count = m_playlist.count();
 | 
			
		||||
    if (count == 0) return std::make_tuple(-1, QString());
 | 
			
		||||
 | 
			
		||||
    int index = m_currentIndex - 1 < 0 ? count - 1 : m_currentIndex - 1;
 | 
			
		||||
    return std::make_tuple(index, m_playlist.at(index).toLocalFile());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::tuple<int, QString> PlaylistManager::nextFile() const
 | 
			
		||||
{
 | 
			
		||||
    int count = m_playlist.count();
 | 
			
		||||
    if (count == 0) return std::make_tuple(-1, QString());
 | 
			
		||||
 | 
			
		||||
    int index = m_currentIndex + 1 == count ? 0 : m_currentIndex + 1;
 | 
			
		||||
    return std::make_tuple(index, m_playlist.at(index).toLocalFile());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::tuple<int, QString> PlaylistManager::currentFile() const
 | 
			
		||||
{
 | 
			
		||||
    if (m_playlist.count() == 0) return std::make_tuple(-1, QString());
 | 
			
		||||
 | 
			
		||||
    return std::make_tuple(m_currentIndex, m_playlist.at(m_currentIndex).toLocalFile());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::tuple<int, QUrl> PlaylistManager::currentFileUrl() const
 | 
			
		||||
{
 | 
			
		||||
    if (m_playlist.count() == 0) return std::make_tuple(-1, QUrl());
 | 
			
		||||
 | 
			
		||||
    return std::make_tuple(m_currentIndex, m_playlist.at(m_currentIndex));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QList<QUrl> PlaylistManager::convertToUrlList(const QStringList &files)
 | 
			
		||||
{
 | 
			
		||||
    QList<QUrl> urlList;
 | 
			
		||||
    for (const QString & str : qAsConst(files)) {
 | 
			
		||||
        QUrl url = QUrl::fromLocalFile(str);
 | 
			
		||||
        if (url.isValid()) {
 | 
			
		||||
            urlList.append(url);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return urlList;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								app/playlistmanager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								app/playlistmanager.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
 | 
			
		||||
class PlaylistManager : public QObject
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
    enum PlaylistType {
 | 
			
		||||
        PL_USERPLAYLIST, // Regular playlist, managed by user.
 | 
			
		||||
        PL_SAMEFOLDER // PlaylistManager managed playlist, loaded from files from same folder.
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    explicit PlaylistManager(PlaylistType type = PL_USERPLAYLIST, QObject *parent = nullptr);
 | 
			
		||||
    ~PlaylistManager();
 | 
			
		||||
 | 
			
		||||
    void setPlaylistType(PlaylistType type);
 | 
			
		||||
    PlaylistType playlistType() const;
 | 
			
		||||
 | 
			
		||||
    void clear();
 | 
			
		||||
 | 
			
		||||
    void setPlaylist(const QList<QUrl> & urls);
 | 
			
		||||
    void setCurrentFile(const QString & filePath);
 | 
			
		||||
    void setCurrentIndex(int index);
 | 
			
		||||
    int appendFile(const QString & filePath);
 | 
			
		||||
    int indexOf(const QString & filePath);
 | 
			
		||||
 | 
			
		||||
    std::tuple<int, QString> previousFile() const;
 | 
			
		||||
    std::tuple<int, QString> nextFile() const;
 | 
			
		||||
    std::tuple<int, QString> currentFile() const;
 | 
			
		||||
    std::tuple<int, QUrl> currentFileUrl() const;
 | 
			
		||||
 | 
			
		||||
    static QList<QUrl> convertToUrlList(const QStringList & files);
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
    void loaded(int length);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    QList<QUrl> m_playlist;
 | 
			
		||||
    PlaylistType m_type;
 | 
			
		||||
    QString m_currentDir;
 | 
			
		||||
    int m_currentIndex = -1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user