Compare commits

...

15 Commits

Author SHA1 Message Date
Adriaan de Groot
3aa4b7368c [partition] Log partition-model lookup failures 2021-12-15 13:57:20 +01:00
Adriaan de Groot
288674a924 [partition] Stub validator for LV name
- An empty LV name isn't allowed, but the create-partition-dialog
  doesn't check for that.
2021-12-15 13:01:58 +01:00
Adriaan de Groot
30b5be0fd4 [partition] Use name PartitionVector consistently
- move definition to a central place,
- drop per-class definitions and corresponding checks,
- use it and add constness as appropriate.
2021-12-15 12:19:59 +01:00
Adriaan de Groot
10334ab14f [partition] More constness, fixes build 2021-12-15 00:30:23 +01:00
Adriaan de Groot
46d69b04d4 [partition] Make the naming of type PartitionVector consistent
- static assert that various names are consistent (in gui, because we can have
  a dependency gui->core)
2021-12-15 00:20:23 +01:00
Adriaan de Groot
f1185d38d8 [partition] Drop unneeded parameters and stored references
- the dialog can return, by value, the selected PVs and
  doesn't need to hold a reference to external storage.

Doesn't compile because the actions in core want a reference.
2021-12-14 17:52:13 +01:00
Adriaan de Groot
2c16d812cd [partition] Factor out determining which PVs exist 2021-12-14 17:27:15 +01:00
Adriaan de Groot
7a071207a2 [partition] Hit VG code with a hammer until it compiles again 2021-12-14 16:53:33 +01:00
Adriaan de Groot
3edfa5ebb5 [partition] Sanitize the base dialog for VGs
- force broken compilation by changing order of parameters to
  constructor; this is to help identify all the consumers.
- improve naming of UI-access-methods.
2021-12-14 16:28:25 +01:00
Adriaan de Groot
898f4498e8 [partition] document UI-accessors as such 2021-12-14 16:02:26 +01:00
Adriaan de Groot
e2d5f01aa1 [partition] Group partition- and VG-methods 2021-12-14 15:53:50 +01:00
Adriaan de Groot
8d7c08612f [partition] Conventional const-ness 2021-12-14 15:52:41 +01:00
Adriaan de Groot
febc5f5b41 [partition] Conventional const-ness 2021-12-14 15:50:04 +01:00
Adriaan de Groot
35a4273127 [partition] Avoid storing references; provide getter for dialog. 2021-12-14 15:43:58 +01:00
Adriaan de Groot
4402ebd8e8 [partition] Clarify name peSize 2021-12-14 15:24:58 +01:00
16 changed files with 153 additions and 188 deletions

View File

@@ -19,6 +19,7 @@
#include <kpmcore/util/report.h> #include <kpmcore/util/report.h>
#include <QList> #include <QList>
#include <QVector>
#include <functional> #include <functional>
@@ -37,6 +38,8 @@ class PartitionRole;
#define KPM_PARTITION_FLAG_ESP PartitionTable::FlagEsp #define KPM_PARTITION_FLAG_ESP PartitionTable::FlagEsp
#endif #endif
using PartitionVector = QVector< const Partition* >;
/** /**
* Helper functions to manipulate partitions * Helper functions to manipulate partitions
*/ */

View File

