calamares/src/modules/netinstall/PackageTreeItem.cpp

303 lines
6.4 KiB
C++
Raw Normal View History

/* === This file is part of Calamares - <https://github.com/calamares> ===
2017-01-23 13:42:40 +01:00
*
* Copyright (c) 2017, Kyle Robbertze <kyle@aims.ac.za>
* Copyright 2017, Adriaan de Groot <groot@kde.org>
2017-01-23 13:42:40 +01:00
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include "PackageTreeItem.h"
#include "utils/Logger.h"
QVariant
PackageTreeItem::ItemData::toOperation() const
{
// If it's a package with a pre- or post-script, replace
// with the more complicated datastructure.
if ( !preScript.isEmpty() || !postScript.isEmpty() )
{
QMap< QString, QVariant > sdetails;
sdetails.insert( "pre-script", preScript );
sdetails.insert( "package", packageName );
sdetails.insert( "post-script", postScript );
return sdetails;
}
else
{
return packageName;
}
}
2017-09-13 20:07:09 +02:00
PackageTreeItem::PackageTreeItem( const ItemData& data, PackageTreeItem* parent )
: m_parentItem( parent )
, m_data( data )
2020-02-18 11:02:53 +01:00
{
}
2017-01-23 13:42:40 +01:00
2020-02-18 11:02:53 +01:00
PackageTreeItem::PackageTreeItem( const QString packageName, PackageTreeItem* parent )
: m_parentItem( parent )
2017-01-25 09:34:18 +01:00
{
m_data.packageName = packageName;
if ( parent != nullptr )
2020-02-18 11:02:53 +01:00
{
2017-01-25 09:34:18 +01:00
m_data.selected = parent->isSelected();
2020-02-18 11:02:53 +01:00
}
2017-01-25 09:34:18 +01:00
else
2020-02-18 11:02:53 +01:00
{
2017-01-25 09:34:18 +01:00
m_data.selected = Qt::Unchecked;
2020-02-18 11:02:53 +01:00
}
2017-01-25 09:34:18 +01:00
}
2017-01-23 13:42:40 +01:00
2020-02-18 11:02:53 +01:00
PackageTreeItem::PackageTreeItem( PackageTreeItem* parent )
: m_parentItem( parent )
{
}
2020-02-18 11:02:53 +01:00
PackageTreeItem::PackageTreeItem::PackageTreeItem()
: PackageTreeItem( QString(), nullptr )
{
m_data.selected = Qt::Checked;
2019-09-08 22:20:13 +02:00
m_data.name = QLatin1String( "<root>" );
}
2017-01-23 13:42:40 +01:00
PackageTreeItem::~PackageTreeItem()
{
qDeleteAll( m_childItems );
}
void
PackageTreeItem::appendChild( PackageTreeItem* child )
{
m_childItems.append( child );
}
PackageTreeItem*
PackageTreeItem::child( int row )
{
return m_childItems.value( row );
}
int
PackageTreeItem::childCount() const
{
return m_childItems.count();
}
int
PackageTreeItem::row() const
{
if ( m_parentItem )
2020-02-18 11:02:53 +01:00
{
return m_parentItem->m_childItems.indexOf( const_cast< PackageTreeItem* >( this ) );
}
2017-01-23 13:42:40 +01:00
return 0;
}
int
PackageTreeItem::columnCount() const
{
return m_columns;
}
QVariant
PackageTreeItem::data( int column ) const
{
2020-02-18 11:02:53 +01:00
if ( packageName() != nullptr ) // package
2017-01-23 13:42:40 +01:00
{
2017-01-25 09:34:18 +01:00
if ( !column )
2020-02-18 11:02:53 +01:00
{
2017-01-23 13:42:40 +01:00
return QVariant( packageName() );
2020-02-18 11:02:53 +01:00
}
2017-01-23 13:42:40 +01:00
return QVariant();
}
2020-02-18 11:02:53 +01:00
switch ( column ) // group
2017-01-23 13:42:40 +01:00
{
2017-01-23 14:04:07 +01:00
case 0:
return QVariant( prettyName() );
case 1:
return QVariant( description() );
default:
return QVariant();
2017-01-23 13:42:40 +01:00
}
}
PackageTreeItem*
PackageTreeItem::parentItem()
{
return m_parentItem;
}
const PackageTreeItem*
PackageTreeItem::parentItem() const
{
return m_parentItem;
}
2017-01-23 13:42:40 +01:00
QString
PackageTreeItem::prettyName() const
{
return m_data.name;
}
QString
PackageTreeItem::description() const
{
return m_data.description;
}
QString
PackageTreeItem::preScript() const
{
return m_data.preScript;
}
QString
PackageTreeItem::packageName() const
{
2017-01-25 09:34:18 +01:00
return m_data.packageName;
2017-01-23 13:42:40 +01:00
}
QString
PackageTreeItem::postScript() const
{
return m_data.postScript;
}
bool
PackageTreeItem::isHidden() const
{
2017-01-25 09:34:18 +01:00
return m_data.isHidden;
2017-01-23 13:42:40 +01:00
}
void
PackageTreeItem::setHidden( bool isHidden )
{
2017-01-25 09:34:18 +01:00
m_data.isHidden = isHidden;
2017-01-23 13:42:40 +01:00
}
bool
PackageTreeItem::hiddenSelected() const
{
Q_ASSERT( m_data.isHidden );
2020-02-18 11:02:53 +01:00
if ( !m_data.selected )
{
return false;
2020-02-18 11:02:53 +01:00
}
const PackageTreeItem* currentItem = parentItem();
while ( currentItem != nullptr )
{
if ( !currentItem->isHidden() )
2020-02-18 11:02:53 +01:00
{
return currentItem->isSelected() != Qt::Unchecked;
2020-02-18 11:02:53 +01:00
}
currentItem = currentItem->parentItem();
}
/* Has no non-hiddent parents */
return m_data.selected;
}
2017-01-23 13:42:40 +01:00
bool
PackageTreeItem::isCritical() const
{
2017-01-25 09:34:18 +01:00
return m_data.isCritical;
2017-01-23 13:42:40 +01:00
}
void
PackageTreeItem::setCritical( bool isCritical )
{
2017-01-25 09:34:18 +01:00
m_data.isCritical = isCritical;
2017-01-23 13:42:40 +01:00
}
Qt::CheckState
PackageTreeItem::isSelected() const
{
2017-01-25 09:34:18 +01:00
return m_data.selected;
2017-01-23 13:42:40 +01:00
}
void
PackageTreeItem::setSelected( Qt::CheckState isSelected )
{
if ( parentItem() == nullptr )
2020-02-18 11:02:53 +01:00
// This is the root, it is always checked so don't change state
{
return;
2020-02-18 11:02:53 +01:00
}
2017-01-25 09:34:18 +01:00
m_data.selected = isSelected;
2017-01-23 13:42:40 +01:00
setChildrenSelected( isSelected );
// Look for suitable parent item which may change checked-state
// when one of its children changes.
2017-01-23 13:42:40 +01:00
PackageTreeItem* currentItem = parentItem();
while ( ( currentItem != nullptr ) && ( currentItem->childCount() == 0 ) )
2017-01-23 13:42:40 +01:00
{
currentItem = currentItem->parentItem();
}
if ( currentItem == nullptr )
2020-02-18 11:02:53 +01:00
// Reached the root .. don't bother
{
return;
2020-02-18 11:02:53 +01:00
}
// 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 )
2020-02-18 11:02:53 +01:00
{
childrenSelected++;
2020-02-18 11:02:53 +01:00
}
if ( currentItem->child( i )->isSelected() == Qt::PartiallyChecked )
2020-02-18 11:02:53 +01:00
{
childrenPartiallySelected++;
2020-02-18 11:02:53 +01:00
}
}
2020-02-18 11:02:53 +01:00
if ( !childrenSelected && !childrenPartiallySelected )
{
currentItem->setSelected( Qt::Unchecked );
2020-02-18 11:02:53 +01:00
}
else if ( childrenSelected == currentItem->childCount() )
2020-02-18 11:02:53 +01:00
{
currentItem->setSelected( Qt::Checked );
2020-02-18 11:02:53 +01:00
}
else
2020-02-18 11:02:53 +01:00
{
currentItem->setSelected( Qt::PartiallyChecked );
2020-02-18 11:02:53 +01:00
}
2017-01-23 13:42:40 +01:00
}
void
PackageTreeItem::setChildrenSelected( Qt::CheckState isSelected )
{
if ( isSelected != Qt::PartiallyChecked )
// Children are never root; don't need to use setSelected on them.
2017-01-23 13:42:40 +01:00
for ( auto child : m_childItems )
{
2017-01-25 09:34:18 +01:00
child->m_data.selected = isSelected;
2017-01-23 13:42:40 +01:00
child->setChildrenSelected( isSelected );
}
}
int
PackageTreeItem::type() const
{
return QStandardItem::UserType;
}