1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-19 15:29:42 +01:00

* Removed obsolete CheckDirTree.

This commit is contained in:
Christian Muehlhaeuser 2014-10-12 12:01:01 +02:00
parent f4336b4d35
commit 59de1e8180
3 changed files with 0 additions and 528 deletions

View File

@ -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

View File

@ -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 );
}

View File

@ -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