QGIS/src/gui/processing/qgsprocessingtoolboxtreeview.cpp
2018-07-16 11:38:13 +10:00

113 lines
3.7 KiB
C++

/***************************************************************************
qgsprocessingtoolboxtreeview.cpp
-------------------------------
begin : July 2018
copyright : (C) 2018 by Nyall Dawso
email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program 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 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsprocessingtoolboxtreeview.h"
#include "qgsprocessingtoolboxmodel.h"
///@cond PRIVATE
QgsProcessingToolboxTreeView::QgsProcessingToolboxTreeView( QWidget *parent,
QgsProcessingRegistry *registry,
QgsProcessingRecentAlgorithmLog *recentLog )
: QTreeView( parent )
{
mModel = new QgsProcessingToolboxProxyModel( this, registry, recentLog );
mToolboxModel = mModel->toolboxModel();
setModel( mModel );
}
void QgsProcessingToolboxTreeView::setRegistry( QgsProcessingRegistry *registry, QgsProcessingRecentAlgorithmLog *recentLog )
{
QgsProcessingToolboxProxyModel *newModel = new QgsProcessingToolboxProxyModel( this, registry, recentLog );
mToolboxModel = mModel->toolboxModel();
setModel( newModel );
mModel->deleteLater();
mModel = newModel;
}
void QgsProcessingToolboxTreeView::setToolboxProxyModel( QgsProcessingToolboxProxyModel *model )
{
mToolboxModel = mModel->toolboxModel();
setModel( model );
mModel->deleteLater();
mModel = model;
}
void QgsProcessingToolboxTreeView::setFilterString( const QString &filter )
{
const QString text = filter.trimmed().toLower();
mModel->setFilterString( text );
if ( !text.isEmpty() )
{
expandAll();
if ( !selectedAlgorithm() )
{
// if previously selected item was hidden, auto select the first visible algorithm
QModelIndex firstVisibleIndex = findFirstVisibleAlgorithm( QModelIndex() );
if ( firstVisibleIndex.isValid() )
selectionModel()->setCurrentIndex( firstVisibleIndex, QItemSelectionModel::ClearAndSelect );
}
}
else
{
collapseAll();
}
}
const QgsProcessingAlgorithm *QgsProcessingToolboxTreeView::algorithmForIndex( const QModelIndex &index )
{
QModelIndex sourceIndex = mModel->mapToSource( index );
if ( mToolboxModel->isAlgorithm( sourceIndex ) )
return mToolboxModel->algorithmForIndex( sourceIndex );
else
return nullptr;
}
const QgsProcessingAlgorithm *QgsProcessingToolboxTreeView::selectedAlgorithm()
{
if ( selectionModel()->hasSelection() )
{
QModelIndex index = selectionModel()->selectedIndexes().at( 0 );
return algorithmForIndex( index );
}
else
{
return nullptr;
}
}
void QgsProcessingToolboxTreeView::setFilters( QgsProcessingToolboxProxyModel::Filters filters )
{
mModel->setFilters( filters );
}
QModelIndex QgsProcessingToolboxTreeView::findFirstVisibleAlgorithm( const QModelIndex &parent )
{
for ( int r = 0; r < mModel->rowCount( parent ); ++r )
{
QModelIndex proxyIndex = mModel->index( r, 0, parent );
QModelIndex sourceIndex = mModel->mapToSource( proxyIndex );
if ( mToolboxModel->isAlgorithm( sourceIndex ) )
return proxyIndex;
QModelIndex index = findFirstVisibleAlgorithm( proxyIndex );
if ( index.isValid() )
return index;
}
return QModelIndex();
}
///@endcond