source: calamares/trunk/fuentes/src/modules/partition/core/PartitionModel.cpp @ 7538

Last change on this file since 7538 was 7538, checked in by kbut, 13 months ago

sync with github

File size: 9.2 KB
Line 
1/* === This file is part of Calamares - <https://github.com/calamares> ===
2 *
3 *   Copyright 2014, Aurélien Gâteau <agateau@kde.org>
4 *
5 *   Calamares is free software: you can redistribute it and/or modify
6 *   it under the terms of the GNU General Public License as published by
7 *   the Free Software Foundation, either version 3 of the License, or
8 *   (at your option) any later version.
9 *
10 *   Calamares is distributed in the hope that it will be useful,
11 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 *   GNU General Public License for more details.
14 *
15 *   You should have received a copy of the GNU General Public License
16 *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include "core/PartitionModel.h"
20
21#include "core/ColorUtils.h"
22#include "core/PartitionInfo.h"
23#include "core/KPMHelpers.h"
24#include "utils/Logger.h"
25
26// CalaPM
27#include <kpmcore/core/device.h>
28#include <kpmcore/core/partition.h>
29#include <kpmcore/core/partitiontable.h>
30#include <kpmcore/fs/filesystem.h>
31
32// KF5
33#include <KFormat>
34
35// Qt
36#include <QColor>
37
38//- ResetHelper --------------------------------------------
39PartitionModel::ResetHelper::ResetHelper( PartitionModel* model )
40    : m_model( model )
41{
42    m_model->beginResetModel();
43}
44
45PartitionModel::ResetHelper::~ResetHelper()
46{
47    m_model->endResetModel();
48}
49
50//- PartitionModel -----------------------------------------
51PartitionModel::PartitionModel( QObject* parent )
52    : QAbstractItemModel( parent )
53    , m_device( nullptr )
54{
55}
56
57void
58PartitionModel::init( Device* device , const OsproberEntryList& osproberEntries )
59{
60    beginResetModel();
61    m_device = device;
62    m_osproberEntries = osproberEntries;
63    endResetModel();
64}
65
66int
67PartitionModel::columnCount( const QModelIndex& parent ) const
68{
69    return ColumnCount;
70}
71
72int
73PartitionModel::rowCount( const QModelIndex& parent ) const
74{
75    Partition* parentPartition = partitionForIndex( parent );
76    if ( parentPartition )
77        return parentPartition->children().count();
78    PartitionTable* table = m_device->partitionTable();
79    return table ? table->children().count() : 0;
80}
81
82QModelIndex
83PartitionModel::index( int row, int column, const QModelIndex& parent ) const
84{
85    PartitionNode* parentPartition = parent.isValid()
86                                     ? static_cast< PartitionNode* >( partitionForIndex( parent ) )
87                                     : static_cast< PartitionNode* >( m_device->partitionTable() );
88    if ( !parentPartition )
89        return QModelIndex();
90    auto lst = parentPartition->children();
91    if ( row < 0 || row >= lst.count() )
92        return QModelIndex();
93    if ( column < 0 || column >= ColumnCount )
94        return QModelIndex();
95    Partition* partition = parentPartition->children().at( row );
96    return createIndex( row, column, partition );
97}
98
99QModelIndex
100PartitionModel::parent( const QModelIndex& child ) const
101{
102    if ( !child.isValid() )
103        return QModelIndex();
104    Partition* partition = partitionForIndex( child );
105    if ( !partition )
106        return QModelIndex();
107    PartitionNode* parentNode = partition->parent();
108    if ( parentNode == m_device->partitionTable() )
109        return QModelIndex();
110
111    int row = 0;
112    for ( auto p : m_device->partitionTable()->children() )
113    {
114        if ( parentNode == p )
115            return createIndex( row, 0, parentNode );
116        ++row;
117    }
118    cWarning() << "No parent found!";
119    return QModelIndex();
120}
121
122QVariant
123PartitionModel::data( const QModelIndex& index, int role ) const
124{
125    Partition* partition = partitionForIndex( index );
126    if ( !partition )
127        return QVariant();
128
129    switch ( role )
130    {
131    case Qt::DisplayRole:
132    {
133        int col = index.column();
134        if ( col == NameColumn )
135        {
136            if ( KPMHelpers::isPartitionFreeSpace( partition ) )
137                return tr( "Free Space" );
138            else
139            {
140                return KPMHelpers::isPartitionNew( partition )
141                       ? tr( "New partition" )
142                       : partition->partitionPath();
143            }
144        }
145        if ( col == FileSystemColumn )
146            return KPMHelpers::prettyNameForFileSystemType( partition->fileSystem().type() );
147        if ( col == MountPointColumn )
148            return PartitionInfo::mountPoint( partition );
149        if ( col == SizeColumn )
150        {
151            qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize();
152            return KFormat().formatByteSize( size );
153        }
154        cDebug() << "Unknown column" << col;
155        return QVariant();
156    }
157    case Qt::DecorationRole:
158        if ( index.column() == NameColumn )
159            return ColorUtils::colorForPartition( partition );
160        else
161            return QVariant();
162    case Qt::ToolTipRole:
163    {
164        int col = index.column();
165        QString name;
166        if ( col == NameColumn )
167        {
168            if ( KPMHelpers::isPartitionFreeSpace( partition ) )
169                name = tr( "Free Space" );
170            else
171            {
172                name = KPMHelpers::isPartitionNew( partition )
173                        ? tr( "New partition" )
174                        : partition->partitionPath();
175            }
176        }
177        QString prettyFileSystem = KPMHelpers::prettyNameForFileSystemType( partition->fileSystem().type() );
178        qint64 size = ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize();
179        QString prettySize = KFormat().formatByteSize( size );
180        return QVariant(name + " " + prettyFileSystem + " " + prettySize);
181    }
182    case SizeRole:
183        return ( partition->lastSector() - partition->firstSector() + 1 ) * m_device->logicalSize();
184    case IsFreeSpaceRole:
185        return KPMHelpers::isPartitionFreeSpace( partition );
186
187    case IsPartitionNewRole:
188        return KPMHelpers::isPartitionNew( partition );
189
190    case FileSystemLabelRole:
191        if ( partition->fileSystem().supportGetLabel() != FileSystem::cmdSupportNone &&
192             !partition->fileSystem().label().isEmpty() )
193            return partition->fileSystem().label();
194        return QVariant();
195
196    case FileSystemTypeRole:
197        return partition->fileSystem().type();
198
199    case PartitionPathRole:
200        return partition->partitionPath();
201
202    case PartitionPtrRole:
203        return qVariantFromValue( (void*)partition );
204
205    // Osprober roles:
206    case OsproberNameRole:
207        foreach ( const OsproberEntry& osproberEntry, m_osproberEntries )
208            if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone &&
209                 !partition->fileSystem().uuid().isEmpty() &&
210                 osproberEntry.uuid == partition->fileSystem().uuid() )
211                return osproberEntry.prettyName;
212        return QVariant();
213    case OsproberPathRole:
214        foreach ( const OsproberEntry& osproberEntry, m_osproberEntries )
215            if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone &&
216                 !partition->fileSystem().uuid().isEmpty() &&
217                 osproberEntry.uuid == partition->fileSystem().uuid() )
218                return osproberEntry.path;
219        return QVariant();
220    case OsproberCanBeResizedRole:
221        foreach ( const OsproberEntry& osproberEntry, m_osproberEntries )
222            if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone &&
223                 !partition->fileSystem().uuid().isEmpty() &&
224                 osproberEntry.uuid == partition->fileSystem().uuid() )
225                return osproberEntry.canBeResized;
226        return QVariant();
227    case OsproberRawLineRole:
228        foreach ( const OsproberEntry& osproberEntry, m_osproberEntries )
229            if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone &&
230                 !partition->fileSystem().uuid().isEmpty() &&
231                 osproberEntry.uuid == partition->fileSystem().uuid() )
232                return osproberEntry.line;
233        return QVariant();
234    case OsproberHomePartitionPathRole:
235        foreach ( const OsproberEntry& osproberEntry, m_osproberEntries )
236            if ( partition->fileSystem().supportGetUUID() != FileSystem::cmdSupportNone &&
237                 !partition->fileSystem().uuid().isEmpty() &&
238                 osproberEntry.uuid == partition->fileSystem().uuid() )
239                return osproberEntry.homePath;
240        return QVariant();
241    // end Osprober roles.
242
243    default:
244        return QVariant();
245    }
246}
247
248QVariant
249PartitionModel::headerData( int section, Qt::Orientation orientation, int role ) const
250{
251    if ( role != Qt::DisplayRole )
252        return QVariant();
253
254    switch ( section )
255    {
256    case NameColumn:
257        return tr( "Name" );
258    case FileSystemColumn:
259        return tr( "File System" );
260    case MountPointColumn:
261        return tr( "Mount Point" );
262    case SizeColumn:
263        return tr( "Size" );
264    default:
265        cDebug() << "Unknown column" << section;
266        return QVariant();
267    }
268}
269
270Partition*
271PartitionModel::partitionForIndex( const QModelIndex& index ) const
272{
273    if ( !index.isValid() )
274        return nullptr;
275    return reinterpret_cast< Partition* >( index.internalPointer() );
276}
277
278
279void
280PartitionModel::update()
281{
282    emit dataChanged( index( 0, 0 ), index( rowCount() - 1, columnCount() - 1 ) );
283}
Note: See TracBrowser for help on using the repository browser.