X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fplaylist%2Fplaylist_model.hpp;h=a1cf54070e17a39e9a88d83cfda232e09e60e781;hb=69863bd612acc31188fa55c713e0c9dc329eb909;hp=f48a9ae73a597dd18ce1ec027e84b246c3efbe22;hpb=d9c2006ca22e7d32ab2b396709d44f1ceb451995;p=vlc diff --git a/modules/gui/qt4/components/playlist/playlist_model.hpp b/modules/gui/qt4/components/playlist/playlist_model.hpp index f48a9ae73a..a1cf54070e 100644 --- a/modules/gui/qt4/components/playlist/playlist_model.hpp +++ b/modules/gui/qt4/components/playlist/playlist_model.hpp @@ -1,7 +1,7 @@ /***************************************************************************** * playlist_model.hpp : Model for a playlist tree **************************************************************************** - * Copyright (C) 2006 the VideoLAN team + * Copyright (C) 2006-2011 the VideoLAN team * $Id$ * * Authors: Clément Stenac @@ -29,162 +29,150 @@ # include "config.h" #endif -#include "qt4.hpp" - #include #include - +#include "vlc_model.hpp" #include "playlist_item.hpp" -#include #include #include -#include #include +#include #include #include - -class QSignalMapper; +#include class PLItem; +class PLSelector; +class PlMimeData; +class QSignalMapper; -#define DEPTH_PL -1 -#define DEPTH_SEL 1 - -enum { - ItemUpdate_Type = QEvent::User + PLEventType + 2, - ItemDelete_Type = QEvent::User + PLEventType + 3, - ItemAppend_Type = QEvent::User + PLEventType + 4, -}; - -class PLEvent : public QEvent -{ -public: - PLEvent( int type, int id ) : QEvent( (QEvent::Type)(type) ) - { - i_id = id; - add.i_node = -1; - add.i_item = -1; - }; - - PLEvent( const playlist_add_t *a ) : QEvent( (QEvent::Type)(ItemAppend_Type) ) - { - add = *a; - }; - - virtual ~PLEvent() { }; - - int i_id; - playlist_add_t add; -}; - - -class PLModel : public QAbstractItemModel +class PLModel : public VLCModel { Q_OBJECT -friend class PLItem; - public: PLModel( playlist_t *, intf_thread_t *, playlist_item_t *, QObject *parent = 0 ); - ~PLModel(); + virtual ~PLModel(); + + /* Qt4 main PLModel */ + static PLModel* getPLModel( intf_thread_t *p_intf ) + { + if(!p_intf->p_sys->pl_model ) + { + playlist_Lock( THEPL ); + playlist_item_t *p_root = THEPL->p_playing; + playlist_Unlock( THEPL ); + p_intf->p_sys->pl_model = new PLModel( THEPL, p_intf, p_root, NULL ); + } - /*** QModel subclassing ***/ + return p_intf->p_sys->pl_model; + } + + /*** QAbstractItemModel subclassing ***/ /* Data structure */ - QVariant data( const QModelIndex &index, int role ) const; - QVariant headerData( int section, Qt::Orientation orientation, + virtual QVariant data( const QModelIndex &index, const int role ) const; + virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; - int rowCount( const QModelIndex &parent = QModelIndex() ) const; - int columnCount( const QModelIndex &parent = QModelIndex() ) const; - Qt::ItemFlags flags( const QModelIndex &index ) const; - QModelIndex index( int r, int c, const QModelIndex &parent ) const; - QModelIndex parent( const QModelIndex &index ) const; + virtual int rowCount( const QModelIndex &parent = QModelIndex() ) const; + virtual int columnCount( const QModelIndex &parent = QModelIndex() ) const; + virtual Qt::ItemFlags flags( const QModelIndex &index ) const; + virtual QModelIndex index( const int r, const int c, const QModelIndex &parent ) const; + virtual QModelIndex parent( const QModelIndex &index ) const; /* Drag and Drop */ - Qt::DropActions supportedDropActions() const; - QMimeData* mimeData( const QModelIndexList &indexes ) const; - bool dropMimeData( const QMimeData *data, Qt::DropAction action, + virtual Qt::DropActions supportedDropActions() const; + virtual QMimeData* mimeData( const QModelIndexList &indexes ) const; + virtual bool dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &target ); - QStringList mimeTypes() const; + virtual QStringList mimeTypes() const; + + /* Sort */ + virtual void sort( const int column, Qt::SortOrder order = Qt::AscendingOrder ); /**** Custom ****/ /* Lookups */ - QStringList selectedURIs(); - bool hasRandom(); bool hasLoop(); bool hasRepeat(); - QModelIndex index( PLItem *, int c ) const; - QModelIndex currentIndex( ) { return index( currentItem, 0 ); }; - bool isCurrent( const QModelIndex &index ) const; + QModelIndex index( const int i_id, const int c ); + virtual QModelIndex currentIndex() const; int itemId( const QModelIndex &index ) const; - /* Actions */ - void popup( QModelIndex & index, QPoint &point, QModelIndexList list ); - void doDelete( QModelIndexList selected ); - void search( const QString& search_text ); - void sort( int column, Qt::SortOrder order ); - void sort( int i_root_id, int column, Qt::SortOrder order ); - void removeItem( int ); - void rebuild(); void rebuild( playlist_item_t *, bool b_first = false ); + /* */ + void search( const QString& search_text, const QModelIndex & root, bool b_recursive ); + void rebuild( playlist_item_t * p = NULL ); -private: + /* Popup Actions */ + virtual bool popup( const QModelIndex & index, const QPoint &point, const QModelIndexList &list ); + virtual void doDelete( QModelIndexList selected ); + + PLItem *getItem( const QModelIndex & index ) const + { + if( index.isValid() ) + return static_cast( index.internalPointer() ); + else return rootItem; + } +signals: + void currentChanged( const QModelIndex& ); + void rootChanged(); + +public slots: + virtual void activateItem( const QModelIndex &index ); + +private: /* General */ PLItem *rootItem; - PLItem *currentItem; playlist_t *p_playlist; - intf_thread_t *p_intf; - int i_depth; static QIcon icons[ITEM_TYPE_NUMBER]; - /* Callbacks related */ - void addCallbacks(); - void delCallbacks(); - void customEvent( QEvent * ); - void processItemRemoval( int i_id ); - void processItemAppend( const playlist_add_t *p_add ); + /* Custom model private methods */ + /* Lookups */ + QStringList selectedURIs(); + QModelIndex index( PLItem *, const int c ) const; + bool isCurrent( const QModelIndex &index ) const; + bool isParent( const QModelIndex &index, const QModelIndex ¤t) const; - /* Actions */ - void recurseDelete( QList children, QModelIndexList *fullList ); - void doDeleteItem( PLItem *item, QModelIndexList *fullList ); + /* Shallow actions (do not affect core playlist) */ void updateTreeItem( PLItem * ); + void removeItem ( PLItem * ); + void removeItem( int ); + void recurseDelete( QList children, QModelIndexList *fullList ); void takeItem( PLItem * ); //will not delete item void insertChildren( PLItem *node, QList& items, int i_pos ); - void dropAppendCopy( QByteArray& data, PLItem *target ); - void dropMove( QByteArray& data, PLItem *target, int new_pos ); - /* The following actions will not signal the view! */ - void removeItem ( PLItem * ); + /* ...of which the following will not update the views */ void updateChildren( PLItem * ); void updateChildren( playlist_item_t *, PLItem * ); + /* Deep actions (affect core playlist) */ + void dropAppendCopy( const PlMimeData * data, PLItem *target, int pos ); + void dropMove( const PlMimeData * data, PLItem *target, int new_pos ); + + /* */ + void sort( const int i_root_id, const int column, Qt::SortOrder order ); + /* Popup */ - int i_popup_item, i_popup_parent, i_popup_column; + int i_popup_item, i_popup_parent; QModelIndexList current_selection; + QMenu *sortingMenu; + QSignalMapper *sortingMapper; /* Lookups */ - PLItem *findById( PLItem *, int ); - PLItem *findByInput( PLItem *, int ); - PLItem *findInner( PLItem *, int , bool ); - static inline PLItem *getItem( QModelIndex index ); - int columnFromMeta( int meta_column ) const; - int columnToMeta( int column ) const; + PLItem *findById( PLItem *, int ) const; + PLItem *findByInput( PLItem *, int ) const; + PLItem *findInner(PLItem *, int , bool ) const; + bool canEdit() const; + PLItem *p_cached_item; PLItem *p_cached_item_bi; int i_cached_id; int i_cached_input_id; -signals: - void currentChanged( const QModelIndex& ); - -public slots: - void activateItem( const QModelIndex &index ); - void activateItem( playlist_item_t *p_item ); - void setRandom( bool ); - void setLoop( bool ); - void setRepeat( bool ); + /* Zoom factor for font-size */ + int i_zoom; private slots: void popupPlay(); @@ -194,10 +182,31 @@ private slots: void popupSave(); void popupExplore(); void popupAddNode(); - void popupSortAsc(); - void popupSortDesc(); + void popupAddToPlaylist(); + void popupSort( int column ); void processInputItemUpdate( input_item_t *); void processInputItemUpdate( input_thread_t* p_input ); + void processItemRemoval( int i_id ); + void processItemAppend( int item, int parent ); + void activateItem( playlist_item_t *p_item ); + void increaseZoom(); + void decreaseZoom(); +}; + +class PlMimeData : public QMimeData +{ + Q_OBJECT + +public: + PlMimeData() {} + ~PlMimeData(); + void appendItem( input_item_t *p_item ); + QList inputItems() const; + QStringList formats () const; + +private: + QList _inputItems; + QMimeData *_mimeData; }; #endif