Skip to content
Snippets Groups Projects
mlfoldersmodel.hpp 3.51 KiB
Newer Older
Abel Tesfaye's avatar
Abel Tesfaye committed
/*****************************************************************************
 * Copyright (C) 2019 VLC authors and VideoLAN
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * ( at your option ) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 *****************************************************************************/

#ifndef ML_FOLDERS_MODEL_HPP
#define ML_FOLDERS_MODEL_HPP

#ifdef HAVE_CONFIG_H

# include "config.h"

#endif

#include "qt.hpp"
#include <QAbstractListModel>
#include <QUrl>
#include <QList>
#include "mlhelper.hpp"
#include <maininterface/main_interface.hpp>
Abel Tesfaye's avatar
Abel Tesfaye committed
#include <vlc_media_library.h>

class MLFoldersBaseModel : public QAbstractListModel
Abel Tesfaye's avatar
Abel Tesfaye committed
{
    Q_OBJECT
    Q_PROPERTY(MainInterface* ctx READ getCtx WRITE setCtx NOTIFY ctxChanged FINAL)
Abel Tesfaye's avatar
Abel Tesfaye committed
public:
    enum Roles
    {
        Banned = Qt::UserRole + 1,
        DisplayUrl,
        MRL
    };

    enum Operation
    {
        Add,
        Remove,
        Ban,
        Unban
    };

    MLFoldersBaseModel( QObject *parent = nullptr );
    void setCtx(MainInterface* ctx);
    inline MainInterface* getCtx() { return m_ctx; }
Abel Tesfaye's avatar
Abel Tesfaye committed

    int rowCount( QModelIndex const &parent = {} ) const  override;
    QVariant data( QModelIndex const &index , const int role = Qt::DisplayRole ) const  override;
    QHash<int, QByteArray> roleNames() const override;

public slots:
    virtual void remove( const QUrl &mrl ) = 0;
    virtual void add( const QUrl &mrl ) = 0;
    void removeAt( int index );
signals:
    void ctxChanged();
    void operationFailed( int op, QUrl url ) const;
    void onMLEntryPointModified(QPrivateSignal);
protected:
    struct EntryPoint
        EntryPoint(const vlc_ml_folder_t &entryPoint );
        QString mrl;
    virtual std::vector<EntryPoint> entryPoints() const = 0;
    virtual bool failed( const vlc_ml_event_t* event ) const = 0; // will be called outside the main thread
    static void onMlEvent( void* data , const vlc_ml_event_t* event );
    void update();

    using EventCallbackPtr = std::unique_ptr<vlc_ml_event_callback_t, std::function<void( vlc_ml_event_callback_t* )>>;

    std::vector<EntryPoint> m_mrls;
    MediaLib *m_mediaLib = nullptr;
    MainInterface* m_ctx = nullptr;
Abel Tesfaye's avatar
Abel Tesfaye committed
    EventCallbackPtr m_ml_event_handle;
class MLFoldersModel : public MLFoldersBaseModel
{
public:
    using MLFoldersBaseModel::MLFoldersBaseModel;
    void remove( const QUrl &mrl ) override;
    void add( const QUrl &mrl ) override;
private:
    std::vector<EntryPoint> entryPoints() const final;
    bool failed( const vlc_ml_event_t* event ) const override;
class MLBannedFoldersModel : public MLFoldersBaseModel
{
public:
    using MLFoldersBaseModel::MLFoldersBaseModel;

    void remove( const QUrl &mrl ) override;
    void add( const QUrl &mrl ) override;

private:
    std::vector<EntryPoint> entryPoints() const final;
    bool failed( const vlc_ml_event_t* event ) const override;
Abel Tesfaye's avatar
Abel Tesfaye committed
#endif // ML_FOLDERS_MODEL_HPP