Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGL5DDataSetEditor.cxx
Go to the documentation of this file.
1 // @(#)root/gl:$Id$
2 // Author: Bertrand Bellenot 2009
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2009, 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 #include <string>
12 #include <map>
13 
14 #include "TGDoubleSlider.h"
15 #include "TGColorSelect.h"
16 #include "TGNumberEntry.h"
17 #include "TVirtualPad.h"
18 #include "TGListBox.h"
19 #include "TGSlider.h"
20 #include "TGButton.h"
21 #include "TGLabel.h"
22 #include "TString.h"
23 #include "TColor.h"
24 #include "TAxis.h"
25 
26 #include "TGL5DDataSetEditor.h"
27 #include "TGL5DPainter.h"
28 #include "TGLUtil.h"
29 #include "TGL5D.h"
30 
31 /** \class TGL5DDataSetEditor
32 \ingroup opengl
33 GUI editor for OpenGL 5D Painter.
34 Exception safety and ROOT's GUI are two
35 mutually exclusive things. So, only ROOT's GUI here.
36 */
37 
38 namespace {
39 
40 typedef TGL5DPainter::SurfIter_t SurfIter_t;
41 typedef std::map<Int_t, SurfIter_t> IterMap_t;
42 typedef IterMap_t::iterator IterMapIter_t;
43 
44 }
45 
46 //
47 //Pimpl.
48 //
49 class TGL5DDataSetEditor::TGL5DEditorPrivate {
50 public:
51  IterMap_t fIterators;
52  Bool_t IsValid(Int_t index)const
53  {
54  return fIterators.find(index) != fIterators.end();
55  }
56 };
57 
58 ClassImp(TGL5DDataSetEditor);
59 
60 ////////////////////////////////////////////////////////////////////////////////
61 
62 TGL5DDataSetEditor::TGL5DDataSetEditor(const TGWindow *p, Int_t width, Int_t height,
63  UInt_t options, Pixel_t back) :
64  TGedFrame(p, width, height, options | kVerticalFrame, back),
65  //"Grid" tab.
66  fNCellsXEntry(0),
67  fNCellsYEntry(0),
68  fNCellsZEntry(0),
69  fXRangeSlider(0),
70  fXRangeSliderMin(0),
71  fXRangeSliderMax(0),
72  fYRangeSlider(0),
73  fYRangeSliderMin(0),
74  fYRangeSliderMax(0),
75  fZRangeSlider(0),
76  fZRangeSliderMin(0),
77  fZRangeSliderMax(0),
78  fCancelGridBtn(0),
79  fOkGridBtn(0),
80  //"Surfaces" tab.
81  fV4MinEntry(0),
82  fV4MaxEntry(0),
83  fHighlightCheck(0),
84  fIsoList(0),
85  fVisibleCheck(0),
86  fShowCloud(0),
87  fSurfColorSelect(0),
88  fSurfAlphaSlider(0),
89  fSurfRemoveBtn(0),
90  fNewIsoEntry(0),
91  fAddNewIsoBtn(0),
92  //"Style" tab's widgets.
93  fShowBoxCut(),
94  fNumberOfPlanes(0),
95  fAlpha(0),
96  fLogScale(0),
97  fSlideRange(0),
98  fApplyAlpha(0),
99  fApplyPlanes(0),
100  //Model.
101  fDataSet(0),
102  fPainter(0),
103  fHidden(0),
104  fSelectedSurface(-1)
105 {
106  //Constructor.
107  CreateStyleTab();
108  CreateGridTab();
109  CreateIsoTab();
110 
111  fHidden = new TGL5DEditorPrivate;
112 }
113 
114 //______________________________________________________________________________
115 
116 TGL5DDataSetEditor::~TGL5DDataSetEditor()
117 {
118  //Destructor.
119  delete fHidden;
120 }
121 
122 ////////////////////////////////////////////////////////////////////////////////
123 ///Connect signals to slots.
124 
125 void TGL5DDataSetEditor::ConnectSignals2Slots()
126 {
127  //Controls from "Style" tab.
128  fShowBoxCut->Connect("Toggled(Bool_t)", "TGL5DDataSetEditor", this, "BoxCutToggled()");
129  fAlpha->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "AlphaChanged()");
130  fAlpha->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "AlphaChanged()");
131  fNumberOfPlanes->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "NContoursChanged()");
132  fNumberOfPlanes->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "NContoursChanged()");
133  fApplyPlanes->Connect("Clicked()", "TGL5DDataSetEditor", this, "ApplyPlanes()");
134  fApplyAlpha->Connect("Clicked()", "TGL5DDataSetEditor", this, "ApplyAlpha()");
135 
136  //Controls from "Grid" tab.
137  fNCellsXEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
138  fNCellsXEntry->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
139 
140  fNCellsYEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
141  fNCellsZEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
142 
143  fXRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "XSliderChanged()");
144  fXRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "XSliderSetMin()");
145  fXRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "XSliderSetMax()");
146 
147  fYRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "YSliderChanged()");
148  fYRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "YSliderSetMin()");
149  fYRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "YSliderSetMax()");
150 
151  fZRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "ZSliderChanged()");
152  fZRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "ZSliderSetMin()");
153  fZRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "ZSliderSetMax()");
154 
155  fCancelGridBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "RollbackGridParameters()");
156  fOkGridBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "ApplyGridParameters()");
157 
158  //Controls from "Surfaces" tab.
159  fIsoList->Connect("Selected(Int_t)", "TGL5DDataSetEditor", this, "SurfaceSelected(Int_t)");
160  fIsoList->GetContainer()->RemoveInput(kKeyPressMask);
161 
162  fHighlightCheck->Connect("Clicked()", "TGL5DDataSetEditor", this, "HighlightClicked()");
163  fVisibleCheck->Connect("Clicked()", "TGL5DDataSetEditor", this, "VisibleClicked()");
164  fSurfColorSelect->Connect("ColorSelected(Pixel_t)", "TGL5DDataSetEditor", this, "ColorChanged(Pixel_t)");
165  fSurfAlphaSlider->Connect("PositionChanged(Int_t)", "TGL5DDataSetEditor", this, "AlphaChanged(Int_t)");
166  fSurfRemoveBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "RemoveSurface()");
167 
168  fAddNewIsoBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "AddNewSurface()");
169 
170  fInit = kFALSE;
171 }
172 
173 
174 namespace
175 {
176 
177 // Auxiliary functions.
178 
179 ////////////////////////////////////////////////////////////////////////////////
180 
181 void make_slider_range_entries(TGCompositeFrame *parent, TGNumberEntryField *&minEntry,
182  const TString &minToolTip, TGNumberEntryField *&maxEntry,
183  const TString &maxToolTip)
184 {
185  TGCompositeFrame *frame = new TGCompositeFrame(parent, 80, 20, kHorizontalFrame);
186 
187  minEntry = new TGNumberEntryField(frame, -1, 0., TGNumberFormat::kNESRealThree,
188  TGNumberFormat::kNEAAnyNumber);
189  minEntry->SetToolTipText(minToolTip.Data());
190  minEntry->Resize(57, 20);
191  frame->AddFrame(minEntry, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
192 
193  maxEntry = new TGNumberEntryField(frame, -1, 0., TGNumberFormat::kNESRealThree,
194  TGNumberFormat::kNEAAnyNumber);
195  maxEntry->SetToolTipText(maxToolTip.Data());
196  maxEntry->Resize(57, 20);
197  frame->AddFrame(maxEntry, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
198  parent->AddFrame(frame, new TGLayoutHints(kLHintsTop, 5, 0, 0, 0));
199 }
200 
201 ////////////////////////////////////////////////////////////////////////////////
202 
203 TGHorizontalFrame *make_labeled_hframe(TGCompositeFrame *p, const char *text)
204 {
205  TGHorizontalFrame *frame = new TGHorizontalFrame(p);
206  TGLabel *label = new TGLabel(frame, text);
207  frame->AddFrame(label, new TGLayoutHints(kLHintsLeft | kLHintsBottom, 0, 0, 0));
208  p->AddFrame(frame, new TGLayoutHints(kLHintsLeft, 0, 0, 1, 0));
209 
210  return frame;
211 }
212 
213 ////////////////////////////////////////////////////////////////////////////////
214 
215 TGDoubleHSlider *make_double_hslider(TGCompositeFrame *parent, const char *labelName)
216 {
217  TGCompositeFrame *sliderFrame = new TGCompositeFrame(parent, 80, 20, kHorizontalFrame);
218  TGLabel *sliderLabel = new TGLabel(sliderFrame, labelName);
219  sliderFrame->AddFrame(sliderLabel,
220  new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 2, 2, 2, 2));
221  TGDoubleHSlider *slider = new TGDoubleHSlider(sliderFrame, 1, 2);
222  slider->Resize(110, 20);
223 
224  sliderFrame->AddFrame(slider, new TGLayoutHints(kLHintsLeft));
225  parent->AddFrame(sliderFrame, new TGLayoutHints(kLHintsTop, 2, 2, 2, 2));
226 
227  return slider;
228 }
229 
230 }
231 
232 ////////////////////////////////////////////////////////////////////////////////
233 /// Creates "Style" tab.
234 
235 void TGL5DDataSetEditor::CreateStyleTab()
236 {
237  TGHorizontalFrame *f;
238  //MakeTitle("Update behaviour");
239  fShowBoxCut = new TGCheckButton(this, "Show Box Cut");
240  fShowBoxCut->SetToolTipText("Box cut. When attached to a plot, cuts away a part of it");
241  AddFrame(fShowBoxCut, new TGLayoutHints(kLHintsLeft, 5, 2, 2, 2));
242 
243  MakeTitle("isosurfaces");
244  f = new TGHorizontalFrame(this, 200, 50);
245  f->AddFrame(new TGLabel(f, "Number:"), new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5, 2, 2, 2));
246  fNumberOfPlanes = new TGNumberEntry(f, 0, 3, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
247  TGNumberFormat::kNELLimitMinMax, 1, 200);
248  fNumberOfPlanes->GetNumberEntry()->SetToolTipText("Set number of isosurfaces");
249  f->AddFrame(fNumberOfPlanes, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
250  fApplyPlanes = new TGTextButton(f, " Apply ");
251  f->AddFrame(fApplyPlanes, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
252  AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0));
253  //fApplyPlanes->SetState(kButtonDisabled);
254 
255  MakeTitle("Alpha");
256  f = new TGHorizontalFrame(this, 200, 50);
257  f->AddFrame(new TGLabel(f, "Value:"), new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5, 2, 2, 2));
258  fAlpha = new TGNumberEntry(f, 0, 1, -1, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEANonNegative,
259  TGNumberFormat::kNELLimitMinMax, 0.1, 0.5);
260  fAlpha->GetNumberEntry()->SetToolTipText("Value of alpha parameter");
261  f->AddFrame(fAlpha, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
262  fApplyAlpha = new TGTextButton(f, " Apply ");
263  f->AddFrame(fApplyAlpha, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
264  AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0));
265  fApplyAlpha->SetState(kButtonDisabled);
266 
267  fLogScale = new TGCheckButton(this, "Log Scale");
268  AddFrame(fLogScale, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 2, 2, 2));
269 
270  AddFrame(new TGLabel(this, "Slide Range:"), new TGLayoutHints(kLHintsLeft, 5, 2, 2, 2));
271  fSlideRange = new TGDoubleHSlider(this, 200, kDoubleScaleDownRight);
272  AddFrame(fSlideRange, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 5, 2, 2, 2));
273 }
274 
275 ////////////////////////////////////////////////////////////////////////////////
276 ///Tab, containing controls to set
277 ///the ranges and number of cells in a grid.
278 
279 void TGL5DDataSetEditor::CreateGridTab()
280 {
281  TGCompositeFrame *tabFrame = CreateEditorTabSubFrame("Grid");
282  //1. The first part of the tab - "Grid parameters" group.
283  TGGroupFrame *gridGroup = new TGGroupFrame(tabFrame, "Grid parameters", kVerticalFrame);
284  //2. Numeric entries.
285  const UInt_t min = 10, max = 300;
286  const UInt_t nDigits = 4;
287 
288  TGHorizontalFrame *frame = make_labeled_hframe(gridGroup, "Cells along X:");
289  fNCellsXEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger,
290  TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
291  min, max);
292  frame->AddFrame(fNCellsXEntry,
293  new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
294  //
295  frame = make_labeled_hframe(gridGroup, "Cells along Y:");
296  fNCellsYEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger,
297  TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
298  min, max);
299  frame->AddFrame(fNCellsYEntry,
300  new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
301  //
302  frame = make_labeled_hframe(gridGroup, "Cells along Z:");
303  fNCellsZEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger,
304  TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
305  min, max);
306  frame->AddFrame(fNCellsZEntry,
307  new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
308  tabFrame->AddFrame(gridGroup, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 3, 3, 0));
309 
310  //3. The second part - "Ranges" group.
311  TGGroupFrame *rangeGroup = new TGGroupFrame(tabFrame, "Ranges", kVerticalFrame);
312  //4. Sliders and number entry fields.
313  fXRangeSlider = make_double_hslider(rangeGroup, "X:");
314  make_slider_range_entries(rangeGroup, fXRangeSliderMin, "Set the minimum value of the x-axis",
315  fXRangeSliderMax, "Set the maximum value of the x-axis");
316  fYRangeSlider = make_double_hslider(rangeGroup, "Y:");
317  make_slider_range_entries(rangeGroup, fYRangeSliderMin, "Set the minimum value of the y-axis",
318  fYRangeSliderMax, "Set the maximum value of the y-axis");
319  fZRangeSlider = make_double_hslider(rangeGroup, "Z:");
320  make_slider_range_entries(rangeGroup, fZRangeSliderMin, "Set the minimum value of the z-axis",
321  fZRangeSliderMax, "Set the maximum value of the z-axis");
322 
323  tabFrame->AddFrame(rangeGroup, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
324 
325  //5. Buttons.
326  TGHorizontalFrame *horizontalFrame = new TGHorizontalFrame(tabFrame, 200, 50);
327  fCancelGridBtn = new TGTextButton(horizontalFrame, " Cancel ");
328  horizontalFrame->AddFrame(fCancelGridBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
329  fOkGridBtn = new TGTextButton(horizontalFrame, " Apply ");
330  horizontalFrame->AddFrame(fOkGridBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
331  tabFrame->AddFrame(horizontalFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX, 2, 3, 0, 0));
332 }
333 
334 ////////////////////////////////////////////////////////////////////////////////
335 ///Tab, containing controls to work with iso-surfaces.
336 
337 void TGL5DDataSetEditor::CreateIsoTab()
338 {
339  TGCompositeFrame *tabFrame = CreateEditorTabSubFrame("Surfaces");
340 
341  //1. The first group - contains V4 range (read only number entries with min and max).
342  TGGroupFrame *v4Group = new TGGroupFrame(tabFrame, "V4 Range", kVerticalFrame);
343 
344  make_slider_range_entries(v4Group, fV4MinEntry, "Minimum value of V4",
345  fV4MaxEntry, "Maximum value of V4");
346 
347  tabFrame->AddFrame(v4Group, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
348  //
349  fV4MinEntry->SetState(kFALSE);
350  fV4MaxEntry->SetState(kFALSE);
351 
352  //2. The second group - contains controls to select surface and
353  //manipulate its parameters.
354  TGGroupFrame *isoGroup = new TGGroupFrame(tabFrame, "Iso-surfaces", kVerticalFrame);
355 
356  fHighlightCheck = new TGCheckButton(isoGroup, "Highlight selected");
357  fHighlightCheck->SetToolTipText("Highlight selected surface");
358  fHighlightCheck->SetState(kButtonDown);
359  isoGroup->AddFrame(fHighlightCheck, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
360 
361  TGHorizontalFrame *hf = new TGHorizontalFrame(isoGroup);
362  fIsoList = new TGListBox(hf);
363  fIsoList->Resize(120, 120);
364  hf->AddFrame(fIsoList, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));
365  isoGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1));
366 
367  fVisibleCheck = new TGCheckButton(isoGroup, "Visible");
368  fVisibleCheck->SetToolTipText("Show/hide surface");
369  isoGroup->AddFrame(fVisibleCheck, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
370 
371  fShowCloud = new TGCheckButton(isoGroup, "Show cloud");
372  fShowCloud->SetToolTipText("Show/hide cloud for surface");
373  isoGroup->AddFrame(fShowCloud, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
374 
375  //Sorry, Matevz :) I stole this from TGLViewerEditor :))
376  hf = new TGHorizontalFrame(isoGroup);
377  TGLabel* lab = new TGLabel(hf, "Color");
378  hf->AddFrame(lab, new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 4, 8, 3));
379  fSurfColorSelect = new TGColorSelect(hf, 0, -1);
380  hf->AddFrame(fSurfColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 8, 1));
381  isoGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1));
382 
383  TGHorizontalFrame *frame = make_labeled_hframe(isoGroup, "Opacity: ");
384  fSurfAlphaSlider = new TGHSlider(frame, 80);
385  fSurfAlphaSlider->SetRange(0, 100);
386  frame->AddFrame(fSurfAlphaSlider, new TGLayoutHints(kLHintsLeft));
387 
388  fSurfRemoveBtn = new TGTextButton(isoGroup, " Remove surface ");
389  isoGroup->AddFrame(fSurfRemoveBtn, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
390  tabFrame->AddFrame(isoGroup, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
391 
392  //3. Group with controls to add new iso-surface.
393  TGGroupFrame *newGroup = new TGGroupFrame(tabFrame, "New iso-surface", kVerticalFrame);
394  hf = new TGHorizontalFrame(newGroup);
395  fNewIsoEntry = new TGNumberEntry(hf, 0., 12, -1, TGNumberFormat::kNESReal);
396  hf->AddFrame(fNewIsoEntry, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
397  fNewIsoEntry->Resize(60, 20);
398  fAddNewIsoBtn = new TGTextButton(hf, " Add ");
399  hf->AddFrame(fAddNewIsoBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY | kLHintsExpandX, 2, 2, 2, 2));
400  newGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
401 
402  tabFrame->AddFrame(newGroup, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 3, 0, 0));
403 }
404 
405 ////////////////////////////////////////////////////////////////////////////////
406 ///Set model or disables/hides viewer.
407 
408 void TGL5DDataSetEditor::SetModel(TObject* obj)
409 {
410  fPainter = 0;
411  Bool_t needUpdate = fSelectedSurface != -1;
412 
413  if ((fDataSet = dynamic_cast<TGL5DDataSet *>(obj))) {
414  fPainter = fDataSet->GetRealPainter();
415 
416  SetStyleTabWidgets();
417  SetGridTabWidgets();
418  SetIsoTabWidgets();
419 
420  DisableGridTabButtons();
421  DisableSurfaceControls();
422 
423  if (fInit)
424  ConnectSignals2Slots();
425  }
426 
427  if (needUpdate && gPad)
428  gPad->Update();
429 }
430 
431 namespace {
432 
433 void set_grid_range_widgets(const TAxis *a, const Rgl::Range_t r, TGDoubleHSlider *slider,
434  TGNumberEntryField *eMin, TGNumberEntryField *eMax)
435 {
436  slider->SetRange(r.first, r.second);
437  slider->SetPosition(a->GetBinLowEdge(1), a->GetBinUpEdge(a->GetLast()));
438 
439  eMin->SetNumber(a->GetBinLowEdge(1));
440  eMin->SetLimits(TGNumberFormat::kNELLimitMinMax, r.first, r.second);
441  eMax->SetNumber(a->GetBinUpEdge(a->GetLast()));
442  eMax->SetLimits(TGNumberFormat::kNELLimitMinMax, r.first, r.second);
443 }
444 
445 }
446 
447 ////////////////////////////////////////////////////////////////////////////////
448 ///Set "Style" tab's controls from model.
449 
450 void TGL5DDataSetEditor::SetStyleTabWidgets()
451 {
452  fShowBoxCut->SetState(fPainter->IsBoxCutShown() ? kButtonDown : kButtonUp);
453  fNumberOfPlanes->SetNumber(fPainter->GetNContours());
454  fAlpha->SetNumber(fPainter->GetAlpha());
455 }
456 
457 ////////////////////////////////////////////////////////////////////////////////
458 ///Set "Grid" tab's controls from model.
459 
460 void TGL5DDataSetEditor::SetGridTabWidgets()
461 {
462  const TAxis *xA = fDataSet->GetXAxis();
463  const TAxis *yA = fDataSet->GetYAxis();
464  const TAxis *zA = fDataSet->GetZAxis();
465  const Rgl::Range_t &xR = fDataSet->GetXRange();
466  const Rgl::Range_t &yR = fDataSet->GetYRange();
467  const Rgl::Range_t &zR = fDataSet->GetZRange();
468  //Number of cells.
469  fNCellsXEntry->SetIntNumber(xA->GetNbins());
470  fNCellsYEntry->SetIntNumber(yA->GetNbins());
471  fNCellsZEntry->SetIntNumber(zA->GetNbins());
472  //X-range.
473  set_grid_range_widgets(xA, xR, fXRangeSlider, fXRangeSliderMin, fXRangeSliderMax);
474  //Y-range.
475  set_grid_range_widgets(yA, yR, fYRangeSlider, fYRangeSliderMin, fYRangeSliderMax);
476  //Z-range.
477  set_grid_range_widgets(zA, zR, fZRangeSlider, fZRangeSliderMin, fZRangeSliderMax);
478 }
479 
480 ////////////////////////////////////////////////////////////////////////////////
481 ///Set "Surfaces" tab's controls from model.
482 
483 void TGL5DDataSetEditor::SetIsoTabWidgets()
484 {
485  const Rgl::Range_t &v4R = fDataSet->GetV4Range();
486  //V4 range.
487  fV4MinEntry->SetNumber(v4R.first);
488  fV4MaxEntry->SetNumber(v4R.second);
489 
490  fIsoList->RemoveAll();
491  fHidden->fIterators.clear();
492 
493  SurfIter_t curr = fPainter->SurfacesBegin();
494 
495  for (Int_t ind = 0; curr != fPainter->SurfacesEnd(); ++curr, ++ind) {
496  TString entry(TString::Format("Level: %f", curr->f4D));
497  fIsoList->AddEntry(entry.Data(), ind);
498  fIsoList->Layout();
499  curr->fHighlight = kFALSE;
500  //I'm saving list's iterators here.
501  //If list modified (surface removed)
502  //- corresponding iterator must be removed,
503  //all other iterators are still valid (thanks to std::list).
504  //If surface added, new iterator must be added at the end.
505  fHidden->fIterators[ind] = curr;
506  }
507 
508  fNewIsoEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, v4R.first, v4R.second);
509  fNewIsoEntry->SetNumber(v4R.first);
510 
511  fSelectedSurface = -1;
512 }
513 
514 ////////////////////////////////////////////////////////////////////////////////
515 ///Some of controls in a "Grid" tab was modified.
516 
517 void TGL5DDataSetEditor::GridParametersChanged()
518 {
519  EnableGridTabButtons();
520 }
521 
522 ////////////////////////////////////////////////////////////////////////////////
523 ///Grid parameters were changed, enable "Cancel" and "Apply" buttons.
524 
525 void TGL5DDataSetEditor::EnableGridTabButtons()
526 {
527  fCancelGridBtn->SetState(kButtonUp);
528  fOkGridBtn->SetState(kButtonUp);
529 }
530 
531 ////////////////////////////////////////////////////////////////////////////////
532 ///Disable "Cancel" and "Apply" buttons.
533 
534 void TGL5DDataSetEditor::DisableGridTabButtons()
535 {
536  fCancelGridBtn->SetState(kButtonDisabled);
537  fOkGridBtn->SetState(kButtonDisabled);
538 }
539 
540 ////////////////////////////////////////////////////////////////////////////////
541 ///Surface was selected in a list box, enable some controls.
542 
543 void TGL5DDataSetEditor::EnableSurfaceControls()
544 {
545  fVisibleCheck->SetState(kButtonUp);
546 // fShowCloud->SetState(kButtonUp);
547 // fSurfColorBtn->SetState(kButtonUp);
548  fSurfRemoveBtn->SetState(kButtonUp);
549 }
550 
551 ////////////////////////////////////////////////////////////////////////////////
552 ///Disable surface controls.
553 
554 void TGL5DDataSetEditor::DisableSurfaceControls()
555 {
556  fVisibleCheck->SetState(kButtonDisabled);
557  fShowCloud->SetState(kButtonDisabled);
558 // fSurfColorBtn->SetState(kButtonDisabled);
559  fSurfRemoveBtn->SetState(kButtonDisabled);
560 }
561 
562 ////////////////////////////////////////////////////////////////////////////////
563 ///X slider in a "Grid" tab.
564 
565 void TGL5DDataSetEditor::XSliderChanged()
566 {
567  fXRangeSliderMin->SetNumber(fXRangeSlider->GetMinPosition());
568  fXRangeSliderMax->SetNumber(fXRangeSlider->GetMaxPosition());
569 
570  EnableGridTabButtons();
571 }
572 
573 ////////////////////////////////////////////////////////////////////////////////
574 ///Y slider in a "Grid" tab.
575 
576 void TGL5DDataSetEditor::YSliderChanged()
577 {
578  fYRangeSliderMin->SetNumber(fYRangeSlider->GetMinPosition());
579  fYRangeSliderMax->SetNumber(fYRangeSlider->GetMaxPosition());
580 
581  EnableGridTabButtons();
582 }
583 
584 ////////////////////////////////////////////////////////////////////////////////
585 ///Z slider in a "Grid" tab.
586 
587 void TGL5DDataSetEditor::ZSliderChanged()
588 {
589  fZRangeSliderMin->SetNumber(fZRangeSlider->GetMinPosition());
590  fZRangeSliderMax->SetNumber(fZRangeSlider->GetMaxPosition());
591 
592  EnableGridTabButtons();
593 }
594 
595 ////////////////////////////////////////////////////////////////////////////////
596 ///Value in a number entry was modified.
597 
598 void TGL5DDataSetEditor::XSliderSetMin()
599 {
600  if (fXRangeSliderMin->GetNumber() < fXRangeSliderMax->GetNumber()) {
601  fXRangeSlider->SetPosition(fXRangeSliderMin->GetNumber(),
602  fXRangeSliderMax->GetNumber());
603  EnableGridTabButtons();
604  } else
605  fXRangeSliderMin->SetNumber(fXRangeSlider->GetMinPosition());
606 }
607 
608 ////////////////////////////////////////////////////////////////////////////////
609 ///Value in a number entry was modified.
610 
611 void TGL5DDataSetEditor::XSliderSetMax()
612 {
613  if (fXRangeSliderMin->GetNumber() < fXRangeSliderMax->GetNumber()) {
614  fXRangeSlider->SetPosition(fXRangeSliderMin->GetNumber(),
615  fXRangeSliderMax->GetNumber());
616  EnableGridTabButtons();
617  } else
618  fXRangeSliderMax->SetNumber(fXRangeSlider->GetMaxPosition());
619 }
620 
621 
622 ////////////////////////////////////////////////////////////////////////////////
623 ///Value in a number entry was modified.
624 
625 void TGL5DDataSetEditor::YSliderSetMin()
626 {
627  if (fYRangeSliderMin->GetNumber() < fYRangeSliderMax->GetNumber()) {
628  fYRangeSlider->SetPosition(fYRangeSliderMin->GetNumber(),
629  fYRangeSliderMax->GetNumber());
630  EnableGridTabButtons();
631  } else
632  fYRangeSliderMin->SetNumber(fYRangeSlider->GetMinPosition());
633 }
634 
635 ////////////////////////////////////////////////////////////////////////////////
636 ///Value in a number entry was modified.
637 
638 void TGL5DDataSetEditor::YSliderSetMax()
639 {
640  if (fYRangeSliderMin->GetNumber() < fYRangeSliderMax->GetNumber()) {
641  fYRangeSlider->SetPosition(fYRangeSliderMin->GetNumber(),
642  fYRangeSliderMax->GetNumber());
643  EnableGridTabButtons();
644  } else
645  fYRangeSliderMax->SetNumber(fYRangeSlider->GetMaxPosition());
646 }
647 
648 ////////////////////////////////////////////////////////////////////////////////
649 ///Value in a number entry was modified.
650 
651 void TGL5DDataSetEditor::ZSliderSetMin()
652 {
653  if (fZRangeSliderMin->GetNumber() < fZRangeSliderMax->GetNumber()) {
654  fZRangeSlider->SetPosition(fZRangeSliderMin->GetNumber(),
655  fZRangeSliderMax->GetNumber());
656  EnableGridTabButtons();
657  } else
658  fZRangeSliderMin->SetNumber(fZRangeSlider->GetMinPosition());
659 
660 }
661 
662 ////////////////////////////////////////////////////////////////////////////////
663 ///Value in a number entry was modified.
664 
665 void TGL5DDataSetEditor::ZSliderSetMax()
666 {
667  if (fZRangeSliderMin->GetNumber() < fZRangeSliderMax->GetNumber()) {
668  fZRangeSlider->SetPosition(fZRangeSliderMin->GetNumber(),
669  fZRangeSliderMax->GetNumber());
670  EnableGridTabButtons();
671  } else
672  fYRangeSliderMax->SetNumber(fZRangeSlider->GetMaxPosition());
673 }
674 
675 ////////////////////////////////////////////////////////////////////////////////
676 ///"Cancel" button was pressed in a "Grid" tab.
677 ///Return old values.
678 
679 void TGL5DDataSetEditor::RollbackGridParameters()
680 {
681  SetGridTabWidgets();
682  DisableGridTabButtons();
683 }
684 
685 ////////////////////////////////////////////////////////////////////////////////
686 ///"Apply" button was pressed in a "Grid" tab.
687 ///Modify all meshes.
688 
689 void TGL5DDataSetEditor::ApplyGridParameters()
690 {
691  DisableGridTabButtons();
692  //
693  fDataSet->GetXAxis()->Set(fNCellsXEntry->GetIntNumber(),
694  fXRangeSlider->GetMinPosition(),
695  fXRangeSlider->GetMaxPosition());
696 
697  fDataSet->GetYAxis()->Set(fNCellsYEntry->GetIntNumber(),
698  fYRangeSlider->GetMinPosition(),
699  fYRangeSlider->GetMaxPosition());
700 
701  fDataSet->GetZAxis()->Set(fNCellsZEntry->GetIntNumber(),
702  fZRangeSlider->GetMinPosition(),
703  fZRangeSlider->GetMaxPosition());
704 
705  fPainter->ResetGeometryRanges();
706  if (gPad)
707  gPad->Update();
708 }
709 
710 ////////////////////////////////////////////////////////////////////////////////
711 ///Check, if selected surface must be highlighted.
712 
713 void TGL5DDataSetEditor::HighlightClicked()
714 {
715  if (fSelectedSurface == -1)
716  return;
717 
718  fHidden->fIterators[fSelectedSurface]->fHighlight = fHighlightCheck->IsOn();
719 
720  if (gPad)
721  gPad->Update();
722 }
723 
724 ////////////////////////////////////////////////////////////////////////////////
725 ///Surface was selected in a list box.
726 ///Enable surface controls and set them into
727 ///correct state.
728 
729 void TGL5DDataSetEditor::SurfaceSelected(Int_t id)
730 {
731  if (id >= 0) {
732  //Check, if the index is valid.
733  if (!fHidden->IsValid(id)) {
734  Error("SurfaceSelected", "Got wrong index %d", id);
735  return;
736  }
737 
738  if (fSelectedSurface != -1) {
739  //Previously selected surface IS ALWAYS
740  //valid index, so no index check here.
741  fHidden->fIterators[fSelectedSurface]->fHighlight = kFALSE;
742  }
743 
744  EnableSurfaceControls();
745 
746 
747  SurfIter_t surf = fHidden->fIterators[fSelectedSurface = id];
748  surf->fHighlight = fHighlightCheck->IsOn();
749  //Surface is visible/invisible - check/uncheck.
750  fVisibleCheck->SetOn(!surf->fHide);
751  fSurfColorSelect->SetColor(TColor::Number2Pixel(surf->fColor), kFALSE);
752  fSurfAlphaSlider->SetPosition(surf->fAlpha);
753 
754  if (gPad)
755  gPad->Update();
756  } else if (fSelectedSurface != -1) {
757  //Deselect.
758  fHidden->fIterators[fSelectedSurface]->fHighlight = kFALSE;
759  fSelectedSurface = -1;
760  DisableSurfaceControls();//No surface is selected, no working controls.
761  if (gPad)
762  gPad->Update();
763  }
764 }
765 
766 ////////////////////////////////////////////////////////////////////////////////
767 ///Hide/show selected surface.
768 
769 void TGL5DDataSetEditor::VisibleClicked()
770 {
771  //In principle, this control can be enabled,
772  //only if some surface was selected and
773  //fSelectedSurface != -1. But I do not trust to
774  //ROOT's GUI so I have a check.
775  if (fSelectedSurface != -1) {
776  fHidden->fIterators[fSelectedSurface]->fHide = !(fVisibleCheck->IsOn());
777  if (gPad)
778  gPad->Update();
779  }
780 }
781 
782 ////////////////////////////////////////////////////////////////////////////////
783 ///Change the color of the selected surface.
784 
785 void TGL5DDataSetEditor::ColorChanged(Pixel_t pixel)
786 {
787  if (fSelectedSurface != -1) {
788  fHidden->fIterators[fSelectedSurface]->fColor = Color_t(TColor::GetColor(pixel));
789  if (gPad)
790  gPad->Update();
791  }
792 }
793 
794 ////////////////////////////////////////////////////////////////////////////////
795 ///Change transparency of selected surface.
796 
797 void TGL5DDataSetEditor::AlphaChanged(Int_t alpha)
798 {
799  if (fSelectedSurface != -1) {
800  fHidden->fIterators[fSelectedSurface]->fAlpha = alpha;
801  if (gPad)
802  gPad->Update();
803  }
804 }
805 
806 ////////////////////////////////////////////////////////////////////////////////
807 ///Remove selected surface.
808 
809 void TGL5DDataSetEditor::RemoveSurface()
810 {
811  if (fSelectedSurface != -1) {
812 
813  SurfIter_t it = fHidden->fIterators[fSelectedSurface];
814  fHidden->fIterators.erase(fSelectedSurface);
815  fIsoList->RemoveEntry(fSelectedSurface);
816  fIsoList->Layout();
817  fPainter->RemoveSurface(it);
818  DisableSurfaceControls();
819  fSelectedSurface = -1;
820 
821  if (gPad)
822  gPad->Update();
823  }
824 }
825 
826 ////////////////////////////////////////////////////////////////////////////////
827 ///Add new iso-surface.
828 
829 void TGL5DDataSetEditor::AddNewSurface()
830 {
831  fPainter->AddSurface(fNewIsoEntry->GetNumber());
832  SetModel(fDataSet);
833 
834  if (gPad)
835  gPad->Update();
836 }
837 
838 ////////////////////////////////////////////////////////////////////////////////
839 /// Slot connected to the "Apply" button for alpha value.
840 
841 void TGL5DDataSetEditor::ApplyAlpha()
842 {
843  if (fPainter) {
844  fApplyAlpha->SetState(kButtonDisabled);
845  fPainter->SetAlpha(fAlpha->GetNumber());
846  fAlpha->SetNumber(fPainter->GetAlpha());
847 
848  //Update other tabs and change controls' states.
849  SetModel(fDataSet);
850  }
851 
852  if (gPad)
853  gPad->Update();
854 }
855 
856 
857 ////////////////////////////////////////////////////////////////////////////////
858 /// Slot connected to the Apply Planes button.
859 
860 void TGL5DDataSetEditor::ApplyPlanes()
861 {
862  if (fPainter) {
863  //fApplyPlanes->SetState(kButtonDisabled);
864  fPainter->SetNContours((Int_t)fNumberOfPlanes->GetIntNumber());
865  fNumberOfPlanes->SetIntNumber(fPainter->GetNContours());
866 
867  //Update other tabs and change controls' states.
868  SetModel(fDataSet);
869  }
870 
871  if (gPad)
872  gPad->Update();
873 }
874 
875 ////////////////////////////////////////////////////////////////////////////////
876 /// Slot connected to the Show BoxCut check button.
877 
878 void TGL5DDataSetEditor::BoxCutToggled()
879 {
880  if (fPainter)
881  fPainter->ShowBoxCut(fShowBoxCut->IsOn());
882  if (gPad)
883  gPad->Update();
884 }
885 
886 ////////////////////////////////////////////////////////////////////////////////
887 /// Slot connected to the Alpha entry.
888 
889 void TGL5DDataSetEditor::AlphaChanged()
890 {
891  fApplyAlpha->SetState(kButtonUp);
892 }
893 
894 ////////////////////////////////////////////////////////////////////////////////
895 /// Slot connected to the Number of Planes value-entry.
896 
897 void TGL5DDataSetEditor::NContoursChanged()
898 {
899 // fApplyPlanes->SetState(kButtonUp);
900 }