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 + -
显示快捷键?