summaryrefslogtreecommitdiffstats
path: root/src/k3bfiletreeview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/k3bfiletreeview.cpp')
-rw-r--r--src/k3bfiletreeview.cpp728
1 files changed, 728 insertions, 0 deletions
diff --git a/src/k3bfiletreeview.cpp b/src/k3bfiletreeview.cpp
new file mode 100644
index 0000000..36c86c3
--- /dev/null
+++ b/src/k3bfiletreeview.cpp
@@ -0,0 +1,728 @@
+/*
+ *
+ * $Id: k3bfiletreeview.cpp 657858 2007-04-25 08:25:11Z trueg $
+ * 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 "k3bfiletreeview.h"
+#include "k3bappdevicemanager.h"
+#include "k3bapplication.h"
+#include "k3bmediacache.h"
+#include "k3btooltip.h"
+#include "k3bthememanager.h"
+
+#include <k3bdevice.h>
+#include <k3bdiskinfo.h>
+#include <k3bglobals.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kstandarddirs.h>
+#include <kaction.h>
+#include <kio/global.h>
+#include <kfileitem.h>
+#include <kapplication.h>
+#include <kglobalsettings.h>
+
+#include <qdir.h>
+#include <qevent.h>
+#include <qdragobject.h>
+#include <qcursor.h>
+#include <qnamespace.h>
+#include <qmap.h>
+#include <qptrdict.h>
+#include <qpainter.h>
+#include <qfont.h>
+#include <qstyle.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+
+K3bDeviceBranch::K3bDeviceBranch( KFileTreeView* view, K3bDevice::Device* dev, KFileTreeViewItem* item )
+ : KFileTreeBranch( view,
+ KURL( "media:/" + dev->blockDeviceName() ),
+ QString("%1 - %2").arg(dev->vendor()).arg(dev->description()),
+ ( dev->burner()
+ ? SmallIcon("cdwriter_unmount")
+ : SmallIcon("cdrom_unmount") ),
+ false,
+ item == 0
+ ? new K3bDeviceBranchViewItem( view, dev, this )
+ : item ),
+ m_device( dev ),
+ m_showBlockDeviceName( false )
+{
+ setAutoUpdate(true);
+ root()->setExpandable(false);
+ updateLabel();
+
+ connect( k3bappcore->mediaCache(), SIGNAL(mediumChanged(K3bDevice::Device*)),
+ this, SLOT(slotMediumChanged(K3bDevice::Device*)) );
+}
+
+
+bool K3bDeviceBranch::populate( const KURL& url, KFileTreeViewItem *currItem )
+{
+ // FIXME: we somehow need to "unpopulate" once the medium is unmounted
+
+ // make sure we do not try to populate in case we are not mounted
+ if( K3b::isMounted( m_device ) ) {
+ bool b = KFileTreeBranch::populate( url, currItem );
+ populateFinished( currItem );
+ return b;
+ }
+ else
+ populateFinished( currItem );
+
+ return true;
+}
+
+
+void K3bDeviceBranch::setCurrent( bool c )
+{
+ static_cast<K3bDeviceBranchViewItem*>( root() )->setCurrent( c );
+}
+
+
+void K3bDeviceBranch::updateLabel()
+{
+ if( m_showBlockDeviceName )
+ setName( QString("%1 %2 (%3)")
+ .arg(m_device->vendor())
+ .arg(m_device->description())
+ .arg(m_device->blockDeviceName()) );
+ else
+ setName( QString("%1 %2")
+ .arg(m_device->vendor())
+ .arg(m_device->description()) );
+
+ if( k3bappcore->mediaCache() ) {
+ root()->setMultiLinesEnabled( true );
+ root()->setText( 0, name() + "\n" + k3bappcore->mediaCache()->mediumString( m_device ) );
+ static_cast<K3bFileTreeView*>( root()->listView() )->updateMinimumWidth();
+ }
+ else {
+ root()->setMultiLinesEnabled( false );
+ root()->setText( 0, name() );
+ }
+}
+
+
+void K3bDeviceBranch::slotMediumChanged( K3bDevice::Device* dev )
+{
+ if( dev == m_device )
+ updateLabel();
+}
+
+
+void K3bDeviceBranch::showBlockDeviceName( bool b )
+{
+ m_showBlockDeviceName = b;
+ updateLabel();
+}
+
+
+K3bFileTreeBranch::K3bFileTreeBranch( KFileTreeView* view,
+ const KURL& url,
+ const QString& name,
+ const QPixmap& pix,
+ bool showHidden,
+ KFileTreeViewItem* item )
+ : KFileTreeBranch( view, url, name, pix, showHidden,
+ item == 0
+ ? new K3bFileTreeViewItem( view,
+ new KFileItem( url, "inode/directory",
+ S_IFDIR ),
+ this )
+ : item )
+{
+}
+
+
+
+K3bDeviceBranchViewItem::K3bDeviceBranchViewItem( KFileTreeViewItem* parent,
+ K3bDevice::Device* dev,
+ K3bDeviceBranch* branch )
+ : KFileTreeViewItem( parent,
+ new KFileItem( KURL( "media:/" + dev->blockDeviceName() ),
+ "inode/directory",
+ S_IFDIR ),
+ branch ),
+ m_bCurrent( false ),
+ m_device( dev )
+{
+}
+
+
+K3bDeviceBranchViewItem::K3bDeviceBranchViewItem( KFileTreeView* parent,
+ K3bDevice::Device* dev,
+ K3bDeviceBranch* branch )
+ : KFileTreeViewItem( parent,
+ new KFileItem( KURL( "media:/" + dev->blockDeviceName() ),
+ "inode/directory",
+ S_IFDIR ),
+ branch ),
+ m_bCurrent( false ),
+ m_device( dev )
+{
+}
+
+
+void K3bDeviceBranchViewItem::setCurrent( bool c )
+{
+ m_bCurrent = c;
+ repaint();
+}
+
+
+void K3bDeviceBranchViewItem::paintCell( QPainter* p, const QColorGroup& cg, int /* col */, int width, int align )
+{
+ p->save();
+
+ int xpos = 1;
+ int ypos = 1;
+ QFontMetrics fm( p->fontMetrics() );
+
+ if( isSelected() ) {
+ p->fillRect( 0, 0, width, height(),
+ cg.brush( QColorGroup::Highlight ) );
+ p->setPen( cg.highlightedText() );
+ }
+ else {
+ p->fillRect( 0, 0, width, height(), cg.base() );
+ p->setPen( cg.text() );
+ }
+
+ if( pixmap(0) ) {
+ p->drawPixmap( xpos, ypos, *pixmap(0) );
+ xpos += pixmap(0)->width() + 5;
+ }
+
+ if( m_bCurrent ) {
+ QFont f( listView()->font() );
+ f.setBold( true );
+ p->setFont( f );
+ }
+
+ ypos += fm.ascent();
+ QString line1 = text(0).left( text(0).find('\n') );
+ p->drawText( xpos, ypos, line1 );
+
+ QFont f( listView()->font() );
+ f.setItalic( true );
+ f.setBold( false );
+ f.setPointSize( f.pointSize() - 2 );
+ p->setFont( f );
+
+ ypos += p->fontMetrics().height() + 1;
+ QString line2 = text(0).mid( text(0).find('\n')+1 );
+ p->drawText( xpos - p->fontMetrics().leftBearing( line2[0] ), ypos, line2 );
+
+
+ // from QListViewItem
+ if( isOpen() && childCount() ) {
+ int textheight = fm.size( align, text(0) ).height() + 2 * listView()->itemMargin();
+ textheight = QMAX( textheight, QApplication::globalStrut().height() );
+ if ( textheight % 2 > 0 )
+ textheight++;
+ if ( textheight < height() ) {
+ int w = listView()->treeStepSize() / 2;
+ listView()->style().drawComplexControl( QStyle::CC_ListView, p, listView(),
+ QRect( 0, textheight, w + 1, height() - textheight + 1 ), cg,
+ QStyle::Style_Enabled,
+ QStyle::SC_ListViewExpand,
+ (uint)QStyle::SC_All, QStyleOption( this ) );
+ }
+ }
+
+ p->restore();
+}
+
+
+int K3bDeviceBranchViewItem::widthHint() const
+{
+ QFont f( listView()->font() );
+ if ( m_bCurrent ) {
+ f.setBold( true );
+ }
+ int w = QFontMetrics(f).width( text(0).left( text(0).find('\n') ) );
+
+ f.setItalic( true );
+ f.setBold( false );
+ f.setPointSize( f.pointSize() - 2 );
+ w = QMAX( w, QFontMetrics(f).width( text(0).mid( text(0).find('\n')+1 ) ) );
+
+ w++; // see paintCell
+
+ if( pixmap(0) )
+ w += pixmap(0)->width() + 5;
+
+ return w;
+}
+
+
+QString K3bDeviceBranchViewItem::key( int column, bool ascending ) const
+{
+ return "0" + KFileTreeViewItem::key( column, ascending );
+}
+
+
+
+K3bFileTreeViewItem::K3bFileTreeViewItem( KFileTreeViewItem* parent, KFileItem* item, KFileTreeBranch* branch )
+ : KFileTreeViewItem( parent, item, branch )
+{
+}
+
+
+K3bFileTreeViewItem::K3bFileTreeViewItem( KFileTreeView* parent, KFileItem* item, KFileTreeBranch* branch )
+ : KFileTreeViewItem( parent, item, branch )
+{
+}
+
+
+QString K3bFileTreeViewItem::key( int column, bool ascending ) const
+{
+ return "1" + KFileTreeViewItem::key( column, ascending );
+}
+
+
+class K3bDeviceTreeToolTip : public K3bToolTip
+{
+public:
+ K3bDeviceTreeToolTip( QWidget* parent, K3bFileTreeView* lv );
+
+ void maybeTip( const QPoint &pos );
+
+private:
+ K3bFileTreeView* m_view;
+};
+
+
+K3bDeviceTreeToolTip::K3bDeviceTreeToolTip( QWidget* parent, K3bFileTreeView* lv )
+ : K3bToolTip( parent ),
+ m_view( lv )
+{
+ setTipTimeout( 500 );
+}
+
+
+void K3bDeviceTreeToolTip::maybeTip( const QPoint& pos )
+{
+ if( !parentWidget() || !m_view )
+ return;
+
+ K3bDeviceBranchViewItem* item = dynamic_cast<K3bDeviceBranchViewItem*>( m_view->itemAt( pos ) );
+ if( !item )
+ return;
+
+ K3bDevice::Device* dev = static_cast<K3bDeviceBranch*>( item->branch() )->device();
+
+ QFrame* tooltip = new QFrame( parentWidget() );
+ tooltip->setFrameStyle( QFrame::Panel | QFrame::Raised );
+ tooltip->setFrameShape( QFrame::StyledPanel );
+ QGridLayout* lay = new QGridLayout( tooltip, 2, 2, tooltip->frameWidth()*2 /*margin*/, 6 /*spacing*/ );
+
+ QString text = k3bappcore->mediaCache()->medium( dev ).longString();
+ int detailsStart = text.find( "<p>", 3 );
+ QString details = text.mid( detailsStart );
+ text.truncate( detailsStart );
+
+ QLabel* label = new QLabel( text, tooltip );
+ label->setMargin( 9 );
+ lay->addMultiCellWidget( label, 0, 0, 0, 1 );
+ label = new QLabel( details, tooltip );
+ label->setMargin( 9 );
+ label->setAlignment( Qt::Vertical );
+ lay->addMultiCellWidget( label, 1, 2, 0, 0 );
+ label = new QLabel( tooltip );
+ lay->addWidget( label, 2, 1 );
+ lay->setColStretch( 0, 1 );
+
+ if( K3bTheme* theme = k3bappcore->themeManager()->currentTheme() ) {
+ tooltip->setPaletteBackgroundColor( theme->backgroundColor() );
+ tooltip->setPaletteForegroundColor( theme->foregroundColor() );
+ K3bTheme::PixmapType pm;
+ int c = k3bappcore->mediaCache()->medium( dev ).content();
+ if( c & (K3bMedium::CONTENT_VIDEO_CD|K3bMedium::CONTENT_VIDEO_DVD) )
+ pm = K3bTheme::MEDIA_VIDEO;
+ else if( c & K3bMedium::CONTENT_AUDIO &&
+ c & K3bMedium::CONTENT_DATA )
+ pm = K3bTheme::MEDIA_MIXED;
+ else if( c & K3bMedium::CONTENT_AUDIO )
+ pm = K3bTheme::MEDIA_AUDIO;
+ else if( c & K3bMedium::CONTENT_DATA )
+ pm = K3bTheme::MEDIA_DATA;
+ else {
+ K3bDevice::DiskInfo di = k3bappcore->mediaCache()->diskInfo( dev );
+ if( di.diskState() == K3bDevice::STATE_EMPTY )
+ pm = K3bTheme::MEDIA_EMPTY;
+ else
+ pm = K3bTheme::MEDIA_NONE;
+ }
+ label->setPixmap( theme->pixmap( pm ) );
+ }
+
+ // the tooltip will take care of deleting the widget
+ tip( m_view->itemRect( item ), tooltip );
+}
+
+
+
+class K3bFileTreeView::Private
+{
+public:
+ Private()
+ : deviceManager(0),
+ currentDeviceBranch(0) {
+ }
+
+ QPtrDict<K3bDeviceBranch> deviceBranchDict;
+ QMap<KFileTreeBranch*, K3bDevice::Device*> branchDeviceMap;
+
+ K3bDevice::DeviceManager* deviceManager;
+ K3bDeviceBranch* currentDeviceBranch;
+
+ K3bDeviceTreeToolTip* toolTip;
+};
+
+K3bFileTreeView::K3bFileTreeView( QWidget *parent, const char *name )
+ : KFileTreeView( parent, name )
+{
+ d = new Private();
+
+ d->toolTip = new K3bDeviceTreeToolTip( viewport(), this );
+
+ addColumn( i18n("Directories") );
+ setDragEnabled( true );
+ setAlternateBackground( QColor() );
+ setFullWidth(true);
+ // setRootIsDecorated(true);
+ setSorting(0);
+
+ m_dirOnlyMode = true;
+ m_menuEnabled = false;
+
+ connect( this, SIGNAL(executed(QListViewItem*)), this, SLOT(slotItemExecuted(QListViewItem*)) );
+ connect( this, SIGNAL(returnPressed(QListViewItem*)), this, SLOT(slotItemExecuted(QListViewItem*)) );
+ connect( this, SIGNAL(contextMenu(KListView*, QListViewItem* , const QPoint& )),
+ this, SLOT(slotContextMenu(KListView*, QListViewItem* , const QPoint& )) );
+
+ // we always simulate the single click
+ slotSettingsChangedK3b(KApplication::SETTINGS_MOUSE);
+ if( kapp )
+ connect( kapp, SIGNAL(settingsChanged(int)), SLOT(slotSettingsChangedK3b(int)) );
+
+ initActions();
+}
+
+
+K3bFileTreeView::~K3bFileTreeView()
+{
+ delete d;
+}
+
+
+void K3bFileTreeView::clear()
+{
+ KFileTreeView::clear();
+ if( d->deviceManager )
+ d->deviceManager->disconnect( this );
+ d->deviceManager = 0;
+}
+
+
+void K3bFileTreeView::initActions()
+{
+// m_actionCollection = new KActionCollection( this );
+
+// m_devicePopupMenu = new KActionMenu( m_actionCollection, "device_popup_menu" );
+// m_urlPopupMenu = new KActionMenu( m_actionCollection, "url_popup_menu" );
+
+// KAction* actionDiskInfo = new KAction( i18n("&Disk Info"), "info", 0, this, SLOT(slotShowDiskInfo()),
+// m_actionCollection, "disk_info");
+// KAction* actionUnmount = new KAction( i18n("&Unmount"), "cdrom_unmount", 0, this, SLOT(slotUnmountDisk()),
+// m_actionCollection, "disk_unmount");
+// KAction* actionEject = new KAction( i18n("&Eject"), "", 0, this, SLOT(slotEjectDisk()),
+// m_actionCollection, "disk_eject");
+
+// m_devicePopupMenu->insert( actionDiskInfo );
+// m_devicePopupMenu->insert( new KActionSeparator( this ) );
+// m_devicePopupMenu->insert( actionUnmount );
+// m_devicePopupMenu->insert( actionEject );
+
+}
+
+
+void K3bFileTreeView::addDefaultBranches()
+{
+ KURL home = KURL::fromPathOrURL( QDir::homeDirPath() );
+ KURL root = KURL( "file:/" );
+
+ KFileTreeBranch* treeBranch = addBranch( new K3bFileTreeBranch( this, root, i18n("Root"), SmallIcon("folder_red") ) );
+ treeBranch = addBranch( new K3bFileTreeBranch( this, home, i18n("Home"), SmallIcon("folder_home") ) );
+ treeBranch->setOpen( true );
+}
+
+
+void K3bFileTreeView::addCdDeviceBranches( K3bDevice::DeviceManager* dm )
+{
+ kdDebug() << "(K3bFileTreeView::addCdDeviceBranches)" << endl;
+
+ // remove all previous added device branches
+ for( QMap<KFileTreeBranch*, K3bDevice::Device*>::Iterator it = d->branchDeviceMap.begin();
+ it != d->branchDeviceMap.end(); ++it ) {
+ removeBranch( it.key() );
+ }
+
+ // clear the maps
+ d->branchDeviceMap.clear();
+ d->deviceBranchDict.clear();
+
+ for( QPtrListIterator<K3bDevice::Device> it( dm->allDevices() ); *it; ++it )
+ addDeviceBranch( *it );
+
+ if( dm != d->deviceManager ) {
+ if( d->deviceManager )
+ d->deviceManager->disconnect( this );
+ d->deviceManager = dm;
+
+ // make sure we get changes to the config
+ connect( dm, SIGNAL(changed(K3bDevice::DeviceManager*)),
+ this, SLOT(addCdDeviceBranches(K3bDevice::DeviceManager*)) );
+
+ if( K3bAppDeviceManager* appDevM = dynamic_cast<K3bAppDeviceManager*>( dm ) )
+ connect( appDevM, SIGNAL(currentDeviceChanged(K3bDevice::Device*)),
+ this, SLOT(setCurrentDevice(K3bDevice::Device*)) );
+ }
+
+ K3bDevice::Device* currentDevice = k3bappcore->appDeviceManager()->currentDevice();
+ if ( !currentDevice && !k3bappcore->appDeviceManager()->allDevices().isEmpty() ) {
+ k3bappcore->appDeviceManager()->setCurrentDevice( k3bappcore->appDeviceManager()->allDevices().getFirst() );
+ }
+
+ d->currentDeviceBranch = d->deviceBranchDict[currentDevice];
+ if( d->currentDeviceBranch ) {
+ d->currentDeviceBranch->setCurrent( true );
+ }
+
+ kdDebug() << "(K3bFileTreeView::addCdDeviceBranches) done" << endl;
+}
+
+
+void K3bFileTreeView::addDeviceBranch( K3bDevice::Device* dev )
+{
+ K3bDeviceBranch* newBranch = new K3bDeviceBranch( this, dev );
+ addBranch( newBranch );
+
+ // search for an equal device
+ int equalCnt = 0;
+ K3bDeviceBranch* equalBranch = 0;
+ for( QMap<KFileTreeBranch*, K3bDevice::Device*>::Iterator it = d->branchDeviceMap.begin();
+ it != d->branchDeviceMap.end(); ++it ) {
+ K3bDevice::Device* itDev = it.data();
+ K3bDeviceBranch* itBranch = (K3bDeviceBranch*)it.key();
+ if( itDev->vendor() == dev->vendor() &&
+ itDev->description() == dev->description() ) {
+ ++equalCnt;
+ equalBranch = itBranch;
+ }
+ }
+
+ // if there is at least one equal device add the block device name
+ // if there is more than one equal device they have been updated after
+ // adding the last one so there is no need to update more than two
+ if( equalCnt > 0 ) {
+ kdDebug() << "(K3bFileTreeView) equal branch" << endl;
+ newBranch->showBlockDeviceName(true);
+ equalBranch->showBlockDeviceName(true);
+ }
+
+ // add to maps
+ d->branchDeviceMap.insert( newBranch, dev );
+ d->deviceBranchDict.insert( (void*)dev, newBranch );
+
+ updateMinimumWidth();
+}
+
+
+KFileTreeBranch* K3bFileTreeView::addBranch( KFileTreeBranch* branch )
+{
+ KFileTreeBranch* newBranch = KFileTreeView::addBranch( branch );
+ newBranch->setChildRecurse( false );
+ setDirOnlyMode( newBranch, m_dirOnlyMode );
+
+ return newBranch;
+}
+
+
+KFileTreeBranch* K3bFileTreeView::addBranch( const KURL& url, const QString& name, const QPixmap& pix, bool showHidden )
+{
+ KFileTreeBranch* newBranch = KFileTreeView::addBranch( url, name, pix, showHidden );
+ newBranch->setChildRecurse( false );
+ setDirOnlyMode( newBranch, m_dirOnlyMode );
+
+ return newBranch;
+}
+
+
+void K3bFileTreeView::slotItemExecuted( QListViewItem* item )
+{
+ KFileTreeViewItem* treeItem = static_cast<KFileTreeViewItem*>(item);
+ if( d->branchDeviceMap.contains( treeItem->branch() ) &&
+ treeItem == treeItem->branch()->root() ) {
+ K3bDevice::Device* dev = d->branchDeviceMap[treeItem->branch()];
+ k3bappcore->appDeviceManager()->setCurrentDevice( dev );
+ emit deviceExecuted( dev );
+ }
+ else
+ emit urlExecuted( treeItem->url() );
+}
+
+
+void K3bFileTreeView::setTreeDirOnlyMode( bool b )
+{
+ m_dirOnlyMode = b;
+}
+
+
+void K3bFileTreeView::followUrl( const KURL& url )
+{
+ // TODO: first try the current branch
+ KFileTreeBranchIterator it( branches() );
+ for( ; *it; ++it ) {
+ if( !d->branchDeviceMap.contains( *it ) )
+ if( KFileTreeViewItem* item = (*it)->findTVIByURL( url ) ) {
+ setCurrentItem( item );
+ setSelected(item, true);
+ ensureItemVisible( item );
+ return;
+ }
+ }
+}
+
+
+void K3bFileTreeView::slotContextMenu( KListView*, QListViewItem* item, const QPoint& p )
+{
+ KFileTreeViewItem* treeItem = dynamic_cast<KFileTreeViewItem*>(item);
+ if( treeItem ) {
+ K3bDevice::Device* device = 0;
+ QMap<KFileTreeBranch*, K3bDevice::Device*>::iterator devIt =
+ d->branchDeviceMap.find( treeItem->branch() );
+ if( devIt != d->branchDeviceMap.end() )
+ device = devIt.data();
+
+ setCurrentItem( treeItem );
+ setSelected( treeItem, true);
+
+ if( device ) {
+ k3bappcore->appDeviceManager()->setCurrentDevice( device );
+ emit contextMenu( device, p );
+ }
+ else
+ emit contextMenu( treeItem->url(), p );
+ }
+ else
+ kdWarning() << "(K3bFileTreeView) found viewItem that is no KFileTreeViewItem!" << endl;
+}
+
+
+K3bDevice::Device* K3bFileTreeView::selectedDevice() const
+{
+ KFileTreeViewItem* treeItem = dynamic_cast<KFileTreeViewItem*>(selectedItem());
+ if( treeItem ) {
+ if( d->branchDeviceMap.contains( treeItem->branch() ) )
+ return d->branchDeviceMap[treeItem->branch()];
+ }
+ return 0;
+}
+
+
+KURL K3bFileTreeView::selectedUrl() const
+{
+ KFileTreeViewItem* treeItem = dynamic_cast<KFileTreeViewItem*>(selectedItem());
+ if( treeItem ) {
+ if( !d->branchDeviceMap.contains( treeItem->branch() ) )
+ return treeItem->url();
+ }
+ return KURL();
+}
+
+
+void K3bFileTreeView::setCurrentDevice( K3bDevice::Device* dev )
+{
+ if( d->currentDeviceBranch )
+ d->currentDeviceBranch->setCurrent( false );
+
+ if( dev ) {
+ if ( ( d->currentDeviceBranch = branch( dev ) ) )
+ d->currentDeviceBranch->setCurrent( true );
+ }
+
+ updateMinimumWidth();
+}
+
+
+void K3bFileTreeView::setSelectedDevice( K3bDevice::Device* dev )
+{
+ setCurrentDevice( dev );
+ K3bDeviceBranch* b = branch( dev );
+ setCurrentItem( b->root() );
+ setSelected( b->root(), true );
+}
+
+
+K3bDeviceBranch* K3bFileTreeView::branch( K3bDevice::Device* dev )
+{
+ return d->deviceBranchDict.find( (void*)dev );
+}
+
+
+void K3bFileTreeView::slotSettingsChangedK3b(int category)
+{
+ // we force single click like konqueror does. This really should be done in KFileTreeView
+
+ if( category == KApplication::SETTINGS_MOUSE ) {
+ disconnect(this, SIGNAL(mouseButtonClicked(int, QListViewItem*, const QPoint &, int)),
+ this, SLOT(slotMouseButtonClickedK3b(int, QListViewItem*, const QPoint &, int)));
+
+ if( !KGlobalSettings::singleClick() )
+ connect(this, SIGNAL(mouseButtonClicked(int, QListViewItem*, const QPoint &, int)),
+ this, SLOT(slotMouseButtonClickedK3b(int, QListViewItem*, const QPoint &, int)));
+ }
+}
+
+
+void K3bFileTreeView::slotMouseButtonClickedK3b( int btn, QListViewItem *item, const QPoint &pos, int c )
+{
+ if( (btn == LeftButton) && item )
+ emitExecute(item, pos, c);
+}
+
+
+void K3bFileTreeView::updateMinimumWidth()
+{
+ //
+ // only handle the device branches, we don't care about the folders.
+ //
+ int w = 0;
+ for( QMap<KFileTreeBranch*, K3bDevice::Device*>::Iterator it = d->branchDeviceMap.begin();
+ it != d->branchDeviceMap.end(); ++it ) {
+ w = QMAX( w, static_cast<K3bDeviceBranchViewItem*>( it.key()->root() )->widthHint() );
+ }
+
+ // width of the items + scrollbar width + the frame + a little eyecandy spacing
+ setMinimumWidth( w + verticalScrollBar()->sizeHint().width() + 2*frameWidth() + 2 );
+}
+
+#include "k3bfiletreeview.moc"