GammaWare  Head Version for release 0.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LoupeOnPad.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (c) IPNL, IN2P3, CNRS *
3  * Contibutor(s) : *
4  * Jeremie Dudouet dudouet(AT)ipnl.in2p3.fr [2014] *
5  * Olivier Stezowski stezow(AT)ipnl.in2p3.fr [2014] *
6  * *
7  * This program is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * This program is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15  * GNU General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU General Public License *
18  * along with this program; if not, write to the *
19  * Free Software Foundation, Inc., *
20  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21  ***************************************************************************/
22 
23 #include "Buttons.h"
24 
25 #include "LoupeOnPad.h"
26 
27 LoupeOnPad::LoupeOnPad(TCanvas *canvas) :
28  TObject(),
29  fCanvas(canvas),
30  fCurrentPadNumber(1),
31  fLastX(),
32  fLastY(),
33  fDeltaX(1),
34  fDeltaY(1),
35  fToggleLoupe(true),
36  fToggleMouse(false)
37 {
38  // in this case connect the current canvas
39  if ( fCanvas == 0x0 ) {
40  if ( TVirtualPad::Pad() )
41  fCanvas = TVirtualPad::Pad()->GetCanvas();
42  else {
43  //fLog.SetProcessMethod("Connect(TCanvas* )");
44  //fLog << error << "gPad not existing" << dolog;
45  }
46  }
47 
48  if ( fCanvas ) {
49  // to catch event on the canvas
50  fCanvas->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
51  "LoupeOnPad",
52  this,
53  "HandleMovement(Int_t, Int_t, Int_t, TObject*)");
54  fCanvas->Connect("Closed()",
55  "LoupeOnPad",
56  this,
57  "Delete(Option_t *)");
58 
59  fCanvas->GetListOfPrimitives()->Add(this);
60 
61  std::cout << "LoupeOnPad connected to " << fCanvas->GetName() << std::endl;
62  }
63 }
64 
66 {
67  // std::cout << " LoupeOnPad::~LoupeOnPad() " << std::endl;
68  Clear();
69  if ( fCanvas ) {
70  if ( TQObject::Disconnect(fCanvas,"ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
71  this,"HandleMovement(Int_t, Int_t, Int_t, TObject*)") &&
72  TQObject::Disconnect(fCanvas,"Closed()",this,"Delete(Option_t *)") ) {
73  std::cout << "Disconnect done for canvas" << std::endl;
74  }
75  else std::cout << "Disconnect fail canvas" << std::endl;
76 
77  std::cout << "LoupeOnPad disconnected from " << fCanvas->GetName() << std::endl;
78  }
79 }
80 
81 Int_t LoupeOnPad::GetPadNumber(Int_t add_x, Int_t add_y)
82 {
83  Int_t padnumber = 0;
84 
85  // should never be the case ...
86  if ( fCanvas == 0x0 )
87  return padnumber;
88 
89  // no subpad
90  if ( fCanvas->GetPad(1) == 0x0 )
91  return padnumber;
92 
94  Double_t x1 = fCanvas->GetPad(1)->GetXlowNDC(); Int_t nb_x = 1, nb_tot = 2, delta_pad = 0; Bool_t count_x = true; TPad *pad;
95 
96  while ( (pad=(TPad *)fCanvas->GetPad(nb_tot++)) ) {
97  if ( pad->GetXlowNDC() > x1 && count_x ) {
98  x1 = pad->GetXlowNDC();
99  nb_x++;
100  }
101  else { count_x = false; }
102  }
103 
104  delta_pad = add_x + add_y * nb_x;
105  if ( delta_pad < 0 ) {
106  padnumber = TMath::Max(0,fCurrentPadNumber+delta_pad);
107  }
108  else {
109  padnumber = TMath::Min(nb_tot,fCurrentPadNumber+delta_pad);
110  }
111 
112  return padnumber;
113 }
114 
116 {
117  TCanvas *loupe = 0x0;
118 
119  if ( fCanvas ) {
120  loupe = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("LoupeOnPad");
121  if (!loupe)
122  {
123  int ww = gPad->GetWw();
124  int wh = gPad->GetWh();
125  loupe = new TCanvas("LoupeOnPad","LoupeOnPad",1000,10,1000,(int)1000*wh/ww);
126  loupe->ToggleToolBar();
127 
128  int LastPadNbr = 1;
129  int i = 0;
130 
131  int fCurrentSave = fCurrentPadNumber;
132  fCurrentPadNumber = 1;
133 
134  while(GetPadNumber(0,i)==fCanvas->cd(LastPadNbr)->GetNumber())
135  {
136  i++;
137  LastPadNbr = fCanvas->cd(GetPadNumber(0,i))->GetNumber();
138  }
139 
140 
141  TPad *RefPad = (TPad*)fCanvas->cd(LastPadNbr);
142 
143  loupe->SetRightMargin(RefPad->GetRightMargin());
144  loupe->SetTopMargin(RefPad->GetTopMargin());
145  loupe->SetLeftMargin(RefPad->GetLeftMargin());
146  loupe->SetBottomMargin(RefPad->GetBottomMargin());
147 
148  fCurrentPadNumber = fCurrentSave;
149 
150  loupe->Update();
151  loupe->Modified();
152  }
153  }
154 
155  return loupe;
156 }
157 
158 void LoupeOnPad::Clear(Option_t *)
159 {
160 
161  TPad *pad; TObject *obj;
162  Int_t nb_tot = 0;
163  while ( (pad=(TPad *)fCanvas->GetPad(nb_tot++)) ) {
164 
165  Bool_t modified = false;
166 
167  if ( (obj = pad->GetListOfPrimitives()->FindObject("LoupeOnPad_S")) ) {
168  pad->GetListOfPrimitives()->Remove(obj);
169  obj->Delete();
170  modified = true;
171  }
172  if ( modified ) {
173  pad->Modified();
174  pad->Update();
175  }
176  }
177 
178  TCanvas *loupe = 0x0;
179  if ( (loupe = (TCanvas*)gROOT->FindObject("LoopOnPad")) == 0x0 )
180  return;
181 
182  while(loupe->GetListOfPrimitives()->GetSize()) loupe->GetListOfPrimitives()->RemoveFirst();
183  loupe->Modified();
184  loupe->Update();
185 }
186 
187 void LoupeOnPad::ChangeCurrentPad(Int_t padnumber)
188 {
189  TCanvas *loupe = 0x0;
190 
191  if ( (loupe = CheckLoupeIsThere()) == 0x0 || padnumber == 0 ) return;
192 
193  TObject *obj = 0x0; TPave *CurrentPave = 0x0; TVirtualPad *selectedpad = fCanvas->GetPad(padnumber);
194 
195  if ( selectedpad == 0x0 )return;
196 
197  if (!selectedpad->GetListOfPrimitives()->GetSize())
198  {
199  fCurrentPadNumber = padnumber;
200  return;
201  }
202 
203  if ( (CurrentPave=(TPave*)selectedpad->GetListOfPrimitives()->FindObject("LoupeOnPad_S")) ) CurrentPave->SetFillColor(kRed);
204  else
205  {
206  CurrentPave = new TPave(0.,0.,1.,1.,0,"NDC");
207  CurrentPave->SetFillColor(kRed);
208  CurrentPave->SetFillStyle(3001);
209  CurrentPave->SetName("LoupeOnPad_S");
210  CurrentPave->SetBit(kCanDelete);
211  CurrentPave->SetBit(kCannotPick);
212  selectedpad->GetListOfPrimitives()->Add(CurrentPave);
213  }
214 
215  selectedpad->Modified();
216  selectedpad->Update();
217 
218  selectedpad = fCanvas->GetPad(fCurrentPadNumber);
219 
220  if ( selectedpad == 0x0 )return;
221 
222  if ( (CurrentPave=(TPave*)selectedpad->GetListOfPrimitives()->FindObject("LoupeOnPad_S")) )
223  {
224  CurrentPave->SetFillColor(kGray+3);
225  selectedpad->Modified();
226  selectedpad->Update();
227  }
228 
229  selectedpad = fCanvas->GetPad(padnumber);
230 
231  loupe->cd();
232  loupe->GetListOfPrimitives()->Clear("nodelete");
233  TObjLink *lnk = selectedpad->GetListOfPrimitives()->FirstLink();
234  while (lnk) {
235  obj = lnk->GetObject();
236 
237  TString tmp = obj->GetName();
238  if ( tmp == "LoupeOnPad_S" ) {
239  lnk = lnk->Next();
240  continue;
241  }
242 
243  lnk->GetObject()->Draw(lnk->GetOption());
244  lnk = lnk->Next();
245  }
246 
247  loupe->SetFrameFillStyle(0);
248 
249  loupe->Update(); selectedpad->Modified(true); fCanvas->Update(); fCurrentPadNumber = padnumber;
250 }
251 
252 void LoupeOnPad::HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject *select)
253 {
254  Int_t addX = 0, addY = 0;
255  select = 0x0;
256 
257  if( eventType == kMouseMotion)
258  {
259  fLastX = eventX;
260  fLastY = eventY;
261 
262  return;
263  }
264 
265 #ifndef R__MACOSX
266 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,34,19)
267  if( eventType == kArrowKeyRelease )
268  {
269  if(eventX>fLastX) addX = addX + fDeltaX;
270  if(eventX<fLastX) addX = addX - fDeltaX;
271 
272  if(eventY>fLastY) addY = addY + fDeltaY;
273  if(eventY<fLastY) addY = addY - fDeltaY;
274 
275  fLastX = eventX;
276  fLastY = eventY;
277  }
278 #endif
279 #endif
280 
281  if( eventType == kKeyPress ) {
282  Int_t keysym = eventY;
283 
284 // if ( (EKeySym)keysym == kKey_d ) {
285 // delete this;
286 // return;
287 // }
288  if ( (EKeySym)keysym == kKey_t ) {
289  fToggleLoupe = !fToggleLoupe;
290  }
291  if ( (EKeySym)keysym == kKey_Left || (EKeySym)keysym == kKey_4 ) {
292  addX = addX - fDeltaX;
293  }
294  if ( (EKeySym)keysym == kKey_Up || (EKeySym)keysym == kKey_8 ) {
295  addY = addY - fDeltaY;
296  }
297  if ( (EKeySym)keysym == kKey_Right || (EKeySym)keysym == kKey_6 ) {
298  addX = addX + fDeltaX;
299  }
300  if ( (EKeySym)keysym == kKey_Down|| (EKeySym)keysym == kKey_2 ) {
301  addY = addY + fDeltaY;
302  }
303  if ( (EKeySym)keysym == kKey_7 ) {
304  addX = addX - fDeltaX;
305  addY = addY - fDeltaY;
306  }
307  if ( (EKeySym)keysym == kKey_9 ) {
308  addX = addX + fDeltaX;
309  addY = addY - fDeltaY;
310  }
311  if ( (EKeySym)keysym == kKey_3 ) {
312  addX = addX + fDeltaX;
313  addY = addY + fDeltaY;
314  }
315  if ( (EKeySym)keysym == kKey_1 ) {
316  addX = addX - fDeltaX;
317  addY = addY + fDeltaY;
318  }
319 // if ( (EKeySym)keysym == kKey_h) {
320 // printf("\n");
321 // printf("\th: this help \n");
322 // printf("any key to select pad under mouse \n");
323 // printf("\tt: toggle on/off loupe on canvas \n");
324 // printf("\tc: clear history \n");
325 // printf("\tleft or 4 arrow: move to left pad\n");
326 // printf("\tright or 6 arrow: move to right pad\n");
327 // printf("\tup or 8 arrow: move up in pads\n");
328 // printf("\tdown or 2 arrow: move down in pads\n");
329 // printf("\td: delete LoupeOnPad \n");
330 // }
331  if ( (EKeySym)keysym == kKey_c) {
332  Clear();
333  } // to loop on task once or infinitely
334  if ( (EKeySym)keysym == kKey_Space && fToggleLoupe ) {
335  if ( fCanvas->GetSelectedPad() ) {
336  ChangeCurrentPad ( fCanvas->GetSelectedPad()->GetNumber() );
337  }
338  }
339  }
340  if ( (addX || addY) && fToggleLoupe ) {
341  ChangeCurrentPad( GetPadNumber(addX,addY) );
342 
343  TVirtualPad *selectedpad = fCanvas->GetPad(fCurrentPadNumber);
344  if(!selectedpad->GetListOfPrimitives()->GetSize())ChangeCurrentPad( GetPadNumber(addX,addY) );
345 
346  }
347 }
348 
350 
351 void RunLoupeOnPad(TCanvas *c)
352 {
353  TCanvas *cc = c;
354 
355  if ( c == 0x0 &&TVirtualPad::Pad() && TVirtualPad::Pad()->GetCanvas() )
356  cc = TVirtualPad::Pad()->GetCanvas();
357 
358  if (cc)
359  new LoupeOnPad(cc);
360 }
361 
362 
TCanvas * CheckLoupeIsThere()
To be sure the Canvas to display loupe is there.
Definition: LoupeOnPad.cpp:115
void HandleMovement(Int_t, Int_t, Int_t, TObject *select)
Handle mouse/keyboad catchings.
Definition: LoupeOnPad.cpp:252
void ChangeCurrentPad(Int_t padnumber=1)
Change current pad number under loupe.
Definition: LoupeOnPad.cpp:187
void RunLoupeOnPad(TCanvas *c=0x0)
void Clear(Option_t *="")
Remove any sign of Loupe on the pad.
Definition: LoupeOnPad.cpp:158
LoupOnPad, a class to Loupe on a Pad in a Canvas with many pads in it.
Definition: LoupeOnPad.h:76
LoupeOnPad(TCanvas *c=0x0)
Definition: LoupeOnPad.cpp:27
ADF::LogMessage & endl(ADF::LogMessage &log)
Int_t GetPadNumber(Int_t add_x, Int_t add_y)
return pad number depending of increntation on x,y from the current position i.e the current pad ...
Definition: LoupeOnPad.cpp:81
virtual ~LoupeOnPad()
Definition: LoupeOnPad.cpp:65
ClassImp(LoupeOnPad) void RunLoupeOnPad(TCanvas *c)
Definition: LoupeOnPad.cpp:349