[vlc-devel] [PATCH 1/2] qt: make ml_folders_model

Abel Tesfaye abeltesfaye45 at gmail.com
Mon Aug 5 13:54:05 CEST 2019


This is a resend.

On Mon, 5 Aug 2019 at 14:53, Abel Tesfaye <abeltesfaye45 at gmail.com> wrote:

> From: Abel Tesfaye <Abeltesfaye45 at gmail.com>
>
> ---
>  modules/gui/qt/Makefile.am                    |   3 +
>  .../mediacenter/ml_folders_model.cpp          | 147 ++++++++++++++++++
>  .../mediacenter/ml_folders_model.hpp          |  80 ++++++++++
>  3 files changed, 230 insertions(+)
>  create mode 100644
> modules/gui/qt/components/mediacenter/ml_folders_model.cpp
>  create mode 100644
> modules/gui/qt/components/mediacenter/ml_folders_model.hpp
>
> diff --git a/modules/gui/qt/Makefile.am b/modules/gui/qt/Makefile.am
> index bdf5dcd5cf..2932cf2426 100644
> --- a/modules/gui/qt/Makefile.am
> +++ b/modules/gui/qt/Makefile.am
> @@ -112,6 +112,8 @@ libqt_plugin_la_SOURCES = \
>         gui/qt/components/settings.hpp \
>         gui/qt/components/audio_device_model.cpp  \
>         gui/qt/components/audio_device_model.hpp \
> +       gui/qt/components/mediacenter/ml_folders_model.hpp  \
> +       gui/qt/components/mediacenter/ml_folders_model.cpp \
>         gui/qt/components/voutwindow/videosurface.cpp \
>         gui/qt/components/voutwindow/videosurface.hpp \
>         gui/qt/components/voutwindow/qvoutwindow.cpp \
> @@ -269,6 +271,7 @@ nodist_libqt_plugin_la_SOURCES = \
>         gui/qt/components/selectable_list_model.moc.cpp \
>         gui/qt/components/settings.moc.cpp \
>         gui/qt/components/audio_device_model.moc.cpp \
> +       gui/qt/components/mediacenter/ml_folders_model.moc.cpp \
>         gui/qt/components/voutwindow/videosurface.moc.cpp \
>         gui/qt/components/voutwindow/qvoutwindow.moc.cpp \
>         gui/qt/components/voutwindow/qvoutwindowdummy.moc.cpp \
> diff --git a/modules/gui/qt/components/mediacenter/ml_folders_model.cpp
> b/modules/gui/qt/components/mediacenter/ml_folders_model.cpp
> new file mode 100644
> index 0000000000..e7469830e7
> --- /dev/null
> +++ b/modules/gui/qt/components/mediacenter/ml_folders_model.cpp
> @@ -0,0 +1,147 @@
>
> +/*****************************************************************************
> + * 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.
> +
> *****************************************************************************/
> +
> +#include "ml_folders_model.hpp"
> +#include <cassert>
> +
> +MlFoldersModel::MlFoldersModel( vlc_medialibrary_t *p_ml , QObject
> *parent )
> +    : QAbstractListModel( parent )
> +    ,m_ml( p_ml )
> +    ,m_ml_event_handle( nullptr , [this](vlc_ml_event_callback_t* cb ) {
> +        assert( m_ml != nullptr );
> +        vlc_ml_event_unregister_callback( m_ml , cb );
> +})
> +{
> +    assert( p_ml );
> +    connect( this , &MlFoldersModel::onMLEntryPointModified , this ,
> &MlFoldersModel::update );
> +    m_ml_event_handle.reset( vlc_ml_event_register_callback( m_ml ,
> onMlEvent , this ) );
> +    update();
> +}
> +
> +int MlFoldersModel::rowCount( QModelIndex const & ) const
> +{
> +    return m_mrls.count();
> +}
> +int MlFoldersModel::columnCount( QModelIndex const & ) const
> +{
> +    return 3;
> +}
> +
> +QVariant MlFoldersModel::data( const QModelIndex &index ,
> +                              int role) const {
> +    if ( index.isValid() )
> +    {
> +        switch ( role )
> +        {
> +        case Qt::DisplayRole :
> +            if ( index.column() == 1 )
> +                return QVariant::fromValue(
> m_mrls[index.row()].toDisplayString( QUrl::RemovePassword |
> QUrl::PreferLocalFile | QUrl::NormalizePathSegments ) );
> +            break;
> +        case CustomCheckBoxRole :
> +            return ( index.row() %2 ) ? //TODO: if mrl banned?
> +                                      Qt::Checked : Qt::Unchecked;
> +            break;
> +        default :
> +            return {};
> +        }
> +    }
> +    return {};
> +}
> +
> +void MlFoldersModel::removeAt( int index )
> +{
> +    vlc_ml_remove_folder( m_ml , qtu( m_mrls[index].toString() ) );
> +}
> +
> +void MlFoldersModel::add( QUrl mrl )
> +{
> +    vlc_ml_add_folder( m_ml , qtu( mrl.toString( QUrl::None ) ) );
> +}
> +
> +void MlFoldersModel::update()
> +{
> +    beginResetModel();
> +
> +    m_mrls.clear();
> +
> +    vlc_ml_entry_point_list_t * entrypoints;
> +    vlc_ml_list_folder( m_ml , &entrypoints ); //TODO: get list of banned
> folders as well
> +
> +    for ( unsigned int i=0 ; i<entrypoints->i_nb_items ; i++ )
> +        m_mrls.append( QUrl::fromUserInput(
> entrypoints->p_items[i].psz_mrl ) );
> +
> +    endResetModel();
> +
> +}
> +
> +Qt::ItemFlags MlFoldersModel::flags ( const QModelIndex & index ) const {
> +    Qt::ItemFlags defaultFlags = QAbstractListModel::flags( index );
> +    if ( index.isValid() ){
> +        return defaultFlags;
> +    }
> +    return defaultFlags;
> +}
> +
> +bool MlFoldersModel::setData( const QModelIndex &index ,
> +                                const QVariant &value , int role){
> +    if( !index.isValid() )
> +        return false;
> +
> +    else if( role == CustomCheckBoxRole ){
> +        if( !value.toBool() ){
> +            vlc_ml_unban_folder(m_ml, qtu( m_mrls[index.row()].toString()
> ) );
> +        }
> +        else{
> +            vlc_ml_ban_folder( m_ml , qtu( m_mrls[index.row()].toString()
> ) );
> +        }
> +    }
> +    else if(role == CustomRemoveRole){
> +        removeAt( index.row() );
> +    }
> +
> +    return true;
> +}
> +void MlFoldersModel::onMlEvent( void* data , const vlc_ml_event_t* event )
> +{
> +    auto self = static_cast<MlFoldersModel*>( data );
> +    if ( event->i_type == VLC_ML_EVENT_ENTRY_POINT_ADDED || event->i_type
> == VLC_ML_EVENT_ENTRY_POINT_REMOVED ||
> +         event->i_type == VLC_ML_EVENT_ENTRY_POINT_UNBANNED ||
> event->i_type == VLC_ML_EVENT_ENTRY_POINT_BANNED  )
> +    {
> +        emit self->onMLEntryPointModified();
> +    }
> +}
> +
> + QVariant MlFoldersModel::headerData( int section , Qt::Orientation
> orientation , int /*role*/) const
> + {
> +     if ( orientation == Qt::Horizontal ) {
> +         switch ( section ) {
> +             case 0:
> +                 return qtr("Banned");
> +
> +             case 1:
> +                 return qtr("Path");
> +
> +             case 2:
> +                 return qtr("Remove");
> +
> +             default:
> +                 return qtr("Unknown");
> +         }
> +     }
> +     return QVariant();
> + }
> diff --git a/modules/gui/qt/components/mediacenter/ml_folders_model.hpp
> b/modules/gui/qt/components/mediacenter/ml_folders_model.hpp
> new file mode 100644
> index 0000000000..2ef0f568bb
> --- /dev/null
> +++ b/modules/gui/qt/components/mediacenter/ml_folders_model.hpp
> @@ -0,0 +1,80 @@
>
> +/*****************************************************************************
> + * 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 "components/mediacenter/mlhelper.hpp"
> +
> +#include <vlc_media_library.h>
> +
> +class MlFoldersModel : public QAbstractListModel
> +{
> +    Q_OBJECT
> +public:
> +    MlFoldersModel( vlc_medialibrary_t *p_ml , QObject * parent = nullptr
> );
> +
> +    int rowCount( QModelIndex const &parent = {} ) const  override;
> +    int columnCount (QModelIndex const &parent = {} ) const  override;
> +
> +    QVariant data( QModelIndex const &index , const int role =
> Qt::DisplayRole ) const  override;
> +
> +    Qt::ItemFlags flags ( const QModelIndex & index ) const ;
> +
> +    bool setData( const QModelIndex &index , const QVariant &value ,
> +                 int role );
> +
> +    static void onMlEvent( void* data , const vlc_ml_event_t* event );
> +    QVariant headerData( int section , Qt::Orientation orientation , int
> role ) const override;
> +
> +    enum Roles
> +    {
> +        CustomCheckBoxRole = Qt::UserRole + 1,
> +        CustomRemoveRole
> +    };
> +private:
> +    QList<QUrl> m_mrls;
> +    vlc_medialibrary_t *m_ml;
> +
> +    using EventCallbackPtr = std::unique_ptr<vlc_ml_event_callback_t,
> +    std::function<void( vlc_ml_event_callback_t* )>> ;
> +
> +    EventCallbackPtr m_ml_event_handle;
> +signals:
> +    void limitChanged();
> +    void  onMLEntryPointModified();
> +
> +public slots:
> +    void update();
> +    void removeAt( int index );
> +    void add( QUrl mrl );
> +
> +
> +};
> +
> +#endif // ML_FOLDERS_MODEL_HPP
> --
> 2.21.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20190805/c863bb64/attachment.html>


More information about the vlc-devel mailing list