@@ -262,9 +262,7 @@ PartitionCoreModule::doInit()
// Gives ownership of the Device* to the DeviceInfo object // Gives ownership of the Device* to the DeviceInfo object
auto deviceInfo = new DeviceInfo( device ); auto deviceInfo = new DeviceInfo( device );
m_deviceInfos << deviceInfo; m_deviceInfos << deviceInfo;
cDebug() << Logger::SubEntry cDebug() << Logger::SubEntry << device->deviceNode() << device->capacity()
<< device->deviceNode()
<< device->capacity()
<< Logger::RedactedName( "DevName", device->name() ) << Logger::RedactedName( "DevName", device->name() )
<< Logger::RedactedName( "DevNamePretty", device->prettyName() ); << Logger::RedactedName( "DevNamePretty", device->prettyName() );
} }
@@ -360,7 +358,12 @@ PartitionModel*
PartitionCoreModule::partitionModelForDevice( const Device* device ) const PartitionCoreModule::partitionModelForDevice( const Device* device ) const
{ {
DeviceInfo* info = infoForDevice( device ); DeviceInfo* info = infoForDevice( device );
Q_ASSERT( info ); if ( !info )
{
cWarning() << "No DeviceInfo for" << Logger::Pointer( device )
<< ( device ? device->deviceNode() : QStringLiteral( "<null>" ) );
return nullptr;
}
return info->partitionModel.data(); return info->partitionModel.data();
} }
@@ -411,15 +414,16 @@ PartitionCoreModule::createPartition( Device* device, Partition* partition, Part
} }
void void
PartitionCoreModule::createVolumeGroup( QString& vgName, QVector< const Partition* > pvList, qint32 peSize ) PartitionCoreModule::createVolumeGroup( const QString& vgName, const PartitionVector& pvList, qint32 peSize )
{ {
QString actualName( vgName );
// Appending '_' character in case of repeated VG name // Appending '_' character in case of repeated VG name
while ( hasVGwithThisName( vgName ) ) while ( hasVGwithThisName( actualName ) )
{ {
vgName.append( '_' ); actualName.append( '_' );
} }
LvmDevice* device = new LvmDevice( vgName ); LvmDevice* device = new LvmDevice( actualName );
for ( const Partition* p : pvList ) for ( const Partition* p : pvList )
{ {
device->physicalVolumes() << p; device->physicalVolumes() << p;
@@ -430,12 +434,12 @@ PartitionCoreModule::createVolumeGroup( QString& vgName, QVector< const Partitio
m_deviceModel->addDevice( device ); m_deviceModel->addDevice( device );
m_deviceInfos << deviceInfo; m_deviceInfos << deviceInfo;
deviceInfo->makeJob< CreateVolumeGroupJob >( vgName, pvList, peSize ); deviceInfo->makeJob< CreateVolumeGroupJob >( actualName, pvList, peSize );
refreshAfterModelChange(); refreshAfterModelChange();
} }
void void
PartitionCoreModule::resizeVolumeGroup( LvmDevice* device, QVector< const Partition* >& pvList ) PartitionCoreModule::resizeVolumeGroup( LvmDevice* device, const PartitionVector& pvList )
{ {
auto* deviceInfo = infoForDevice( device ); auto* deviceInfo = infoForDevice( device );
Q_ASSERT( deviceInfo ); Q_ASSERT( deviceInfo );
@@ -676,7 +680,7 @@ PartitionCoreModule::efiSystemPartitions() const
return m_efiSystemPartitions; return m_efiSystemPartitions;
} }
QVector< const Partition* > PartitionVector
PartitionCoreModule::lvmPVs() const PartitionCoreModule::lvmPVs() const
{ {
return m_lvmPVs; return m_lvmPVs;

View File

@@ -136,25 +136,18 @@ public:
*/ */
void void
createPartition( Device* device, Partition* partition, PartitionTable::Flags flags = KPM_PARTITION_FLAG( None ) ); createPartition( Device* device, Partition* partition, PartitionTable::Flags flags = KPM_PARTITION_FLAG( None ) );
void deletePartition( Device* device, Partition* partition );
void formatPartition( Device* device, Partition* partition );
void resizePartition( Device* device, Partition* partition, qint64 first, qint64 last );
void setPartitionFlags( Device* device, Partition* partition, PartitionTable::Flags flags );
void createVolumeGroup( QString& vgName, QVector< const Partition* > pvList, qint32 peSize ); void createVolumeGroup( const QString& vgName, const PartitionVector& pvList, qint32 peSize );
void resizeVolumeGroup( LvmDevice* device, const PartitionVector& pvList );
void resizeVolumeGroup( LvmDevice* device, QVector< const Partition* >& pvList );
void deactivateVolumeGroup( LvmDevice* device ); void deactivateVolumeGroup( LvmDevice* device );
void removeVolumeGroup( LvmDevice* device ); void removeVolumeGroup( LvmDevice* device );
void deletePartition( Device* device, Partition* partition );
void formatPartition( Device* device, Partition* partition );
void setFilesystemLabel( Device* device, Partition* partition, const QString& newLabel ); void setFilesystemLabel( Device* device, Partition* partition, const QString& newLabel );
void resizePartition( Device* device, Partition* partition, qint64 first, qint64 last );
void setPartitionFlags( Device* device, Partition* partition, PartitionTable::Flags flags );
/// @brief Retrieve the path where the bootloader will be installed /// @brief Retrieve the path where the bootloader will be installed
QString bootLoaderInstallPath() const { return m_bootLoaderInstallPath; } QString bootLoaderInstallPath() const { return m_bootLoaderInstallPath; }
/// @brief Set the path where the bootloader will be installed /// @brief Set the path where the bootloader will be installed
@@ -185,7 +178,7 @@ public:
QList< Partition* > efiSystemPartitions() const; QList< Partition* > efiSystemPartitions() const;
QVector< const Partition* > lvmPVs() const; PartitionVector lvmPVs() const;
bool hasVGwithThisName( const QString& name ) const; bool hasVGwithThisName( const QString& name ) const;
@@ -255,7 +248,7 @@ private:
QList< DeviceInfo* > m_deviceInfos; QList< DeviceInfo* > m_deviceInfos;
QList< Partition* > m_efiSystemPartitions; QList< Partition* > m_efiSystemPartitions;
QVector< const Partition* > m_lvmPVs; PartitionVector m_lvmPVs;
DeviceModel* m_deviceModel; DeviceModel* m_deviceModel;
BootLoaderModel* m_bootLoaderModel; BootLoaderModel* m_bootLoaderModel;

View File

@@ -66,19 +66,22 @@ CreatePartitionDialog::CreatePartitionDialog( Device* device,
m_ui->encryptWidget->setText( tr( "En&crypt" ) ); m_ui->encryptWidget->setText( tr( "En&crypt" ) );
m_ui->encryptWidget->hide(); m_ui->encryptWidget->hide();
if ( m_device->type() != Device::Type::LVM_Device )
{
m_ui->lvNameLabel->hide();
m_ui->lvNameLineEdit->hide();
}
if ( m_device->type() == Device::Type::LVM_Device ) if ( m_device->type() == Device::Type::LVM_Device )
{ {
m_ui->lvNameLabel->show();
m_ui->lvNameLineEdit->show();
/* LVM logical volume name can consist of: letters numbers _ . - + /* LVM logical volume name can consist of: letters numbers _ . - +
* It cannot start with underscore _ and must not be equal to . or .. or any entry in /dev/ * It cannot start with underscore _ and must not be equal to . or .. or any entry in /dev/
* QLineEdit accepts QValidator::Intermediate, so we just disable . at the beginning */ * QLineEdit accepts QValidator::Intermediate, so we just disable . at the beginning */
QRegularExpression re( QStringLiteral( R"(^(?!_|\.)[\w\-.+]+)" ) ); QRegularExpression re( QStringLiteral( R"(^(?!_|\.)[\w\-.+]+)" ) );
QRegularExpressionValidator* validator = new QRegularExpressionValidator( re, this ); QRegularExpressionValidator* validator = new QRegularExpressionValidator( re, this );
m_ui->lvNameLineEdit->setValidator( validator ); m_ui->lvNameLineEdit->setValidator( validator );
connect( m_ui->lvNameLineEdit, &QLineEdit::textChanged, this, &CreatePartitionDialog::updateOkButton );
}
else
{
m_ui->lvNameLabel->hide();
m_ui->lvNameLineEdit->hide();
} }
if ( device->partitionTable()->type() == PartitionTable::msdos if ( device->partitionTable()->type() == PartitionTable::msdos
@@ -347,3 +350,13 @@ CreatePartitionDialog::initPartResizerWidget( Partition* partition )
m_partitionSizeController->setPartResizerWidget( m_ui->partResizerWidget ); m_partitionSizeController->setPartResizerWidget( m_ui->partResizerWidget );
m_partitionSizeController->setSpinBox( m_ui->sizeSpinBox ); m_partitionSizeController->setSpinBox( m_ui->sizeSpinBox );
} }
void
CreatePartitionDialog::updateOkButton()
{
if ( m_device->type() == Device::Type::LVM_Device )
{
QString lvName = m_ui->lvNameLineEdit->text();
cDebug() << "LVName" << lvName << m_ui->lvNameLineEdit->hasAcceptableInput();
}
}

View File

@@ -45,10 +45,12 @@ private:
QWidget* parentWidget ); QWidget* parentWidget );
public: public:
/// @brief Tag-type for creating partition from free space
struct FreeSpace struct FreeSpace
{ {
Partition* p; Partition* p;
}; };
/// @brief Tag-type for editing (re-creating) a new partition
struct FreshPartition struct FreshPartition
{ {
Partition* p; Partition* p;
@@ -81,6 +83,7 @@ public:
private Q_SLOTS: private Q_SLOTS:
void updateMountPointUi(); void updateMountPointUi();
void checkMountPointSelection(); void checkMountPointSelection();
void updateOkButton(); // Check if dialog can be accepted
private: private:
QScopedPointer< Ui_CreatePartitionDialog > m_ui; QScopedPointer< Ui_CreatePartitionDialog > m_ui;

View File

@@ -16,32 +16,13 @@
#include <QLineEdit> #include <QLineEdit>
#include <QSpinBox> #include <QSpinBox>
CreateVolumeGroupDialog::CreateVolumeGroupDialog( QString& vgName, CreateVolumeGroupDialog::CreateVolumeGroupDialog( const PartitionVector& pvList,
QVector< const Partition* >& selectedPVs, qint32 physicalExtentSize,
QVector< const Partition* > pvList,
qint64& pSize,
QWidget* parent ) QWidget* parent )
: VolumeGroupBaseDialog( vgName, pvList, parent ) : VolumeGroupBaseDialog( parent, QString(), pvList )
, m_selectedPVs( selectedPVs )
, m_peSize( pSize )
{ {
setWindowTitle( tr( "Create Volume Group" ) ); setWindowTitle( tr( "Create Volume Group" ) );
peSize()->setValue( pSize ); peSizeWidget()->setValue( physicalExtentSize );
vgTypeWidget()->setEnabled( false );
vgType()->setEnabled( false );
}
void
CreateVolumeGroupDialog::accept()
{
QString& name = vgNameValue();
name = vgName()->text();
m_selectedPVs << checkedItems();
qint64& pe = m_peSize;
pe = peSize()->value();
QDialog::accept();
} }

View File

@@ -16,18 +16,7 @@ class CreateVolumeGroupDialog : public VolumeGroupBaseDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
CreateVolumeGroupDialog( QString& vgName, CreateVolumeGroupDialog( const PartitionVector& pvList, qint32 physicalExtentSize, QWidget* parent );
QVector< const Partition* >& selectedPVs,
QVector< const Partition* > pvList,
qint64& pSize,
QWidget* parent );
void accept() override;
private:
QVector< const Partition* >& m_selectedPVs;
qint64& m_peSize;
}; };
#endif // CREATEVOLUMEGROUPDIALOG_H #endif // CREATEVOLUMEGROUPDIALOG_H

View File

@@ -278,26 +278,30 @@ PartitionPage::checkCanCreate( Device* device )
} }
} }
void static inline PartitionVector
PartitionPage::onNewVolumeGroupClicked() availablePVs( PartitionCoreModule* core )
{ {
QString vgName; PartitionVector availablePVs;
QVector< const Partition* > selectedPVs;
qint64 peSize = 4;
QVector< const Partition* > availablePVs; for ( const Partition* p : core->lvmPVs() )
{
for ( const Partition* p : m_core->lvmPVs() ) if ( !core->isInVG( p ) )
if ( !m_core->isInVG( p ) )
{ {
availablePVs << p; availablePVs << p;
} }
}
return availablePVs;
}
QPointer< CreateVolumeGroupDialog > dlg
= new CreateVolumeGroupDialog( vgName, selectedPVs, availablePVs, peSize, this ); void
PartitionPage::onNewVolumeGroupClicked()
{
QPointer< CreateVolumeGroupDialog > dlg = new CreateVolumeGroupDialog( availablePVs( m_core ), 4, this );
if ( dlg->exec() == QDialog::Accepted ) if ( dlg->exec() == QDialog::Accepted )
{ {
const PartitionVector selectedPVs = dlg->selectedPVs();
QModelIndex partitionIndex = m_ui->partitionTreeView->currentIndex(); QModelIndex partitionIndex = m_ui->partitionTreeView->currentIndex();
if ( partitionIndex.isValid() ) if ( partitionIndex.isValid() )
@@ -321,7 +325,7 @@ PartitionPage::onNewVolumeGroupClicked()
QVariant previousIndexDeviceData = m_core->deviceModel()->data( deviceIndex, Qt::ToolTipRole ); QVariant previousIndexDeviceData = m_core->deviceModel()->data( deviceIndex, Qt::ToolTipRole );
// Creating new VG // Creating new VG
m_core->createVolumeGroup( vgName, selectedPVs, peSize ); m_core->createVolumeGroup( dlg->volumeGroupName(), selectedPVs, dlg->physicalExtentSize() );
// As createVolumeGroup method call resets deviceModel, // As createVolumeGroup method call resets deviceModel,
// is needed to set the current index in deviceComboBox as the previous one // is needed to set the current index in deviceComboBox as the previous one
@@ -342,20 +346,11 @@ PartitionPage::onResizeVolumeGroupClicked()
Q_ASSERT( device && device->type() == Device::Type::LVM_Device ); Q_ASSERT( device && device->type() == Device::Type::LVM_Device );
QVector< const Partition* > availablePVs; QPointer< ResizeVolumeGroupDialog > dlg = new ResizeVolumeGroupDialog( device, availablePVs( m_core ), this );
QVector< const Partition* > selectedPVs;
for ( const Partition* p : m_core->lvmPVs() )
if ( !m_core->isInVG( p ) )
{
availablePVs << p;
}
QPointer< ResizeVolumeGroupDialog > dlg = new ResizeVolumeGroupDialog( device, availablePVs, selectedPVs, this );
if ( dlg->exec() == QDialog::Accepted ) if ( dlg->exec() == QDialog::Accepted )
{ {
m_core->resizeVolumeGroup( device, selectedPVs ); m_core->resizeVolumeGroup( device, dlg->selectedPVs() );
} }
delete dlg; delete dlg;

View File

@@ -22,38 +22,28 @@
ResizeVolumeGroupDialog::ResizeVolumeGroupDialog( LvmDevice* device, ResizeVolumeGroupDialog::ResizeVolumeGroupDialog( LvmDevice* device,
const PartitionVector& availablePVs, const PartitionVector& availablePVs,
PartitionVector& selectedPVs,
QWidget* parent ) QWidget* parent )
: VolumeGroupBaseDialog( device->name(), device->physicalVolumes(), parent ) : VolumeGroupBaseDialog( parent, device->name(), device->physicalVolumes() )
, m_selectedPVs( selectedPVs )
{ {
setWindowTitle( tr( "Resize Volume Group" ) ); setWindowTitle( tr( "Resize Volume Group" ) );
for ( int i = 0; i < pvList()->count(); i++ ) for ( int i = 0; i < pvListWidget()->count(); i++ )
{ {
pvList()->item( i )->setCheckState( Qt::Checked ); pvListWidget()->item( i )->setCheckState( Qt::Checked );
} }
for ( const Partition* p : availablePVs ) for ( const Partition* p : availablePVs )
{ {
pvList()->addItem( new ListPhysicalVolumeWidgetItem( p, false ) ); pvListWidget()->addItem( new ListPhysicalVolumeWidgetItem( p, false ) );
} }
peSize()->setValue( peSizeWidget()->setValue(
static_cast< int >( device->peSize() / Capacity::unitFactor( Capacity::Unit::Byte, Capacity::Unit::MiB ) ) ); static_cast< int >( device->peSize() / Capacity::unitFactor( Capacity::Unit::Byte, Capacity::Unit::MiB ) ) );
vgName()->setEnabled( false ); vgNameWidget()->setEnabled( false );
peSize()->setEnabled( false ); peSizeWidget()->setEnabled( false );
vgType()->setEnabled( false ); vgTypeWidget()->setEnabled( false );
setUsedSizeValue( device->allocatedPE() * device->peSize() ); setUsedSizeValue( device->allocatedPE() * device->peSize() );
setLVQuantity( device->partitionTable()->children().count() ); setLVQuantity( device->partitionTable()->children().count() );
} }
void
ResizeVolumeGroupDialog::accept()
{
m_selectedPVs << checkedItems();
QDialog::accept();
}

View File

@@ -19,17 +19,7 @@ class ResizeVolumeGroupDialog : public VolumeGroupBaseDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
using PartitionVector = QVector< const Partition* >; ResizeVolumeGroupDialog( LvmDevice* device, const PartitionVector& availablePVs, QWidget* parent );
ResizeVolumeGroupDialog( LvmDevice* device,
const PartitionVector& availablePVs,
PartitionVector& selectedPVs,
QWidget* parent );
void accept() override;
private:
PartitionVector& m_selectedPVs;
}; };
#endif // RESIZEVOLUMEGROUPDIALOG_H #endif // RESIZEVOLUMEGROUPDIALOG_H

View File

@@ -10,6 +10,7 @@
#include "VolumeGroupBaseDialog.h" #include "VolumeGroupBaseDialog.h"
#include "ui_VolumeGroupBaseDialog.h" #include "ui_VolumeGroupBaseDialog.h"
#include "core/PartitionCoreModule.h"
#include "core/SizeUtils.h" #include "core/SizeUtils.h"
#include "gui/ListPhysicalVolumeWidgetItem.h" #include "gui/ListPhysicalVolumeWidgetItem.h"
@@ -20,10 +21,11 @@
#include <QPushButton> #include <QPushButton>
#include <QSpinBox> #include <QSpinBox>
VolumeGroupBaseDialog::VolumeGroupBaseDialog( QString& vgName, QVector< const Partition* > pvList, QWidget* parent ) // Keeping the sources consistent
VolumeGroupBaseDialog::VolumeGroupBaseDialog( QWidget* parent, const QString& vgName, PartitionVector pvList )
: QDialog( parent ) : QDialog( parent )
, ui( new Ui::VolumeGroupBaseDialog ) , ui( new Ui::VolumeGroupBaseDialog )
, m_vgNameValue( vgName ) , m_volumeGroupName( vgName )
, m_totalSizeValue( 0 ) , m_totalSizeValue( 0 )
, m_usedSizeValue( 0 ) , m_usedSizeValue( 0 )
{ {
@@ -34,13 +36,12 @@ VolumeGroupBaseDialog::VolumeGroupBaseDialog( QString& vgName, QVector< const Pa
ui->pvList->addItem( new ListPhysicalVolumeWidgetItem( p, false ) ); ui->pvList->addItem( new ListPhysicalVolumeWidgetItem( p, false ) );
} }
ui->vgType->addItems( QStringList() << "LVM" ui->vgType->addItems( { "LVM", "RAID" } );
<< "RAID" );
ui->vgType->setCurrentIndex( 0 ); ui->vgType->setCurrentIndex( 0 );
QRegularExpression re( R"(^(?!_|\.)[\w\-.+]+)" ); QRegularExpression re( R"(^(?!_|\.)[\w\-.+]+)" );
ui->vgName->setValidator( new QRegularExpressionValidator( re, this ) ); ui->vgName->setValidator( new QRegularExpressionValidator( re, this ) );
ui->vgName->setText( m_vgNameValue ); ui->vgName->setText( vgName );
updateOkButton(); updateOkButton();
updateTotalSize(); updateTotalSize();
@@ -55,7 +56,10 @@ VolumeGroupBaseDialog::VolumeGroupBaseDialog( QString& vgName, QVector< const Pa
updateOkButton(); updateOkButton();
} ); } );
connect( ui->vgName, &QLineEdit::textChanged, this, [&]( const QString& ) { updateOkButton(); } ); connect( ui->vgName, &QLineEdit::textChanged, this, [&]( const QString& s ) {
m_volumeGroupName = s;
updateOkButton();
} );
} }
VolumeGroupBaseDialog::~VolumeGroupBaseDialog() VolumeGroupBaseDialog::~VolumeGroupBaseDialog()
@@ -63,10 +67,10 @@ VolumeGroupBaseDialog::~VolumeGroupBaseDialog()
delete ui; delete ui;
} }
QVector< const Partition* > PartitionVector
VolumeGroupBaseDialog::checkedItems() const VolumeGroupBaseDialog::selectedPVs() const
{ {
QVector< const Partition* > items; PartitionVector items;
for ( int i = 0; i < ui->pvList->count(); i++ ) for ( int i = 0; i < ui->pvList->count(); i++ )
{ {
@@ -90,7 +94,7 @@ VolumeGroupBaseDialog::isSizeValid() const
void void
VolumeGroupBaseDialog::updateOkButton() VolumeGroupBaseDialog::updateOkButton()
{ {
okButton()->setEnabled( isSizeValid() && !checkedItems().empty() && !ui->vgName->text().isEmpty() okButtonWidget()->setEnabled( isSizeValid() && !selectedPVs().empty() && !ui->vgName->text().isEmpty()
&& ui->peSize->value() > 0 ); && ui->peSize->value() > 0 );
} }
@@ -111,13 +115,14 @@ VolumeGroupBaseDialog::setLVQuantity( qint32 lvQuantity )
void void
VolumeGroupBaseDialog::updateTotalSize() VolumeGroupBaseDialog::updateTotalSize()
{ {
m_physicalExtentSize = peSizeWidget()->value();
m_totalSizeValue = 0; m_totalSizeValue = 0;
for ( const Partition* p : checkedItems() ) for ( const Partition* p : selectedPVs() )
{ {
m_totalSizeValue += p->capacity() m_totalSizeValue += p->capacity()
- p->capacity() - p->capacity()
% ( ui->peSize->value() * Capacity::unitFactor( Capacity::Unit::Byte, Capacity::Unit::MiB ) ); % ( m_physicalExtentSize * Capacity::unitFactor( Capacity::Unit::Byte, Capacity::Unit::MiB ) );
} }
ui->totalSize->setText( formatByteSize( m_totalSizeValue ) ); ui->totalSize->setText( formatByteSize( m_totalSizeValue ) );
@@ -128,9 +133,10 @@ VolumeGroupBaseDialog::updateTotalSize()
void void
VolumeGroupBaseDialog::updateTotalSectors() VolumeGroupBaseDialog::updateTotalSectors()
{ {
qint64 totalSectors = 0; m_physicalExtentSize = peSizeWidget()->value();
qint64 extentSize = ui->peSize->value() * Capacity::unitFactor( Capacity::Unit::Byte, Capacity::Unit::MiB ); qint64 totalSectors = 0;
qint64 extentSize = m_physicalExtentSize * Capacity::unitFactor( Capacity::Unit::Byte, Capacity::Unit::MiB );
if ( extentSize > 0 ) if ( extentSize > 0 )
{ {
@@ -140,38 +146,32 @@ VolumeGroupBaseDialog::updateTotalSectors()
ui->totalSectors->setText( QString::number( totalSectors ) ); ui->totalSectors->setText( QString::number( totalSectors ) );
} }
QString&
VolumeGroupBaseDialog::vgNameValue() const
{
return m_vgNameValue;
}
QLineEdit* QLineEdit*
VolumeGroupBaseDialog::vgName() const VolumeGroupBaseDialog::vgNameWidget() const
{ {
return ui->vgName; return ui->vgName;
} }
QComboBox* QComboBox*
VolumeGroupBaseDialog::vgType() const VolumeGroupBaseDialog::vgTypeWidget() const
{ {
return ui->vgType; return ui->vgType;
} }
QSpinBox* QSpinBox*
VolumeGroupBaseDialog::peSize() const VolumeGroupBaseDialog::peSizeWidget() const
{ {
return ui->peSize; return ui->peSize;
} }
QListWidget* QListWidget*
VolumeGroupBaseDialog::pvList() const VolumeGroupBaseDialog::pvListWidget() const
{ {
return ui->pvList; return ui->pvList;
} }
QPushButton* QPushButton*
VolumeGroupBaseDialog::okButton() const VolumeGroupBaseDialog::okButtonWidget() const
{ {
return ui->buttonBox->button( QDialogButtonBox::StandardButton::Ok ); return ui->buttonBox->button( QDialogButtonBox::StandardButton::Ok );
} }

View File

@@ -10,7 +10,7 @@
#ifndef VOLUMEGROUPBASEDIALOG_H #ifndef VOLUMEGROUPBASEDIALOG_H
#define VOLUMEGROUPBASEDIALOG_H #define VOLUMEGROUPBASEDIALOG_H
#include <kpmcore/core/partition.h> #include "core/KPMHelpers.h"
#include <QDialog> #include <QDialog>
@@ -29,43 +29,46 @@ class VolumeGroupBaseDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit VolumeGroupBaseDialog( QString& vgName, QVector< const Partition* > pvList, QWidget* parent = nullptr ); explicit VolumeGroupBaseDialog( QWidget* parent, const QString& vgName, PartitionVector pvList );
~VolumeGroupBaseDialog() override; ~VolumeGroupBaseDialog() override;
qint32 physicalExtentSize() const { return m_physicalExtentSize; }
QString volumeGroupName() const { return m_volumeGroupName; }
/** @brief Which PVs (partitions) are selected for this VG
*
* The vector contains non-owned pointers.
*/
PartitionVector selectedPVs() const;
protected: protected:
virtual void updateOkButton(); virtual void updateOkButton();
void setUsedSizeValue( qint64 usedSize ); void setUsedSizeValue( qint64 usedSize );
void setLVQuantity( qint32 lvQuantity ); void setLVQuantity( qint32 lvQuantity );
void updateTotalSize();
void updateTotalSectors();
QVector< const Partition* > checkedItems() const;
bool isSizeValid() const; bool isSizeValid() const;
QString& vgNameValue() const; void updateTotalSize();
void updateTotalSectors();
QLineEdit* vgName() const;
QComboBox* vgType() const; /** @section UI-widget accessors
*
QSpinBox* peSize() const; * These methods get UI internal widgets, so that subclasses
* can manipulate the values in those widgets.
QListWidget* pvList() const; */
QLineEdit* vgNameWidget() const;
QPushButton* okButton() const; QComboBox* vgTypeWidget() const;
QSpinBox* peSizeWidget() const;
QListWidget* pvListWidget() const;
QPushButton* okButtonWidget() const;
private: private:
Ui::VolumeGroupBaseDialog* ui; Ui::VolumeGroupBaseDialog* ui;
QString& m_vgNameValue; QString m_volumeGroupName;
qint64 m_totalSizeValue; qint64 m_totalSizeValue;
qint64 m_usedSizeValue; qint64 m_usedSizeValue;
qint32 m_physicalExtentSize;
}; };
#endif // VOLUMEGROUPBASEDIALOG_H #endif // VOLUMEGROUPBASEDIALOG_H

View File

@@ -17,12 +17,12 @@
#include <kpmcore/util/report.h> #include <kpmcore/util/report.h>
CreateVolumeGroupJob::CreateVolumeGroupJob( Device*, CreateVolumeGroupJob::CreateVolumeGroupJob( Device*,
QString& vgName, const QString& vgName,
QVector< const Partition* > pvList, const PartitionVector& pvList,
const qint32 peSize ) const qint32 peSize )
: m_vgName( vgName ) : m_vgName( vgName )
, m_pvList( pvList ) , m_pvList( pvList )
, m_peSize( peSize ) , m_physicalExtentSize( peSize )
{ {
} }
@@ -47,7 +47,7 @@ CreateVolumeGroupJob::prettyStatusMessage() const
Calamares::JobResult Calamares::JobResult
CreateVolumeGroupJob::exec() CreateVolumeGroupJob::exec()
{ {
return KPMHelpers::execute( CreateVolumeGroupOperation( m_vgName, m_pvList, m_peSize ), return KPMHelpers::execute( CreateVolumeGroupOperation( m_vgName, m_pvList, m_physicalExtentSize ),
tr( "The installer failed to create a volume group named '%1'." ).arg( m_vgName ) ); tr( "The installer failed to create a volume group named '%1'." ).arg( m_vgName ) );
} }

View File

@@ -10,19 +10,23 @@
#ifndef CREATEVOLUMEGROUPJOB_H #ifndef CREATEVOLUMEGROUPJOB_H
#define CREATEVOLUMEGROUPJOB_H #define CREATEVOLUMEGROUPJOB_H
#include "core/KPMHelpers.h"
#include "Job.h" #include "Job.h"
#include "partition/KPMManager.h" #include "partition/KPMManager.h"
#include <QVector>
class Device;
class Partition;
class CreateVolumeGroupJob : public Calamares::Job class CreateVolumeGroupJob : public Calamares::Job
{ {
Q_OBJECT Q_OBJECT
public: public:
CreateVolumeGroupJob( Device*, QString& vgName, QVector< const Partition* > pvList, const qint32 peSize ); /** @brief Make a job that will create a volume group
*
* The @p physicalExtentSize is given in MiB; typically this is 4 (MiB).
*/
CreateVolumeGroupJob( Device*,
const QString& vgName,
const PartitionVector& pvList,
const qint32 physicalExtentSize );
QString prettyName() const override; QString prettyName() const override;
QString prettyDescription() const override; QString prettyDescription() const override;
@@ -35,8 +39,8 @@ public:
private: private:
CalamaresUtils::Partition::KPMManager m_kpmcore; CalamaresUtils::Partition::KPMManager m_kpmcore;
QString m_vgName; QString m_vgName;
QVector< const Partition* > m_pvList; PartitionVector m_pvList;
qint32 m_peSize; qint32 m_physicalExtentSize;
}; };
#endif // CREATEVOLUMEGROUPJOB_H #endif // CREATEVOLUMEGROUPJOB_H

View File

@@ -9,14 +9,12 @@
#include "ResizeVolumeGroupJob.h" #include "ResizeVolumeGroupJob.h"
#include "core/KPMHelpers.h"
#include <kpmcore/core/lvmdevice.h> #include <kpmcore/core/lvmdevice.h>
#include <kpmcore/core/partition.h> #include <kpmcore/core/partition.h>
#include <kpmcore/ops/resizevolumegroupoperation.h> #include <kpmcore/ops/resizevolumegroupoperation.h>
#include <kpmcore/util/report.h> #include <kpmcore/util/report.h>
ResizeVolumeGroupJob::ResizeVolumeGroupJob( Device*, LvmDevice* device, QVector< const Partition* >& partitionList ) ResizeVolumeGroupJob::ResizeVolumeGroupJob( Device*, LvmDevice* device, const PartitionVector& partitionList )
: m_device( device ) : m_device( device )
, m_partitionList( partitionList ) , m_partitionList( partitionList )
{ {

View File

@@ -10,20 +10,19 @@
#ifndef RESIZEVOLUMEGROUPJOB_H #ifndef RESIZEVOLUMEGROUPJOB_H
#define RESIZEVOLUMEGROUPJOB_H #define RESIZEVOLUMEGROUPJOB_H
#include "core/KPMHelpers.h"
#include "Job.h" #include "Job.h"
#include "partition/KPMManager.h" #include "partition/KPMManager.h"
#include <QVector>
class Device; class Device;
class LvmDevice; class LvmDevice;
class Partition;
class ResizeVolumeGroupJob : public Calamares::Job class ResizeVolumeGroupJob : public Calamares::Job
{ {
Q_OBJECT Q_OBJECT
public: public:
ResizeVolumeGroupJob( Device*, LvmDevice* device, QVector< const Partition* >& partitionList ); ResizeVolumeGroupJob( Device*, LvmDevice* device, const PartitionVector& partitionList );
QString prettyName() const override; QString prettyName() const override;
QString prettyDescription() const override; QString prettyDescription() const override;
@@ -37,7 +36,7 @@ private:
private: private:
CalamaresUtils::Partition::KPMManager m_kpmcore; CalamaresUtils::Partition::KPMManager m_kpmcore;
LvmDevice* m_device; LvmDevice* m_device;
QVector< const Partition* > m_partitionList; PartitionVector m_partitionList;
}; };
#endif // RESIZEVOLUMEGROUPJOB_H #endif // RESIZEVOLUMEGROUPJOB_H