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