/* * * $Id: k3bvcdlistview.cpp 628165 2007-01-29 11:01:22Z trueg $ * Copyright (C) 2003-2004 Christian Kvasny * * This file is part of the K3b project. * Copyright (C) 1998-2007 Sebastian Trueg * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // K3b Includes #include "k3bvcdlistview.h" #include "k3bvcdlistviewitem.h" #include "k3bvcdtrack.h" #include "k3bvcdtrackdialog.h" #include "k3bvcddoc.h" #include K3bVcdListView::K3bVcdListView( K3bView* view, K3bVcdDoc* doc, QWidget *parent, const char *name ) : K3bListView( parent, name ), m_doc( doc ), m_view( view ) { setAcceptDrops( true ); setDropVisualizer( true ); setAllColumnsShowFocus( true ); setDragEnabled( true ); setSelectionModeExt( KListView::Extended ); setItemsMovable( false ); setNoItemText( i18n( "Use drag'n'drop to add MPEG video files to the project." ) + "\n" + i18n( "After that press the burn button to write the CD." ) ); setSorting( 0 ); setupActions(); setupPopupMenu(); setupColumns(); header() ->setClickEnabled( false ); connect( this, SIGNAL( dropped( KListView*, QDropEvent*, QListViewItem* ) ), this, SLOT( slotDropped( KListView*, QDropEvent*, QListViewItem* ) ) ); connect( this, SIGNAL( contextMenu( KListView*, QListViewItem*, const QPoint& ) ), this, SLOT( showPopupMenu( KListView*, QListViewItem*, const QPoint& ) ) ); connect( this, SIGNAL( doubleClicked( QListViewItem*, const QPoint&, int ) ), this, SLOT( showPropertiesDialog() ) ); connect( m_doc, SIGNAL( changed() ), this, SLOT( slotUpdateItems() ) ); connect( m_doc, SIGNAL( trackRemoved( K3bVcdTrack* ) ), this, SLOT( slotTrackRemoved( K3bVcdTrack* ) ) ); slotUpdateItems(); } K3bVcdListView::~K3bVcdListView() {} void K3bVcdListView::setupColumns() { addColumn( i18n( "No." ) ); addColumn( i18n( "Title" ) ); addColumn( i18n( "Type" ) ); addColumn( i18n( "Resolution" ) ); addColumn( i18n( "High Resolution" ) ); addColumn( i18n( "Framerate" ) ); addColumn( i18n( "Muxrate" ) ); addColumn( i18n( "Duration" ) ); addColumn( i18n( "File Size" ) ); addColumn( i18n( "Filename" ) ); } void K3bVcdListView::setupActions() { m_actionCollection = new KActionCollection( this ); m_actionProperties = new KAction( i18n( "Properties" ), "misc", 0, this, SLOT( showPropertiesDialog() ), actionCollection() ); m_actionRemove = new KAction( i18n( "Remove" ), "editdelete", Key_Delete, this, SLOT( slotRemoveTracks() ), actionCollection() ); // disabled by default m_actionRemove->setEnabled( false ); } void K3bVcdListView::setupPopupMenu() { m_popupMenu = new KPopupMenu( this, "VcdViewPopupMenu" ); m_actionRemove->plug( m_popupMenu ); m_popupMenu->insertSeparator(); m_actionProperties->plug( m_popupMenu ); m_popupMenu->insertSeparator(); m_view->actionCollection() ->action( "project_burn" ) ->plug( m_popupMenu ); } bool K3bVcdListView::acceptDrag( QDropEvent* e ) const { // the first is for built-in item moving, the second for dropping urls return ( KListView::acceptDrag( e ) || KURLDrag::canDecode( e ) ); } QDragObject* K3bVcdListView::dragObject() { QPtrList list = selectedItems(); if ( list.isEmpty() ) return 0; QPtrListIterator it( list ); KURL::List urls; for ( ; it.current(); ++it ) urls.append( KURL( ( ( K3bVcdListViewItem* ) it.current() ) ->vcdTrack() ->absPath() ) ); return KURLDrag::newDrag( urls, viewport() ); } void K3bVcdListView::slotDropped( KListView*, QDropEvent* e, QListViewItem* after ) { if ( !e->isAccepted() ) return ; int pos; if ( after == 0L ) pos = 0; else pos = ( ( K3bVcdListViewItem* ) after ) ->vcdTrack() ->index() + 1; if ( e->source() == viewport() ) { QPtrList sel = selectedItems(); QPtrListIterator it( sel ); K3bVcdTrack* trackAfter = ( after ? ( ( K3bVcdListViewItem* ) after ) ->vcdTrack() : 0 ); while ( it.current() ) { K3bVcdTrack * track = ( ( K3bVcdListViewItem* ) it.current() ) ->vcdTrack(); m_doc->moveTrack( track, trackAfter ); trackAfter = track; ++it; } } else { KURL::List urls; KURLDrag::decode( e, urls ); m_doc->addTracks( urls, pos ); } // now grab that focus setFocus(); } void K3bVcdListView::insertItem( QListViewItem* item ) { KListView::insertItem( item ); // make sure at least one item is selected if ( selectedItems().isEmpty() ) { setSelected( firstChild(), true ); } } void K3bVcdListView::showPopupMenu( KListView*, QListViewItem* _item, const QPoint& _point ) { if ( _item ) { m_actionRemove->setEnabled( true ); } else { m_actionRemove->setEnabled( false ); } m_popupMenu->popup( _point ); } void K3bVcdListView::showPropertiesDialog() { QPtrList selected = selectedTracks(); if ( !selected.isEmpty() && selected.count() == 1 ) { QPtrList tracks = *m_doc->tracks(); K3bVcdTrackDialog d( m_doc, tracks, selected, this ); if ( d.exec() ) { repaint(); } } else { m_view->slotProperties(); } } QPtrList K3bVcdListView::selectedTracks() { QPtrList selectedTracks; QPtrList selectedVI( selectedItems() ); for ( QListViewItem * item = selectedVI.first(); item != 0; item = selectedVI.next() ) { K3bVcdListViewItem * vcdItem = dynamic_cast( item ); if ( vcdItem ) { selectedTracks.append( vcdItem->vcdTrack() ); } } return selectedTracks; } void K3bVcdListView::slotRemoveTracks() { QPtrList selected = selectedTracks(); if ( !selected.isEmpty() ) { for ( K3bVcdTrack * track = selected.first(); track != 0; track = selected.next() ) { m_doc->removeTrack( track ); } } if ( m_doc->numOfTracks() == 0 ) { m_actionRemove->setEnabled( false ); } } void K3bVcdListView::slotTrackRemoved( K3bVcdTrack* track ) { QListViewItem * viewItem = m_itemMap[ track ]; m_itemMap.remove( track ); delete viewItem; } void K3bVcdListView::slotUpdateItems() { // iterate through all doc-tracks and test if we have a listItem, if not, create one K3bVcdTrack * track = m_doc->first(); K3bVcdTrack* lastTrack = 0; while ( track != 0 ) { if ( !m_itemMap.contains( track ) ) m_itemMap.insert( track, new K3bVcdListViewItem( track, this, m_itemMap[ lastTrack ] ) ); lastTrack = track; track = m_doc->next(); } if ( m_doc->numOfTracks() > 0 ) { m_actionRemove->setEnabled( true ); } else { m_actionRemove->setEnabled( false ); } sort(); // This is so lame! header()->setShown( m_doc->numOfTracks() > 0 ); } #include "k3bvcdlistview.moc"