Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TEveParamList.cxx
Go to the documentation of this file.
1 // @(#)root/eve:$Id$
2 // Author: Dmytro Kovalskyi, 28.2.2008
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #include "TEveParamList.h"
13 
14 // Cleanup these includes:
15 #include "TGLabel.h"
16 #include "TGButton.h"
17 #include "TGNumberEntry.h"
18 #include "TGColorSelect.h"
19 #include "TGDoubleSlider.h"
20 
21 #include "TEveGValuators.h"
22 #include "TGNumberEntry.h"
23 #include "TGedEditor.h"
24 
25 /** \class TEveParamList
26 \ingroup TEve
27 Collection of named parameters.
28 */
29 
30 ClassImp(TEveParamList);
31 
32 ////////////////////////////////////////////////////////////////////////////////
33 /// Constructor.
34 
35 TEveParamList::TEveParamList(const char* n, const char* t, Bool_t doColor) :
36  TNamed(n, t),
37  fColor(0)
38 {
39  if (doColor) SetMainColorPtr(&fColor);
40 }
41 
42 ////////////////////////////////////////////////////////////////////////////////
43 /// Get config-struct for float parameter 'name'.
44 
45 TEveParamList::FloatConfig_t TEveParamList::GetFloatParameter(const TString& name)
46 {
47  static const TEveException eh("TEveParamList::GetFloatParameter ");
48 
49  for (FloatConfigVec_ci itr = fFloatParameters.begin(); itr != fFloatParameters.end(); ++itr)
50  if (itr->fName.CompareTo(name)==0 ) return *itr;
51  Error(eh, "parameter not found.");
52  return FloatConfig_t();
53 }
54 
55 ////////////////////////////////////////////////////////////////////////////////
56 /// Get config-struct for int parameter 'name'.
57 
58 TEveParamList::IntConfig_t TEveParamList::GetIntParameter(const TString& name)
59 {
60  static const TEveException eh("TEveParamList::GetIntParameter ");
61 
62  for (IntConfigVec_ci itr = fIntParameters.begin(); itr != fIntParameters.end(); ++itr)
63  if (itr->fName.CompareTo(name) == 0) return *itr;
64  Error(eh, "parameter not found.");
65  return IntConfig_t();
66 }
67 
68 ////////////////////////////////////////////////////////////////////////////////
69 /// Get value for bool parameter 'name'.
70 
71 Bool_t TEveParamList::GetBoolParameter(const TString& name)
72 {
73  static const TEveException eh("TEveParamList::GetBoolParameter ");
74 
75  for (BoolConfigVec_ci itr = fBoolParameters.begin(); itr != fBoolParameters.end(); ++itr)
76  if ( itr->fName.CompareTo(name)==0 ) return itr->fValue;
77  Error(eh, "parameter not found.");
78  return kFALSE;
79 }
80 
81 ////////////////////////////////////////////////////////////////////////////////
82 /// Emit ParamChanged() signal.
83 
84 void TEveParamList::ParamChanged(const char* name)
85 {
86  Emit("ParamChanged(char*)", name);
87 }
88 
89 /** \class TEveParamListEditor
90 \ingroup TEve
91 GUI editor for TEveParamList.
92 
93 Slot methods from this object do not call Update, instead they call
94 their model's ParamChanged(const char* name) function which emits a
95 corresponding signal.
96 
97 This helps in handling of parameter changes as they are probably
98 related to displayed objects in a more complicated way. Further,
99 the TGCheckButton::HandleButton() emits more signal after the
100 Clicked() signal and if model is reset in the editor, its contents
101 is removed. This results in a crash.
102 */
103 
104 ClassImp(TEveParamListEditor);
105 
106 ////////////////////////////////////////////////////////////////////////////////
107 /// Constructor.
108 
109 TEveParamListEditor::TEveParamListEditor(const TGWindow *p, Int_t width, Int_t height,
110  UInt_t options, Pixel_t back) :
111  TGedFrame(p, width, height, options | kVerticalFrame, back),
112  fM (0),
113  fParamFrame (0)
114 {
115  MakeTitle("TEveParamList");
116 }
117 
118 ////////////////////////////////////////////////////////////////////////////////
119 /// Initialize widgets when a new object is selected.
120 
121 void TEveParamListEditor::InitModel(TObject* obj)
122 {
123  fM = dynamic_cast<TEveParamList*>(obj);
124 
125  if (fParamFrame) {
126  fParamFrame->UnmapWindow();
127  RemoveFrame(fParamFrame);
128  fParamFrame->DestroyWindow();
129  delete fParamFrame;
130  }
131  fParamFrame = new TGVerticalFrame(this);
132  AddFrame(fParamFrame);
133 
134  // integers
135  fIntParameters.clear();
136  for (UInt_t i = 0; i < fM->fIntParameters.size(); ++i)
137  {
138  TGCompositeFrame* frame = new TGHorizontalFrame(fParamFrame);
139 
140  // number entry widget
141  TGNumberEntry* widget = new TGNumberEntry
142  (frame, fM->fIntParameters[i].fValue,
143  5, // number of digits
144  i, // widget ID
145  TGNumberFormat::kNESInteger, // style
146  TGNumberFormat::kNEAAnyNumber, // input value filter
147  TGNumberFormat::kNELLimitMinMax, // specify limits
148  fM->fIntParameters[i].fMin, // min value
149  fM->fIntParameters[i].fMax); // max value
150  frame->AddFrame(widget, new TGLayoutHints(kLHintsLeft|kLHintsCenterY, 2,8,2,2));
151  widget->Connect("ValueSet(Long_t)", "TEveParamListEditor", this, "DoIntUpdate()");
152  fIntParameters.push_back(widget);
153 
154  // label
155  frame->AddFrame(new TGLabel(frame,fM->fIntParameters[i].fName.Data()),
156  new TGLayoutHints(kLHintsLeft|kLHintsCenterY));
157 
158  fParamFrame->AddFrame(frame, new TGLayoutHints(kLHintsTop));
159  }
160 
161 
162  // floats
163  fFloatParameters.clear();
164  for (UInt_t i = 0; i < fM->fFloatParameters.size(); ++i)
165  {
166  TGCompositeFrame* frame = new TGHorizontalFrame(fParamFrame);
167 
168  // number entry widget
169  TGNumberEntry* widget = new TGNumberEntry
170  (frame, fM->fFloatParameters[i].fValue,
171  5, // number of digits
172  i, // widget ID
173  TGNumberFormat::kNESReal, // style
174  TGNumberFormat::kNEAAnyNumber, // input value filter
175  TGNumberFormat::kNELLimitMinMax, // specify limits
176  fM->fFloatParameters[i].fMin, // min value
177  fM->fFloatParameters[i].fMax); // max value
178  frame->AddFrame(widget, new TGLayoutHints(kLHintsLeft|kLHintsCenterY, 2,8,2,2));
179  widget->Connect("ValueSet(Long_t)", "TEveParamListEditor", this, "DoFloatUpdate()");
180  fFloatParameters.push_back( widget );
181 
182  // label
183  frame->AddFrame(new TGLabel(frame,fM->fFloatParameters[i].fName.Data()),
184  new TGLayoutHints(kLHintsLeft|kLHintsCenterY) );
185 
186  fParamFrame->AddFrame(frame, new TGLayoutHints(kLHintsTop));
187  }
188 
189  // boolean
190  fBoolParameters.clear();
191  for (UInt_t i = 0; i < fM->fBoolParameters.size(); ++i)
192  {
193  TGCheckButton* widget = new TGCheckButton(fParamFrame,
194  fM->fBoolParameters[i].fName.Data(),
195  i);
196  widget->Connect("Clicked()", "TEveParamListEditor", this, "DoBoolUpdate()");
197  fBoolParameters.push_back(widget);
198 
199  fParamFrame->AddFrame(widget, new TGLayoutHints(kLHintsTop,2,0,1,1));
200  }
201  MapSubwindows();
202 }
203 
204 ////////////////////////////////////////////////////////////////////////////////
205 /// Set model object.
206 
207 void TEveParamListEditor::SetModel(TObject* obj)
208 {
209  InitModel(obj);
210 
211  for (UInt_t i = 0; i < fIntParameters.size(); ++i)
212  fIntParameters[i]->GetNumberEntry()->SetIntNumber(fM->fIntParameters[i].fValue);
213 
214  for (UInt_t i = 0; i < fFloatParameters.size(); ++i)
215  fFloatParameters[i]->GetNumberEntry()->SetNumber(fM->fFloatParameters[i].fValue);
216 
217  for (UInt_t i = 0; i < fBoolParameters.size(); ++i)
218  fBoolParameters[i]->SetState( fM->fBoolParameters[i].fValue ? kButtonDown : kButtonUp);
219 }
220 
221 ////////////////////////////////////////////////////////////////////////////////
222 /// Slot for integer parameter update.
223 
224 void TEveParamListEditor::DoIntUpdate()
225 {
226  TGNumberEntry *widget = (TGNumberEntry*) gTQSender;
227  Int_t id = widget->WidgetId();
228  if (id < 0 || id >= (int) fM->fIntParameters.size()) return;
229  fM->fIntParameters[id].fValue = widget->GetNumberEntry()->GetIntNumber();
230 
231  fM->ParamChanged(fM->fIntParameters[id].fName);
232  gTQSender = (void*) widget;
233 }
234 
235 ////////////////////////////////////////////////////////////////////////////////
236 /// Slot for float parameter update.
237 
238 void TEveParamListEditor::DoFloatUpdate()
239 {
240  TGNumberEntry *widget = (TGNumberEntry*) gTQSender;
241  Int_t id = widget->WidgetId();
242  if (id < 0 || id >= (int) fM->fFloatParameters.size()) return;
243  fM->fFloatParameters[id].fValue = widget->GetNumberEntry()->GetNumber();
244 
245  fM->ParamChanged(fM->fFloatParameters[id].fName);
246  gTQSender = (void*) widget;
247 }
248 
249 ////////////////////////////////////////////////////////////////////////////////
250 /// Slot for bool parameter update.
251 
252 void TEveParamListEditor::DoBoolUpdate()
253 {
254  TGCheckButton *widget = (TGCheckButton*) gTQSender;
255  Int_t id = widget->WidgetId();
256  if (id < 0 || id >= (int) fM->fBoolParameters.size()) return;
257  fM->fBoolParameters[id].fValue = widget->IsOn();
258 
259  fM->ParamChanged(fM->fBoolParameters[id].fName);
260  gTQSender = (void*) widget;
261 }