[partition] Including CreateVolumeGroupDialog and fixing some of its GUI issues.

This commit is contained in:
Caio 2018-06-07 17:22:22 -03:00
parent d15ce56c97
commit 208d58bcd9
12 changed files with 409 additions and 37 deletions

View file

@ -21,22 +21,160 @@
#include "gui/ListPhysicalVolumeWidgetItem.h"
#include <kpmcore/util/capacity.h>
#include <QComboBox>
#include <QDialogButtonBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QSpinBox>
VolumeGroupBaseDialog::VolumeGroupBaseDialog( QString& vgName,
QList< const Partition* > pvList,
QVector< const Partition* > pvList,
qint32& peSize,
QWidget *parent)
QWidget *parent )
: QDialog(parent)
, ui(new Ui::VolumeGroupBaseDialog)
, m_vgName(vgName)
, m_peSize(peSize)
, m_vgNameValue(vgName)
, m_peSizeValue(peSize)
, m_totalSizeValue(0)
, m_usedSizeValue(0)
{
ui->setupUi(this);
for ( const Partition* p : pvList )
ui->pvList->addItem( new ListPhysicalVolumeWidgetItem(p, false) );
ui->pvList->addItem( new ListPhysicalVolumeWidgetItem( p, false ) );
ui->vgType->addItems( QStringList() << "LVM" << "RAID" );
ui->vgType->setCurrentIndex(0);
QRegularExpression re(R"(^(?!_|\.)[\w\-.+]+)");
ui->vgName->setValidator( new QRegularExpressionValidator( re, this ) );
ui->vgName->setText( m_vgNameValue );
ui->peSize->setValue( m_peSizeValue );
updateOkButton();
updateTotalSize();
connect( ui->pvList, &QListWidget::itemChanged, this,
[&](QListWidgetItem*) {
updateTotalSize();
updateOkButton();
} );
connect( ui->peSize, qOverload<int>(&QSpinBox::valueChanged), this,
[&](int) {
updateTotalSectors();
updateOkButton();
});
connect( ui->vgName, &QLineEdit::textChanged, this,
[&](const QString&) {
updateOkButton();
});
}
VolumeGroupBaseDialog::~VolumeGroupBaseDialog()
{
delete ui;
}
QVector< const Partition* >
VolumeGroupBaseDialog::checkedItems() const
{
QVector< const Partition* > items;
for ( int i = 0; i < ui->pvList->count(); i++) {
ListPhysicalVolumeWidgetItem* item = dynamic_cast< ListPhysicalVolumeWidgetItem* >( ui->pvList->item(i) );
if ( item && item->checkState() == Qt::Checked )
items << item->partition();
}
return items;
}
bool
VolumeGroupBaseDialog::isSizeValid() const
{
return m_totalSizeValue >= m_usedSizeValue;
}
void
VolumeGroupBaseDialog::updateOkButton()
{
okButton()->setEnabled(isSizeValid() &&
!checkedItems().empty() &&
!ui->vgName->text().isEmpty() &&
ui->peSize->value() > 0);
}
void
VolumeGroupBaseDialog::updateTotalSize()
{
m_totalSizeValue = 0;
for ( const Partition *p : checkedItems())
m_totalSizeValue += p->capacity() - p->capacity() % (ui->peSize->value() * Capacity::unitFactor(Capacity::Unit::Byte, Capacity::Unit::MiB));
ui->totalSize->setText(Capacity::formatByteSize(m_totalSizeValue));
updateTotalSectors();
}
void
VolumeGroupBaseDialog::updateTotalSectors()
{
qint32 totalSectors = 0;
qint32 extentSize = ui->peSize->value() * Capacity::unitFactor(Capacity::Unit::Byte, Capacity::Unit::MiB);
if ( extentSize > 0 )
totalSectors = m_totalSizeValue / extentSize;
ui->totalSectors->setText( QString::number( totalSectors ) );
}
QString&
VolumeGroupBaseDialog::vgNameValue() const
{
return m_vgNameValue;
}
qint32&
VolumeGroupBaseDialog::peSizeValue() const
{
return m_peSizeValue;
}
QLineEdit*
VolumeGroupBaseDialog::vgName() const
{
return ui->vgName;
}
QComboBox*
VolumeGroupBaseDialog::vgType() const
{
return ui->vgType;
}
QSpinBox*
VolumeGroupBaseDialog::peSize() const
{
return ui->peSize;
}
QListWidget*
VolumeGroupBaseDialog::pvList() const
{
return ui->pvList;
}
QPushButton*
VolumeGroupBaseDialog::okButton() const
{
return ui->buttonBox->button( QDialogButtonBox::StandardButton::Ok );
}