📄 mediabrowser.cpp
字号:
if( ( it->isLeafItem() && (!(flags & OnlyPlayed) || it->played()>0) ) || it->type() == MediaItem::DIRECTORY ) list->append( it ); } } } return numFiles;}boolMediaView::acceptDrag( QDropEvent *e ) const{ if( e->source() == MediaBrowser::queue()->viewport() ) return false; QString data; QCString subtype; QTextDrag::decode( e, data, subtype ); return e->source() == viewport() || subtype == "amarok-sql" || KURLDrag::canDecode( e );}voidMediaView::contentsDropEvent( QDropEvent *e ){ cleanDropVisualizer(); cleanItemHighlighter(); if(e->source() == viewport()) { const QPoint p = contentsToViewport( e->pos() ); MediaItem *item = dynamic_cast<MediaItem *>(itemAt( p )); if( !item && MediaBrowser::instance()->currentDevice()->m_type != "generic-mediadevice" ) return; QPtrList<MediaItem> items; if( !item || item->type() == MediaItem::DIRECTORY || item->type() == MediaItem::TRACK ) { QPtrList<MediaItem> items; getSelectedLeaves( 0, &items ); m_device->addToDirectory( item, items ); } else if( item->type() == MediaItem::PLAYLIST ) { MediaItem *list = item; MediaItem *after = 0; for(MediaItem *it = dynamic_cast<MediaItem *>(item->firstChild()); it; it = dynamic_cast<MediaItem *>(it->nextSibling())) after = it; getSelectedLeaves( 0, &items ); m_device->addToPlaylist( list, after, items ); } else if( item->type() == MediaItem::PLAYLISTITEM ) { MediaItem *list = dynamic_cast<MediaItem *>(item->parent()); MediaItem *after = 0; for(MediaItem *it = dynamic_cast<MediaItem*>(item->parent()->firstChild()); it; it = dynamic_cast<MediaItem *>(it->nextSibling())) { if(it == item) break; after = it; } getSelectedLeaves( 0, &items ); m_device->addToPlaylist( list, after, items ); } else if( item->type() == MediaItem::PLAYLISTSROOT ) { QPtrList<MediaItem> items; getSelectedLeaves( 0, &items ); QString base( i18n("New Playlist") ); QString name = base; int i=1; while( item->findItem(name) ) { QString num; num.setNum(i); name = base + ' ' + num; i++; } MediaItem *pl = m_device->newPlaylist(name, item, items); ensureItemVisible(pl); rename(pl, 0); } } else { QString data; QCString subtype; QTextDrag::decode( e, data, subtype ); KURL::List list; if( subtype == "amarok-sql" ) { QString playlist = data.section( "\n", 0, 0 ); QString query = data.section( "\n", 1 ); QStringList values = CollectionDB::instance()->query( query ); list = CollectionDB::instance()->URLsFromSqlDrag( values ); MediaBrowser::queue()->addURLs( list, playlist ); } else if ( KURLDrag::decode( e, list ) ) { MediaBrowser::queue()->addURLs( list ); } }}voidMediaView::viewportPaintEvent( QPaintEvent *e ){ KListView::viewportPaintEvent( e ); // Superimpose bubble help: if ( !MediaBrowser::instance()->currentDevice() || !MediaBrowser::instance()->currentDevice()->isConnected() ) { QPainter p( viewport() ); QSimpleRichText t( i18n( "<div align=center>" "<h3>Media Device Browser</h3>" "Configure your media device and then " "click the Connect button to access your media device. " "Drag and drop files to enqueue them for transfer." "</div>" ), QApplication::font() ); t.setWidth( width() - 50 ); const uint w = t.width() + 20; const uint h = t.height() + 20; p.setBrush( colorGroup().background() ); p.drawRoundRect( 15, 15, w, h, (8*200)/w, (8*200)/h ); t.draw( &p, 20, 20, QRect(), colorGroup() ); } MediaBrowser::instance()->updateButtons();}voidMediaView::rmbPressed( QListViewItem *item, const QPoint &p, int i ){ if( m_device->isConnected() ) m_device->rmbPressed( item, p, i );}MediaItem *MediaView::newDirectory( MediaItem *parent ){ bool ok; const QString name = KInputDialog::getText(i18n("Add Directory"), i18n("Directory Name:"), QString::null, &ok, this); if( ok && !name.isEmpty() ) { m_device->newDirectory( name, parent ); } return 0;}voidMediaBrowser::mediumAdded( const Medium *medium, QString /*name*/, bool /*constructing*/ ){ debug() << "mediumAdded: " << (medium? medium->properties():"null") << endl; if( medium ) { QString handler = Amarok::config( "MediaBrowser" )->readEntry( medium->id() ); if( handler.isEmpty() ) { //Some people complained about the dialog, boohoo //Just disable it for now I guess /*if( !constructing && medium->isAutodetected() ) { MediumPluginManagerDialog *mpm = new MediumPluginManagerDialog(); mpm->exec(); }*/ } //debug() << "id=" << medium->id() << ", handler=" << handler << endl; MediaDevice *device = loadDevicePlugin( handler ); if( device ) { device->m_medium = *medium; addDevice( device ); if( m_currentDevice == m_devices.begin() || m_currentDevice == m_devices.end() ) activateDevice( m_devices.count()-1, false ); } }}voidMediaBrowser::pluginSelected( const Medium *medium, const QString plugin ){ DEBUG_BLOCK if( !plugin.isEmpty() ) { debug() << "Medium id is " << medium->id() << " and plugin selected is: " << plugin << endl; Amarok::config( "MediaBrowser" )->writeEntry( medium->id(), plugin ); bool success = true; for( QValueList<MediaDevice *>::iterator it = m_devices.begin(); it != m_devices.end(); it++ ) { if( (*it)->uniqueId() == medium->id() ) { debug() << "removing " << medium->deviceNode() << endl; if( (*it)->isConnected() ) { if( (*it)->disconnectDevice( false ) ) removeDevice( *it ); else success = false; } else removeDevice( *it ); break; } } if( success ) { mediumAdded( medium, "doesntmatter", false ); } else { debug() << "Cannot change plugin while operation is in progress" << endl; Amarok::StatusBar::instance()->longMessage( i18n( "Cannot change plugin while operation is in progress" ), KDE::StatusBar::Warning ); } } else debug() << "Medium id is " << medium->id() << " and you opted not to use a plugin" << endl;}voidMediaBrowser::showPluginManager(){ MediumPluginManagerDialog* mpm = new MediumPluginManagerDialog(); mpm->exec(); delete mpm;}voidMediaBrowser::mediumChanged( const Medium *medium, QString /*name*/ ){ if( medium ) { for( QValueList<MediaDevice *>::iterator it = m_devices.begin(); it != m_devices.end(); it++ ) { if( (*it)->uniqueId() == medium->id() ) { (*it)->m_medium = const_cast<Medium *>(medium); if( !(*it)->isConnected() && medium->isMounted() ) (*it)->connectDevice();#if 0 else if( (*it)->isConnected() && !medium->isMounted() ) { Amarok::StatusBar::instance()->longMessage( i18n( "The device %1 was unmounted before it was synchronized. " "In order to avoid data loss, press the \"Disconnect\" button " "before unmounting the device." ).arg( name ), KDE::StatusBar::Warning ); //(*it)->disconnectDevice(); }#endif break; } } }}voidMediaBrowser::mediumRemoved( const Medium *medium, QString name ){ if( medium ) { for( QValueList<MediaDevice *>::iterator it = m_devices.begin(); it != m_devices.end(); it++ ) { if( (*it)->uniqueId() == medium->id() ) { if( (*it)->isConnected() ) { if( (*it)->disconnectDevice() ) removeDevice( *it ); Amarok::StatusBar::instance()->longMessage( i18n( "The device %1 was removed before it was disconnected. " "In order to avoid possible data loss, press the \"Disconnect\" " "button before disconnecting the device." ).arg( name ), KDE::StatusBar::Warning ); } else removeDevice( *it ); break; } } }}MediaDevice *MediaBrowser::loadDevicePlugin( const QString &deviceType ){ DEBUG_BLOCK if( deviceType == "ignore" ) return 0; QString query = "[X-KDE-Amarok-plugintype] == 'mediadevice' and [X-KDE-Amarok-name] == '%1'"; Amarok::Plugin *plugin = PluginManager::createFromQuery( query.arg( deviceType ) ); if( plugin ) { debug() << "Returning plugin!" << endl; MediaDevice *device = static_cast<MediaDevice *>( plugin ); device->init( this ); device->m_type = deviceType; return device; } debug() << "no plugin for " << deviceType << endl; return 0;}voidMediaBrowser::unloadDevicePlugin( MediaDevice *device ){ DEBUG_BLOCK if( !device ) return; disconnect( device ); // disconnect all signals if( dynamic_cast<DummyMediaDevice *>(device) ) { delete device; } else { PluginManager::unload( device ); }}boolMediaBrowser::config(){ if( m_deviceCombo->currentText() == "No Device Selected" ) { showPluginManager(); return true; } DeviceConfigureDialog* dcd = new DeviceConfigureDialog( currentDevice()->m_medium ); dcd->exec(); bool successful = dcd->successful(); delete dcd; return successful;}voidMediaBrowser::configSelectPlugin( int index ){ Q_UNUSED( index ); if( m_currentDevice == m_devices.begin() ) { AmarokConfig::setDeviceType( m_pluginName[m_configPluginCombo->currentText()] ); } else if( currentDevice() ) { KConfig *config = Amarok::config( "MediaBrowser" ); config->writeEntry( currentDevice()->uniqueId(), m_pluginName[m_configPluginCombo->currentText()] ); } if( !currentDevice() ) activateDevice( 0, false ); if( !currentDevice() ) return; if( m_pluginName[m_configPluginCombo->currentText()] != currentDevice()->deviceType() ) { MediaDevice *dev = currentDevice(); dev->removeConfigElements( m_configBox ); if( dev->isConnected() ) { dev->disconnectDevice( false ); } unloadDevicePlugin( dev ); *m_currentDevice = loadDevicePlugin( AmarokConfig::deviceType() ); if( !*m_currentDevice ) { *m_currentDevice = new DummyMediaDevice(); if( AmarokConfig::deviceType() != "dummy-mediadevice" ) { QString msg = i18n( "The requested media device could not be loaded" ); Amarok::StatusBar::instance()->shortMessage( msg ); } } dev = currentDevice(); dev->init( this ); dev->loadConfig(); m_configBox->hide(); dev->addConfigElements( m_configBox ); m_configBox->show(); dev->view()->show(); if( dev->autoConnect() ) { dev->connectDevice( true ); updateButtons(); } updateDevices(); }}voidMediaBrowser::updateButtons(){ if( !m_toolbar->getButton(CONNECT) || !m_toolbar->getButton(DISCONNECT) || !m_toolbar->getButton(TRANSFER) ) //TODO add CUSTOM return; if( currentDevice() ) { if( currentDevice()->m_transfer ) m_toolbar->showItem( TRANSFER ); else m_toolbar->hideItem( TRANSFER ); if( currentDevice()->m_customButton ) m_toolbar->showItem( CUSTOM ); else m_toolbar->hideItem( CUSTOM ); if( currentDevice()->m_configure )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -