30 QgsLayerTreeViewProxyStyle::QgsLayerTreeViewProxyStyle( 
QgsLayerTreeView *treeView )
 
   32   , mLayerTreeView( treeView )
 
   37 QRect QgsLayerTreeViewProxyStyle::subElementRect( QStyle::SubElement element, 
const QStyleOption *option, 
const QWidget *widget )
 const 
   39   if ( element == SE_LayerTreeItemIndicator )
 
   41     if ( 
const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>( option ) )
 
   43       if ( 
QgsLayerTreeNode *node = mLayerTreeView->layerTreeModel()->index2node( vopt->index ) )
 
   45         int count = mLayerTreeView->indicators( node ).count();
 
   48           QRect vpr = mLayerTreeView->viewport()->rect();
 
   49           QRect r = QProxyStyle::subElementRect( SE_ItemViewItemText, option, widget );
 
   50           int indiWidth = r.height() * count;
 
   51           int spacing = r.height() / 10;
 
   52           int vpIndiWidth = vpr.width() - indiWidth - spacing - mLayerTreeView->layerMarkWidth();
 
   53           return QRect( vpIndiWidth, r.top(), indiWidth, r.height() );
 
   58   return QProxyStyle::subElementRect( element, option, widget );
 
   65 QgsLayerTreeViewItemDelegate::QgsLayerTreeViewItemDelegate( 
QgsLayerTreeView *parent )
 
   66   : QStyledItemDelegate( parent )
 
   67   , mLayerTreeView( parent )
 
   69   connect( mLayerTreeView, &QgsLayerTreeView::clicked, 
this, &QgsLayerTreeViewItemDelegate::onClicked );
 
   73 void QgsLayerTreeViewItemDelegate::paint( QPainter *painter, 
const QStyleOptionViewItem &option, 
const QModelIndex &index )
 const 
   75   QStyledItemDelegate::paint( painter, option, index );
 
   77   QgsLayerTreeNode *node = mLayerTreeView->layerTreeModel()->index2node( index );
 
   81   QStyleOptionViewItem opt = option;
 
   82   initStyleOption( &opt, index );
 
   84   const QColor baseColor = opt.palette.base().color();
 
   85   QRect tRect = mLayerTreeView->style()->subElementRect( QStyle::SE_ItemViewItemText, &opt, mLayerTreeView );
 
   87   const bool shouldShowLayerMark = tRect.left() < 0;  
 
   88   if ( shouldShowLayerMark )
 
   90     int tPadding = tRect.height() / 10;
 
   91     QRect mRect( mLayerTreeView->viewport()->rect().right() - mLayerTreeView->layerMarkWidth(), tRect.top() + tPadding, mLayerTreeView->layerMarkWidth(), tRect.height() - tPadding * 2 );
 
   92     QBrush pb = painter->brush();
 
   93     QPen pp = painter->pen();
 
   94     painter->setPen( QPen( Qt::NoPen ) );
 
   95     QBrush b = QBrush( opt.palette.mid() );
 
   96     QColor bc = b.color();
 
   98     bc.setRed( 
static_cast< int >( bc.red() * 0.3 + baseColor.red() * 0.7 ) );
 
   99     bc.setGreen( 
static_cast< int >( bc.green() * 0.3 + baseColor.green() * 0.7 ) );
 
  100     bc.setBlue( 
static_cast< int >( bc.blue() * 0.3 + baseColor.blue() * 0.7 ) );
 
  102     painter->setBrush( b );
 
  103     painter->drawRect( mRect );
 
  104     painter->setBrush( pb );
 
  105     painter->setPen( pp );
 
  108   const QList<QgsLayerTreeViewIndicator *> indicators = mLayerTreeView->indicators( node );
 
  109   if ( indicators.isEmpty() )
 
  112   QRect indRect = mLayerTreeView->style()->subElementRect( 
static_cast<QStyle::SubElement
>( QgsLayerTreeViewProxyStyle::SE_LayerTreeItemIndicator ), &opt, mLayerTreeView );
 
  113   int spacing = indRect.height() / 10;
 
  114   int h = indRect.height();
 
  115   int x = indRect.left();
 
  119     QRect rect( x + spacing, indRect.top() + spacing, h - spacing * 2, h - spacing * 2 );
 
  121     QRect iconRect( x + spacing * 2, indRect.top() + spacing * 2, h - spacing * 4, h - spacing * 4 );
 
  124     QIcon::Mode mode = QIcon::Normal;
 
  125     if ( !( opt.state & QStyle::State_Enabled ) )
 
  126       mode = QIcon::Disabled;
 
  127     else if ( opt.state & QStyle::State_Selected )
 
  128       mode = QIcon::Selected;
 
  131     qreal bradius = spacing;
 
  132     QBrush pb = painter->brush();
 
  133     QPen pp = painter->pen();
 
  134     QBrush b = QBrush( opt.palette.midlight() );
 
  135     QColor bc = b.color();
 
  136     bc.setRed( 
static_cast< int >( bc.red() * 0.3 + baseColor.red() * 0.7 ) );
 
  137     bc.setGreen( 
static_cast< int >( bc.green() * 0.3 + baseColor.green() * 0.7 ) );
 
  138     bc.setBlue( 
static_cast< int >( bc.blue() * 0.3 + baseColor.blue() * 0.7 ) );
 
  140     painter->setBrush( b );
 
  141     painter->setPen( QPen( QBrush( opt.palette.mid() ), 0.25 ) );
 
  142     painter->drawRoundedRect( rect, bradius, bradius );
 
  143     painter->setBrush( pb );
 
  144     painter->setPen( pp );
 
  146     indicator->icon().paint( painter, iconRect, Qt::AlignCenter, mode );
 
  150 static void _fixStyleOption( QStyleOptionViewItem &opt )
 
  158   opt.showDecorationSelected = 
