From 791377f176097b8244c294692d1be43a341de32a Mon Sep 17 00:00:00 2001 From: Volker Lanz Date: Fri, 19 Mar 2010 14:13:04 +0000 Subject: [PATCH] only return true from PartResizerWidget::movePartition() if the partition was actually moved. set single step for the sector spinboxes to align value add a checkbox to turn off aligning the partition svn path=/trunk/extragear/sysadmin/partitionmanager/; revision=1105207 --- src/gui/partitionmanagerwidget.cpp | 15 +-- src/gui/partresizerwidget.cpp | 60 +++++++--- src/gui/partresizerwidget.h | 4 + src/gui/sizedetailswidget.h | 1 + src/gui/sizedetailswidgetbase.ui | 183 +++++++++++++++++------------ src/gui/sizedialogbase.cpp | 13 ++ src/gui/sizedialogbase.h | 1 + src/plugins/dummy/dummybackend.cpp | 2 +- 8 files changed, 174 insertions(+), 105 deletions(-) diff --git a/src/gui/partitionmanagerwidget.cpp b/src/gui/partitionmanagerwidget.cpp index c27269e..fc4e047 100644 --- a/src/gui/partitionmanagerwidget.cpp +++ b/src/gui/partitionmanagerwidget.cpp @@ -472,10 +472,7 @@ void PartitionManagerWidget::onNewPartition() QPointer dlg = new NewDialog(this, *selectedDevice(), *newPartition, selectedDevice()->partitionTable()->childRoles(*selectedPartition())); if (dlg->exec() == KDialog::Accepted) - { - PartitionTable::alignPartition(*selectedDevice(), *newPartition); operationStack().push(new NewOperation(*selectedDevice(), newPartition)); - } else delete newPartition; @@ -565,8 +562,6 @@ void PartitionManagerWidget::onResizePartition() if (dlg->exec() == KDialog::Accepted && dlg->isModified()) { - PartitionTable::alignPartition(*selectedDevice(), resizedPartition, selectedPartition()); - if (resizedPartition.firstSector() == selectedPartition()->firstSector() && resizedPartition.lastSector() == selectedPartition()->lastSector()) Log(Log::information) << i18nc("@info/plain", "Partition %1 has the same position and size after resize/move. Ignoring operation.", selectedPartition()->deviceNode()); else @@ -628,7 +623,7 @@ void PartitionManagerWidget::onPastePartition() delete copiedPartition; } -bool PartitionManagerWidget::showInsertDialog(Partition& insertPartition, qint64 sourceLength) +bool PartitionManagerWidget::showInsertDialog(Partition& insertedPartition, qint64 sourceLength) { Q_ASSERT(selectedDevice()); Q_ASSERT(selectedPartition()); @@ -643,22 +638,20 @@ bool PartitionManagerWidget::showInsertDialog(Partition& insertPartition, qint64 // Make sure the inserted partition has the right parent and logical or primary set. Only then // can PartitionTable::alignPartition() work correctly. - selectedPartition()->parent()->reparent(insertPartition); + selectedPartition()->parent()->reparent(insertedPartition); if (!overwrite) { - QPointer dlg = new InsertDialog(this, *selectedDevice(), insertPartition, *selectedPartition()); + QPointer dlg = new InsertDialog(this, *selectedDevice(), insertedPartition, *selectedPartition()); int result = dlg->exec(); delete dlg; if (result != KDialog::Accepted) return false; - - PartitionTable::alignPartition(*selectedDevice(), insertPartition, selectedPartition()); } - if (insertPartition.length() < sourceLength) + if (insertedPartition.length() < sourceLength) { if (overwrite) KMessageBox::error(this, i18nc("@info", diff --git a/src/gui/partresizerwidget.cpp b/src/gui/partresizerwidget.cpp index 59ec9cd..efa0994 100644 --- a/src/gui/partresizerwidget.cpp +++ b/src/gui/partresizerwidget.cpp @@ -59,7 +59,8 @@ PartResizerWidget::PartResizerWidget(QWidget* parent) : m_DraggedWidget(NULL), m_Hotspot(0), m_MoveAllowed(true), - m_ReadOnly(false) + m_ReadOnly(false), + m_Align(true) { } @@ -207,18 +208,31 @@ bool PartResizerWidget::movePartition(qint64 newFirstSector) return false; } + const qint64 originalFirst = partition().firstSector(); + const qint64 originalLast = partition().lastSector(); + partition().setFirstSector(newFirstSector); partition().fileSystem().setFirstSector(newFirstSector); - emit firstSectorChanged(newFirstSector); partition().setLastSector(newLastSector); partition().fileSystem().setLastSector(newLastSector); - emit lastSectorChanged(newLastSector); - resizeLogicals(); - updatePositions(); + if (align()) + device().partitionTable()->alignPartition(device(), partition()); - return true; + if (originalFirst != partition().firstSector() || originalLast != partition().lastSector()) + { + resizeLogicals(); + updatePositions(); + } + + if (originalFirst != partition().firstSector()) + emit firstSectorChanged(partition().firstSector()); + + if (originalLast != partition().lastSector()) + emit lastSectorChanged(partition().lastSector()); + + return originalFirst != partition().firstSector() || originalLast != partition().lastSector(); } void PartResizerWidget::mouseMoveEvent(QMouseEvent* event) @@ -266,16 +280,21 @@ bool PartResizerWidget::updateFirstSector(qint64 newFirstSector) if (newFirstSector != partition().firstSector() && (partition().children().size() == 0 || checkAlignment(*partition().children().first(), partition().firstSector() - newFirstSector))) { + const qint64 originalFirst = partition().lastSector(); + partition().setFirstSector(newFirstSector); partition().fileSystem().setFirstSector(newFirstSector); - resizeLogicals(); + if (align()) + device().partitionTable()->alignPartition(device(), partition()); - emit firstSectorChanged(newFirstSector); - - updatePositions(); - - return true; + if (originalFirst != partition().firstSector()) + { + resizeLogicals(); + updatePositions(); + emit firstSectorChanged(partition().firstSector()); + return true; + } } return false; @@ -323,16 +342,21 @@ bool PartResizerWidget::updateLastSector(qint64 newLastSector) if (newLastSector != partition().lastSector() && (partition().children().size() == 0 || checkAlignment(*partition().children().last(), partition().lastSector() - newLastSector))) { + const qint64 originalLast = partition().lastSector(); + partition().setLastSector(newLastSector); partition().fileSystem().setLastSector(newLastSector); - resizeLogicals(); + if (align()) + device().partitionTable()->alignPartition(device(), partition()); - emit lastSectorChanged(newLastSector); - - updatePositions(); - - return true; + if (partition().lastSector() != originalLast) + { + resizeLogicals(); + updatePositions(); + emit lastSectorChanged(partition().lastSector()); + return true; + } } return false; diff --git a/src/gui/partresizerwidget.h b/src/gui/partresizerwidget.h index f25d827..2e8f115 100644 --- a/src/gui/partresizerwidget.h +++ b/src/gui/partresizerwidget.h @@ -72,6 +72,9 @@ class PartResizerWidget : public QWidget bool readOnly() const { return m_ReadOnly; } /**< @return true if the widget is read only */ void setReadOnly(bool b) { m_ReadOnly = b; } /**< @param b the new value for read only */ + bool align() const { return m_Align; } /**< @return true if the Partition is to be aligned */ + void setAlign(bool b) { m_Align = b; } /**< @param b the new value for aligning the Partition */ + static qint32 handleWidth() { return m_HandleWidth; } /**< @return the handle width in pixels */ static qint32 handleHeight() { return m_HandleHeight; } /**< @return the handle height in pixels */ @@ -143,6 +146,7 @@ class PartResizerWidget : public QWidget bool m_MoveAllowed; bool m_ReadOnly; + bool m_Align; static const qint32 m_HandleWidth; static const qint32 m_HandleHeight; diff --git a/src/gui/sizedetailswidget.h b/src/gui/sizedetailswidget.h index 86e09f0..5824fe8 100644 --- a/src/gui/sizedetailswidget.h +++ b/src/gui/sizedetailswidget.h @@ -39,6 +39,7 @@ class SizeDetailsWidget : public QWidget, public Ui::SizeDetailsWidgetBase public: QDoubleSpinBox& spinFirstSector() { Q_ASSERT(m_SpinFirstSector); return *m_SpinFirstSector; } QDoubleSpinBox& spinLastSector() { Q_ASSERT(m_SpinLastSector); return *m_SpinLastSector; } + QCheckBox& checkAlign() { Q_ASSERT(m_CheckAlign); return *m_CheckAlign; } }; #endif diff --git a/src/gui/sizedetailswidgetbase.ui b/src/gui/sizedetailswidgetbase.ui index 7f904dc..b541d31 100644 --- a/src/gui/sizedetailswidgetbase.ui +++ b/src/gui/sizedetailswidgetbase.ui @@ -7,81 +7,11 @@ 0 0 428 - 134 + 211 - - - - - 0 - 0 - - - - First sector: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - m_SpinFreeBefore - - - - - - - - 3 - 0 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 0 - - - - - - - - 0 - 0 - - - - Last sector: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - m_SpinFreeBefore - - - - - - - - 3 - 0 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 0 - - - - + Qt::Vertical @@ -97,14 +27,14 @@ - + Qt::Horizontal - + Qt::Vertical @@ -120,7 +50,87 @@ - + + + + + 0 + 0 + + + + First sector: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + m_SpinFirstSector + + + + + + + + 3 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 + + + + + + + + 0 + 0 + + + + Last sector: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + m_SpinLastSector + + + + + + + + 3 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 0 + + + + + + + Align Partition According To Partition Table Settings + + + true + + + + Qt::Vertical @@ -136,6 +146,29 @@ + + + + Qt::Horizontal + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + diff --git a/src/gui/sizedialogbase.cpp b/src/gui/sizedialogbase.cpp index 730cba0..131b1a3 100644 --- a/src/gui/sizedialogbase.cpp +++ b/src/gui/sizedialogbase.cpp @@ -29,6 +29,7 @@ #include "util/capacity.h" #include +#include SizeDialogBase::SizeDialogBase(QWidget* parent, Device& d, Partition& part, qint64 minFirst, qint64 maxLast) : KDialog(parent), @@ -127,6 +128,9 @@ void SizeDialogBase::setupConstraints() detailsWidget().spinFirstSector().setRange(minimumFirstSector(), maximumLastSector()); detailsWidget().spinLastSector().setRange(minimumFirstSector(), maximumLastSector()); + + detailsWidget().spinFirstSector().setSingleStep(Config::sectorAlignment()); + detailsWidget().spinLastSector().setSingleStep(Config::sectorAlignment()); } void SizeDialogBase::setupConnections() @@ -140,6 +144,7 @@ void SizeDialogBase::setupConnections() connect(&detailsWidget().spinFirstSector(), SIGNAL(valueChanged(double)), SLOT(onSpinFirstSectorChanged(double))); connect(&detailsWidget().spinLastSector(), SIGNAL(valueChanged(double)), SLOT(onSpinLastSectorChanged(double))); + connect(&detailsWidget().checkAlign(), SIGNAL(stateChanged(int)), SLOT(onAlignStateChanged(int))); } @@ -161,6 +166,14 @@ void SizeDialogBase::onSpinLastSectorChanged(double newLast) } } +void SizeDialogBase::onAlignStateChanged(int) +{ + const bool align = detailsWidget().checkAlign().isChecked(); + dialogWidget().partResizerWidget().setAlign(align); + detailsWidget().spinFirstSector().setSingleStep(align ? Config::sectorAlignment() : 1); + detailsWidget().spinLastSector().setSingleStep(align ? Config::sectorAlignment() : 1); +} + void SizeDialogBase::onFirstSectorChanged(qint64 newFirst) { bool state = dialogWidget().spinFreeBefore().blockSignals(true); diff --git a/src/gui/sizedialogbase.h b/src/gui/sizedialogbase.h index d3cbb3a..b3739a8 100644 --- a/src/gui/sizedialogbase.h +++ b/src/gui/sizedialogbase.h @@ -80,6 +80,7 @@ class SizeDialogBase : public KDialog void onSpinFirstSectorChanged(double newFirst); void onSpinLastSectorChanged(double newLast); + void onAlignStateChanged(int); protected: SizeDialogWidget* m_SizeDialogWidget; diff --git a/src/plugins/dummy/dummybackend.cpp b/src/plugins/dummy/dummybackend.cpp index 756aa52..cedf847 100644 --- a/src/plugins/dummy/dummybackend.cpp +++ b/src/plugins/dummy/dummybackend.cpp @@ -76,7 +76,7 @@ QList DummyBackend::scanDevices() Device* DummyBackend::scanDevice(const QString& device_node) { - Device* d = new Device("Dummy Device", QString("/tmp" + device_node), 255, 3000, 63, 512); + Device* d = new Device("Dummy Device", QString("/tmp" + device_node), 255, 30, 63, 512); CoreBackend::setPartitionTableForDevice(*d, new PartitionTable(PartitionTable::msdos_sectorbased, 2048, d->totalSectors() - 2048)); CoreBackend::setPartitionTableMaxPrimaries(*d->partitionTable(), 128); d->partitionTable()->updateUnallocated(*d);