File indexing completed on 2024-05-05 04:51:43

0001 /*
0002     SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 
0008 #include "k3bdatadirtreeview.h"
0009 #include "k3bdataview.h"
0010 #include "k3bdatadoc.h"
0011 #include "k3bdataitem.h"
0012 #include "k3bdiritem.h"
0013 #include "k3bdataprojectmodel.h"
0014 #include "k3bdataurladdingdialog.h"
0015 #include "k3bview.h"
0016 #include "k3bvalidators.h"
0017 
0018 #include <KLocalizedString>
0019 #include <KIconLoader>
0020 
0021 #include <QDebug>
0022 #include <QList>
0023 #include <QHeaderView>
0024 
0025 
0026 class K3b::DataDirTreeView::Private
0027 {
0028 public:
0029     Private() {
0030     }
0031 
0032     int animationCounter;
0033     QPixmap beforeAniPixmap;
0034 
0035 #ifdef __GNUC__
0036 #warning Re-enable the iso and ascii validators
0037 #endif
0038     QValidator* iso9660Validator;
0039     QValidator* asciiValidator;
0040 
0041     K3b::DataProjectModel* model;
0042 };
0043 
0044 
0045 K3b::DataDirTreeView::DataDirTreeView( K3b::View* view, K3b::DataDoc* doc, QWidget* parent )
0046     : QTreeView( parent ), m_view(view)
0047 {
0048     d = new Private();
0049 
0050     setSelectionMode(QAbstractItemView::SingleSelection);
0051 
0052 //    setRootIsDecorated( false );
0053     setDragDropMode( QAbstractItemView::DragDrop );
0054     setDropIndicatorShown( true );
0055     setDragEnabled(true);
0056     setAcceptDrops( true );
0057 
0058     header()->hide();
0059 
0060     m_doc = doc;
0061 
0062     d->model = new K3b::DataProjectModel( doc, this );
0063     //d->model->setListOnlyDirs( true );
0064     setModel( d->model );
0065 
0066     for ( int i = K3b::DataProjectModel::TypeColumn; i < K3b::DataProjectModel::NumColumns; ++i ) {
0067         hideColumn( i );
0068     }
0069 
0070     connect( d->model, SIGNAL(addUrlsRequested(QList<QUrl>,K3b::DirItem*)),
0071                        SLOT(slotAddUrlsRequested(QList<QUrl>,K3b::DirItem*)) );
0072     connect( d->model, SIGNAL(moveItemsRequested(QList<K3b::DataItem*>,K3b::DirItem*)),
0073                        SLOT(slotMoveItemsRequested(QList<K3b::DataItem*>,K3b::DirItem*)) );
0074     connect( selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
0075                                SLOT(slotSelectionChanged(QItemSelection,QItemSelection)) );
0076 }
0077 
0078 
0079 K3b::DataDirTreeView::~DataDirTreeView()
0080 {
0081     delete d;
0082 }
0083 
0084 
0085 K3b::DataItem* K3b::DataDirTreeView::itemAt( const QPoint& pos )
0086 {
0087     return d->model->itemForIndex( indexAt( pos ) );
0088 }
0089 
0090 
0091 K3b::DirItem* K3b::DataDirTreeView::selectedDir() const
0092 {
0093     if ( K3b::DataItem* item = d->model->itemForIndex( selectionModel()->currentIndex() ) ) {
0094         return item->getDirItem();
0095     }
0096 //     QModelIndexList indices = selectionModel()->selectedRows();
0097 //     if ( !indices.isEmpty() ) {
0098 //         return d->model->itemForIndex( indices.first() )->getDirItem();
0099 //     }
0100     else {
0101         return 0;
0102     }
0103 }
0104 
0105 
0106 void K3b::DataDirTreeView::slotSelectionChanged( const QItemSelection& selected, const QItemSelection& )
0107 {
0108     QModelIndexList indexes = selected.indexes();
0109     if ( !indexes.isEmpty() ) {
0110         K3b::DirItem* dir = d->model->itemForIndex( indexes.first() )->getDirItem();
0111         emit dirSelected( dir );
0112     }
0113 }
0114 
0115 
0116 void K3b::DataDirTreeView::slotAddUrlsRequested( QList<QUrl> urls, K3b::DirItem* targetDir )
0117 {
0118     DataUrlAddingDialog::addUrls( urls, targetDir, m_view );
0119 }
0120 
0121 
0122 void K3b::DataDirTreeView::slotMoveItemsRequested( QList<K3b::DataItem*> items, K3b::DirItem* targetDir )
0123 {
0124     DataUrlAddingDialog::moveItems( items, targetDir, m_view );
0125 }
0126 
0127 
0128 void K3b::DataDirTreeView::setCurrentDir( K3b::DirItem* dirItem )
0129 {
0130     selectionModel()->select( d->model->indexForItem( dirItem ), QItemSelectionModel::SelectCurrent );
0131 }
0132 
0133 
0134 
0135 #if 0
0136 void K3b::DataDirTreeView::startDropAnimation( K3b::DirItem* dir )
0137 {
0138     stopDropAnimation();
0139 
0140     K3b::DataDirViewItem* vI = m_itemMap[dir];
0141     if( vI ) {
0142         d->animationCounter = 0;
0143         d->animatedDirItem = vI;
0144         d->beforeAniPixmap = QPixmap( *vI->pixmap(0) );
0145         QTimer::singleShot( 0, this, SLOT(slotDropAnimate()) );
0146     }
0147 }
0148 
0149 
0150 void K3b::DataDirTreeView::slotDropAnimate()
0151 {
0152     if( d->animatedDirItem ) {
0153         if( d->animationCounter > 5 )
0154             stopDropAnimation();
0155         else {
0156             switch(d->animationCounter) {
0157             case 0:
0158                 d->animatedDirItem->setPixmap( QIcon::fromTheme( "folder-cyan" ).pixmap( KIconLoader::SizeSmall ) );
0159                 break;
0160             case 1:
0161                 d->animatedDirItem->setPixmap( QIcon::fromTheme( "folder-green" ).pixmap( KIconLoader::SizeSmall ) );
0162                 break;
0163             case 2:
0164                 d->animatedDirItem->setPixmap( QIcon::fromTheme( "folder-yellow" ).pixmap( KIconLoader::SizeSmall ) );
0165                 break;
0166             case 3:
0167                 d->animatedDirItem->setPixmap( QIcon::fromTheme( "folder-orange" ).pixmap( KIconLoader::SizeSmall ) );
0168                 break;
0169             case 4:
0170                 d->animatedDirItem->setPixmap( QIcon::fromTheme( "folder-red" ).pixmap( KIconLoader::SizeSmall ) );
0171                 break;
0172             case 5:
0173                 d->animatedDirItem->setPixmap( QIcon::fromTheme( "folder-violet" ).pixmap( KIconLoader::SizeSmall ) );
0174                 break;
0175             }
0176 
0177             d->animationCounter++;
0178             QTimer::singleShot( 300, this, SLOT(slotDropAnimate()) );
0179         }
0180     }
0181 }
0182 
0183 
0184 void K3b::DataDirTreeView::stopDropAnimation()
0185 {
0186     if( d->animatedDirItem ) {
0187         d->animatedDirItem->setPixmap( 0, d->beforeAniPixmap );
0188         d->animatedDirItem = 0;
0189     }
0190 }
0191 #endif
0192 
0193 #include "moc_k3bdatadirtreeview.cpp"