1 /***************************************************************************
2   qgstabwidget.cpp - QgsTabWidget
3 
4  ---------------------
5  begin                : 8.9.2016
6  copyright            : (C) 2016 by Matthias Kuhn
7  email                : matthias@opengis.ch
8  ***************************************************************************
9  *                                                                         *
10  *   This program is free software; you can redistribute it and/or modify  *
11  *   it under the terms of the GNU General Public License as published by  *
12  *   the Free Software Foundation; either version 2 of the License, or     *
13  *   (at your option) any later version.                                   *
14  *                                                                         *
15  ***************************************************************************/
16 #include "qgstabwidget.h"
17 
18 #include "qgslogger.h"
19 
QgsTabWidget(QWidget * parent)20 QgsTabWidget::QgsTabWidget( QWidget *parent )
21   : QTabWidget( parent )
22 {
23 }
24 
hideTab(QWidget * tab)25 void QgsTabWidget::hideTab( QWidget *tab )
26 {
27   QgsDebugMsg( QStringLiteral( "Hide" ) );
28   TabInformation &info = mTabs[ realTabIndex( tab )];
29   if ( info.visible )
30   {
31     mSetTabVisibleFlag = true;
32     removeTab( info.sourceIndex );
33     info.visible = false;
34     mSetTabVisibleFlag = false;
35   }
36 }
37 
showTab(QWidget * tab)38 void QgsTabWidget::showTab( QWidget *tab )
39 {
40   QgsDebugMsg( QStringLiteral( "Show" ) );
41   TabInformation &info = mTabs[ realTabIndex( tab )];
42   if ( ! info.visible )
43   {
44     mSetTabVisibleFlag = true;
45     insertTab( info.sourceIndex + 1, info.widget, info.label );
46     info.visible = true;
47     mSetTabVisibleFlag = false;
48   }
49 }
50 
setTabVisible(QWidget * tab,bool visible)51 void QgsTabWidget::setTabVisible( QWidget *tab, bool visible )
52 {
53   if ( visible )
54     showTab( tab );
55   else
56     hideTab( tab );
57 }
58 
realTabIndex(QWidget * widget)59 int QgsTabWidget::realTabIndex( QWidget *widget )
60 {
61   int realIndex = 0;
62   const auto constMTabs = mTabs;
63   for ( const TabInformation &info : constMTabs )
64   {
65     if ( info.widget == widget )
66       return realIndex;
67     ++realIndex;
68   }
69   return -1;
70 }
71 
tabInserted(int index)72 void QgsTabWidget::tabInserted( int index )
73 {
74   if ( !mSetTabVisibleFlag )
75   {
76     QWidget *newWidget = widget( index );
77 
78     if ( index == 0 )
79     {
80       mTabs.insert( 0, TabInformation( newWidget, tabText( index ) ) );
81     }
82     else
83     {
84       bool inserted = false;
85       QList<TabInformation>::iterator it;
86 
87       for ( it = mTabs.begin(); it != mTabs.end(); ++it )
88       {
89         if ( it->sourceIndex == index )
90         {
91           mTabs.insert( it, TabInformation( newWidget, tabText( index ) ) );
92           inserted = true;
93           break;
94         }
95       }
96 
97       if ( !inserted )
98       {
99         mTabs.append( TabInformation( newWidget, tabText( index ) ) );
100       }
101     }
102   }
103 
104   synchronizeIndexes();
105 }
106 
tabRemoved(int index)107 void QgsTabWidget::tabRemoved( int index )
108 {
109   if ( !mSetTabVisibleFlag )
110   {
111     QList<TabInformation>::iterator it;
112 
113     for ( it = mTabs.begin(); it != mTabs.end(); ++it )
114     {
115       if ( it->sourceIndex == index )
116       {
117         mTabs.removeOne( *it );
118         break;
119       }
120     }
121   }
122 
123   synchronizeIndexes();
124 }
125 
synchronizeIndexes()126 void QgsTabWidget::synchronizeIndexes()
127 {
128   QgsDebugMsg( QStringLiteral( "---------" ) );
129   int i = -1;
130   QWidget *nextWidget = widget( 0 );
131 
132   QList<TabInformation>::iterator it;
133 
134   for ( it = mTabs.begin(); it != mTabs.end(); ++it )
135   {
136     if ( it->widget == nextWidget )
137     {
138       i++;
139       nextWidget = widget( i + 1 );
140     }
141     it->sourceIndex = i;
142     QgsDebugMsg( QStringLiteral( "Tab %1 (%2): %3" ).arg( it->sourceIndex ).arg( it->label ).arg( i ) );
143   }
144 }
145 
tabInfo(QWidget * widget)146 QgsTabWidget::TabInformation QgsTabWidget::tabInfo( QWidget *widget )
147 {
148   const auto constMTabs = mTabs;
149   for ( const TabInformation &info : constMTabs )
150   {
151     if ( info.widget == widget )
152       return info;
153   }
154   return TabInformation();
155 }
156 
operator ==(const QgsTabWidget::TabInformation & other) const157 bool QgsTabWidget::TabInformation::operator ==( const QgsTabWidget::TabInformation &other ) const
158 {
159   return other.widget == widget && other.sourceIndex == sourceIndex;
160 }
161 
operator !=(const TabInformation & other) const162 bool QgsTabWidget::TabInformation::operator !=( const TabInformation &other ) const
163 {
164   return !( *this == other );
165 }
166