OpendTect  6.3
i_qtable.h
Go to the documentation of this file.
1 #ifndef i_qtable_h
2 #define i_qtable_h
3 
4 /*+
5 ________________________________________________________________________
6 
7  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
8  Author: Nanne Hemstra
9  Date: January 2008
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "uitable.h"
15 
16 #include <QHeaderView>
17 #include <QObject>
18 #include <QTableWidget>
19 #include <QTableWidgetItem>
20 #include <QWidget>
21 
22 
24 
28 QT_BEGIN_NAMESPACE
29 
30 class i_tableMessenger : public QObject
31 {
32  Q_OBJECT
33  friend class uiTableBody;
34 
35 protected:
36 i_tableMessenger( QTableWidget* sndr, uiTable* receiver )
37  : sender_(sndr)
38  , receiver_(receiver)
40 {
41  connect( sndr, SIGNAL(cellChanged(int,int)),
42  this, SLOT(valueChanged(int,int)) );
43 
44  connect( sndr, SIGNAL(cellClicked(int,int)),
45  this, SLOT(cellClicked(int,int)) );
46 
47  connect( sndr, SIGNAL(cellPressed(int,int)),
48  this, SLOT(cellPressed(int,int)) );
49 
50  connect( sndr, SIGNAL(cellDoubleClicked(int,int)),
51  this, SLOT(doubleClicked(int,int)) );
52 
53  connect( sndr, SIGNAL(itemSelectionChanged()),
54  this, SLOT(itemSelectionChanged()) );
55 
56  connect( sndr, SIGNAL(cellEntered(int,int)),
57  this, SLOT(cellEntered(int,int)) );
58 
59  connect( sndr->verticalHeader(), SIGNAL(sectionClicked(int)),
60  this, SLOT(rowClicked(int)) );
61  connect( sndr->horizontalHeader(), SIGNAL(sectionClicked(int)),
62  this, SLOT(columnClicked(int)) );
63 
64  connect( sndr->verticalHeader(), SIGNAL(sectionPressed(int)),
65  this, SLOT(rowPressed(int)) );
66  connect( sndr->horizontalHeader(), SIGNAL(sectionPressed(int)),
67  this, SLOT(columnPressed(int)) );
68 
69  connect( sndr->verticalHeader(), SIGNAL(sectionDoubleClicked(int)),
70  this, SLOT(rowDoubleClicked(int)) );
71  connect( sndr->horizontalHeader(), SIGNAL(sectionDoubleClicked(int)),
72  this, SLOT(columnDoubleClicked(int)) );
73 }
74 
75  virtual ~i_tableMessenger() {}
76 
77 private:
78 
80  QTableWidget* sender_;
82 
83 private slots:
84 
85 #define mTriggerBody( notifier, row, col, triggerstatement ) \
86 { \
87  BufferString msg = #notifier; \
88  msg += " "; msg += row; \
89  msg += " "; msg += col; \
90  const int refnr = receiver_->beginCmdRecEvent( msg ); \
91  triggerstatement; \
92  receiver_->endCmdRecEvent( refnr, msg ); \
93 }
94 
95 #define mNoTrigger( notifier, row, col ) \
96  mTriggerBody( notifier, row, col, )
97 
98 #define mTrigger( notifier, row, col ) \
99  mTriggerBody( notifier, row, col, receiver_->notifier.trigger(*receiver_) )
100 
101 #define mHeaderTriggerBody( notifier, idx, vertical, triggerstatement ) \
102  mTriggerBody( notifier, (vertical ? idx : -1), (vertical ? -1 : idx), \
103  triggerstatement )
104 
105 #define mNoHeaderTrigger( notifier, idx, vertical ) \
106  mHeaderTriggerBody( notifier, idx, vertical, )
107 
108 #define mHeaderTrigger( notifier, idx, vertical ) \
109  mHeaderTriggerBody( notifier, idx, vertical, \
110  receiver_->notifier.trigger(idx, *receiver_ ) )
111 
112 
113 void valueChanged( int row, int col )
114 {
115  receiver_->notifcell_ = RowCol(row,col);
116  mTrigger( valueChanged, row, col );
117 }
118 
119 
120 void cellClicked( int row, int col )
121 {
122  receiver_->notifcell_ = RowCol(row,col);
123  if ( receiver_->buttonstate_ == OD::RightButton )
124  mTrigger( rightClicked, row, col )
125  else if ( receiver_->buttonstate_ == OD::LeftButton )
126  mTrigger( leftClicked, row, col );
127 }
128 
129 
130 void doubleClicked( int row, int col )
131 {
132  receiver_->notifcell_ = RowCol(row,col);
133  mTrigger( doubleClicked, row, col );
134 }
135 
136 
138 { mTrigger( selectionChanged, -1, -1 ); }
139 
140 
141 void cellPressed( int row, int col )
142 {
143  receiver_->notifcell_ = RowCol(row,col);
144  mNoTrigger( cellPressed, row, col );
145 }
146 
147 
148 void cellEntered( int row, int col )
149 { mNoTrigger( cellEntered, row, col ); }
150 
151 
152 void rowClicked( int idx )
153 {
154  // Trigger is conditional to repair Qt inconsistency. Unlike tables and
155  // and lists, the header signals a final click after mouse dragging.
156  if ( idx == lastpressedheaderidx_ )
157  mHeaderTrigger( rowClicked, idx, true );
158 }
159 
160 
161 void columnClicked( int idx )
162 {
163  // Trigger is conditional to repair Qt inconsistency. Unlike tables and
164  // and lists, the header signals a final click after mouse dragging.
165  if ( idx == lastpressedheaderidx_ )
166  mHeaderTrigger( columnClicked, idx, false );
167 }
168 
169 
170 void rowPressed( int idx )
171 {
172  lastpressedheaderidx_ = idx;
173  mNoHeaderTrigger( rowPressed, idx, true );
174 }
175 
176 
177 void columnPressed( int idx )
178 {
179  lastpressedheaderidx_ = idx;
180  mNoHeaderTrigger( columnPressed, idx, false );
181 }
182 
183 
184 void rowDoubleClicked( int idx )
185 { mNoHeaderTrigger( rowDoubleClicked, idx, true ); }
186 
187 
188 void columnDoubleClicked( int idx )
189 { mNoHeaderTrigger( columnDoubleClicked, idx, false ); }
190 
191 #undef mNoTrigger
192 #undef mTrigger
193 #undef mTriggerBody
194 #undef mHeaderTriggerBody
195 #undef mNoHeaderTrigger
196 #undef mHeaderTrigger
197 
198 };
199 
200 QT_END_NAMESPACE
201 
202 #endif
friend class uiTableBody
Definition: i_qtable.h:33
void cellEntered(int row, int col)
Definition: i_qtable.h:148
virtual ~i_tableMessenger()
Definition: i_qtable.h:75
Definition: uitable.h:29
void itemSelectionChanged()
Definition: i_qtable.h:137
#define mNoHeaderTrigger(notifier, idx, vertical)
Definition: i_qtable.h:105
int lastpressedheaderidx_
Definition: i_qtable.h:81
void rowClicked(int idx)
Definition: i_qtable.h:152
void rowDoubleClicked(int idx)
Definition: i_qtable.h:184
Definition: keyenum.h:21
QTableWidget * sender_
Definition: i_qtable.h:80
void columnDoubleClicked(int idx)
Definition: i_qtable.h:188
void rowPressed(int idx)
Definition: i_qtable.h:170
void valueChanged(int row, int col)
Definition: i_qtable.h:113
#define mHeaderTrigger(notifier, idx, vertical)
Definition: i_qtable.h:108
OD::ButtonState buttonstate_
Definition: uitable.h:343
void cellClicked(int row, int col)
Definition: i_qtable.h:120
#define mTrigger(notifier, row, col)
Definition: i_qtable.h:98
Helper class for uiTable to relay Qt&#39;s &#39;activated&#39; messages to uiAction.
Definition: i_qtable.h:30
IdxPair used for its row() and col().
Definition: rowcol.h:23
#define mNoTrigger(notifier, row, col)
Definition: i_qtable.h:95
void columnPressed(int idx)
Definition: i_qtable.h:177
RowCol notifcell_
Definition: uitable.h:333
void cellPressed(int row, int col)
Definition: i_qtable.h:141
i_tableMessenger(QTableWidget *sndr, uiTable *receiver)
Definition: i_qtable.h:36
void doubleClicked(int row, int col)
Definition: i_qtable.h:130
uiTable * receiver_
Definition: i_qtable.h:79
void columnClicked(int idx)
Definition: i_qtable.h:161
Definition: keyenum.h:22

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B. V. 2017