⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mediabrowser.cpp

📁 Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 经过两年开发后
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            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 + -