playlist_model.hpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * playlist_model.hpp : Model for a playlist tree
  3.  ****************************************************************************
  4.  * Copyright (C) 2006 the VideoLAN team
  5.  * $Id: d4c2e4e9004a3aab08ad54bf42b024eaf959ba33 $
  6.  *
  7.  * Authors: Clément Stenac <zorglub@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #ifndef _PLAYLIST_MODEL_H_
  24. #define _PLAYLIST_MODEL_H_
  25. #ifdef HAVE_CONFIG_H
  26. # include "config.h"
  27. #endif
  28. #include "qt4.hpp"
  29. #include <vlc_input.h>
  30. #include <vlc_playlist.h>
  31. #include "playlist_item.hpp"
  32. #include <QModelIndex>
  33. #include <QObject>
  34. #include <QEvent>
  35. #include <QMimeData>
  36. #include <QSignalMapper>
  37. #include <QAbstractItemModel>
  38. #include <QVariant>
  39. class QSignalMapper;
  40. class PLItem;
  41. #define DEPTH_PL -1
  42. #define DEPTH_SEL 1
  43. enum {
  44.     ItemUpdate_Type = QEvent::User + PLEventType + 2,
  45.     ItemDelete_Type = QEvent::User + PLEventType + 3,
  46.     ItemAppend_Type = QEvent::User + PLEventType + 4,
  47.     PLUpdate_Type   = QEvent::User + PLEventType + 5,
  48. };
  49. class PLEvent : public QEvent
  50. {
  51. public:
  52.     PLEvent( int type, int id ) : QEvent( (QEvent::Type)(type) )
  53.     {
  54.         i_id = id;
  55.         add.i_node = -1;
  56.         add.i_item = -1;
  57.     };
  58.     PLEvent( const playlist_add_t  *a ) : QEvent( (QEvent::Type)(ItemAppend_Type) )
  59.     {
  60.         add = *a;
  61.     };
  62.     virtual ~PLEvent() { };
  63.     int i_id;
  64.     playlist_add_t add;
  65. };
  66. class PLModel : public QAbstractItemModel
  67. {
  68.     Q_OBJECT
  69. friend class PLItem;
  70. public:
  71.     PLModel( playlist_t *, intf_thread_t *,
  72.              playlist_item_t *, int, QObject *parent = 0 );
  73.     ~PLModel();
  74.     /* All types of lookups / QModel stuff */
  75.     QVariant data( const QModelIndex &index, int role ) const;
  76.     Qt::ItemFlags flags( const QModelIndex &index ) const;
  77.     QVariant headerData( int section, Qt::Orientation orientation,
  78.                          int role = Qt::DisplayRole ) const;
  79.     QModelIndex index( int r, int c, const QModelIndex &parent ) const;
  80.     QModelIndex index( PLItem *, int c ) const;
  81.     int itemId( const QModelIndex &index ) const;
  82.     bool isCurrent( const QModelIndex &index );
  83.     QModelIndex parent( const QModelIndex &index ) const;
  84.     int childrenCount( const QModelIndex &parent = QModelIndex() ) const;
  85.     int rowCount( const QModelIndex &parent = QModelIndex() ) const;
  86.     int columnCount( const QModelIndex &parent = QModelIndex() ) const;
  87.     /* Get current selection */
  88.     QStringList selectedURIs();
  89.     void rebuild(); void rebuild( playlist_item_t * );
  90.     bool hasRandom(); bool hasLoop(); bool hasRepeat();
  91.     /* Actions made by the views */
  92.     void popup( QModelIndex & index, QPoint &point, QModelIndexList list );
  93.     void doDelete( QModelIndexList selected );
  94.     void search( const QString& search_text );
  95.     void sort( int column, Qt::SortOrder order );
  96.     void removeItem( int );
  97.     /* DnD handling */
  98.     Qt::DropActions supportedDropActions() const;
  99.     QMimeData* mimeData( const QModelIndexList &indexes ) const;
  100.     bool dropMimeData( const QMimeData *data, Qt::DropAction action,
  101.                       int row, int column, const QModelIndex &target );
  102.     QStringList mimeTypes() const;
  103.     int shownFlags() { return rootItem->i_showflags;  }
  104. private:
  105.     void addCallbacks();
  106.     void delCallbacks();
  107.     void customEvent( QEvent * );
  108.     PLItem *rootItem;
  109.     playlist_t *p_playlist;
  110.     intf_thread_t *p_intf;
  111.     int i_depth;
  112.     static QIcon icons[ITEM_TYPE_NUMBER];
  113.     /* Update processing */
  114.     void ProcessItemRemoval( int i_id );
  115.     void ProcessItemAppend( const playlist_add_t *p_add );
  116.     void UpdateTreeItem( PLItem *, bool, bool force = false );
  117.     void UpdateTreeItem( playlist_item_t *, PLItem *, bool, bool forc = false );
  118.     void UpdateNodeChildren( PLItem * );
  119.     void UpdateNodeChildren( playlist_item_t *, PLItem * );
  120.     /* Actions */
  121.     void recurseDelete( QList<PLItem*> children, QModelIndexList *fullList );
  122.     void doDeleteItem( PLItem *item, QModelIndexList *fullList );
  123.     /* Popup */
  124.     int i_popup_item, i_popup_parent;
  125.     QModelIndexList current_selection;
  126.     QSignalMapper *ContextUpdateMapper;
  127.     /* Lookups */
  128.     PLItem *FindById( PLItem *, int );
  129.     PLItem *FindByInput( PLItem *, int );
  130.     PLItem *FindInner( PLItem *, int , bool );
  131.     PLItem *p_cached_item;
  132.     PLItem *p_cached_item_bi;
  133.     int i_cached_id;
  134.     int i_cached_input_id;
  135. signals:
  136.     void shouldRemove( int );
  137.     void currentChanged( const QModelIndex& );
  138.     void columnsChanged( int );
  139. public slots:
  140.     void activateItem( const QModelIndex &index );
  141.     void activateItem( playlist_item_t *p_item );
  142.     void setRandom( bool );
  143.     void setLoop( bool );
  144.     void setRepeat( bool );
  145. private slots:
  146.     void popupPlay();
  147.     void popupDel();
  148.     void popupInfo();
  149.     void popupStream();
  150.     void popupSave();
  151.     void popupExplore();
  152.     void viewchanged( int );
  153.     void ProcessInputItemUpdate( int i_input_id );
  154.     void ProcessInputItemUpdate( input_thread_t* p_input );
  155. };
  156. #endif