From 848d532a5800de40ca398a6d06cb91edef12c92b Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 14 Nov 2017 10:18:58 -0500 Subject: [PATCH 1/6] CMake: drop -rc status --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 991343614..7c0af9c4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -167,7 +167,7 @@ set( CALAMARES_TRANSLATION_LANGUAGES ar ast bg ca cs_CZ da de el en en_GB es_MX set( CALAMARES_VERSION_MAJOR 3 ) set( CALAMARES_VERSION_MINOR 1 ) set( CALAMARES_VERSION_PATCH 8 ) -set( CALAMARES_VERSION_RC 1 ) +set( CALAMARES_VERSION_RC 0 ) set( CALAMARES_VERSION ${CALAMARES_VERSION_MAJOR}.${CALAMARES_VERSION_MINOR}.${CALAMARES_VERSION_PATCH} ) set( CALAMARES_VERSION_SHORT "${CALAMARES_VERSION}" ) From 7e2e2cabfeb8c051e6ea8fe253ac40ae6f411545 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 21 Nov 2017 04:25:32 -0500 Subject: [PATCH 2/6] CMake: bump version to 3.1.9rc1 (no functional changes yet) --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c0af9c4a..a28ba179f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -166,8 +166,8 @@ set( CALAMARES_TRANSLATION_LANGUAGES ar ast bg ca cs_CZ da de el en en_GB es_MX ### Bump version here set( CALAMARES_VERSION_MAJOR 3 ) set( CALAMARES_VERSION_MINOR 1 ) -set( CALAMARES_VERSION_PATCH 8 ) -set( CALAMARES_VERSION_RC 0 ) +set( CALAMARES_VERSION_PATCH 9 ) +set( CALAMARES_VERSION_RC 1 ) set( CALAMARES_VERSION ${CALAMARES_VERSION_MAJOR}.${CALAMARES_VERSION_MINOR}.${CALAMARES_VERSION_PATCH} ) set( CALAMARES_VERSION_SHORT "${CALAMARES_VERSION}" ) From 71e80f680ee2cb814a5141a34789788dbeeee364 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 21 Nov 2017 05:36:30 -0500 Subject: [PATCH 3/6] [netinstall] Only update selectedness of parents with children. While walking up the tree, only switch the selectedness states of parents with children. This avoids the case where a parent has a first subgroup that is hidden -- in which case the parent ends up with no children, and is unselected even though it is marked as selected in the config file. FIXES #864 --- src/modules/netinstall/PackageTreeItem.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/modules/netinstall/PackageTreeItem.cpp b/src/modules/netinstall/PackageTreeItem.cpp index 77ca07a9c..8e0d3f43b 100644 --- a/src/modules/netinstall/PackageTreeItem.cpp +++ b/src/modules/netinstall/PackageTreeItem.cpp @@ -169,16 +169,22 @@ PackageTreeItem::setSelected( Qt::CheckState isSelected ) PackageTreeItem* currentItem = parentItem(); while ( currentItem != nullptr ) { + if ( currentItem->childCount() == 0) + { + currentItem = currentItem->parentItem(); + continue; + } + int childrenSelected = 0; - bool isChildPartiallySelected = false; + int childrenPartiallySelected = 0; for ( int i = 0; i < currentItem->childCount(); i++ ) { if ( currentItem->child( i )->isSelected() == Qt::Checked ) childrenSelected++; if ( currentItem->child( i )->isSelected() == Qt::PartiallyChecked ) - isChildPartiallySelected = true; + childrenPartiallySelected++; } - if ( !childrenSelected && !isChildPartiallySelected ) + if ( !childrenSelected && !childrenPartiallySelected) currentItem->m_data.selected = Qt::Unchecked; else if ( childrenSelected == currentItem->childCount() ) currentItem->m_data.selected = Qt::Checked; From aa0fa37492d96180b6229a380eb1bf9c6da90d85 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 21 Nov 2017 06:13:42 -0500 Subject: [PATCH 4/6] [netinstall] Hidden groups follow selectedness of parents. If a subgroup is hidden, then it should be considered selected if its parent is selected or partially-selected. If the parent group is totally unselected, then the hidden subgroup shouldn't be installed either. This allows putting required-packages into a group, without cluttering the interface. FIXES #864 --- src/modules/netinstall/PackageModel.cpp | 3 ++- src/modules/netinstall/PackageTreeItem.cpp | 27 ++++++++++++++++++++++ src/modules/netinstall/PackageTreeItem.h | 14 +++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/modules/netinstall/PackageModel.cpp b/src/modules/netinstall/PackageModel.cpp index 9fe8305a7..b97793f6d 100644 --- a/src/modules/netinstall/PackageModel.cpp +++ b/src/modules/netinstall/PackageModel.cpp @@ -163,7 +163,8 @@ PackageModel::getPackages() const { QList items = getItemPackages( m_rootItem ); for ( auto package : m_hiddenItems ) - items.append( getItemPackages( package ) ); + if ( package->hiddenSelected() ) + items.append( getItemPackages( package ) ); QList packages; for ( auto item : items ) { diff --git a/src/modules/netinstall/PackageTreeItem.cpp b/src/modules/netinstall/PackageTreeItem.cpp index 8e0d3f43b..db89d988e 100644 --- a/src/modules/netinstall/PackageTreeItem.cpp +++ b/src/modules/netinstall/PackageTreeItem.cpp @@ -101,6 +101,13 @@ PackageTreeItem::parentItem() return m_parentItem; } +const PackageTreeItem* +PackageTreeItem::parentItem() const +{ + return m_parentItem; +} + + QString PackageTreeItem::prettyName() const { @@ -143,6 +150,26 @@ PackageTreeItem::setHidden( bool isHidden ) m_data.isHidden = isHidden; } +bool +PackageTreeItem::hiddenSelected() const +{ + Q_ASSERT( m_data.isHidden ); + if (! m_data.selected ) + return false; + + const PackageTreeItem* currentItem = parentItem(); + while ( currentItem != nullptr ) + { + if ( !currentItem->isHidden() ) + return currentItem->isSelected() != Qt::Unchecked; + currentItem = currentItem->parentItem(); + } + + /* Has no non-hiddent parents */ + return m_data.selected; +} + + bool PackageTreeItem::isCritical() const { diff --git a/src/modules/netinstall/PackageTreeItem.h b/src/modules/netinstall/PackageTreeItem.h index e9bbcf59c..08bf1e811 100644 --- a/src/modules/netinstall/PackageTreeItem.h +++ b/src/modules/netinstall/PackageTreeItem.h @@ -49,16 +49,30 @@ public: int columnCount() const; QVariant data( int column ) const override; int row() const; + PackageTreeItem* parentItem(); + const PackageTreeItem* parentItem() const; + QString prettyName() const; QString description() const; QString preScript() const; QString packageName() const; QString postScript() const; + bool isHidden() const; void setHidden( bool isHidden ); + /** + * @brief Is this hidden item, considered "selected"? + * + * This asserts when called on a non-hidden item. + * A hidden item has its own selected state, but really + * falls under the selectedness of the parent item. + */ + bool hiddenSelected() const; + bool isCritical() const; void setCritical( bool isCritical ); + Qt::CheckState isSelected() const; void setSelected( Qt::CheckState isSelected ); void setChildrenSelected( Qt::CheckState isSelected ); From 452cefd482b67be484f82f2a38e30139db684085 Mon Sep 17 00:00:00 2001 From: bill-auger Date: Tue, 3 Oct 2017 18:27:14 -0400 Subject: [PATCH 5/6] use orphaned Branding::ProductLogo as sidebar image --- src/calamares/CalamaresWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index eb3289083..ab24b6db2 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -96,7 +96,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) logoLabel->setAlignment( Qt::AlignCenter ); logoLabel->setFixedSize( 80, 80 ); logoLabel->setPixmap( Calamares::Branding::instance()-> - image( Calamares::Branding::ProductIcon, + image( Calamares::Branding::ProductLogo, logoLabel->size() ) ); logoLayout->addWidget( logoLabel ); logoLayout->addStretch(); From 93ab6432c4c1d890da2ac77c9fd74b4a7aefd7fc Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Fri, 24 Nov 2017 07:52:52 -0500 Subject: [PATCH 6/6] [netinstall] Special-case the root node. Root is always selected, can't be unselected, and has its own explicit constructor and name. This resolves issue reported where unchecking all *visible* groups caused the root to be unchecked, after which hidden-but-still-selected subgroups were not installed. Reported by crazy@ --- src/modules/netinstall/PackageTreeItem.cpp | 65 ++++++++++++++-------- src/modules/netinstall/PackageTreeItem.h | 3 +- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/modules/netinstall/PackageTreeItem.cpp b/src/modules/netinstall/PackageTreeItem.cpp index db89d988e..6ccd53382 100644 --- a/src/modules/netinstall/PackageTreeItem.cpp +++ b/src/modules/netinstall/PackageTreeItem.cpp @@ -19,6 +19,8 @@ #include "PackageTreeItem.h" +#include "utils/Logger.h" + PackageTreeItem::PackageTreeItem( const ItemData& data, PackageTreeItem* parent ) : m_parentItem( parent ) , m_data( data ) @@ -36,7 +38,15 @@ PackageTreeItem::PackageTreeItem( const QString packageName, PackageTreeItem* pa PackageTreeItem::PackageTreeItem( PackageTreeItem* parent ) : m_parentItem( parent ) -{ } +{ +} + +PackageTreeItem::PackageTreeItem::PackageTreeItem() : + PackageTreeItem( QString(), nullptr ) +{ + m_data.selected = Qt::Checked; + m_data.name = QLatin1Literal( "" ); +} PackageTreeItem::~PackageTreeItem() { @@ -191,40 +201,47 @@ PackageTreeItem::isSelected() const void PackageTreeItem::setSelected( Qt::CheckState isSelected ) { + if ( parentItem() == nullptr ) + // This is the root, it is always checked so don't change state + return; + m_data.selected = isSelected; setChildrenSelected( isSelected ); - PackageTreeItem* currentItem = parentItem(); - while ( currentItem != nullptr ) - { - if ( currentItem->childCount() == 0) - { - currentItem = currentItem->parentItem(); - continue; - } - int childrenSelected = 0; - int childrenPartiallySelected = 0; - for ( int i = 0; i < currentItem->childCount(); i++ ) - { - if ( currentItem->child( i )->isSelected() == Qt::Checked ) - childrenSelected++; - if ( currentItem->child( i )->isSelected() == Qt::PartiallyChecked ) - childrenPartiallySelected++; - } - if ( !childrenSelected && !childrenPartiallySelected) - currentItem->m_data.selected = Qt::Unchecked; - else if ( childrenSelected == currentItem->childCount() ) - currentItem->m_data.selected = Qt::Checked; - else - currentItem->m_data.selected = Qt::PartiallyChecked; + // Look for suitable parent item which may change checked-state + // when one of its children changes. + PackageTreeItem* currentItem = parentItem(); + while ( ( currentItem != nullptr ) && ( currentItem->childCount() == 0 ) ) + { currentItem = currentItem->parentItem(); } + if ( currentItem == nullptr ) + // Reached the root .. don't bother + return; + + // Figure out checked-state based on the children + int childrenSelected = 0; + int childrenPartiallySelected = 0; + for ( int i = 0; i < currentItem->childCount(); i++ ) + { + if ( currentItem->child( i )->isSelected() == Qt::Checked ) + childrenSelected++; + if ( currentItem->child( i )->isSelected() == Qt::PartiallyChecked ) + childrenPartiallySelected++; + } + if ( !childrenSelected && !childrenPartiallySelected) + currentItem->setSelected( Qt::Unchecked ); + else if ( childrenSelected == currentItem->childCount() ) + currentItem->setSelected( Qt::Checked ); + else + currentItem->setSelected( Qt::PartiallyChecked ); } void PackageTreeItem::setChildrenSelected( Qt::CheckState isSelected ) { if ( isSelected != Qt::PartiallyChecked ) + // Children are never root; don't need to use setSelected on them. for ( auto child : m_childItems ) { child->m_data.selected = isSelected; diff --git a/src/modules/netinstall/PackageTreeItem.h b/src/modules/netinstall/PackageTreeItem.h index 08bf1e811..5b3520cb4 100644 --- a/src/modules/netinstall/PackageTreeItem.h +++ b/src/modules/netinstall/PackageTreeItem.h @@ -40,7 +40,8 @@ public: }; explicit PackageTreeItem( const ItemData& data, PackageTreeItem* parent = nullptr ); explicit PackageTreeItem( const QString packageName, PackageTreeItem* parent = nullptr ); - explicit PackageTreeItem( PackageTreeItem* parent = nullptr ); + explicit PackageTreeItem( PackageTreeItem* parent ); + explicit PackageTreeItem(); // The root of the tree; always selected, named ~PackageTreeItem() override; void appendChild( PackageTreeItem* child );