diff options
Diffstat (limited to 'libk3b/tools/k3bdevicecombobox.cpp')
-rw-r--r-- | libk3b/tools/k3bdevicecombobox.cpp | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/libk3b/tools/k3bdevicecombobox.cpp b/libk3b/tools/k3bdevicecombobox.cpp new file mode 100644 index 0000000..165b59d --- /dev/null +++ b/libk3b/tools/k3bdevicecombobox.cpp @@ -0,0 +1,174 @@ +/* + * + * $Id: k3bdevicecombobox.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg <[email protected]> + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + +#include "k3bdevicecombobox.h" +#include <k3bdevice.h> +#include <k3bdevicemanager.h> +#include <k3bcore.h> + +#include <klocale.h> + +#include <qmap.h> +#include <qptrvector.h> + + +class K3bDeviceComboBox::Private +{ +public: + QMap<QString, int> deviceIndexMap; + QPtrVector<K3bDevice::Device> devices; +}; + + +K3bDeviceComboBox::K3bDeviceComboBox( QWidget* parent, const char* name ) + : KComboBox( parent, name ) +{ + d = new Private(); + connect( this, SIGNAL(activated(int)), + this, SLOT(slotActivated(int)) ); + connect( k3bcore->deviceManager(), SIGNAL(changed(K3bDevice::DeviceManager*)), + this, SLOT(slotDeviceManagerChanged(K3bDevice::DeviceManager*)) ); +} + + +K3bDeviceComboBox::~K3bDeviceComboBox() +{ + delete d; +} + +K3bDevice::Device* K3bDeviceComboBox::selectedDevice() const +{ + if ( count() > 0 ) + return d->devices[currentItem()]; + else + return 0; +} + + +void K3bDeviceComboBox::addDevice( K3bDevice::Device* dev ) +{ + int devIndex = -2; + bool addDevice = false; + for( int i = 0; i < count(); ++i ) { + if( dev->vendor() == d->devices[i]->vendor() && + dev->description() == d->devices[i]->description() ) { + addDevice = true; + if( devIndex < -1 ) // when devIndex == -1 we already found two devices. + devIndex = i; + else + devIndex = -1; // when there are already two or more equal devices they have already been updated + } + } + + // update the existing device item + if( devIndex >= 0 ) { + changeItem( d->devices[devIndex]->vendor() + " " + + d->devices[devIndex]->description() + + " (" + d->devices[devIndex]->blockDeviceName() + ")", + devIndex ); + d->deviceIndexMap[d->devices[devIndex]->devicename()] = devIndex; + } + + // add the new device item + if( addDevice ) + insertItem( dev->vendor() + " " + dev->description() + " (" + dev->blockDeviceName() + ")" ); + else + insertItem( dev->vendor() + " " + dev->description() ); + + d->deviceIndexMap[dev->devicename()] = count()-1; + d->devices.resize( count() ); + d->devices.insert(count()-1, dev); +} + + +void K3bDeviceComboBox::removeDevice( K3bDevice::Device* dev ) +{ + if( dev ) { + if( d->deviceIndexMap.contains(dev->devicename()) ) { + // let's make it easy and recreate the whole list + K3bDevice::Device* selDev = selectedDevice(); + QPtrList<K3bDevice::Device> devices; + for( unsigned int i = 0; i < d->devices.size(); ++i ) + devices.append( d->devices[i] ); + + clear(); + + devices.removeRef( dev ); + + addDevices( devices ); + setSelectedDevice( selDev ); + } + } +} + + +void K3bDeviceComboBox::addDevices( const QPtrList<K3bDevice::Device>& list ) +{ + for( QPtrListIterator<K3bDevice::Device> it( list ); + it.current(); ++it ) + addDevice( it.current() ); +} + + +void K3bDeviceComboBox::refreshDevices( const QPtrList<K3bDevice::Device>& list ) +{ + K3bDevice::Device* selDev = selectedDevice(); + clear(); + if( !list.containsRef( selDev ) ) + selDev = 0; + addDevices( list ); + setSelectedDevice( selDev ); +} + + +void K3bDeviceComboBox::setSelectedDevice( K3bDevice::Device* dev ) +{ + if( dev ) { + if( d->deviceIndexMap.contains(dev->devicename()) ) { + setCurrentItem( d->deviceIndexMap[dev->devicename()] ); + emit selectionChanged( dev ); + } + } +} + + +void K3bDeviceComboBox::clear() +{ + d->deviceIndexMap.clear(); + d->devices.clear(); + KComboBox::clear(); +} + + +void K3bDeviceComboBox::slotActivated( int i ) +{ + emit selectionChanged( d->devices[i] ); +} + + +void K3bDeviceComboBox::slotDeviceManagerChanged( K3bDevice::DeviceManager* dm ) +{ + unsigned int i = 0; + while( i < d->devices.size() ) { + if( !dm->allDevices().containsRef( d->devices[i] ) ) { + removeDevice( d->devices[i] ); + i = 0; + } + else + ++i; + } +} + +#include "k3bdevicecombobox.moc" |