File indexing completed on 2024-05-12 04:20:45
0001 /* 0002 * SPDX-FileCopyrightText: 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved. 0003 * 0004 * This file is part of the KGantt library. 0005 * 0006 * SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "kgantttreeviewrowcontroller.h" 0010 #include "kgantttreeviewrowcontroller_p.h" 0011 0012 #include <QAbstractProxyModel> 0013 #include <QHeaderView> 0014 #include <QScrollBar> 0015 0016 #include <cassert> 0017 0018 using namespace KGantt; 0019 0020 0021 0022 TreeViewRowController::TreeViewRowController( QTreeView* tv, 0023 QAbstractProxyModel* proxy ) 0024 : _d( new Private ) 0025 { 0026 _d->treeview = static_cast<Private::HackTreeView*>(tv); 0027 _d->proxy = proxy; 0028 } 0029 0030 TreeViewRowController::~TreeViewRowController() 0031 { 0032 delete _d; _d = nullptr; 0033 } 0034 0035 #define d d_func() 0036 0037 int TreeViewRowController::headerHeight() const 0038 { 0039 //return d->treeview->header()->sizeHint().height(); 0040 return d->treeview->viewport()->y()-d->treeview->frameWidth(); 0041 } 0042 0043 int TreeViewRowController::maximumItemHeight() const 0044 { 0045 return d->treeview->fontMetrics().height(); 0046 } 0047 0048 int TreeViewRowController::totalHeight() const 0049 { 0050 return d->treeview->verticalScrollBar()->maximum()+d->treeview->viewport()->height(); 0051 } 0052 0053 bool TreeViewRowController::isRowVisible( const QModelIndex& _idx ) const 0054 { 0055 //qDebug() << _idx.model()<<d->proxy << d->treeview->model(); 0056 const QModelIndex idx = d->proxy->mapToSource( _idx ); 0057 assert( idx.isValid() ? ( idx.model() == d->treeview->model() ):( true ) ); 0058 return d->treeview->visualRect(idx).isValid(); 0059 } 0060 0061 bool TreeViewRowController::isRowExpanded( const QModelIndex& _idx ) const 0062 { 0063 const QModelIndex idx = d->proxy->mapToSource( _idx ); 0064 assert( idx.isValid() ? ( idx.model() == d->treeview->model() ):( true ) ); 0065 return d->treeview->isExpanded( idx ); 0066 } 0067 0068 Span TreeViewRowController::rowGeometry( const QModelIndex& _idx ) const 0069 { 0070 const QModelIndex idx = d->proxy->mapToSource( _idx ); 0071 assert( idx.isValid() ? ( idx.model() == d->treeview->model() ):( true ) ); 0072 QRect r = d->treeview->visualRect(idx).translated( QPoint( 0, d->treeview->verticalOffset() ) ); 0073 return Span( r.y(), r.height() ); 0074 } 0075 0076 QModelIndex TreeViewRowController::indexAt( int height ) const 0077 { 0078 /* using indexAt( QPoint ) won't work here, since it does hit detection 0079 * against the actual item text/icon, so we would return wrong values 0080 * for items with no text etc. 0081 * 0082 * The code below could cache for performance, but currently it doesn't 0083 * seem to be the performance bottleneck at all. 0084 */ 0085 if ( !d->treeview->model() ) return QModelIndex(); 0086 int y = d->treeview->verticalOffset(); 0087 QModelIndex idx = d->treeview->model()->index( 0, 0, d->treeview->rootIndex() ); 0088 do { 0089 if ( y >= height ) break; 0090 y += d->treeview->rowHeight( idx ); 0091 idx = d->treeview->indexBelow( idx ); 0092 } while ( idx.isValid() ); 0093 return d->proxy->mapFromSource( idx ); 0094 } 0095 0096 QModelIndex TreeViewRowController::indexAbove( const QModelIndex& _idx ) const 0097 { 0098 const QModelIndex idx = d->proxy->mapToSource( _idx ); 0099 return d->proxy->mapFromSource( d->treeview->indexAbove( idx ) ); 0100 } 0101 0102 QModelIndex TreeViewRowController::indexBelow( const QModelIndex& _idx ) const 0103 { 0104 const QModelIndex idx = d->proxy->mapToSource( _idx ); 0105 return d->proxy->mapFromSource( d->treeview->indexBelow( idx ) ); 0106 }