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