From b03d72952bd49541695589e83fbea29d7b29876a Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Sat, 30 Mar 2019 06:36:51 -0400 Subject: [PATCH 01/12] [partition] Improve logging --- src/modules/partition/gui/PartitionPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index 5f16e9dc1..965209b41 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -512,7 +512,7 @@ findBootloader( const QAbstractItemModel* model, const QString& path ) for ( int i = 0; i < model->rowCount(); ++i) { const auto index = model->index( i, 0, QModelIndex() ); - cDebug() << i << model->itemData( index ); + cDebug() << "FindBootLoader" << i << index.isValid() << model->itemData( index ); QVariant var = model->data( index, BootLoaderModel::BootLoaderPathRole ); if ( var.isValid() && var.toString() == path ) return i; From 752a922bde603b65217e19503a41547aa2ec2384 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 1 Apr 2019 07:36:18 -0400 Subject: [PATCH 02/12] [partition] Lock the bootloader model during reset - Try to avoid races between resetting the model and getting data from it for the UI. --- src/modules/partition/core/BootLoaderModel.cpp | 13 +++++++++++-- src/modules/partition/core/BootLoaderModel.h | 9 +++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/modules/partition/core/BootLoaderModel.cpp b/src/modules/partition/core/BootLoaderModel.cpp index f0661d8b0..345cbad52 100644 --- a/src/modules/partition/core/BootLoaderModel.cpp +++ b/src/modules/partition/core/BootLoaderModel.cpp @@ -69,6 +69,16 @@ BootLoaderModel::update() { beginResetModel(); blockSignals( true ); + updateInternal(); + blockSignals( false ); + endResetModel(); +} + + +void +BootLoaderModel::updateInternal() +{ + QMutexLocker lock(&m_lock); clear(); createMbrItems(); @@ -113,14 +123,13 @@ BootLoaderModel::update() createBootLoaderItem( tr( "Do not install a boot loader" ), QString(), false ) ); } - blockSignals( false ); - endResetModel(); } QVariant BootLoaderModel::data( const QModelIndex& index, int role ) const { + QMutexLocker lock(&m_lock); if ( role == Qt::DisplayRole ) { QString displayRole = QStandardItemModel::data( index, Qt::DisplayRole ).toString(); diff --git a/src/modules/partition/core/BootLoaderModel.h b/src/modules/partition/core/BootLoaderModel.h index 27be18687..e59225e0e 100644 --- a/src/modules/partition/core/BootLoaderModel.h +++ b/src/modules/partition/core/BootLoaderModel.h @@ -19,8 +19,9 @@ #ifndef BOOTLOADERMODEL_H #define BOOTLOADERMODEL_H -#include #include +#include +#include class Device; @@ -51,10 +52,14 @@ public: QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override; + using DeviceList = QList< Device* >; + private: - QList< Device* > m_devices; + DeviceList m_devices; + mutable QMutex m_lock; void createMbrItems(); + void updateInternal(); }; #endif /* BOOTLOADERMODEL_H */ From 7806ccbe729ceee69cb0e608cf07bf9a0df10e2c Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 1 Apr 2019 07:39:19 -0400 Subject: [PATCH 03/12] [partition] Drop superfluous debug logging - While here, update copyright header --- src/modules/partition/gui/PartitionPage.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp index 965209b41..a9aa0fc81 100644 --- a/src/modules/partition/gui/PartitionPage.cpp +++ b/src/modules/partition/gui/PartitionPage.cpp @@ -2,7 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019, Adriaan de Groot * Copyright 2018, Andrius Štikonas * Copyright 2018, Caio Jordão Carvalho * Copyright 2019, Collabora Ltd @@ -512,7 +512,8 @@ findBootloader( const QAbstractItemModel* model, const QString& path ) for ( int i = 0; i < model->rowCount(); ++i) { const auto index = model->index( i, 0, QModelIndex() ); - cDebug() << "FindBootLoader" << i << index.isValid() << model->itemData( index ); + if ( !index.isValid() ) + continue; QVariant var = model->data( index, BootLoaderModel::BootLoaderPathRole ); if ( var.isValid() && var.toString() == path ) return i; From b55a6cf7167e844f5d96ffd20b99740000c01670 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 1 Apr 2019 07:50:59 -0400 Subject: [PATCH 04/12] [partition] Improve type-constness - Don't bother copying the vector of available PVs, we need the contained pointers. --- src/modules/partition/gui/ResizeVolumeGroupDialog.cpp | 5 +++-- src/modules/partition/gui/ResizeVolumeGroupDialog.h | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp b/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp index 35b6bbdf1..1c5eef0ab 100644 --- a/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp +++ b/src/modules/partition/gui/ResizeVolumeGroupDialog.cpp @@ -1,6 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2018, Caio Jordão Carvalho + * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,8 +30,8 @@ #include ResizeVolumeGroupDialog::ResizeVolumeGroupDialog( LvmDevice *device, - QVector< const Partition* > availablePVs, - QVector< const Partition* >& selectedPVs, + const PartitionVector& availablePVs, + PartitionVector& selectedPVs, QWidget* parent ) : VolumeGroupBaseDialog( device->name(), device->physicalVolumes(), parent ) , m_selectedPVs( selectedPVs ) diff --git a/src/modules/partition/gui/ResizeVolumeGroupDialog.h b/src/modules/partition/gui/ResizeVolumeGroupDialog.h index 1d6015329..82231f885 100644 --- a/src/modules/partition/gui/ResizeVolumeGroupDialog.h +++ b/src/modules/partition/gui/ResizeVolumeGroupDialog.h @@ -1,6 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2018, Caio Jordão Carvalho + * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,15 +27,17 @@ class LvmDevice; class ResizeVolumeGroupDialog : public VolumeGroupBaseDialog { public: + using PartitionVector = QVector< const Partition* >; + ResizeVolumeGroupDialog( LvmDevice *device, - QVector< const Partition* > availablePVs, - QVector< const Partition* >& selectedPVs, + const PartitionVector& availablePVs, + PartitionVector& selectedPVs, QWidget* parent ); void accept() override; private: - QVector< const Partition* >& m_selectedPVs; + PartitionVector& m_selectedPVs; }; #endif // RESIZEVOLUMEGROUPDIALOG_H From df921606b9c448ee4a6c5b1f906b241752fffa01 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 1 Apr 2019 07:55:14 -0400 Subject: [PATCH 05/12] [partition] Update copyright headers - Files modified in 2019 by me --- src/modules/partition/core/BootLoaderModel.cpp | 1 + src/modules/partition/core/BootLoaderModel.h | 1 + src/modules/partition/core/DeviceList.cpp | 2 +- src/modules/partition/core/KPMHelpers.cpp | 2 +- src/modules/partition/core/KPMHelpers.h | 1 + src/modules/partition/core/PartUtils.cpp | 2 +- src/modules/partition/core/PartUtils.h | 2 +- src/modules/partition/core/PartitionActions.cpp | 2 +- src/modules/partition/core/PartitionCoreModule.cpp | 2 +- src/modules/partition/core/PartitionCoreModule.h | 1 + src/modules/partition/core/PartitionLayout.cpp | 2 +- src/modules/partition/core/PartitionModel.cpp | 2 +- src/modules/partition/core/PartitionModel.h | 2 +- src/modules/partition/gui/PartitionDialogHelpers.cpp | 2 +- src/modules/partition/gui/PartitionPage.h | 2 +- src/modules/partition/gui/PartitionViewStep.cpp | 2 +- src/modules/partition/gui/ReplaceWidget.cpp | 1 + src/modules/partition/jobs/FillGlobalStorageJob.cpp | 2 +- src/modules/partition/tests/PartitionJobTests.cpp | 2 +- 19 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/modules/partition/core/BootLoaderModel.cpp b/src/modules/partition/core/BootLoaderModel.cpp index 345cbad52..4f48e0787 100644 --- a/src/modules/partition/core/BootLoaderModel.cpp +++ b/src/modules/partition/core/BootLoaderModel.cpp @@ -2,6 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac + * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/core/BootLoaderModel.h b/src/modules/partition/core/BootLoaderModel.h index e59225e0e..fbbb9deb2 100644 --- a/src/modules/partition/core/BootLoaderModel.h +++ b/src/modules/partition/core/BootLoaderModel.h @@ -2,6 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2015, Teo Mrnjavac + * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/core/DeviceList.cpp b/src/modules/partition/core/DeviceList.cpp index 858bb5c73..68f218689 100644 --- a/src/modules/partition/core/DeviceList.cpp +++ b/src/modules/partition/core/DeviceList.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/core/KPMHelpers.cpp b/src/modules/partition/core/KPMHelpers.cpp index 3c0a55987..0265a17e5 100644 --- a/src/modules/partition/core/KPMHelpers.cpp +++ b/src/modules/partition/core/KPMHelpers.cpp @@ -2,7 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019 Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/core/KPMHelpers.h b/src/modules/partition/core/KPMHelpers.h index f1b8bd8a9..764a9491b 100644 --- a/src/modules/partition/core/KPMHelpers.h +++ b/src/modules/partition/core/KPMHelpers.h @@ -2,6 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac + * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp index a4738aa8c..89cf33a0a 100644 --- a/src/modules/partition/core/PartUtils.cpp +++ b/src/modules/partition/core/PartUtils.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019 Adriaan de Groot * Copyright 2019, Collabora Ltd * * Calamares is free software: you can redistribute it and/or modify diff --git a/src/modules/partition/core/PartUtils.h b/src/modules/partition/core/PartUtils.h index 9b4efeec9..d28355331 100644 --- a/src/modules/partition/core/PartUtils.h +++ b/src/modules/partition/core/PartUtils.h @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2015-2016, Teo Mrnjavac - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019 Adriaan de Groot * Copyright 2019, Collabora Ltd * * Calamares is free software: you can redistribute it and/or modify diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp index 074783186..4397ac736 100644 --- a/src/modules/partition/core/PartitionActions.cpp +++ b/src/modules/partition/core/PartitionActions.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2017-2019, Adriaan de Groot * Copyright 2019, Collabora Ltd * * Calamares is free software: you can redistribute it and/or modify diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp index 5d9b21bb0..d6ffe6354 100644 --- a/src/modules/partition/core/PartitionCoreModule.cpp +++ b/src/modules/partition/core/PartitionCoreModule.cpp @@ -2,7 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2015, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2017-2019, Adriaan de Groot * Copyright 2018, Caio Carvalho * * Calamares is free software: you can redistribute it and/or modify diff --git a/src/modules/partition/core/PartitionCoreModule.h b/src/modules/partition/core/PartitionCoreModule.h index dc0c5eff5..aebf9835f 100644 --- a/src/modules/partition/core/PartitionCoreModule.h +++ b/src/modules/partition/core/PartitionCoreModule.h @@ -2,6 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2016, Teo Mrnjavac + * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp index 98095b9ed..222950a83 100644 --- a/src/modules/partition/core/PartitionLayout.cpp +++ b/src/modules/partition/core/PartitionLayout.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014-2017, Teo Mrnjavac - * Copyright 2017-2018, Adriaan de Groot + * Copyright 2017-2019, Adriaan de Groot * Copyright 2018, Collabora Ltd * * Calamares is free software: you can redistribute it and/or modify diff --git a/src/modules/partition/core/PartitionModel.cpp b/src/modules/partition/core/PartitionModel.cpp index 8f0ecba81..a685a8bf5 100644 --- a/src/modules/partition/core/PartitionModel.cpp +++ b/src/modules/partition/core/PartitionModel.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/core/PartitionModel.h b/src/modules/partition/core/PartitionModel.h index fa63103c9..f36a496ea 100644 --- a/src/modules/partition/core/PartitionModel.h +++ b/src/modules/partition/core/PartitionModel.h @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau - * Copyright 2017, Adriaan de Groot + * Copyright 2017, 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/gui/PartitionDialogHelpers.cpp b/src/modules/partition/gui/PartitionDialogHelpers.cpp index 02d91ca4b..112d12cea 100644 --- a/src/modules/partition/gui/PartitionDialogHelpers.cpp +++ b/src/modules/partition/gui/PartitionDialogHelpers.cpp @@ -2,7 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2016, Teo Mrnjavac - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019 Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/gui/PartitionPage.h b/src/modules/partition/gui/PartitionPage.h index 9999c334d..e8a96a4cf 100644 --- a/src/modules/partition/gui/PartitionPage.h +++ b/src/modules/partition/gui/PartitionPage.h @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019, Adriaan de Groot * Copyright 2019, Collabora Ltd * * Calamares is free software: you can redistribute it and/or modify diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 7053740c9..1964a2839 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -2,7 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2014-2017, Teo Mrnjavac - * Copyright 2018, Adriaan de Groot + * Copyright 2018-2019, Adriaan de Groot * Copyright 2019, Collabora Ltd * * Calamares is free software: you can redistribute it and/or modify diff --git a/src/modules/partition/gui/ReplaceWidget.cpp b/src/modules/partition/gui/ReplaceWidget.cpp index 9c7a199be..13001468f 100644 --- a/src/modules/partition/gui/ReplaceWidget.cpp +++ b/src/modules/partition/gui/ReplaceWidget.cpp @@ -2,6 +2,7 @@ * * Copyright 2014-2015, Teo Mrnjavac * Copyright 2014, Aurélien Gâteau + * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/jobs/FillGlobalStorageJob.cpp b/src/modules/partition/jobs/FillGlobalStorageJob.cpp index 72146e2a0..52f98d4e5 100644 --- a/src/modules/partition/jobs/FillGlobalStorageJob.cpp +++ b/src/modules/partition/jobs/FillGlobalStorageJob.cpp @@ -2,7 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2015-2016, Teo Mrnjavac - * Copyright 2017, Adriaan de Groot + * Copyright 2017, 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/modules/partition/tests/PartitionJobTests.cpp b/src/modules/partition/tests/PartitionJobTests.cpp index 0314ea9cd..ac867bcb0 100644 --- a/src/modules/partition/tests/PartitionJobTests.cpp +++ b/src/modules/partition/tests/PartitionJobTests.cpp @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau - * Copyright 2017, Adriaan de Groot + * Copyright 2017, 2019 Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From dd6d1bf1c1c324873b2fc39c5fa28dd3a4c4a0da Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 1 Apr 2019 08:09:37 -0400 Subject: [PATCH 06/12] [partition] Protect PartitionModel against concurrent access - Try to avoid concurrent access while the model is being reset. --- src/modules/partition/core/PartitionModel.cpp | 7 +++++++ src/modules/partition/core/PartitionModel.h | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/modules/partition/core/PartitionModel.cpp b/src/modules/partition/core/PartitionModel.cpp index a685a8bf5..e92a9fe32 100644 --- a/src/modules/partition/core/PartitionModel.cpp +++ b/src/modules/partition/core/PartitionModel.cpp @@ -40,11 +40,16 @@ PartitionModel::ResetHelper::ResetHelper( PartitionModel* model ) : m_model( model ) { + m_model->m_lock.lock(); m_model->beginResetModel(); } PartitionModel::ResetHelper::~ResetHelper() { + // We need to unlock the mutex before emitting the reset signal, + // because the reset will cause clients to start looking at the + // (new) data. + m_model->m_lock.unlock(); m_model->endResetModel(); } @@ -58,6 +63,7 @@ PartitionModel::PartitionModel( QObject* parent ) void PartitionModel::init( Device* device , const OsproberEntryList& osproberEntries ) { + QMutexLocker lock(&m_lock); beginResetModel(); m_device = device; m_osproberEntries = osproberEntries; @@ -271,6 +277,7 @@ PartitionModel::headerData( int section, Qt::Orientation orientation, int role ) Partition* PartitionModel::partitionForIndex( const QModelIndex& index ) const { + QMutexLocker lock(&m_lock); if ( !index.isValid() ) return nullptr; return reinterpret_cast< Partition* >( index.internalPointer() ); diff --git a/src/modules/partition/core/PartitionModel.h b/src/modules/partition/core/PartitionModel.h index f36a496ea..f5289254b 100644 --- a/src/modules/partition/core/PartitionModel.h +++ b/src/modules/partition/core/PartitionModel.h @@ -23,6 +23,7 @@ // Qt #include +#include class Device; class Partition; @@ -115,8 +116,11 @@ public: void update(); private: + friend class ResetHelper; + Device* m_device; OsproberEntryList m_osproberEntries; + mutable QMutex m_lock; }; #endif /* PARTITIONMODEL_H */ From 544131c4bcd51ba401bde1325db36bfda9f4e608 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 1 Apr 2019 08:48:25 -0400 Subject: [PATCH 07/12] [partition] Improve type notation --- src/modules/partition/core/DeviceModel.cpp | 3 ++- src/modules/partition/core/DeviceModel.h | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/modules/partition/core/DeviceModel.cpp b/src/modules/partition/core/DeviceModel.cpp index 260315729..7c9503344 100644 --- a/src/modules/partition/core/DeviceModel.cpp +++ b/src/modules/partition/core/DeviceModel.cpp @@ -2,6 +2,7 @@ * * Copyright 2014, Aurélien Gâteau * Copyright 2014, Teo Mrnjavac + * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,7 +46,7 @@ DeviceModel::~DeviceModel() } void -DeviceModel::init( const QList< Device* >& devices ) +DeviceModel::init( const DeviceList& devices ) { beginResetModel(); m_devices = devices; diff --git a/src/modules/partition/core/DeviceModel.h b/src/modules/partition/core/DeviceModel.h index 2e2f99342..f3e158bbf 100644 --- a/src/modules/partition/core/DeviceModel.h +++ b/src/modules/partition/core/DeviceModel.h @@ -1,7 +1,7 @@ /* === This file is part of Calamares - === * * Copyright 2014, Aurélien Gâteau - * Copyright 2017, Adriaan de Groot + * Copyright 2017, 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,11 +36,13 @@ public: DeviceModel( QObject* parent = nullptr ); ~DeviceModel() override; + using DeviceList = QList< Device* >; + /** * Init the model with the list of devices. Does *not* take ownership of the * devices. */ - void init( const QList< Device* >& devices ); + void init( const DeviceList& devices ); int rowCount( const QModelIndex& parent = QModelIndex() ) const override; QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override; @@ -54,7 +56,7 @@ public: void removeDevice( Device* device ); private: - QList< Device* > m_devices; + DeviceList m_devices; }; #endif /* DEVICEMODEL_H */ From cccd4402d8b1541fabc15a42d1573f0731150fb0 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Mon, 1 Apr 2019 08:53:35 -0400 Subject: [PATCH 08/12] [partition] Simplify DeviceModel sorting --- src/modules/partition/core/DeviceModel.cpp | 28 ++++++++++------------ 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/modules/partition/core/DeviceModel.cpp b/src/modules/partition/core/DeviceModel.cpp index 7c9503344..d77f10ca1 100644 --- a/src/modules/partition/core/DeviceModel.cpp +++ b/src/modules/partition/core/DeviceModel.cpp @@ -36,6 +36,15 @@ // STL #include +static void +sortDevices( DeviceModel::DeviceList& l ) +{ + std::sort( l.begin(), l.end(), []( const Device* dev1, const Device* dev2 ) + { + return dev1->deviceNode() < dev2->deviceNode(); + } ); +} + DeviceModel::DeviceModel( QObject* parent ) : QAbstractListModel( parent ) { @@ -50,10 +59,7 @@ DeviceModel::init( const DeviceList& devices ) { beginResetModel(); m_devices = devices; - std::sort( m_devices.begin(), m_devices.end(), []( const Device* dev1, const Device* dev2 ) - { - return dev1->deviceNode() < dev2->deviceNode(); - } ); + sortDevices( m_devices ); endResetModel(); } @@ -131,13 +137,8 @@ void DeviceModel::addDevice( Device *device ) { beginResetModel(); - m_devices << device; - std::sort( m_devices.begin(), m_devices.end(), []( const Device* dev1, const Device* dev2 ) - { - return dev1->deviceNode() < dev2->deviceNode(); - } ); - + sortDevices( m_devices ); endResetModel(); } @@ -145,12 +146,7 @@ void DeviceModel::removeDevice( Device *device ) { beginResetModel(); - m_devices.removeAll( device ); - std::sort( m_devices.begin(), m_devices.end(), []( const Device* dev1, const Device* dev2 ) - { - return dev1->deviceNode() < dev2->deviceNode(); - } ); - + sortDevices( m_devices ); endResetModel(); } From 7074829c24cb21832b71daa9f980c9ac770df78b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 2 Apr 2019 04:55:12 -0400 Subject: [PATCH 09/12] [partition] Initialising BootLoader model is atomic - don't send a bunch of update signals, do only a single model-reset when the BootLoaderModel is (re-)initialised. --- src/modules/partition/core/BootLoaderModel.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/partition/core/BootLoaderModel.cpp b/src/modules/partition/core/BootLoaderModel.cpp index 4f48e0787..16c6ce3c8 100644 --- a/src/modules/partition/core/BootLoaderModel.cpp +++ b/src/modules/partition/core/BootLoaderModel.cpp @@ -47,9 +47,15 @@ BootLoaderModel::~BootLoaderModel() void BootLoaderModel::init( const QList< Device* >& devices ) { + beginResetModel(); + blockSignals( true ); + m_devices = devices; clear(); createMbrItems(); + + blockSignals( false ); + endResetModel(); } void From 8f9b9a2ccf5575020a0359a57045b481233e23a2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 2 Apr 2019 05:21:35 -0400 Subject: [PATCH 10/12] [partition] Remove unused include --- src/modules/partition/gui/PartitionViewStep.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 1964a2839..6927dbdbc 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -60,8 +60,6 @@ #include #include -#include // For sleep(3) - PartitionViewStep::PartitionViewStep( QObject* parent ) : Calamares::ViewStep( parent ) , m_core( nullptr ) From 71fd3ab01051874b6503f2b4095e1a296a83be21 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 2 Apr 2019 05:30:22 -0400 Subject: [PATCH 11/12] [partition] Check-which-page consistently --- src/modules/partition/gui/PartitionViewStep.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 6927dbdbc..509edea13 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -311,10 +311,10 @@ PartitionViewStep::back() bool PartitionViewStep::isNextEnabled() const { - if ( m_choicePage && m_choicePage == m_widget->currentWidget() ) + if ( m_choicePage && m_widget->currentWidget() == m_choicePage ) return m_choicePage->isNextEnabled(); - if ( m_manualPartitionPage && m_manualPartitionPage == m_widget->currentWidget() ) + if ( m_manualPartitionPage && m_widget->currentWidget() == m_manualPartitionPage ) return m_core->hasRootMountPoint(); return false; @@ -331,7 +331,7 @@ PartitionViewStep::isBackEnabled() const bool PartitionViewStep::isAtBeginning() const { - if ( m_widget->currentWidget() == m_manualPartitionPage ) + if ( m_widget->currentWidget() != m_choicePage ) return false; return true; } @@ -340,7 +340,7 @@ PartitionViewStep::isAtBeginning() const bool PartitionViewStep::isAtEnd() const { - if ( m_choicePage == m_widget->currentWidget() ) + if ( m_widget->currentWidget() == m_choicePage ) { if ( m_choicePage->currentChoice() == ChoicePage::Erase || m_choicePage->currentChoice() == ChoicePage::Replace || From 4282e4c31f95c6581478bea993bea73e232b62e2 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 2 Apr 2019 05:32:32 -0400 Subject: [PATCH 12/12] [partition] Instantiate the manual-partitioning page on-demand - When the manual partitioning page exists, it reacts to changes in a bunch of models; these models can be changed repeatedly from the choice page. - the manual partitioning page really only needs to deal with the relevant selections at the moment it is instantiated. --- .../partition/gui/PartitionViewStep.cpp | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/modules/partition/gui/PartitionViewStep.cpp b/src/modules/partition/gui/PartitionViewStep.cpp index 509edea13..371a039cb 100644 --- a/src/modules/partition/gui/PartitionViewStep.cpp +++ b/src/modules/partition/gui/PartitionViewStep.cpp @@ -90,15 +90,16 @@ void PartitionViewStep::continueLoading() { Q_ASSERT( !m_choicePage ); - Q_ASSERT( !m_manualPartitionPage ); - - m_manualPartitionPage = new PartitionPage( m_core ); m_choicePage = new ChoicePage( m_swapChoices ); - m_choicePage->init( m_core ); - m_widget->addWidget( m_choicePage ); - m_widget->addWidget( m_manualPartitionPage ); + + // Instantiate the manual partitioning page as needed. + // + Q_ASSERT( !m_manualPartitionPage ); + // m_manualPartitionPage = new PartitionPage( m_core ); + // m_widget->addWidget( m_manualPartitionPage ); + m_widget->removeWidget( m_waitingWidget ); m_waitingWidget->deleteLater(); m_waitingWidget = nullptr; @@ -287,6 +288,12 @@ PartitionViewStep::next() { if ( m_choicePage->currentChoice() == ChoicePage::Manual ) { + if ( !m_manualPartitionPage ) + { + m_manualPartitionPage = new PartitionPage( m_core ); + m_widget->addWidget( m_manualPartitionPage ); + } + m_widget->setCurrentWidget( m_manualPartitionPage ); m_manualPartitionPage->selectDeviceByIndex( m_choicePage->lastSelectedDeviceIndex() ); if ( m_core->isDirty() ) @@ -304,6 +311,12 @@ PartitionViewStep::back() { m_widget->setCurrentWidget( m_choicePage ); m_choicePage->setLastSelectedDeviceIndex( m_manualPartitionPage->selectedDeviceIndex() ); + + if ( m_manualPartitionPage ) + { + m_manualPartitionPage->deleteLater(); + m_manualPartitionPage = nullptr; + } } }