📄 mediabrowser.cpp
字号:
m_toolbar->showItem( CONFIGURE ); else m_toolbar->hideItem( CONFIGURE ); m_toolbar->getButton(CONNECT)->setEnabled( !currentDevice()->isConnected() ); m_toolbar->getButton(DISCONNECT)->setEnabled( currentDevice()->isConnected() ); m_toolbar->getButton(TRANSFER)->setEnabled( currentDevice()->isConnected() && m_queue->childCount() > 0 ); m_toolbar->getButton( CUSTOM )->setEnabled( true ); } else { m_toolbar->getButton( CONNECT )->setEnabled( false ); m_toolbar->getButton( DISCONNECT )->setEnabled( false ); m_toolbar->getButton( TRANSFER )->setEnabled( false ); m_toolbar->getButton( CUSTOM )->setEnabled( false ); }}voidMediaBrowser::updateStats(){ if( !m_stats ) return; KIO::filesize_t queued = m_queue->totalSize(); QString text = i18n( "1 track in queue", "%n tracks in queue", m_queue->childCount() ); if(m_queue->childCount() > 0) { text += i18n(" (%1)").arg( KIO::convertSize( queued ) ); } KIO::filesize_t total, avail; if( currentDevice() && currentDevice()->getCapacity(&total, &avail) ) { text += i18n( " - %1 of %2 available" ).arg( KIO::convertSize( avail ) ).arg( KIO::convertSize( total ) ); m_stats->m_used = total-avail; m_stats->m_total = total; m_stats->m_scheduled = queued; } else { m_stats->m_used = 0; m_stats->m_total = 0; m_stats->m_scheduled = queued; } m_stats->setText(text); QToolTip::add( m_stats, text );}boolMediaView::setFilter( const QString &filter, MediaItem *parent ){ bool advanced = ExpressionParser::isAdvancedExpression( filter ); QValueList<int> defaultColumns; defaultColumns << MetaBundle::Album; defaultColumns << MetaBundle::Title; defaultColumns << MetaBundle::Artist; bool root = false; MediaItem *it; if( !parent ) { root = true; it = dynamic_cast<MediaItem *>(firstChild()); } else { it = dynamic_cast<MediaItem *>(parent->firstChild()); } bool childrenVisible = false; for( ; it; it = dynamic_cast<MediaItem *>(it->nextSibling())) { bool visible = true; if(it->isLeafItem()) { if( advanced ) { ParsedExpression parsed = ExpressionParser::parse( filter ); visible = it->bundle() && it->bundle()->matchesParsedExpression( parsed, defaultColumns ); } else { visible = it->bundle() && it->bundle()->matchesSimpleExpression( filter, defaultColumns ); } } else { visible = setFilter(filter, it); if(it->type()==MediaItem::PLAYLISTSROOT || it->type()==MediaItem::PLAYLIST) { visible = true; } else if(it->type()==MediaItem::DIRECTORY) { bool match = true; QStringList list = QStringList::split( " ", filter ); for( QStringList::iterator i = list.begin(); i != list.end(); ++i ) { if( !(*it).text(0).contains( *i ) ) { match = false; break; } } if( match ) visible = true; } } if( filter.isEmpty() ) visible = true; it->setVisible( visible ); if(visible) childrenVisible = true; } if( root && m_device ) m_device->updateRootItems(); return childrenVisible;}MediaDevice::MediaDevice() : Amarok::Plugin() , m_hasMountPoint( true ) , m_autoDeletePodcasts( false ) , m_syncStats( false ) , m_transcode( false ) , m_transcodeAlways( false ) , m_transcodeRemove( false ) , sysProc ( 0 ) , m_parent( 0 ) , m_view( 0 ) , m_wait( false ) , m_requireMount( false ) , m_canceled( false ) , m_transferring( false ) , m_deleting( false ) , m_deferredDisconnect( false ) , m_scheduledDisconnect( false ) , m_transfer( true ) , m_configure( true ) , m_customButton( false ) , m_playlistItem( 0 ) , m_podcastItem( 0 ) , m_invisibleItem( 0 ) , m_staleItem( 0 ) , m_orphanedItem( 0 ){ sysProc = new KShellProcess(); Q_CHECK_PTR(sysProc);}void MediaDevice::init( MediaBrowser* parent ){ m_parent = parent; if( !m_view ) m_view = new MediaView( m_parent->m_views, this ); m_view->hide();}MediaDevice::~MediaDevice(){ delete m_view; delete sysProc;}boolMediaDevice::isSpecialItem( MediaItem *item ){ return (item == m_playlistItem) || (item == m_podcastItem) || (item == m_invisibleItem) || (item == m_staleItem) || (item == m_orphanedItem);}voidMediaDevice::loadConfig(){ m_transcode = configBool( "Transcode" ); m_transcodeAlways = configBool( "TranscodeAlways" ); m_transcodeRemove = configBool( "TranscodeRemove" ); m_preconnectcmd = configString( "PreConnectCommand" ); if( m_preconnectcmd.isEmpty() ) m_preconnectcmd = configString( "MountCommand" ); m_postdisconnectcmd = configString( "PostDisconnectCommand" ); if( m_postdisconnectcmd.isEmpty() ) m_postdisconnectcmd = configString( "UmountCommand" ); if( m_requireMount && m_postdisconnectcmd.isEmpty() ) m_postdisconnectcmd = "kdeeject -q %d";}QStringMediaDevice::configString( const QString &name, const QString &defValue ){ QString configName = "MediaDevice"; if( !uniqueId().isEmpty() ) configName += '_' + uniqueId(); KConfig *config = Amarok::config( configName ); return config->readEntry( name, defValue );}voidMediaDevice::setConfigString( const QString &name, const QString &value ){ QString configName = "MediaDevice"; if( !uniqueId().isEmpty() ) configName += '_' + uniqueId(); KConfig *config = Amarok::config( configName ); config->writeEntry( name, value );}boolMediaDevice::configBool( const QString &name, bool defValue ){ QString configName = "MediaDevice"; if( !uniqueId().isEmpty() ) configName += '_' + uniqueId(); KConfig *config = Amarok::config( configName ); return config->readBoolEntry( name, defValue );}voidMediaDevice::setConfigBool( const QString &name, bool value ){ QString configName = "MediaDevice"; if( !uniqueId().isEmpty() ) configName += '_' + uniqueId(); KConfig *config = Amarok::config( configName ); config->writeEntry( name, value );}MediaView *MediaDevice::view(){ return m_view;}voidMediaDevice::hideProgress(){ m_parent->m_progressBox->hide();}voidMediaDevice::updateRootItems(){ if(m_podcastItem) m_podcastItem->setVisible(m_podcastItem->childCount() > 0); if(m_invisibleItem) m_invisibleItem->setVisible(m_invisibleItem->childCount() > 0); if(m_staleItem) m_staleItem->setVisible(m_staleItem->childCount() > 0); if(m_orphanedItem) m_orphanedItem->setVisible(m_orphanedItem->childCount() > 0);}voidMediaQueue::syncPlaylist( const QString &name, const QString &query, bool loading ){ MediaItem* item = new MediaItem( this, lastItem() ); item->setType( MediaItem::PLAYLIST ); item->setExpandable( false ); item->setData( query ); item->m_playlistName = name; item->setText( 0, name ); item->m_flags |= MediaItem::SmartPlaylist; m_parent->m_progress->setTotalSteps( m_parent->m_progress->totalSteps() + 1 ); itemCountChanged(); if( !loading ) URLsAdded();}voidMediaQueue::syncPlaylist( const QString &name, const KURL &url, bool loading ){ MediaItem* item = new MediaItem( this, lastItem() ); item->setType( MediaItem::PLAYLIST ); item->setExpandable( false ); item->setData( url.url() ); item->m_playlistName = name; item->setText( 0, name ); m_parent->m_progress->setTotalSteps( m_parent->m_progress->totalSteps() + 1 ); itemCountChanged(); if( !loading ) URLsAdded();}BundleListMediaDevice::bundlesToSync( const QString &name, const KURL &url ){ BundleList bundles; if( !PlaylistFile::isPlaylistFile( url ) ) { Amarok::StatusBar::instance()->longMessage( i18n( "Not a playlist file: %1" ).arg( url.path() ), KDE::StatusBar::Sorry ); return bundles; } PlaylistFile playlist( url.path() ); if( playlist.isError() ) { Amarok::StatusBar::instance()->longMessage( i18n( "Failed to load playlist: %1" ).arg( url.path() ), KDE::StatusBar::Sorry ); return bundles; } for( BundleList::iterator it = playlist.bundles().begin(); it != playlist.bundles().end(); ++it ) { bundles += MetaBundle( (*it).url() ); } preparePlaylistForSync( name, bundles ); return bundles;}BundleListMediaDevice::bundlesToSync( const QString &name, const QString &query ){ const QStringList values = CollectionDB::instance()->query( query ); BundleList bundles; for( for_iterators( QStringList, values ); it != end; ++it ) bundles += CollectionDB::instance()->bundleFromQuery( &it ); preparePlaylistForSync( name, bundles ); return bundles;}voidMediaDevice::preparePlaylistForSync( const QString &name, const BundleList &bundles ){ if( ! m_playlistItem ) // might be syncing a new playlist from the playlist browser return; MediaItem *pl = m_playlistItem->findItem( name ); if( pl ) { MediaItem *next = 0; for( MediaItem *it = static_cast<MediaItem *>(pl->firstChild()); it; it = next ) { next = static_cast<MediaItem *>(it->nextSibling()); const MetaBundle *bundle = (*it).bundle(); if( !bundle ) continue; if( isOnOtherPlaylist( name, *bundle ) ) continue; if( isInBundleList( bundles, *bundle ) ) continue; deleteItemFromDevice( it ); } deleteItemFromDevice( pl, None ); } purgeEmptyItems();}boolMediaDevice::bundleMatch( const MetaBundle &b1, const MetaBundle &b2 ){ if( b1.track() != b2.track() ) return false; if( b1.title() != b2.title() ) return false; if( b1.album() != b2.album() ) return false; if( b1.artist() != b2.artist() ) return false;#if 0 if( b1.discNumber() != b2.discNumber() ) return false; if( b1.composer() != b2.composer() ) return false;#endif return true;}boolMediaDevice::isInBundleList( const BundleList &bundles, const MetaBundle &b ){ for( BundleList::const_iterator it = bundles.begin(); it != bundles.end(); ++it ) { if( bundleMatch( b, *it ) ) return true; } return false;}boolMediaDevice::isOnOtherPlaylist( const QString &playlistToAvoid, const MetaBundle &bundle ){ for( MediaItem *it = static_cast<MediaItem *>(m_playlistItem->firstChild()); it; it = static_cast<MediaItem *>(it->nextSibling()) ) { if( it->text( 0 ) == playlistToAvoid ) continue; if( isOnPlaylist( *it, bundle ) ) return true; } return false;}boolMediaDevice::isOnPlaylist( const MediaItem &playlist, const MetaBundle &bundle ){ for( MediaItem *it = static_cast<MediaItem *>(playlist.firstChild()); it; it = static_cast<MediaItem *>(it->nextSibling()) ) { const MetaBundle *b = (*it).bundle(); if( !b ) continue; if( bundleMatch( *b, bundle ) ) return true; } return false;}voidMediaQueue::addURL( const KURL& url2, MetaBundle *bundle, const QString &playlistName ){ KURL url = Amarok::mostLocalURL( url2 ); if( PlaylistFile::isPlaylistFile( url ) ) { QString name = url.path().section( "/", -1 ).section( ".", 0, -2 ).replace( "_", " " ); PlaylistFile playlist( url.path() ); if( playlist.isError() ) { Amarok::StatusBar::instance()->longMessage( i18n( "Failed to load playlist: %1" ).arg( url.path() ), KDE::StatusBar::Sorry ); return; } for( BundleList::iterator it = playlist.bundles().begin(); it != playlist.bundles().end(); ++it ) { add
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -