playlist.h

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C头文件 代码 · 共 550 行 · 第 1/2 页

H
550
字号
/***************************************************************************                        Playlist.h  -  description                            -------------------    begin                : Don Dez 5 2002    copyright            : (C) 2002 by Mark Kretschmann                           (C) 2005 Ian Monroe                           (C) 2005 by Gábor Lehel***************************************************************************//****************************************************************************                                                                         **   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.                                   **                                                                         ****************************************************************************/#ifndef AMAROK_PLAYLIST_H#define AMAROK_PLAYLIST_H#include <config.h>#include "amarok_export.h"#include "amarokconfig.h"#include "amarokdcophandler.h"#include "engineobserver.h"  //baseclass#include "dynamicmode.h"#include "playlistwindow.h"  //friend#include "playlistitem.h"#include "metabundle.h"#include "tooltip.h"         //baseclass#include "tracktooltip.h"#include <klistview.h>       //baseclass#include <kurl.h>            //KURL::List#include <qdir.h>            //stack allocated#include <qpoint.h>          //stack allocated#include <qptrlist.h>        //stack allocated#include <qstringlist.h>     //stack allocated#include <vector>            //stack allocatedclass KAction;class KActionCollection;class PlaylistItem;class PlaylistEntry;class PlaylistLoader;class PlaylistAlbum;class TagWriter;class QBoxLayout;class QLabel;class QTimer;class Medium;/** * @authors Mark Kretschmann && Max Howell * * Playlist inherits KListView privately and thus is no longer a ListView * Instead it is a part of PlaylistWindow and they interact in harmony. The change * was necessary as it is too dangerous to allow public access to PlaylistItems * due to the multi-threading environment. * * Unfortunately, since QObject is now inaccessible you have to connect slots * via one of PlaylistWindow's friend members or in Playlist * * If you want to add new playlist type functionality you should implement it * inside this class or inside PlaylistWindow. * */// template <class FieldType>// AtomicString Index<FieldType>::fieldString(const FieldType &field) { return AtomicString(field); }// template<>// AtomicString Index<KURL>::fieldString(const KURL &field);class Playlist : private KListView, public EngineObserver, public Amarok::ToolTipClient{        Q_OBJECT    public:        ~Playlist();        LIBAMAROK_EXPORT static Playlist *instance() { return s_instance; }        static QString defaultPlaylistPath();        static const int NO_SORT = 200;        static const int Append     = 1;     /// inserts media after the last item in the playlist        static const int Queue      = 2;     /// inserts media after the currentTrack        static const int Clear      = 4;     /// clears the playlist first        static const int Replace    = Clear;        static const int DirectPlay = 8;     /// start playback of the first item in the list        static const int Unique     = 16;    /// don't insert anything already in the playlist        static const int StartPlay  = 32;    /// start playback of the first item in the list if nothing else playing        static const int Colorize   = 64;    /// colorize newly added items        static const int DefaultOptions = Append | Unique | StartPlay;        // it's really just the *ListView parts we want to hide...        QScrollView *qscrollview() const        {            return reinterpret_cast<QScrollView*>( const_cast<Playlist*>( this ) );        }        /** Add media to the playlist         *  @param options you can OR these together, see the enum         *  @param sql     Sql program to execute */        LIBAMAROK_EXPORT void insertMedia( const KURL::List &, int options = Append );        void insertMediaSql( const QString& sql, int options = Append );        // Dynamic mode functions        void addDynamicModeTracks( uint songCount );        void adjustDynamicUpcoming( bool saveUndo = false );        void adjustDynamicPrevious( uint songCount, bool saveUndo = false );        void advanceDynamicTrack();        void setDynamicHistory( bool enable = true );        void burnPlaylist      ( int projectType = -1 );        void burnSelectedTracks( int projectType = -1 );        int  currentTrackIndex( bool onlyCountVisible = true );        bool isEmpty()       const  { return childCount() == 0; }        LIBAMAROK_EXPORT bool isTrackBefore() const;        LIBAMAROK_EXPORT bool isTrackAfter()  const;        void restoreSession();          // called during initialisation        void setPlaylistName( const QString &name, bool proposeOverwriting = false ) { m_playlistName = name; m_proposeOverwriting = proposeOverwriting; }        void proposePlaylistName( const QString &name, bool proposeOverwriting = false ) { if( isEmpty() || m_playlistName==i18n("Untitled") ) m_playlistName = name; m_proposeOverwriting = proposeOverwriting; }        const QString &playlistName() const { return m_playlistName; }        bool proposeOverwriteOnSave() const { return m_proposeOverwriting; }        bool saveM3U( const QString&, bool relative = AmarokConfig::relativePlaylist() ) const;        void saveXML( const QString& );        int  totalTrackCount() const;        BundleList nextTracks() const;        uint repeatAlbumTrackCount() const;    //returns number of tracks from same album        //as current track that are in playlist (may require Play Albums in Order on).        //If the information is not available, returns 0.        //const so you don't change it behind Playlist's back, use modifyDynamicMode() for that        const DynamicMode *dynamicMode() const;        //modify the returned DynamicMode, then finishedModifying() it when done        DynamicMode *modifyDynamicMode();        //call this every time you modifyDynamicMode(), otherwise you'll get memory leaks and/or crashes        void finishedModifying( DynamicMode *mode );        int  stopAfterMode();        void addCustomMenuItem ( const QString &submenu, const QString &itemTitle );        void customMenuClicked ( int id );        bool removeCustomMenuItem( const QString &submenu, const QString &itemTitle );        void setFont( const QFont &f ) { KListView::setFont( f ); } //made public for convenience        void unsetFont()               { KListView::unsetFont(); }        PlaylistItem *firstChild() const { return static_cast<PlaylistItem*>( KListView::firstChild() ); }        PlaylistItem *lastItem()   const { return static_cast<PlaylistItem*>( KListView::lastItem() ); }        PlaylistItem *currentItem() const { return static_cast<PlaylistItem*>( KListView::currentItem() ); }        int  numVisibleColumns() const;        QValueList<int> visibleColumns() const;        MetaBundle::ColumnMask getVisibleColumnMask() const;        int  mapToLogicalColumn( int physical ) const; // Converts physical PlaylistItem column position to logical        QString columnText( int c ) const { return KListView::columnText( c ); };        void setColumns( QValueList<int> order, QValueList<int> visible );        /** Call this to prevent items being removed from the playlist, it is mostly for internal use only         *  Don't forget to unlock() !! */        void lock();        void unlock();        //reimplemented to save columns by name instead of index, to be more resilient to reorderings and such        void saveLayout(KConfig *config, const QString &group) const;        void restoreLayout(KConfig *config, const QString &group);        //AFT-related functions        bool checkFileStatus( PlaylistItem * item );        void addToUniqueMap( const QString uniqueid, PlaylistItem* item );        void removeFromUniqueMap( const QString uniqueid, PlaylistItem* item );        enum RequestType { Prev = -1, Current = 0, Next = 1 };        enum StopAfterMode { DoNotStop, StopAfterCurrent, StopAfterQueue, StopAfterOther };        class QDragObject *dragObject();        friend class PlaylistItem;        friend class UrlLoader;        friend class QueueManager;        friend class QueueLabel;        friend class PlaylistWindow;        friend class ColumnList;        friend void Amarok::DcopPlaylistHandler::removeCurrentTrack(); //calls removeItem() and currentTrack()        friend void Amarok::DcopPlaylistHandler::removeByIndex( int ); //calls removeItem()        friend class TagWriter; //calls removeItem()        friend void PlaylistWindow::init(); //setting up connections etc.        friend TrackToolTip::TrackToolTip();        friend bool PlaylistWindow::eventFilter( QObject*, QEvent* ); //for convenience we handle some playlist events here    public:        QPair<QString, QRect> toolTipText( QWidget*, const QPoint &pos ) const;    signals:        void aboutToClear();        void itemCountChanged( int newCount, int newLength, int visCount, int visLength, int selCount, int selLength );        void queueChanged( const PLItemList &queued, const PLItemList &dequeued );        void columnsChanged();        void dynamicModeChanged( const DynamicMode *newMode );    public slots:        void activateByIndex(int);        void addCustomColumn();        void appendMedia( const KURL &url );        void appendMedia( const QString &path );        void clear();        void copyToClipboard( const QListViewItem* = 0 ) const;        void deleteSelectedFiles();        void ensureItemCentered( QListViewItem* item );        void playCurrentTrack();        void playNextTrack( const bool forceNext = true );        void playPrevTrack();        void queueSelected();        void setSelectedRatings( int rating );        void redo();        void removeDuplicates();        void removeSelectedItems();        void setDynamicMode( DynamicMode *mode );        void loadDynamicMode( DynamicMode *mode ); //saveUndoState() + setDynamicMode()        void disableDynamicMode();        void editActiveDynamicMode();        void rebuildDynamicModeCache();        void repopulate();        void safeClear();        void scoreChanged( const QString &path, float score );        void ratingChanged( const QString &path, int rating );        void fileMoved( const QString &srcPath, const QString &dstPath );        void selectAll() { QListView::selectAll( true ); }        void setFilter( const QString &filter );        void setFilterSlot( const QString &filter );                       //uses a delay where applicable        void setStopAfterCurrent( bool on );        void setStopAfterItem( PlaylistItem *item );        void toggleStopAfterCurrentItem();        void toggleStopAfterCurrentTrack();        void setStopAfterMode( int mode );        void showCurrentTrack() { ensureItemCentered( m_currentTrack ); }        void showQueueManager();        void changeFromQueueManager(QPtrList<PlaylistItem> list);        void shuffle();        void undo();        void updateMetaData( const MetaBundle& );        void adjustColumn( int n );        void updateEntriesUrl( const QString &oldUrl, const QString &newUrl, const QString &uniqueid );        void updateEntriesUniqueId( const QString &url, const QString &oldid, const QString &newid );        void updateEntriesStatusDeleted( const QString &absPath, const QString &uniqueid );        void updateEntriesStatusAdded( const QString &absPath, const QString &uniqueid );        void updateEntriesStatusAdded( const QMap<QString,QString> &map );    protected:        virtual void fontChange( const QFont &old );    protected slots:        void contentsMouseMoveEvent( QMouseEvent *e = 0 );        void leaveEvent( QEvent *e );        void contentsMousePressEvent( QMouseEvent *e );        void contentsWheelEvent( QWheelEvent *e );    private slots:        void mediumChange( int );        void slotCountChanged();        void activate( QListViewItem* );        void columnOrderChanged();        void columnResizeEvent( int, int, int );        void doubleClicked( QListViewItem* );        void generateInfo(); //generates info for Random Albums        /* the only difference multi makes is whether it emits queueChanged(). (if multi, then no)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?