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 }