diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index 7cf74c544..4b88df85a 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -124,7 +124,6 @@ set( libGuiSources widgets/Breadcrumb.cpp widgets/BreadcrumbButton.cpp widgets/ChartDataLoader.cpp - widgets/CheckDirTree.cpp widgets/ClickableLabel.cpp widgets/ComboBox.cpp widgets/ElidedLabel.cpp diff --git a/src/libtomahawk/widgets/CheckDirTree.cpp b/src/libtomahawk/widgets/CheckDirTree.cpp deleted file mode 100644 index 5cc06659c..000000000 --- a/src/libtomahawk/widgets/CheckDirTree.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> === - * - * Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org> - * Copyright 2011, Leo Franchi <lfranchi@kde.org> - * - * Tomahawk 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 3 of the License, or - * (at your option) any later version. - * - * Tomahawk is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Tomahawk. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "CheckDirTree.h" - -#include "utils/Logger.h" -#include "TomahawkSettings.h" -#include "Source.h" - -#include <QCoreApplication> -#include <QProcess> -#ifdef Q_OS_MAC - #include <QTimer> -#endif - -static QString s_macVolumePath = "/Volumes"; - -CheckDirModel::CheckDirModel( QWidget* parent ) - : QFileSystemModel( parent ) - , m_shownVolumes( false ) -{ -#ifdef Q_OS_MAC - m_setFilePath = QString( "%1/SetFile" ) .arg( QCoreApplication::applicationDirPath() ); - m_getFileInfoPath = QString( "%1/GetFileInfo" ).arg( QCoreApplication::applicationDirPath() ); - - QProcess* checkVolumeVisible = new QProcess( this ); - connect( checkVolumeVisible, SIGNAL( readyReadStandardOutput() ), this, SLOT( getFileInfoResult() ) ); - qDebug() << "Running GetFileInfo:" << m_getFileInfoPath << "-aV" << s_macVolumePath; - checkVolumeVisible->start( m_getFileInfoPath, QStringList() << "-aV" << s_macVolumePath ); -#endif -} - -CheckDirModel::~CheckDirModel() -{ - cleanup(); -} - - -void -CheckDirModel::cleanup() -{ -#ifdef Q_OS_MAC - // reset to previous state - if ( m_shownVolumes ) - QProcess::startDetached( QString( "%1 -a V %2" ).arg( m_setFilePath ).arg( s_macVolumePath ) ); -#endif -} - -void -CheckDirModel::getFileInfoResult() -{ -#ifdef Q_OS_MAC - QProcess* p = qobject_cast< QProcess* >( sender() ); - Q_ASSERT( p ); - - QByteArray res = p->readAll().trimmed(); - qDebug() << "Got output from GetFileInfo:" << res; - // 1 means /Volumes is hidden, so we show it while the dialog is visible - if ( res == "1" ) - { - // Remove the hidden flag for the /Volumnes folder so all mount points are visible in the default (Q)FileSystemModel - QProcess* showProcess = new QProcess( this ); - qDebug() << "Running SetFile:" << QString( "%1 -a v %2" ).arg( m_setFilePath ).arg( s_macVolumePath ); - showProcess->start( QString( "%1 -a v %2" ).arg( m_setFilePath ).arg( s_macVolumePath ) ); - connect( showProcess, SIGNAL( readyReadStandardError() ), this, SLOT( processErrorOutput() ) ); - m_shownVolumes = true; - - QTimer::singleShot( 500, this, SLOT( volumeShowFinished() ) ); - } - - p->terminate(); - p->deleteLater(); -#endif -} - -void -CheckDirModel::volumeShowFinished() -{ -#if ! QT_VERSION >= QT_VERSION_CHECK( 5, 0, 0 ) -//FIXME: this has no equivalent in Qt5, does it just work there? - reset(); -#endif - -#ifdef Q_OS_MAC - // Make sure /Volumes is there, if not wait and try again - const QModelIndex parent = index("/"); - const int count = rowCount(parent); - bool found = false; - for ( int i = 0; i < count; i++ ) - { - if ( data( index( i, 0, parent ) ).toString() == "Volumes" ) - { - found = true; - break; - } - } - if ( !found ) - QTimer::singleShot( 500, this, SLOT( volumeShowFinished() ) ); -#endif -} - - -void -CheckDirModel::processErrorOutput() -{ - QProcess* p = qobject_cast< QProcess* >( sender() ); - Q_ASSERT( p ); - qDebug() << "Got ERROR OUTPUT from subprocess in CheckDirModel:" << p->readAll(); -} - - -Qt::ItemFlags -CheckDirModel::flags( const QModelIndex& index ) const -{ - return QFileSystemModel::flags( index ) | Qt::ItemIsUserCheckable; -} - - -QVariant -CheckDirModel::data( const QModelIndex& index, int role ) const -{ -#ifdef Q_WS_MAC - // return the 'My Computer' icon for the /Volumes folder - if ( index.column() == 0 && filePath( index ) == s_macVolumePath ) - { - switch ( role ) - { - case Qt::DecorationRole: - return myComputer( role ); - default: - break; - } - } -#endif - - if ( role == Qt::CheckStateRole ) - { - return m_checkTable.contains( index ) ? m_checkTable.value( index ) : Qt::Unchecked; - } - else - { - return QFileSystemModel::data( index, role ); - } -} - - -bool -CheckDirModel::setData( const QModelIndex& index, const QVariant& value, int role ) -{ - bool b = QFileSystemModel::setData( index, value, role ); - - if ( role == Qt::CheckStateRole ) - { - m_checkTable.insert( index, (Qt::CheckState)value.toInt() ); - emit dataChanged( index, index ); - emit dataChangedByUser( index ); - } - - return b; -} - - -void -CheckDirModel::setCheck( const QModelIndex& index, const QVariant& value ) -{ - QFileSystemModel::setData( index, value, Qt::CheckStateRole ); - m_checkTable.insert( index, (Qt::CheckState)value.toInt() ); - emit dataChanged( index, index ); -} - - -Qt::CheckState -CheckDirModel::getCheck( const QModelIndex& index ) -{ - return (Qt::CheckState)data( index, Qt::CheckStateRole ).toInt(); -} - - -CheckDirTree::CheckDirTree( QWidget* parent ) - : QTreeView( parent ) -{ - m_dirModel.setFilter( QDir::Dirs | QDir::NoDotAndDotDot ); - m_dirModel.setRootPath( "/" ); - - m_dirModel.setNameFilters( QStringList() << "[^\\.]*" ); - - setModel( &m_dirModel ); - setColumnHidden( 1, true ); - setColumnHidden( 2, true ); - setColumnHidden( 3, true ); - //header()->hide(); - - connect( &m_dirModel, SIGNAL( dataChangedByUser( QModelIndex ) ), - SLOT( updateNode( QModelIndex ) ) ); - connect( &m_dirModel, SIGNAL( dataChangedByUser( const QModelIndex& ) ), - SIGNAL( changed() ) ); - connect( &m_dirModel, SIGNAL( modelReset() ), - SLOT( modelReset() ) ); - - connect( this, SIGNAL( collapsed( QModelIndex ) ), - SLOT( onCollapse( QModelIndex ) ) ); - connect( this, SIGNAL( expanded( QModelIndex ) ), - SLOT( onExpand( QModelIndex ) ) ); -} - - -void -CheckDirTree::cleanup() -{ - m_dirModel.cleanup(); -} - - -void -CheckDirTree::checkPath( const QString& path, Qt::CheckState state ) -{ - QModelIndex index = m_dirModel.index( path ); - m_dirModel.setCheck( index, state ); - updateNode( index ); -} - - -void -CheckDirTree::setExclusions( const QStringList& list ) -{ - foreach ( const QString& path, list ) - { - checkPath( path, Qt::Unchecked ); - } -} - - -QStringList -CheckDirTree::getCheckedPaths() -{ - QStringList checks; - QModelIndex root = rootIndex(); - - getChecksForNode( root, checks ); - return checks; -} - - -void -CheckDirTree::getChecksForNode( const QModelIndex& index, QStringList& checks ) -{ - // Look at first node - // Is it checked? - // - move on to next node - // Is it unchecked? - // - add to list - // - move to next node - // Is it partially checked? - // - recurse - - int numChildren = m_dirModel.rowCount( index ); - for ( int i = 0; i < numChildren; ++i ) - { - QModelIndex kid = m_dirModel.index( i, 0, index ); - Qt::CheckState check = m_dirModel.getCheck( kid ); - if ( check == Qt::Checked ) - { - checks.append( m_dirModel.filePath( kid ) ); - } - else if ( check == Qt::Unchecked ) - { - continue; - } - else if ( check == Qt::PartiallyChecked ) - { - getChecksForNode( kid, checks ); - } - else - { - Q_ASSERT( false ); - } - } -} - - -QStringList -CheckDirTree::getExclusions() -{ - QStringList exclusions; - QModelIndex root = rootIndex(); - - getExclusionsForNode( root, exclusions ); - return exclusions; -} - - -void -CheckDirTree::getExclusionsForNode( const QModelIndex& index, QStringList& exclusions ) -{ - // Look at first node - // Is it checked? - // - move on to next node - // Is it unchecked? - // - add to list - // - move to next node - // Is it partially checked? - // - recurse - - int numChildren = m_dirModel.rowCount( index ); - for ( int i = 0; i < numChildren; ++i ) - { - QModelIndex kid = m_dirModel.index( i, 0, index ); - Qt::CheckState check = m_dirModel.getCheck( kid ); - if ( check == Qt::Checked ) - { - continue; - } - else if ( check == Qt::Unchecked ) - { - exclusions.append( m_dirModel.filePath( kid ) ); - } - else if ( check == Qt::PartiallyChecked ) - { - getExclusionsForNode( kid, exclusions ); - } - else - { - Q_ASSERT( false ); - } - } -} - - -void -CheckDirTree::onCollapse( const QModelIndex& /*idx*/ ) -{ - -} - - -void -CheckDirTree::onExpand( const QModelIndex& idx ) -{ - // If the node is partially checked, that means we have been below it - // setting some stuff, so only fill down if we are unchecked. - if ( m_dirModel.getCheck( idx ) != Qt::PartiallyChecked ) - { - fillDown( idx ); - } -} - - -void -CheckDirTree::updateNode( const QModelIndex& idx ) -{ - // Start by recursing down to the bottom and then work upwards - fillDown( idx ); - updateParent( idx ); -} - - -void -CheckDirTree::modelReset() -{ - foreach ( const QString& dir, TomahawkSettings::instance()->scannerPaths() ) - { - checkPath( dir, Qt::Checked ); - } -} - - -void -CheckDirTree::fillDown( const QModelIndex& parent ) -{ - // Recursion stops when we reach a directory which has never been expanded - // or one that has no children. - if ( !isExpanded( parent ) || !m_dirModel.hasChildren( parent ) ) - { - return; - } - - Qt::CheckState state = m_dirModel.getCheck( parent ); - int numChildren = m_dirModel.rowCount( parent ); - for ( int i = 0; i < numChildren; ++i ) - { - QModelIndex kid = m_dirModel.index( i, 0, parent ); - m_dirModel.setCheck( kid, state ); - fillDown( kid ); - } -} - - -void -CheckDirTree::updateParent( const QModelIndex& index ) -{ - QModelIndex parent = index.parent(); - if ( !parent.isValid() ) - { - // We have reached the root - return; - } - - // Initialise overall state to state of first child - QModelIndex kid = m_dirModel.index( 0, 0, parent ); - Qt::CheckState overall = m_dirModel.getCheck( kid ); - - int numChildren = m_dirModel.rowCount( parent ); - for ( int i = 1; i <= numChildren; ++i ) - { - kid = m_dirModel.index( i, 0, parent ); - Qt::CheckState state = m_dirModel.getCheck( kid ); - if ( state != overall ) - { - // If we ever come across a state different than the first child, - // we are partially checked - overall = Qt::PartiallyChecked; - break; - } - } - - m_dirModel.setCheck( parent, overall ); - updateParent( parent ); -} diff --git a/src/libtomahawk/widgets/CheckDirTree.h b/src/libtomahawk/widgets/CheckDirTree.h deleted file mode 100644 index d3b4ec9f0..000000000 --- a/src/libtomahawk/widgets/CheckDirTree.h +++ /dev/null @@ -1,93 +0,0 @@ -/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> === - * - * Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org> - * Copyright 2011, Leo Franchi <lfranchi@kde.org> - * - * Tomahawk 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 3 of the License, or - * (at your option) any later version. - * - * Tomahawk is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Tomahawk. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef CHECKDIRTREE_H -#define CHECKDIRTREE_H - -#include "DllMacro.h" - -#include <QFileSystemModel> -#include <QTreeView> - -class DLLEXPORT CheckDirModel : public QFileSystemModel -{ - Q_OBJECT - -public: - CheckDirModel( QWidget* parent = 0 ); - virtual ~CheckDirModel(); - - virtual Qt::ItemFlags flags( const QModelIndex& index ) const; - virtual QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const; - virtual bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ); - - void setCheck( const QModelIndex& index, const QVariant& value ); - Qt::CheckState getCheck( const QModelIndex& index ); - - void cleanup(); -signals: - void dataChangedByUser( const QModelIndex & index ); - -private slots: - void getFileInfoResult(); - void volumeShowFinished(); - void processErrorOutput(); -private: - QHash<QPersistentModelIndex, Qt::CheckState> m_checkTable; - - bool m_shownVolumes; - QString m_setFilePath; - QString m_getFileInfoPath; -}; - - -class DLLEXPORT CheckDirTree : public QTreeView -{ - Q_OBJECT - -public: - CheckDirTree( QWidget* parent ); - - void checkPath( const QString& path, Qt::CheckState state ); - - void setExclusions( const QStringList& list ); - QStringList getExclusions(); - QStringList getCheckedPaths(); - - void cleanup(); -signals: - void changed(); - -private slots: - void onCollapse( const QModelIndex& idx ); - void onExpand( const QModelIndex& idx ); - void updateNode( const QModelIndex& idx ); - - void modelReset(); -private: - CheckDirModel m_dirModel; - QSet<qint64> m_expandedSet; - - void fillDown( const QModelIndex& index ); - void updateParent( const QModelIndex& index ); - void getExclusionsForNode( const QModelIndex& index, QStringList& exclusions ); - void getChecksForNode( const QModelIndex& index, QStringList& checks ); -}; - -#endif // CHECKDIRTREE_H