mediumpluginmanager.cpp

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 524 行 · 第 1/2 页

CPP
524
字号
//// C++ Implementation: mediumpluginmanager//// Description:////// Authors: Jeff Mitchell <kde-dev@emailgoeshere.com>, (C) 2005, 2006//          Martin Aumueller <aumuell@reserv.at>, (C) 2006//// Copyright: See COPYING file that comes with this distribution////#include "amarok.h"#include "debug.h"#include "deviceconfiguredialog.h"#include "mediadevicemanager.h"#include "devicemanager.h"#include "hintlineedit.h"#include "mediabrowser.h"#include "medium.h"#include "mediumpluginmanager.h"#include "plugin/pluginconfig.h"#include "pluginmanager.h"#include "statusbar.h"#include <qgroupbox.h>#include <qlabel.h>#include <qlayout.h>#include <qsignalmapper.h>#include <qtooltip.h>#include <qvbox.h>#include <kapplication.h>#include <kactivelabel.h>#include <kcombobox.h>#include <kconfig.h>#include <kiconloader.h>#include <klineedit.h>#include <klocale.h>#include <kpushbutton.h>using Amarok::escapeHTML;using Amarok::escapeHTMLAttr;typedef QMap<QString, Medium*> MediumMap;MediumPluginManagerDialog::MediumPluginManagerDialog()        : KDialogBase( Amarok::mainWindow(), "mediumpluginmanagerdialog", false, QString::null, Ok|Cancel, Ok ){    kapp->setTopWidget( this );    setCaption( kapp->makeStdCaption( i18n( "Manage Devices and Plugins" ) ) );    QVBox* vbox = makeVBoxMainWidget();    vbox->setSpacing( KDialog::spacingHint() );    vbox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );    m_location = new QGroupBox( 1, Qt::Vertical, i18n( "Devices" ), vbox );    m_location->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );    m_devicesBox = new QVBox( m_location );    m_devicesBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );    m_manager = new MediumPluginManager( m_devicesBox );    QHBox *hbox = new QHBox( vbox );    KPushButton *detectDevices = new KPushButton( i18n( "Autodetect Devices" ), hbox);    detectDevices->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );    connect( detectDevices, SIGNAL( clicked() ), m_manager, SLOT( redetectDevices() ) );    KPushButton *addButton = new KPushButton( i18n( "Add Device..." ), hbox );    addButton->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );    connect( addButton, SIGNAL( clicked() ), m_manager, SLOT( newDevice() ) );}MediumPluginManagerDialog::~MediumPluginManagerDialog(){    delete m_manager;}voidMediumPluginManagerDialog::slotOk(){    m_manager->finished();    KDialogBase::slotOk();}MediumPluginManager::MediumPluginManager( QWidget *widget, const bool nographics ): m_widget( widget ){    detectDevices( false, nographics );    connect( this, SIGNAL( selectedPlugin( const Medium*, const QString ) ), MediaBrowser::instance(), SLOT( pluginSelected( const Medium*, const QString ) ) );}MediumPluginManager::~MediumPluginManager(){}boolMediumPluginManager::hasChanged(){    bool temp = m_hasChanged;    m_hasChanged = false;    return temp;}voidMediumPluginManager::slotChanged()//slot{    m_hasChanged = true;    emit changed();}boolMediumPluginManager::detectDevices( const bool redetect, const bool nographics ){    bool foundNew = false;    KConfig *config = Amarok::config( "MediaBrowser" );    if( redetect )        DeviceManager::instance()->reconcileMediumMap();    MediumMap mmap = MediaDeviceManager::instance()->getMediumMap();    for( MediumMap::Iterator it = mmap.begin(); it != mmap.end(); it++ )    {        if( !config->readEntry( (*it)->id() ).isEmpty() &&                config->readEntry( (*it)->id() ) == "deleted" && !redetect)        {            debug() << "skipping: deleted" << endl;            continue;        }        bool skipflag = false;        for( DeviceList::Iterator dit = m_deviceList.begin();                dit != m_deviceList.end();                dit++ )        {            if( (*it)->id() == (*dit)->medium()->id() )            {                skipflag = true;                debug() << "skipping: already listed" << endl;            }        }        if( m_deletedMap.contains( (*it)->id() ) && !(*it)->isAutodetected() )        {            skipflag = true;            debug() << "skipping: deleted & not autodetect" << endl;        }        if( skipflag )            continue;        if( m_deletedMap.contains( (*it)->id() ) )            m_deletedMap.remove( (*it)->id() );        MediaDeviceConfig *dev = new MediaDeviceConfig( *it, this, nographics, m_widget );        m_deviceList.append( dev );        connect( dev, SIGNAL(deleteMedium(Medium *)), SLOT(deleteMedium(Medium *)) );        foundNew = true;    }    return foundNew;}voidMediumPluginManager::redetectDevices(){    if( !detectDevices( true ) )    {        Amarok::StatusBar::instance()->longMessageThreadSafe( i18n("No new media devices were found. If you feel this is an\n"                                                                   "error, ensure that the DBUS and HAL daemons are running\n"                                                                   "and KDE was built with support for them. You can test this\n"                                                                   "by running\n"                                                                   "     \"dcop kded mediamanager fullList\"\n"                                                                   "in a Konsole window.") );    }    else        slotChanged();}voidMediumPluginManager::deleteMedium( Medium *medium ){    for( DeviceList::Iterator it = m_deviceList.begin();            it != m_deviceList.end();            it++ )    {        if( (*it)->medium() == medium )        {            m_deletedMap[medium->id()] = medium;            m_deviceList.remove( *it );            break;        }    }    slotChanged();}voidMediumPluginManager::finished(){    for( DeviceList::Iterator it = m_deviceList.begin();            it != m_deviceList.end();            it++ )    {        if( (*it)->plugin() != (*it)->oldPlugin() )        {            (*it)->setOldPlugin( (*it)->plugin() );            emit selectedPlugin( (*it)->medium(), (*it)->plugin() );        }        (*it)->configButton()->setEnabled( (*it)->pluginCombo()->currentText() != i18n( "Do not handle" ) );    }    KConfig *config = Amarok::config( "MediaBrowser" );    for( DeletedMap::Iterator dit = m_deletedMap.begin();            dit != m_deletedMap.end();            ++dit )    {        if( dit.data()->isAutodetected() )            config->writeEntry( dit.data()->id(), "deleted" );        else            config->deleteEntry( dit.data()->id() );        MediaDeviceManager::instance()->removeManualDevice( dit.data() );    }    m_deletedMap.clear();}voidMediumPluginManager::newDevice(){    DEBUG_BLOCK    ManualDeviceAdder* mda = new ManualDeviceAdder( this );    if( mda->exec() == QDialog::Accepted && mda->successful() )    {        if( !Amarok::config( "MediaBrowser" )->readEntry( mda->getMedium()->id() ).isNull() )        {            //abort!  Can't have the same device defined twice...should never            //happen due to name checking earlier...right?            Amarok::StatusBar::instance()->longMessageThreadSafe( i18n("Sorry, you cannot define two devices\n"                                                                       "with the same name and mountpoint!") );        }        else        {            Medium *newdev = new Medium( mda->getMedium() );            Amarok::config( "MediaBrowser" )->writeEntry( newdev->id(), mda->getPlugin() );            MediaDeviceManager::instance()->addManualDevice( newdev );            detectDevices();        }    }    delete mda;    slotChanged();}/////////////////////////////////////////////////////////////////////ManualDeviceAdder::ManualDeviceAdder( MediumPluginManager* mpm ): KDialogBase( Amarok::mainWindow(), "manualdeviceadder", true, QString::null, Ok|Cancel, Ok ){    m_mpm = mpm;    m_successful = false;    m_newMed = 0;    kapp->setTopWidget( this );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?