summaryrefslogtreecommitdiffstats
path: root/src/option/k3bdevicewidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/option/k3bdevicewidget.cpp')
-rw-r--r--src/option/k3bdevicewidget.cpp404
1 files changed, 404 insertions, 0 deletions
diff --git a/src/option/k3bdevicewidget.cpp b/src/option/k3bdevicewidget.cpp
new file mode 100644
index 0000000..d7d1e36
--- /dev/null
+++ b/src/option/k3bdevicewidget.cpp
@@ -0,0 +1,404 @@
+/*
+ *
+ * $Id$
+ * Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This file is part of the K3b project.
+ * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
+ *
+ * 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 "k3bdevicewidget.h"
+#include "k3bdevicemanager.h"
+#include "k3bdevice.h"
+#include "k3bdeviceglobals.h"
+#include <k3blistview.h>
+
+#include <kinputdialog.h>
+#include <kmessagebox.h>
+#include <knuminput.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <ksimpleconfig.h>
+#include <kiconloader.h>
+#include <kstandarddirs.h>
+#include <kio/global.h>
+
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qvariant.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qheader.h>
+#include <qstring.h>
+#include <qcolor.h>
+#include <qptrlist.h>
+
+
+class K3bDeviceWidget::PrivateTempDevice
+{
+public:
+ PrivateTempDevice( K3bDevice::Device* d ) {
+ device = d;
+ cdrdaoDriver = d->cdrdaoDriver();
+ cdTextCapable = ( d->cdTextCapable() != 2 );
+ writer = d->burner();
+ }
+
+ K3bDevice::Device* device;
+ QString cdrdaoDriver;
+ bool cdTextCapable;
+ bool writer;
+};
+
+
+class K3bDeviceWidget::PrivateDeviceViewItem1 : public K3bListViewItem
+{
+public:
+ PrivateDeviceViewItem1( int type, PrivateTempDevice* dev, QListView* view, QListViewItem* after )
+ : K3bListViewItem( view, after ),
+ m_type(type) {
+ this->dev = dev;
+ init();
+ }
+
+ PrivateDeviceViewItem1( int type, PrivateTempDevice* dev, QListViewItem* item, QListViewItem* after )
+ : K3bListViewItem( item, after ),
+ m_type(type) {
+ this->dev = dev;
+ init();
+ }
+
+ void setText(int col, const QString& text) {
+ if( col == 1 ) {
+ switch(m_type) {
+ case t_cdrdaoDriver:
+ dev->cdrdaoDriver = text;
+ break;
+ case t_cdTextCapable:
+ if( dev->cdrdaoDriver != "auto" )
+ dev->cdTextCapable = ( text == i18n("yes") );
+ break;
+ }
+ }
+ }
+
+ QString text( int col ) const {
+ switch(m_type) {
+ case t_cdrdaoDriver:
+ return (col == 0 ? i18n("Cdrdao driver:") : dev->cdrdaoDriver );
+ break;
+ case t_cdTextCapable:
+ if( col == 0 )
+ return i18n("CD-Text capable:");
+ else {
+ if( dev->cdrdaoDriver == "auto" )
+ return "auto";
+ else return ( dev->cdTextCapable ? i18n("yes") : i18n("no") );
+ }
+ }
+ return "???";
+ }
+
+ enum itemType { t_cdrdaoDriver, t_cdTextCapable };
+
+ PrivateTempDevice* dev;
+
+private:
+ void init() {
+ static QStringList l;
+ static QStringList l2;
+
+ switch(m_type) {
+ case t_cdrdaoDriver:
+ if( l.isEmpty() )
+ for( int i = 0; i < 13; i++ )
+ l.append(K3bDevice::Device::cdrdao_drivers[i]);
+
+ setEditor( 1, COMBO, l );
+ break;
+ case t_cdTextCapable:
+ if( l2.isEmpty() ) {
+ l2.append(i18n("auto"));
+ l2.append(i18n("yes"));
+ l2.append(i18n("no"));
+ }
+
+ setEditor( 1, COMBO, l2 );
+ }
+ }
+
+ int m_type;
+};
+
+
+
+
+
+
+K3bDeviceWidget::K3bDeviceWidget( K3bDevice::DeviceManager* manager, QWidget *parent, const char *name )
+ : QWidget( parent, name ), m_deviceManager( manager )
+{
+ QGridLayout* frameLayout = new QGridLayout( this );
+ frameLayout->setSpacing( KDialog::spacingHint() );
+ frameLayout->setMargin( 0 );
+
+
+ // buttons
+ // ------------------------------------------------
+ QGridLayout* refreshButtonGrid = new QGridLayout;
+ refreshButtonGrid->setSpacing( KDialog::spacingHint() );
+ refreshButtonGrid->setMargin(0);
+ m_buttonRefreshDevices = new QPushButton( i18n( "Refresh" ), this, "m_buttonRefreshDevices" );
+ m_buttonAddDevice = new QPushButton( i18n( "Add Device..." ), this, "m_buttonAddDevice" );
+ QToolTip::add( m_buttonRefreshDevices, i18n( "Rescan the devices" ) );
+ QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ refreshButtonGrid->addItem( spacer, 0, 0 );
+ refreshButtonGrid->addWidget( m_buttonRefreshDevices, 0, 2 );
+ refreshButtonGrid->addWidget( m_buttonAddDevice, 0, 1 );
+ // ------------------------------------------------
+
+
+ // Devices Box
+ // ------------------------------------------------
+ QGroupBox* groupDevices = new QGroupBox( 1, Qt::Vertical, i18n( "CD/DVD Drives" ), this );
+ groupDevices->layout()->setSpacing( KDialog::spacingHint() );
+ groupDevices->layout()->setMargin( KDialog::marginHint() );
+
+ m_viewDevices = new K3bListView( groupDevices, "m_viewDevicesReader" );
+ m_viewDevices->addColumn( "V" );
+ m_viewDevices->addColumn( "D" );
+ m_viewDevices->setAllColumnsShowFocus( true );
+ m_viewDevices->header()->hide();
+ m_viewDevices->setSorting( -1 );
+ m_viewDevices->setDoubleClickForEdit(false);
+ m_viewDevices->setAlternateBackground( QColor() );
+ m_viewDevices->setSelectionMode( QListView::NoSelection );
+ m_viewDevices->setFullWidth(true);
+ // ------------------------------------------------
+
+
+ frameLayout->addWidget( groupDevices, 0, 0 );
+ frameLayout->addLayout( refreshButtonGrid, 1, 0 );
+ // ------------------------------------------------
+
+ // temporary device lists settings
+ // ------------------------------------------------
+ m_tempDevices.setAutoDelete( true );
+ // ------------------------------------------------
+
+
+ // connections
+ // ------------------------------------------------
+ // connect( m_buttonRefreshDevices, SIGNAL(clicked()), this, SLOT(slotRefreshDevices()) );
+ connect( m_buttonRefreshDevices, SIGNAL(clicked()), this, SIGNAL(refreshButtonClicked()) );
+ connect( m_buttonAddDevice, SIGNAL(clicked()), this, SLOT(slotNewDevice()) );
+ connect( m_deviceManager, SIGNAL(changed()), this, SLOT(init()) );
+ // ------------------------------------------------
+}
+
+
+K3bDeviceWidget::~K3bDeviceWidget()
+{
+ m_tempDevices.clear();
+}
+
+
+void K3bDeviceWidget::init()
+{
+ // fill the temporary lists
+ m_tempDevices.clear();
+
+ // add the reading devices
+ for( QPtrListIterator<K3bDevice::Device> it( m_deviceManager->allDevices() ); *it; ++it )
+ m_tempDevices.append( new PrivateTempDevice( *it ) );
+
+ updateDeviceListViews();
+}
+
+
+void K3bDeviceWidget::updateDeviceListViews()
+{
+ m_viewDevices->clear();
+
+ // create the parent view items
+ // -----------------------------------------
+ m_writerParentViewItem = new QListViewItem( m_viewDevices, i18n("Writer Drives") );
+ m_writerParentViewItem->setPixmap( 0, SmallIcon( "cdwriter_unmount" ) );
+ // spacer item
+ (void)new QListViewItem( m_viewDevices );
+ m_readerParentViewItem = new QListViewItem( m_viewDevices, i18n("Readonly Drives") );
+ m_readerParentViewItem->setPixmap( 0, SmallIcon( "cdrom_unmount" ) );
+ // -----------------------------------------
+
+ QFont fBold( m_viewDevices->font() );
+ fBold.setBold(true);
+ QFont fItalic( m_viewDevices->font() );
+ fItalic.setItalic(true);
+
+ PrivateTempDevice* dev = m_tempDevices.first();
+ while( dev ) {
+ // create the root device item
+ K3bListViewItem* devRoot = new K3bListViewItem( (dev->writer ? m_writerParentViewItem : m_readerParentViewItem),
+ dev->device->vendor() + " " + dev->device->description() );
+ devRoot->setFont( 0, fBold );
+
+ // create the read-only info items
+ K3bListViewItem* systemDeviceItem = new K3bListViewItem( devRoot, i18n("System device name:") );
+ if( dev->device->interfaceType() == K3bDevice::SCSI )
+ systemDeviceItem->setText( 1, QString("%1 (%2)").arg(dev->device->devicename()).arg(dev->device->busTargetLun()) );
+ else
+ systemDeviceItem->setText( 1, dev->device->devicename() );
+ systemDeviceItem->setForegroundColor( 1, palette().disabled().foreground() );
+
+ K3bListViewItem* interfaceItem = new K3bListViewItem( devRoot, systemDeviceItem,
+ i18n("Interface type:"),
+ ( dev->device->interfaceType() == K3bDevice::SCSI ?
+ i18n("Generic SCSI") :
+ i18n("ATAPI") ) );
+ interfaceItem->setForegroundColor( 1, palette().disabled().foreground() );
+
+ K3bListViewItem* vendorItem = new K3bListViewItem( devRoot, interfaceItem,
+ i18n("Vendor:"),
+ dev->device->vendor() );
+ vendorItem->setForegroundColor( 1, palette().disabled().foreground() );
+ K3bListViewItem* modelItem = new K3bListViewItem( devRoot, vendorItem,
+ i18n("Description:"),
+ dev->device->description() );
+ modelItem->setForegroundColor( 1, palette().disabled().foreground() );
+ K3bListViewItem* versionItem = new K3bListViewItem( devRoot, modelItem,
+ i18n("Firmware:"),
+ dev->device->version() );
+ versionItem->setForegroundColor( 1, palette().disabled().foreground() );
+
+
+ // drive type
+ // --------------------------------
+ K3bListViewItem* typeItem = new K3bListViewItem( devRoot, versionItem,
+ i18n("Writes CD-R:"),
+ dev->device->writesCd() ? i18n("yes") : i18n("no") );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+ typeItem = new K3bListViewItem( devRoot, typeItem,
+ i18n("Writes CD-RW:"),
+ dev->device->writesCdrw() ? i18n("yes") : i18n("no") );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+ typeItem = new K3bListViewItem( devRoot, typeItem,
+ i18n("Reads DVD:"),
+ dev->device->readsDvd() ? i18n("yes") : i18n("no") );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+ typeItem = new K3bListViewItem( devRoot, typeItem,
+ i18n("Writes DVD-R(W):"),
+ dev->device->writesDvdMinus() ? i18n("yes") : i18n("no") );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+ typeItem = new K3bListViewItem( devRoot, typeItem,
+ i18n("Writes DVD-R Dual Layer:"),
+ (dev->device->type() & K3bDevice::DEVICE_DVD_R_DL)
+ ? i18n("yes") : i18n("no") );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+ typeItem = new K3bListViewItem( devRoot, typeItem,
+ i18n("Writes DVD+R(W):"),
+ dev->device->writesDvdPlus() ? i18n("yes") : i18n("no") );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+ typeItem = new K3bListViewItem( devRoot, typeItem,
+ i18n("Writes DVD+R Double Layer:"),
+ (dev->device->type() & K3bDevice::DEVICE_DVD_PLUS_R_DL)
+ ? i18n("yes") : i18n("no") );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+ // --------------------------------
+
+
+ // now add the reader (both interfaces) items
+ if( dev->device->bufferSize() > 0 ) {
+ typeItem = new K3bListViewItem( devRoot, typeItem,
+ i18n("Buffer Size:"),
+ KIO::convertSizeFromKB(dev->device->bufferSize()) );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+ }
+
+ PrivateDeviceViewItem1* cdrdaoDriverItem = new PrivateDeviceViewItem1( PrivateDeviceViewItem1::t_cdrdaoDriver,
+ dev,
+ devRoot,
+ typeItem );
+
+
+ // now add the writer specific items
+ if( dev->writer ) {
+ PrivateDeviceViewItem1* cdTextItem = new PrivateDeviceViewItem1( PrivateDeviceViewItem1::t_cdTextCapable,
+ dev,
+ devRoot,
+ cdrdaoDriverItem );
+
+ typeItem = new K3bListViewItem( devRoot, cdTextItem,
+ i18n("Supports Burnfree:"),
+ dev->device->burnfree() ? i18n("yes") : i18n("no") );
+ typeItem->setForegroundColor( 1, palette().disabled().foreground() );
+
+
+ // and at last the write modes
+ (new K3bListViewItem( devRoot,
+ typeItem,
+ i18n("Write modes:"),
+ K3bDevice::writingModeString(dev->device->writingModes()) ))->setForegroundColor( 1, palette().disabled().foreground() );
+ }
+
+ devRoot->setOpen(true);
+
+ dev = m_tempDevices.next();
+ }
+
+ // create empty items
+ if( m_writerParentViewItem->childCount() == 0 ) {
+ K3bListViewItem* item = new K3bListViewItem( m_writerParentViewItem, i18n("none") );
+ item->setFont( 0, fItalic );
+ }
+ if( m_readerParentViewItem->childCount() == 0 ) {
+ K3bListViewItem* item = new K3bListViewItem( m_readerParentViewItem, i18n("none") );
+ item->setFont( 0, fItalic );
+ }
+
+ m_writerParentViewItem->setOpen( true );
+ m_readerParentViewItem->setOpen( true );
+}
+
+
+void K3bDeviceWidget::slotNewDevice()
+{
+ bool ok;
+ QString newDevicename = KInputDialog::getText( i18n("Location of New Drive"),
+ i18n("Please enter the device name where K3b should search\nfor a new drive (example: /dev/cdrom):"),
+ "/dev/", &ok, this );
+
+ if( ok ) {
+ if( K3bDevice::Device* dev = m_deviceManager->addDevice( newDevicename ) ) {
+ m_tempDevices.append( new PrivateTempDevice( dev ) );
+
+ updateDeviceListViews();
+ }
+ else
+ KMessageBox::error( this, i18n("Could not find an additional device at\n%1").arg(newDevicename), i18n("Error"), false );
+ }
+}
+
+
+void K3bDeviceWidget::apply()
+{
+ // update the devices
+ PrivateTempDevice* tempDev = m_tempDevices.first();
+ while( tempDev != 0 ) {
+ tempDev->device->setCdrdaoDriver( tempDev->cdrdaoDriver );
+ tempDev->device->setCdTextCapability( tempDev->cdTextCapable );
+
+ tempDev = m_tempDevices.next();
+ }
+}
+
+
+#include "k3bdevicewidget.moc"