📄 mediabrowser.h
字号:
// (c) 2004 Christian Muehlhaeuser <chris@chris.de>// (c) 2005 Martin Aumueller <aumuell@reserv.at>// (c) 2005 Seb Ruiz <me@sebruiz.net>// (c) 2006 T.R.Shashwath <trshash84@gmail.com>// See COPYING file for licensing information#ifndef AMAROK_MEDIABROWSER_H#define AMAROK_MEDIABROWSER_H#include "amarok.h"#include "amarok_export.h"#include "browserToolBar.h"#include "medium.h"#include "multitabbar.h" //baseclass#include "plugin/plugin.h" //baseclass#include "pluginmanager.h"#include <qmutex.h>#include <qvbox.h> //baseclass#include <qdatetime.h>#include <klistview.h> //baseclass#include <kurl.h> //stack allocated#include <kio/global.h> //filesize_t#include "scrobbler.h" //SubmitItem#include "metabundle.h"class MediaBrowser;class MediaDevice;class MediaItemTip;class MediaView;class SpaceLabel;class TransferDialog;class KAction;class KComboBox;class KDialogBase;class KProgress;class KPushButton;class KShellProcess;class QDragObject;class QLabel;class QPalette;class LIBAMAROK_EXPORT MediaItem : public KListViewItem{ public: MediaItem( QListView* parent ); MediaItem( QListViewItem* parent ); MediaItem( QListView* parent, QListViewItem* after ); MediaItem( QListViewItem* parent, QListViewItem* after ); void init(); virtual ~MediaItem(); MediaItem *lastChild() const; virtual KURL url() const; const MetaBundle *bundle() const; void setBundle( MetaBundle *bundle ); enum Type { UNKNOWN, ARTIST, ALBUM, TRACK, PODCASTSROOT, PODCASTCHANNEL, PODCASTITEM, PLAYLISTSROOT, PLAYLIST, PLAYLISTITEM, INVISIBLEROOT, INVISIBLE, STALEROOT, STALE, ORPHANEDROOT, ORPHANED, DIRECTORY }; enum Flags { Failed=1, BeginTransfer=2, StopTransfer=4, Transferring=8, SmartPlaylist=16 }; void setType( Type type ); void setFailed( bool failed=true ); Type type() const { return m_type; } MediaItem *findItem(const QString &key, const MediaItem *after=0) const; const QString &data() const { return m_data; } void setData( const QString &data ) { m_data = data; } virtual bool isLeafItem() const; // A leaf node of the tree virtual bool isFileBacked() const; // Should the file be deleted of the device when removed virtual QDateTime playTime() const { return QDateTime(); } virtual int played() const { return 0; } virtual int recentlyPlayed() const { return 0; } // no of times played on device since last sync virtual void setPlayCount( int ) {} virtual int rating() const { return 0; } // rating on device, normalized to 100 virtual void setRating( int /*rating*/ ) {} virtual bool ratingChanged() const { return false; } virtual void setLastPlayed( uint ) {} virtual void syncStatsFromPath( const QString &path ); virtual long size() const; virtual MediaDevice *device() const { return m_device; } virtual bool listened() const { return m_listened; } virtual void setListened( bool listened=true ) { m_listened = listened; } int compare( QListViewItem *i, int col, bool ascending ) const; int flags() const { return m_flags; } void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align ); //attributes: int m_order; Type m_type; QString m_playlistName; QString m_data; MediaDevice *m_device; int m_flags; bool m_listened; static QPixmap *s_pixUnknown; static QPixmap *s_pixRootItem; static QPixmap *s_pixFile; static QPixmap *s_pixArtist; static QPixmap *s_pixAlbum; static QPixmap *s_pixPlaylist; static QPixmap *s_pixPodcast; static QPixmap *s_pixTrack; static QPixmap *s_pixInvisible; static QPixmap *s_pixStale; static QPixmap *s_pixOrphaned; static QPixmap *s_pixDirectory; static QPixmap *s_pixTransferFailed; static QPixmap *s_pixTransferBegin; static QPixmap *s_pixTransferEnd; private: mutable MetaBundle *m_bundle;};class MediaQueue : public KListView, public DropProxyTarget{ Q_OBJECT public: MediaQueue(MediaBrowser *parent); MediaItem *findPath( QString path ); KIO::filesize_t totalSize() const; // total size of items to transfer in KB void computeSize() const; // compute total size of items to transfer in KB void addItemToSize( const MediaItem *item ) const; void subtractItemFromSize( const MediaItem *item, bool unconditonally=false ) const; void removeSelected(); void clearItems(); void load( const QString &path ); void save( const QString &path ); void syncPlaylist( const QString &playlistName, const QString &sql, bool loading=false ); void syncPlaylist( const QString &playlistName, const KURL &url, bool loading=false ); void addURL( const KURL& url, MetaBundle *bundle=NULL, const QString &playlistName=QString::null ); void addURL( const KURL& url, MediaItem *item ); void addURLs( const KURL::List urls, const QString &playlistName=QString::null ); void URLsAdded(); // call after finishing adding single urls void dropProxyEvent( QDropEvent *e ); // Reimplemented from KListView bool acceptDrag( QDropEvent *e ) const; QDragObject *dragObject(); public slots: void itemCountChanged(); private slots: void selectAll() {QListView::selectAll(true); } void slotShowContextMenu( QListViewItem* item, const QPoint& point, int ); void slotDropped (QDropEvent* e, QListViewItem* parent, QListViewItem* after); private: void keyPressEvent( QKeyEvent *e ); MediaBrowser *m_parent; mutable KIO::filesize_t m_totalSize;};class MediaBrowser : public QVBox{ Q_OBJECT friend class DeviceConfigureDialog; friend class MediaDevice; friend class MediaView; friend class MediaQueue; friend class MediumPluginChooser; friend class MediaItem; public: enum { CONNECT, DISCONNECT, TRANSFER, CONFIGURE, CUSTOM }; static bool isAvailable(); LIBAMAROK_EXPORT static MediaBrowser *instance() { return s_instance; } LIBAMAROK_EXPORT static MediaQueue *queue() { return s_instance ? s_instance->m_queue : 0; } MediaBrowser( const char *name ); virtual ~MediaBrowser(); bool blockQuit() const; MediaDevice *currentDevice() const; MediaDevice *deviceFromId( const QString &id ) const; QStringList deviceNames() const; bool deviceSwitch( const QString &name ); QString getInternalPluginName ( const QString string ) { return m_pluginName[string]; } QString getDisplayPluginName ( const QString string ) { return m_pluginAmarokName[string]; } const KTrader::OfferList &getPlugins() { return m_plugins; } void transcodingFinished( const QString &src, const QString &dst ); bool isTranscoding() const { return m_waitForTranscode; } void updateStats(); void updateButtons(); void updateDevices(); // return bundle for url if it is known to MediaBrowser bool getBundle( const KURL &url, MetaBundle *bundle ) const; bool isQuitting() const { return m_quitting; } KURL getProxyUrl( const KURL& daapUrl ) const; KToolBar* getToolBar() const { return m_toolbar; } signals: void availabilityChanged( bool isAvailable ); protected slots: void transferClicked(); private slots: void slotSetFilterTimeout(); void slotSetFilter(); void slotSetFilter( const QString &filter ); void slotEditFilter(); void mediumAdded( const Medium *, QString , bool constructing = false); void mediumChanged( const Medium *, QString ); void mediumRemoved( const Medium *, QString ); void activateDevice( const MediaDevice *device ); void activateDevice( int index, bool skipDummy = true ); void pluginSelected( const Medium *, const QString ); void showPluginManager(); void cancelClicked(); void connectClicked(); void disconnectClicked(); void customClicked(); void configSelectPlugin( int index ); bool config(); // false if canceled by user KURL transcode( const KURL &src, const QString &filetype ); void tagsChanged( const MetaBundle &bundle ); void prepareToQuit(); private: MediaDevice *loadDevicePlugin( const QString &deviceName ); void unloadDevicePlugin( MediaDevice *device ); KLineEdit* m_searchEdit; QTimer *m_timer; LIBAMAROK_EXPORT static MediaBrowser *s_instance; QValueList<MediaDevice *> m_devices; QValueList<MediaDevice *>::iterator m_currentDevice; QMap<QString, QString> m_pluginName; QMap<QString, QString> m_pluginAmarokName; void addDevice( MediaDevice *device ); void removeDevice( MediaDevice *device ); MediaQueue* m_queue; bool m_waitForTranscode; KURL m_transcodedUrl; QString m_transcodeSrc; SpaceLabel* m_stats; QHBox* m_progressBox; KProgress* m_progress; QVBox* m_views; KPushButton* m_cancelButton; //KPushButton* m_playlistButton; QVBox* m_configBox; KComboBox* m_configPluginCombo; KComboBox* m_deviceCombo; Browser::ToolBar*m_toolbar; typedef QMap<QString, MediaItem*> ItemMap; mutable QMutex m_itemMapMutex; ItemMap m_itemMap; KTrader::OfferList m_plugins; bool m_haveDevices; bool m_quitting;};class MediaView : public KListView{ Q_OBJECT friend class MediaBrowser; friend class MediaDevice; public: enum Flags { None = 0, OnlySelected = 1, OnlyPlayed = 2 }; MediaView( QWidget *parent, MediaDevice *device ); virtual ~MediaView(); LIBAMAROK_EXPORT KURL::List nodeBuildDragList( MediaItem* item, int flags=OnlySelected ); int getSelectedLeaves(MediaItem *parent, QPtrList<MediaItem> *list, int flags=OnlySelected ); LIBAMAROK_EXPORT MediaItem *newDirectory( MediaItem* parent ); bool setFilter( const QString &filter, MediaItem *parent=NULL ); private slots: void rmbPressed( QListViewItem*, const QPoint&, int ); void renameItem( QListViewItem *item ); void slotExpand( QListViewItem* ); void selectAll() { QListView::selectAll(true); } void invokeItem( QListViewItem*, const QPoint &, int column ); void invokeItem( QListViewItem* ); private: void keyPressEvent( QKeyEvent *e ); // Reimplemented from KListView void contentsDropEvent( QDropEvent *e ); void viewportPaintEvent( QPaintEvent* ); bool acceptDrag( QDropEvent *e ) const; QDragObject *dragObject(); QWidget *m_parent; MediaDevice *m_device; MediaItemTip *m_toolTip;};/* at least the pure virtual functions have to be implemented by a media device, all items are stored in a hierarchy of MediaItems, when items are manipulated the MediaItems have to be updated accordingly */class LIBAMAROK_EXPORT MediaDevice : public QObject, public Amarok::Plugin{ Q_OBJECT friend class DeviceConfigureDialog; friend class TransferDialog; friend class MediaBrowser; friend class MediaView; friend class MediaQueue; public: enum Flags
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -