From 26d914e7c8662140eb255091ed728efb6755d13d Mon Sep 17 00:00:00 2001 From: Volker Lanz Date: Mon, 6 Oct 2008 07:31:11 +0000 Subject: [PATCH] Don't allow creating a new partition table on a device with currently mounted partitions. svn path=/trunk/playground/sysadmin/partitionmanager/; revision=868375 --- src/core/partition.cpp | 11 +---------- src/core/partitionnode.cpp | 10 ++++++++++ src/core/partitionnode.h | 1 + src/gui/mainwindow.cpp | 2 +- src/ops/createpartitiontableoperation.cpp | 9 +++++++++ src/ops/createpartitiontableoperation.h | 2 ++ 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/core/partition.cpp b/src/core/partition.cpp index 6cf8fda..577972f 100644 --- a/src/core/partition.cpp +++ b/src/core/partition.cpp @@ -239,16 +239,7 @@ bool Partition::hasChildren() const /** Sets an extended Partition to mounted if any of its children are mounted */ void Partition::checkChildrenMounted() { - bool isBusy = false; - - foreach (const Partition* child, children()) - if (child->isMounted()) - { - isBusy = true; - break; - } - - setMounted(isBusy); + setMounted(isChildMounted()); } /** @return true if this Partition can be mounted */ diff --git a/src/core/partitionnode.cpp b/src/core/partitionnode.cpp index b0f6762..aa60784 100644 --- a/src/core/partitionnode.cpp +++ b/src/core/partitionnode.cpp @@ -205,3 +205,13 @@ qint32 PartitionNode::highestMountedChild() const return result; } + +/** @return true if any of the partition's children are mounted */ +bool PartitionNode::isChildMounted() const +{ + foreach (const Partition* child, children()) + if (child->isMounted() || child->hasChildren() && child->isChildMounted()) + return true; + + return false; +} diff --git a/src/core/partitionnode.h b/src/core/partitionnode.h index 00207df..b3a4f2a 100644 --- a/src/core/partitionnode.h +++ b/src/core/partitionnode.h @@ -68,6 +68,7 @@ class PartitionNode : public QObject virtual const Partitions& children() const = 0; virtual void append(Partition* p) = 0; virtual qint32 highestMountedChild() const; + virtual bool isChildMounted() const; protected: virtual void clearChildren(); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 746d5f8..8f0a09f 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -381,7 +381,7 @@ void MainWindow::setupDevicesList() void MainWindow::enableActions() { - actionCollection()->action("createNewPartitionTable")->setEnabled(selectedDevice() != NULL); + actionCollection()->action("createNewPartitionTable")->setEnabled(CreatePartitionTableOperation::canCreate(selectedDevice())); const Partition* part = selectedPartition(); diff --git a/src/ops/createpartitiontableoperation.cpp b/src/ops/createpartitiontableoperation.cpp index ba0b4cd..11258ae 100644 --- a/src/ops/createpartitiontableoperation.cpp +++ b/src/ops/createpartitiontableoperation.cpp @@ -67,6 +67,15 @@ bool CreatePartitionTableOperation::execute(Report& parent) return Operation::execute(parent); } +/** Can a new partition table be created on a device? + @param device pointer to the device, can be NULL + @return true if a new partition table can be created on @p device +*/ +bool CreatePartitionTableOperation::canCreate(const Device* device) +{ + return device != NULL && !device->partitionTable().isChildMounted(); +} + QString CreatePartitionTableOperation::description() const { return QString(i18nc("@info/plain", "Create a new partition table on %1", targetDevice().deviceNode())); diff --git a/src/ops/createpartitiontableoperation.h b/src/ops/createpartitiontableoperation.h index 467deb3..0eb4842 100644 --- a/src/ops/createpartitiontableoperation.h +++ b/src/ops/createpartitiontableoperation.h @@ -47,6 +47,8 @@ class CreatePartitionTableOperation : public Operation void undo(); bool execute(Report& parent); + static bool canCreate(const Device* device); + protected: Device& targetDevice() { return m_TargetDevice; } const Device& targetDevice() const { return m_TargetDevice; }