true;
 
  161 bool QgsLayerTreeViewItemDelegate::helpEvent( QHelpEvent *event, QAbstractItemView *view, 
const QStyleOptionViewItem &option, 
const QModelIndex &index )
 
  163   if ( event && event->type() == QEvent::ToolTip )
 
  165     QgsLayerTreeNode *node = mLayerTreeView->layerTreeModel()->index2node( index );
 
  168       const QList<QgsLayerTreeViewIndicator *> indicators = mLayerTreeView->indicators( node );
 
  169       if ( !indicators.isEmpty() )
 
  171         QStyleOptionViewItem opt = option;
 
  172         initStyleOption( &opt, index );
 
  173         _fixStyleOption( opt );
 
  175         QRect indRect = mLayerTreeView->style()->subElementRect( 
static_cast<QStyle::SubElement
>( QgsLayerTreeViewProxyStyle::SE_LayerTreeItemIndicator ), &opt, mLayerTreeView );
 
  177         if ( indRect.contains( event->pos() ) )
 
  179           int indicatorIndex = ( 
event->pos().x() - indRect.left() ) / indRect.height();
 
  180           if ( indicatorIndex >= 0 && indicatorIndex < indicators.count() )
 
  182             const QString tooltip = indicators[indicatorIndex]->toolTip();
 
  183             if ( !tooltip.isEmpty() )
 
  185               QToolTip::showText( event->globalPos(), tooltip, view );
 
  193   return QStyledItemDelegate::helpEvent( event, view, option, index );
 
  197 void QgsLayerTreeViewItemDelegate::onClicked( 
const QModelIndex &index )
 
  199   QgsLayerTreeNode *node = mLayerTreeView->layerTreeModel()->index2node( index );
 
  203   const QList<QgsLayerTreeViewIndicator *> indicators = mLayerTreeView->indicators( node );
 
  204   if ( indicators.isEmpty() )
 
  207   QStyleOptionViewItem opt( mLayerTreeView->viewOptions() );
 
  208   opt.rect = mLayerTreeView->visualRect( index );
 
  209   initStyleOption( &opt, index );
 
  210   _fixStyleOption( opt );
 
  212   QRect indRect = mLayerTreeView->style()->subElementRect( 
static_cast<QStyle::SubElement
>( QgsLayerTreeViewProxyStyle::SE_LayerTreeItemIndicator ), &opt, mLayerTreeView );
 
  214   QPoint pos = mLayerTreeView->mLastReleaseMousePos;
 
  215   if ( indRect.contains( pos ) )
 
  217     int indicatorIndex = ( pos.x() - indRect.left() ) / indRect.height();
 
  218     if ( indicatorIndex >= 0 && indicatorIndex < indicators.count() )
 
  219       emit indicators[indicatorIndex]->clicked( index );