calamares/src/modules/partition/core/PartitionModel.cpp

198 lines
5.6 KiB
C++
Raw Normal View History

2014-06-27 17:25:39 +02:00
/* === This file is part of Calamares - <http://github.com/calamares> ===
*
* Copyright 2014, Aurélien Gâteau <agateau@kde.org>
*
* Calamares 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.
*
* Calamares 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 Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include <core/PartitionModel.h>
2014-06-27 17:25:39 +02:00
#include <core/ColorUtils.h>
#include <core/PartitionInfo.h>
#include <core/PMUtils.h>
#include <utils/Logger.h>
2014-06-30 15:03:29 +02:00
2014-06-27 17:25:39 +02:00
// CalaPM
#include <core/device.h>
#include <core/partition.h>
#include <core/partitiontable.h>
#include <fs/filesystem.h>
2014-07-02 17:25:59 +02:00
// KF5
#include <KFormat>
2014-07-29 13:36:48 +02:00
// Qt
#include <QColor>
//- ResetHelper --------------------------------------------
PartitionModel::ResetHelper::ResetHelper( PartitionModel* model )
2014-08-05 09:54:30 +02:00
: m_model( model )
2014-06-27 17:25:39 +02:00
{
m_model->beginResetModel();
2014-06-27 17:25:39 +02:00
}
PartitionModel::ResetHelper::~ResetHelper()
{
m_model->endResetModel();
}
//- PartitionModel -----------------------------------------
PartitionModel::PartitionModel( QObject* parent )
: QAbstractItemModel( parent )
, m_device( nullptr )
2014-06-27 17:25:39 +02:00
{
}
void
PartitionModel::init( Device* device )
{
beginResetModel();
m_device = device;
2014-06-27 17:25:39 +02:00
endResetModel();
}
int
PartitionModel::columnCount( const QModelIndex& parent ) const
{
return ColumnCount;
}
2014-06-27 17:25:39 +02:00
int
PartitionModel::rowCount( const QModelIndex& parent ) const
{
Partition* parentPartition = partitionForIndex( parent );
if ( parentPartition )
return parentPartition->children().count();
PartitionTable* table = m_device->partitionTable();
return table ? table->children().count() : 0;
}
QModelIndex
PartitionModel::index( int row, int column, const QModelIndex& parent ) const
{
PartitionNode* parentPartition = parent.isValid()
2014-08-05 09:54:30 +02:00
? static_cast< PartitionNode* >( partitionForIndex( parent ) )
: static_cast< PartitionNode* >( m_device->partitionTable() );
if ( !parentPartition )
return QModelIndex();
auto lst = parentPartition->children();
if ( row < 0 || row >= lst.count() )
return QModelIndex();
if ( column < 0 || column >= ColumnCount )
return QModelIndex();
Partition* partition = parentPartition->children().at( row );
return createIndex( row, column, partition );
}
QModelIndex
PartitionModel::parent( const QModelIndex& child ) const
{
if ( !child.isValid() )
return QModelIndex();
Partition* partition = partitionForIndex( child );
2015-06-21 01:21:06 +02:00
if ( !partition )
return QModelIndex();
PartitionNode* parentNode = partition->parent();
if ( parentNode == m_device->partitionTable() )
return QModelIndex();
int row = 0;
for ( auto p : m_device->partitionTable()->children() )
{
if ( parentNode == p )
return createIndex( row, 0, parentNode );
++row;
}
cLog() << "No parent found!";
return QModelIndex();
2014-06-27 17:25:39 +02:00
}
QVariant
PartitionModel::data( const QModelIndex& index, int role ) const
{
Partition* partition = partitionForIndex( index );
if ( !partition )
2014-06-27 17:25:39 +02:00
return QVariant();
switch ( role )
{
case Qt::DisplayRole:
{
int col = index.column();
if ( col == NameColumn )
2014-06-27 17:25:39 +02:00
{
if ( PMUtils::isPartitionFreeSpace( partition ) )
return tr( "Free Space" );
else
{
return PMUtils::isPartitionNew( partition )
? tr( "New partition" )
: partition->partitionPath();
}
}
if ( col == FileSystemColumn )
return partition->fileSystem().name();
if ( col == MountPointColumn )
return PartitionInfo::mountPoint( partition );
if ( col == SizeColumn )
{
qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSectorSize();
return KFormat().formatByteSize( size );
}
cDebug() << "Unknown column" << col;
return QVariant();
}
2014-07-29 13:36:48 +02:00
case Qt::DecorationRole:
if ( index.column() == NameColumn )
return ColorUtils::colorForPartition( partition );
2014-07-29 13:36:48 +02:00
else
return QVariant();
2014-07-29 13:37:12 +02:00
case SizeRole:
return ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSectorSize();
2014-07-29 15:56:00 +02:00
case IsFreeSpaceRole:
return PMUtils::isPartitionFreeSpace( partition );
2014-06-27 17:25:39 +02:00
default:
return QVariant();
}
}
2014-07-25 13:13:04 +02:00
QVariant
PartitionModel::headerData( int section, Qt::Orientation orientation, int role ) const
{
if ( role != Qt::DisplayRole )
return QVariant();
switch ( section )
{
case NameColumn:
return tr( "Name" );
case FileSystemColumn:
return tr( "File System" );
case MountPointColumn:
2014-07-28 15:00:30 +02:00
return tr( "Mount Point" );
2014-07-25 13:13:04 +02:00
case SizeColumn:
2014-07-28 15:00:30 +02:00
return tr( "Size" );
2014-07-25 13:13:04 +02:00
default:
cDebug() << "Unknown column" << section;
return QVariant();
}
}
Partition*
PartitionModel::partitionForIndex( const QModelIndex& index ) const
{
if ( !index.isValid() )
return nullptr;
return reinterpret_cast< Partition* >( index.internalPointer() );
}