From d013e663b8644dcf55c93156dd8090ddb1a83c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20G=C3=A2teau?= Date: Wed, 2 Jul 2014 15:49:35 +0200 Subject: [PATCH] Implement partition removal --- src/modules/partition/CMakeLists.txt | 2 + src/modules/partition/CreatePartitionJob.h | 6 ++ src/modules/partition/PartitionCoreModule.cpp | 60 ++++++++++++++++++- src/modules/partition/PartitionCoreModule.h | 13 +++- src/modules/partition/PartitionPage.cpp | 15 ++++- src/modules/partition/PartitionPage.h | 1 + 6 files changed, 93 insertions(+), 4 deletions(-) diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index e1359f615..f6ba92199 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -10,6 +10,7 @@ calamares_add_plugin( partition SOURCES CreatePartitionDialog.cpp CreatePartitionJob.cpp + DeletePartitionJob.cpp DeviceModel.cpp PartitionCoreModule.cpp PartitionModel.cpp @@ -30,6 +31,7 @@ calamares_add_plugin( partition set( partview_SRCS CreatePartitionDialog.cpp CreatePartitionJob.cpp + DeletePartitionJob.cpp DeviceModel.cpp PartitionCoreModule.cpp PartitionModel.cpp diff --git a/src/modules/partition/CreatePartitionJob.h b/src/modules/partition/CreatePartitionJob.h index b90c8885f..5ba20dbdb 100644 --- a/src/modules/partition/CreatePartitionJob.h +++ b/src/modules/partition/CreatePartitionJob.h @@ -27,6 +27,7 @@ class FileSystem; class CreatePartitionJob : public Calamares::Job { + Q_OBJECT public: CreatePartitionJob( Device* device, Partition* partition ); QString prettyName() override; @@ -38,6 +39,11 @@ public: return m_device; } + Partition* partition() const + { + return m_partition; + } + private: Device* m_device; Partition* m_partition; diff --git a/src/modules/partition/PartitionCoreModule.cpp b/src/modules/partition/PartitionCoreModule.cpp index f5020f43f..45d14dfac 100644 --- a/src/modules/partition/PartitionCoreModule.cpp +++ b/src/modules/partition/PartitionCoreModule.cpp @@ -19,13 +19,17 @@ #include #include +#include #include #include #include #include +#include // CalaPM #include +#include +#include #include #include @@ -95,7 +99,9 @@ PartitionCoreModule::createPartition( CreatePartitionJob* job ) Q_ASSERT( info ); job->updatePreview(); info->partitionModel->reload(); - Calamares::JobQueue::instance()->enqueue( Calamares::job_ptr( job ) ); + m_jobs << Calamares::job_ptr( job ); + + dumpQueue(); } PartitionCoreModule::DeviceInfo* @@ -110,3 +116,55 @@ PartitionCoreModule::deviceInfoForDevice( Device* device ) const } return nullptr; } + +void +PartitionCoreModule::deletePartition( Device* device, Partition* partition ) +{ + if ( partition->state() == Partition::StateNew ) + { + // Find matching CreatePartitionJob + auto it = std::find_if( m_jobs.begin(), m_jobs.end(), [ partition ]( Calamares::job_ptr job ) + { + CreatePartitionJob* createJob = qobject_cast< CreatePartitionJob* >( job.data() ); + return createJob && createJob->partition() == partition; + } ); + if ( it == m_jobs.end() ) + { + cDebug() << "Failed to find a CreatePartitionJob matching the partition to remove"; + return; + } + // Remove it + if ( ! partition->parent()->remove( partition ) ) + { + cDebug() << "Failed to remove partition from preview"; + return; + } + device->partitionTable()->updateUnallocated( *device ); + m_jobs.erase( it ); + // The partition is no longer referenced by either a job or the device + // partition list, so we have to delete it + delete partition; + } + else + { + DeletePartitionJob* job = new DeletePartitionJob( device, partition ); + job->updatePreview(); + Calamares::JobQueue::instance()->enqueue( Calamares::job_ptr( job ) ); + m_jobs << Calamares::job_ptr( job ); + } + + DeviceInfo* info = deviceInfoForDevice( device ); + info->partitionModel->reload(); + + dumpQueue(); +} + +void +PartitionCoreModule::dumpQueue() const +{ + cDebug() << "Queue:"; + for ( auto job : m_jobs ) + { + cDebug() << job->prettyName(); + } +} diff --git a/src/modules/partition/PartitionCoreModule.h b/src/modules/partition/PartitionCoreModule.h index fa23aa751..b34861fe1 100644 --- a/src/modules/partition/PartitionCoreModule.h +++ b/src/modules/partition/PartitionCoreModule.h @@ -19,12 +19,15 @@ #ifndef PARTITIONCOREMODULE_H #define PARTITIONCOREMODULE_H -#include -#include +#include // CalaPM #include +// Qt +#include +#include + class CreatePartitionJob; class Device; class DeviceModel; @@ -47,6 +50,8 @@ public: void createPartition( CreatePartitionJob* job ); + void deletePartition( Device* device, Partition* partition ); + private: struct DeviceInfo { @@ -58,9 +63,13 @@ private: QList< DeviceInfo* > m_devices; DeviceModel* m_deviceModel; + QList< Calamares::job_ptr > m_jobs; + void listDevices(); DeviceInfo* deviceInfoForDevice( Device* device ) const; + + void dumpQueue() const; }; #endif /* PARTITIONCOREMODULE_H */ diff --git a/src/modules/partition/PartitionPage.cpp b/src/modules/partition/PartitionPage.cpp index 67663eb05..b225a565f 100644 --- a/src/modules/partition/PartitionPage.cpp +++ b/src/modules/partition/PartitionPage.cpp @@ -58,6 +58,7 @@ PartitionPage::PartitionPage( QWidget* parent ) } ); connect( m_ui->createButton, &QAbstractButton::clicked, this, &PartitionPage::onCreateClicked ); + connect( m_ui->deleteButton, &QAbstractButton::clicked, this, &PartitionPage::onDeleteClicked ); } PartitionPage::~PartitionPage() @@ -92,7 +93,6 @@ PartitionPage::onCreateClicked() Q_ASSERT( index.isValid() ); const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); - Q_ASSERT( model ); Partition* partition = model->partitionForIndex( index ); Q_ASSERT( partition ); @@ -103,3 +103,16 @@ PartitionPage::onCreateClicked() } delete dlg; } + +void +PartitionPage::onDeleteClicked() +{ + QModelIndex index = m_ui->partitionListView->currentIndex(); + Q_ASSERT( index.isValid() ); + + const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); + Partition* partition = model->partitionForIndex( index ); + Q_ASSERT( partition ); + + m_core->deletePartition( model->device(), partition ); +} diff --git a/src/modules/partition/PartitionPage.h b/src/modules/partition/PartitionPage.h index e4d9cf714..23719caaa 100644 --- a/src/modules/partition/PartitionPage.h +++ b/src/modules/partition/PartitionPage.h @@ -44,6 +44,7 @@ private: PartitionCoreModule* m_core; void updateButtons(); void onCreateClicked(); + void onDeleteClicked(); }; #endif // PARTITIONPAGE_H