TGL5DDataSetEditor.cxx

Go to the documentation of this file.
00001 // @(#)root/gl:$Id: TGL5DDataSetEditor.cxx 29738 2009-08-08 10:41:47Z matevz $
00002 // Author: Bertrand Bellenot 2009
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2009, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 #include <string>
00012 #include <map>
00013 
00014 #include "TGDoubleSlider.h"
00015 #include "TGColorSelect.h"
00016 #include "TGNumberEntry.h"
00017 #include "TVirtualPad.h"
00018 #include "TGListBox.h"
00019 #include "TGSlider.h"
00020 #include "TGButton.h"
00021 #include "TGLabel.h"
00022 #include "TString.h"
00023 #include "TColor.h"
00024 #include "TAxis.h"
00025 
00026 #include "TGL5DDataSetEditor.h"
00027 #include "TGL5DPainter.h"
00028 #include "TGLUtil.h"
00029 #include "TGL5D.h"
00030 
00031 //______________________________________________________________________________
00032 //
00033 // GUI editor for OpenGL 5D Painter.
00034 // Exception safety and ROOT's GUI are two
00035 // mutually exclusive things. So,
00036 // only ROOT's GUI here.
00037 namespace {
00038 
00039 typedef TGL5DPainter::SurfIter_t    SurfIter_t;
00040 typedef std::map<Int_t, SurfIter_t> IterMap_t;
00041 typedef IterMap_t::iterator         IterMapIter_t;
00042 
00043 }
00044 
00045 //
00046 //Pimpl.
00047 //
00048 class TGL5DDataSetEditor::TGL5DEditorPrivate {
00049 public:
00050    IterMap_t fIterators;
00051    Bool_t IsValid(Int_t index)const
00052    {
00053       return fIterators.find(index) != fIterators.end();
00054    }
00055 };
00056 
00057 ClassImp(TGL5DDataSetEditor);
00058 
00059 //______________________________________________________________________________
00060 TGL5DDataSetEditor::TGL5DDataSetEditor(const TGWindow *p,  Int_t width, Int_t height, 
00061                                        UInt_t options, Pixel_t back) :
00062    TGedFrame(p,  width, height, options | kVerticalFrame, back),
00063    //"Grid" tab.
00064    fNCellsXEntry(0),
00065    fNCellsYEntry(0),
00066    fNCellsZEntry(0),
00067    fXRangeSlider(0),
00068    fXRangeSliderMin(0),
00069    fXRangeSliderMax(0),
00070    fYRangeSlider(0),
00071    fYRangeSliderMin(0),
00072    fYRangeSliderMax(0),
00073    fZRangeSlider(0),
00074    fZRangeSliderMin(0),
00075    fZRangeSliderMax(0),
00076    fCancelGridBtn(0),
00077    fOkGridBtn(0),
00078    //"Surfaces" tab.
00079    fV4MinEntry(0),
00080    fV4MaxEntry(0),
00081    fHighlightCheck(0),
00082    fIsoList(0),
00083    fVisibleCheck(0),
00084    fShowCloud(0),
00085    fSurfColorSelect(0),
00086    fSurfAlphaSlider(0),
00087    fSurfRemoveBtn(0),
00088    fNewIsoEntry(0),
00089    fAddNewIsoBtn(0),
00090    //"Style" tab's widgets.
00091    fShowBoxCut(),
00092    fNumberOfPlanes(0),
00093    fAlpha(0),
00094    fLogScale(0),
00095    fSlideRange(0),
00096    fApplyAlpha(0),
00097    fApplyPlanes(0),
00098    //Model.
00099    fDataSet(0),
00100    fPainter(0),
00101    fHidden(0),
00102    fSelectedSurface(-1)
00103 {
00104    //Constructor.
00105    CreateStyleTab();
00106    CreateGridTab();
00107    CreateIsoTab();
00108 
00109    fHidden = new TGL5DEditorPrivate;
00110 }
00111 
00112 //______________________________________________________________________________
00113 
00114 TGL5DDataSetEditor::~TGL5DDataSetEditor()
00115 {
00116    //Destructor.
00117    delete fHidden;
00118 }
00119 
00120 //______________________________________________________________________________
00121 void TGL5DDataSetEditor::ConnectSignals2Slots()
00122 {
00123    //Connect signals to slots.
00124 
00125    //Controls from "Style" tab.
00126    fShowBoxCut->Connect("Toggled(Bool_t)", "TGL5DDataSetEditor", this, "BoxCutToggled()");
00127    fAlpha->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "AlphaChanged()");
00128    fAlpha->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "AlphaChanged()");
00129    fNumberOfPlanes->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "NContoursChanged()");
00130    fNumberOfPlanes->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "NContoursChanged()");
00131    fApplyPlanes->Connect("Clicked()", "TGL5DDataSetEditor", this, "ApplyPlanes()");
00132    fApplyAlpha->Connect("Clicked()", "TGL5DDataSetEditor", this, "ApplyAlpha()");
00133 
00134    //Controls from "Grid" tab.
00135    fNCellsXEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
00136    fNCellsXEntry->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
00137 
00138    fNCellsYEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
00139    fNCellsZEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
00140 
00141    fXRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "XSliderChanged()");
00142    fXRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "XSliderSetMin()");
00143    fXRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "XSliderSetMax()");
00144 
00145    fYRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "YSliderChanged()");
00146    fYRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "YSliderSetMin()");
00147    fYRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "YSliderSetMax()");
00148 
00149    fZRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "ZSliderChanged()");
00150    fZRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "ZSliderSetMin()");
00151    fZRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "ZSliderSetMax()");
00152 
00153    fCancelGridBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "RollbackGridParameters()");
00154    fOkGridBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "ApplyGridParameters()");
00155 
00156    //Controls from "Surfaces" tab.
00157    fIsoList->Connect("Selected(Int_t)", "TGL5DDataSetEditor", this, "SurfaceSelected(Int_t)");
00158    fIsoList->GetContainer()->RemoveInput(kKeyPressMask);
00159    
00160    fHighlightCheck->Connect("Clicked()", "TGL5DDataSetEditor", this, "HighlightClicked()");
00161    fVisibleCheck->Connect("Clicked()", "TGL5DDataSetEditor", this, "VisibleClicked()");
00162    fSurfColorSelect->Connect("ColorSelected(Pixel_t)", "TGL5DDataSetEditor", this, "ColorChanged(Pixel_t)");
00163    fSurfAlphaSlider->Connect("PositionChanged(Int_t)", "TGL5DDataSetEditor", this, "AlphaChanged(Int_t)");
00164    fSurfRemoveBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "RemoveSurface()");
00165 
00166    fAddNewIsoBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "AddNewSurface()");
00167 
00168    fInit = kFALSE;
00169 }
00170 
00171 
00172 namespace
00173 {
00174 
00175 //Auxilary functions.
00176 //______________________________________________________________________________
00177 void make_slider_range_entries(TGCompositeFrame *parent, TGNumberEntryField *&minEntry, 
00178                                const TString &minToolTip, TGNumberEntryField *&maxEntry,
00179                                const TString &maxToolTip)
00180 {
00181    TGCompositeFrame *frame = new TGCompositeFrame(parent, 80, 20, kHorizontalFrame);
00182 
00183    minEntry = new TGNumberEntryField(frame, -1, 0., TGNumberFormat::kNESRealThree,
00184                                      TGNumberFormat::kNEAAnyNumber);
00185    minEntry->SetToolTipText(minToolTip.Data());
00186    minEntry->Resize(57, 20);
00187    frame->AddFrame(minEntry, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
00188 
00189    maxEntry = new TGNumberEntryField(frame, -1, 0., TGNumberFormat::kNESRealThree,
00190                                      TGNumberFormat::kNEAAnyNumber);
00191    maxEntry->SetToolTipText(maxToolTip.Data());
00192    maxEntry->Resize(57, 20);
00193    frame->AddFrame(maxEntry, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
00194    parent->AddFrame(frame, new TGLayoutHints(kLHintsTop, 5, 0, 0, 0));
00195 }
00196 
00197 //______________________________________________________________________________
00198 TGHorizontalFrame *make_labeled_hframe(TGCompositeFrame *p, const char *text)
00199 {
00200    TGHorizontalFrame *frame = new TGHorizontalFrame(p);
00201    TGLabel *label = new TGLabel(frame, text);
00202    frame->AddFrame(label, new TGLayoutHints(kLHintsLeft | kLHintsBottom, 0, 0, 0));
00203    p->AddFrame(frame, new TGLayoutHints(kLHintsLeft, 0, 0, 1, 0));
00204 
00205    return frame;
00206 }
00207 
00208 //______________________________________________________________________________
00209 TGDoubleHSlider *make_double_hslider(TGCompositeFrame *parent, const char *labelName)
00210 {
00211    TGCompositeFrame *sliderFrame = new TGCompositeFrame(parent, 80, 20, kHorizontalFrame);
00212    TGLabel *sliderLabel = new TGLabel(sliderFrame, labelName);
00213    sliderFrame->AddFrame(sliderLabel,
00214                          new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 2, 2, 2, 2)); 
00215    TGDoubleHSlider *slider = new TGDoubleHSlider(sliderFrame, 1, 2);
00216    slider->Resize(110, 20);
00217 
00218    sliderFrame->AddFrame(slider, new TGLayoutHints(kLHintsLeft));
00219    parent->AddFrame(sliderFrame, new TGLayoutHints(kLHintsTop, 2, 2, 2, 2));
00220 
00221    return slider;
00222 }
00223 
00224 }
00225 
00226 //______________________________________________________________________________
00227 void TGL5DDataSetEditor::CreateStyleTab()
00228 {
00229    // Creates "Style" tab.
00230 
00231    TGHorizontalFrame *f;
00232    //MakeTitle("Update behaviour");
00233    fShowBoxCut  = new TGCheckButton(this, "Show Box Cut");
00234    fShowBoxCut->SetToolTipText("Box cut. When attached to a plot, cuts away a part of it");
00235    AddFrame(fShowBoxCut, new TGLayoutHints(kLHintsLeft, 5, 2, 2, 2));
00236 
00237    MakeTitle("isosurfaces");
00238    f = new TGHorizontalFrame(this, 200, 50);
00239    f->AddFrame(new TGLabel(f, "Number:"), new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5, 2, 2, 2));
00240    fNumberOfPlanes = new TGNumberEntry(f, 0, 3, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
00241                                        TGNumberFormat::kNELLimitMinMax, 1, 200);
00242    fNumberOfPlanes->GetNumberEntry()->SetToolTipText("Set number of isosurfaces");
00243    f->AddFrame(fNumberOfPlanes, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
00244    fApplyPlanes = new TGTextButton(f, "   Apply   ");
00245    f->AddFrame(fApplyPlanes, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
00246    AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0));
00247    //fApplyPlanes->SetState(kButtonDisabled);
00248 
00249    MakeTitle("Alpha");
00250    f = new TGHorizontalFrame(this, 200, 50);
00251    f->AddFrame(new TGLabel(f, "Value:"), new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5, 2, 2, 2));
00252    fAlpha = new TGNumberEntry(f, 0, 1, -1, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEANonNegative, 
00253                               TGNumberFormat::kNELLimitMinMax, 0.1, 0.5);
00254    fAlpha->GetNumberEntry()->SetToolTipText("Value of alpha parameter");
00255    f->AddFrame(fAlpha, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
00256    fApplyAlpha = new TGTextButton(f, "   Apply   ");
00257    f->AddFrame(fApplyAlpha, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
00258    AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0));
00259    fApplyAlpha->SetState(kButtonDisabled);
00260 
00261    fLogScale  = new TGCheckButton(this, "Log Scale");
00262    AddFrame(fLogScale, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 2, 2, 2));
00263 
00264    AddFrame(new TGLabel(this, "Slide Range:"), new TGLayoutHints(kLHintsLeft, 5, 2, 2, 2));
00265    fSlideRange = new TGDoubleHSlider(this, 200, kDoubleScaleDownRight);
00266    AddFrame(fSlideRange, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 5, 2, 2, 2));
00267 }
00268 
00269 //______________________________________________________________________________
00270 void TGL5DDataSetEditor::CreateGridTab()
00271 {
00272    //Tab, containing controls to set
00273    //the ranges and number of cells in a grid.
00274    TGCompositeFrame *tabFrame = CreateEditorTabSubFrame("Grid");
00275    //1. The first part of the tab - "Grid parameters" group.
00276    TGGroupFrame *gridGroup = new TGGroupFrame(tabFrame, "Grid parameters", kVerticalFrame);
00277    //2. Numeric entries.
00278    const UInt_t min = 10, max = 300;
00279    const UInt_t nDigits = 4;
00280 
00281    TGHorizontalFrame *frame = make_labeled_hframe(gridGroup, "Cells along X:");
00282    fNCellsXEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger,
00283                                      TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
00284                                      min, max);
00285    frame->AddFrame(fNCellsXEntry, 
00286                    new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
00287    //
00288    frame = make_labeled_hframe(gridGroup, "Cells along Y:");
00289    fNCellsYEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger, 
00290                                      TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
00291                                      min, max);
00292    frame->AddFrame(fNCellsYEntry, 
00293                    new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
00294    //
00295    frame = make_labeled_hframe(gridGroup, "Cells along Z:");
00296    fNCellsZEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger,
00297                                      TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
00298                                      min, max);
00299    frame->AddFrame(fNCellsZEntry, 
00300                    new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
00301    tabFrame->AddFrame(gridGroup, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 3, 3, 0));
00302    
00303    //3. The second part - "Ranges" group.
00304    TGGroupFrame *rangeGroup = new TGGroupFrame(tabFrame, "Ranges", kVerticalFrame);
00305    //4. Sliders and number entry fields.
00306    fXRangeSlider = make_double_hslider(rangeGroup, "X:");
00307    make_slider_range_entries(rangeGroup, fXRangeSliderMin, "Set the minimum value of the x-axis",
00308                           fXRangeSliderMax, "Set the maximum value of the x-axis");
00309    fYRangeSlider = make_double_hslider(rangeGroup, "Y:");
00310    make_slider_range_entries(rangeGroup, fYRangeSliderMin, "Set the minimum value of the y-axis",
00311                           fYRangeSliderMax, "Set the maximum value of the y-axis");
00312    fZRangeSlider = make_double_hslider(rangeGroup, "Z:");
00313    make_slider_range_entries(rangeGroup, fZRangeSliderMin, "Set the minimum value of the z-axis",
00314                           fZRangeSliderMax, "Set the maximum value of the z-axis");
00315 
00316    tabFrame->AddFrame(rangeGroup, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00317 
00318    //5. Buttons.
00319    TGHorizontalFrame *horizontalFrame = new TGHorizontalFrame(tabFrame, 200, 50);
00320    fCancelGridBtn = new TGTextButton(horizontalFrame, "  Cancel  ");
00321    horizontalFrame->AddFrame(fCancelGridBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
00322    fOkGridBtn = new TGTextButton(horizontalFrame, "  Apply  ");
00323    horizontalFrame->AddFrame(fOkGridBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
00324    tabFrame->AddFrame(horizontalFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX, 2, 3, 0, 0));
00325 }
00326 
00327 //______________________________________________________________________________
00328 void TGL5DDataSetEditor::CreateIsoTab()
00329 {
00330    //Tab, containing controls to work with iso-surfaces.
00331    TGCompositeFrame *tabFrame = CreateEditorTabSubFrame("Surfaces");
00332 
00333    //1. The first group - contains V4 range (read only number entries with min and max).
00334    TGGroupFrame *v4Group = new TGGroupFrame(tabFrame, "V4 Range", kVerticalFrame);
00335 
00336    make_slider_range_entries(v4Group, fV4MinEntry, "Minimum value of V4",
00337                              fV4MaxEntry, "Maximum value of V4");
00338 
00339    tabFrame->AddFrame(v4Group, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00340    //
00341    fV4MinEntry->SetState(kFALSE);
00342    fV4MaxEntry->SetState(kFALSE);
00343 
00344    //2. The second group - contains controls to select surface and
00345    //manipulate its parameters.
00346    TGGroupFrame *isoGroup = new TGGroupFrame(tabFrame, "Iso-surfaces", kVerticalFrame);
00347 
00348    fHighlightCheck = new TGCheckButton(isoGroup, "Highlight selected");
00349    fHighlightCheck->SetToolTipText("Highlight selected surface");
00350    fHighlightCheck->SetState(kButtonDown);
00351    isoGroup->AddFrame(fHighlightCheck, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
00352 
00353    TGHorizontalFrame *hf = new TGHorizontalFrame(isoGroup);
00354    fIsoList = new TGListBox(hf);
00355    fIsoList->Resize(120, 120);
00356    hf->AddFrame(fIsoList, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));
00357    isoGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1));
00358    
00359    fVisibleCheck = new TGCheckButton(isoGroup, "Visible");
00360    fVisibleCheck->SetToolTipText("Show/hide surface");
00361    isoGroup->AddFrame(fVisibleCheck, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
00362 
00363    fShowCloud = new TGCheckButton(isoGroup, "Show cloud");
00364    fShowCloud->SetToolTipText("Show/hide cloud for surface");
00365    isoGroup->AddFrame(fShowCloud, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
00366 
00367    //Sorry, Matevz :) I stole this from TGLViewerEditor :))
00368    hf = new TGHorizontalFrame(isoGroup);
00369    TGLabel* lab = new TGLabel(hf, "Color");
00370    hf->AddFrame(lab, new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 4, 8, 3));
00371    fSurfColorSelect = new TGColorSelect(hf, 0, -1);
00372    hf->AddFrame(fSurfColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 8, 1));
00373    isoGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1));
00374 
00375    TGHorizontalFrame *frame = make_labeled_hframe(isoGroup, "Opacity: ");
00376    fSurfAlphaSlider = new TGHSlider(frame, 80);
00377    fSurfAlphaSlider->SetRange(0, 100);
00378    frame->AddFrame(fSurfAlphaSlider, new TGLayoutHints(kLHintsLeft));
00379 
00380    fSurfRemoveBtn = new TGTextButton(isoGroup, "  Remove surface  ");
00381    isoGroup->AddFrame(fSurfRemoveBtn, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
00382    tabFrame->AddFrame(isoGroup, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00383 
00384    //3. Group with controls to add new iso-surface.
00385    TGGroupFrame *newGroup = new TGGroupFrame(tabFrame, "New iso-surface", kVerticalFrame);
00386    hf = new TGHorizontalFrame(newGroup);
00387    fNewIsoEntry = new TGNumberEntry(hf, 0., 12, -1, TGNumberFormat::kNESReal);
00388    hf->AddFrame(fNewIsoEntry, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
00389    fNewIsoEntry->Resize(60, 20);
00390    fAddNewIsoBtn = new TGTextButton(hf, "    Add    ");
00391    hf->AddFrame(fAddNewIsoBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY | kLHintsExpandX, 2, 2, 2, 2));
00392    newGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
00393 
00394    tabFrame->AddFrame(newGroup, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 3, 0, 0));
00395 }
00396 
00397 //______________________________________________________________________________
00398 void TGL5DDataSetEditor::SetModel(TObject* obj)
00399 {
00400    //Set model or disables/hides viewer.
00401    fPainter = 0;
00402    Bool_t needUpdate = fSelectedSurface != -1;
00403 
00404    if ((fDataSet = dynamic_cast<TGL5DDataSet *>(obj))) {
00405       fPainter = fDataSet->GetRealPainter();
00406 
00407       SetStyleTabWidgets();
00408       SetGridTabWidgets();
00409       SetIsoTabWidgets();
00410 
00411       DisableGridTabButtons();
00412       DisableSurfaceControls();
00413 
00414       if (fInit)
00415          ConnectSignals2Slots();
00416    }
00417 
00418    if (needUpdate && gPad)
00419       gPad->Update();
00420 }
00421 
00422 namespace {
00423 
00424 void set_grid_range_widgets(const TAxis *a, const Rgl::Range_t r, TGDoubleHSlider *slider, 
00425                             TGNumberEntryField *eMin, TGNumberEntryField *eMax)
00426 {
00427    slider->SetRange(r.first, r.second);
00428    slider->SetPosition(a->GetBinLowEdge(1), a->GetBinUpEdge(a->GetLast()));
00429 
00430    eMin->SetNumber(a->GetBinLowEdge(1));
00431    eMin->SetLimits(TGNumberFormat::kNELLimitMinMax, r.first, r.second);
00432    eMax->SetNumber(a->GetBinUpEdge(a->GetLast()));
00433    eMax->SetLimits(TGNumberFormat::kNELLimitMinMax, r.first, r.second);
00434 }
00435 
00436 }
00437 
00438 //______________________________________________________________________________
00439 void TGL5DDataSetEditor::SetStyleTabWidgets()
00440 {
00441    //Set "Style" tab's controls from model.
00442 
00443    fShowBoxCut->SetState(fPainter->IsBoxCutShown() ? kButtonDown : kButtonUp);
00444    fNumberOfPlanes->SetNumber(fPainter->GetNContours());
00445    fAlpha->SetNumber(fPainter->GetAlpha());
00446 }
00447 
00448 //______________________________________________________________________________
00449 void TGL5DDataSetEditor::SetGridTabWidgets()
00450 {
00451    //Set "Grid" tab's controls from model.
00452 
00453    const TAxis *xA = fDataSet->GetXAxis();
00454    const TAxis *yA = fDataSet->GetYAxis();
00455    const TAxis *zA = fDataSet->GetZAxis();
00456    const Rgl::Range_t &xR = fDataSet->GetXRange();
00457    const Rgl::Range_t &yR = fDataSet->GetYRange();
00458    const Rgl::Range_t &zR = fDataSet->GetZRange();
00459    //Number of cells.
00460    fNCellsXEntry->SetIntNumber(xA->GetNbins());
00461    fNCellsYEntry->SetIntNumber(yA->GetNbins());
00462    fNCellsZEntry->SetIntNumber(zA->GetNbins());
00463    //X-range.
00464    set_grid_range_widgets(xA, xR, fXRangeSlider, fXRangeSliderMin, fXRangeSliderMax);
00465    //Y-range.
00466    set_grid_range_widgets(yA, yR, fYRangeSlider, fYRangeSliderMin, fYRangeSliderMax);
00467    //Z-range.
00468    set_grid_range_widgets(zA, zR, fZRangeSlider, fZRangeSliderMin, fZRangeSliderMax);
00469 }
00470 
00471 //______________________________________________________________________________
00472 void TGL5DDataSetEditor::SetIsoTabWidgets()
00473 {
00474    //Set "Surfaces" tab's controls from model.
00475    const Rgl::Range_t &v4R = fDataSet->GetV4Range();
00476    //V4 range.
00477    fV4MinEntry->SetNumber(v4R.first);
00478    fV4MaxEntry->SetNumber(v4R.second);
00479 
00480    fIsoList->RemoveAll();
00481    fHidden->fIterators.clear();
00482 
00483    SurfIter_t curr = fPainter->SurfacesBegin();
00484 
00485    for (Int_t ind = 0; curr != fPainter->SurfacesEnd(); ++curr, ++ind) {
00486       TString entry(TString::Format("Level: %f", curr->f4D));
00487       fIsoList->AddEntry(entry.Data(), ind);
00488       fIsoList->Layout();
00489       curr->fHighlight = kFALSE;
00490       //I'm saving list's iterators here.
00491       //If list modified (surface removed)
00492       //- corresponding iterator must be removed,
00493       //all other iterators are still valid (thanks to std::list).
00494       //If surface added, new iterator must be added at the end.
00495       fHidden->fIterators[ind] = curr;
00496    }
00497 
00498    fNewIsoEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, v4R.first, v4R.second);
00499    fNewIsoEntry->SetNumber(v4R.first);
00500 
00501    fSelectedSurface = -1;
00502 }
00503 
00504 //______________________________________________________________________________
00505 void TGL5DDataSetEditor::GridParametersChanged()
00506 {
00507    //Some of controls in a "Grid" tab was modified.
00508    EnableGridTabButtons();
00509 }
00510 
00511 //______________________________________________________________________________
00512 void TGL5DDataSetEditor::EnableGridTabButtons()
00513 {
00514    //Grid parameters were changed, enable "Cancel" and "Apply" buttons.
00515    fCancelGridBtn->SetState(kButtonUp);
00516    fOkGridBtn->SetState(kButtonUp);
00517 }
00518 
00519 //______________________________________________________________________________
00520 void TGL5DDataSetEditor::DisableGridTabButtons()
00521 {
00522    //Disable "Cancel" and "Apply" buttons.
00523    fCancelGridBtn->SetState(kButtonDisabled);
00524    fOkGridBtn->SetState(kButtonDisabled);
00525 }
00526 
00527 //______________________________________________________________________________
00528 void TGL5DDataSetEditor::EnableSurfaceControls()
00529 {
00530    //Surface was selected in a list box, enable some controls.
00531    fVisibleCheck->SetState(kButtonUp);
00532 //   fShowCloud->SetState(kButtonUp);
00533 //   fSurfColorBtn->SetState(kButtonUp);
00534    fSurfRemoveBtn->SetState(kButtonUp);   
00535 }
00536 
00537 //______________________________________________________________________________
00538 void TGL5DDataSetEditor::DisableSurfaceControls()
00539 {
00540    //Disable surface controls.
00541    fVisibleCheck->SetState(kButtonDisabled);
00542    fShowCloud->SetState(kButtonDisabled);
00543 //   fSurfColorBtn->SetState(kButtonDisabled);
00544    fSurfRemoveBtn->SetState(kButtonDisabled);
00545 }
00546 
00547 //______________________________________________________________________________
00548 void TGL5DDataSetEditor::XSliderChanged()
00549 {
00550    //X slider in a "Grid" tab.
00551    fXRangeSliderMin->SetNumber(fXRangeSlider->GetMinPosition());
00552    fXRangeSliderMax->SetNumber(fXRangeSlider->GetMaxPosition());
00553 
00554    EnableGridTabButtons();
00555 }
00556 
00557 //______________________________________________________________________________
00558 void TGL5DDataSetEditor::YSliderChanged()
00559 {
00560    //Y slider in a "Grid" tab.
00561    fYRangeSliderMin->SetNumber(fYRangeSlider->GetMinPosition());
00562    fYRangeSliderMax->SetNumber(fYRangeSlider->GetMaxPosition());
00563 
00564    EnableGridTabButtons();
00565 }
00566 
00567 //______________________________________________________________________________
00568 void TGL5DDataSetEditor::ZSliderChanged()
00569 {
00570    //Z slider in a "Grid" tab.
00571    fZRangeSliderMin->SetNumber(fZRangeSlider->GetMinPosition());
00572    fZRangeSliderMax->SetNumber(fZRangeSlider->GetMaxPosition());
00573 
00574    EnableGridTabButtons();
00575 }
00576 
00577 //______________________________________________________________________________
00578 void TGL5DDataSetEditor::XSliderSetMin()
00579 {
00580    //Value in a number entry was modified.
00581    if (fXRangeSliderMin->GetNumber() < fXRangeSliderMax->GetNumber()) {
00582       fXRangeSlider->SetPosition(fXRangeSliderMin->GetNumber(), 
00583                                  fXRangeSliderMax->GetNumber());
00584       EnableGridTabButtons();
00585    } else
00586       fXRangeSliderMin->SetNumber(fXRangeSlider->GetMinPosition());
00587 }
00588 
00589 //______________________________________________________________________________
00590 void TGL5DDataSetEditor::XSliderSetMax()
00591 {
00592    //Value in a number entry was modified.
00593    if (fXRangeSliderMin->GetNumber() < fXRangeSliderMax->GetNumber()) {
00594       fXRangeSlider->SetPosition(fXRangeSliderMin->GetNumber(), 
00595                                  fXRangeSliderMax->GetNumber());
00596       EnableGridTabButtons();
00597    } else
00598       fXRangeSliderMax->SetNumber(fXRangeSlider->GetMaxPosition());
00599 }
00600 
00601 
00602 //______________________________________________________________________________
00603 void TGL5DDataSetEditor::YSliderSetMin()
00604 {
00605    //Value in a number entry was modified.
00606    if (fYRangeSliderMin->GetNumber() < fYRangeSliderMax->GetNumber()) {
00607       fYRangeSlider->SetPosition(fYRangeSliderMin->GetNumber(), 
00608                                  fYRangeSliderMax->GetNumber());
00609       EnableGridTabButtons();
00610    } else
00611       fYRangeSliderMin->SetNumber(fYRangeSlider->GetMinPosition());
00612 }
00613 
00614 //______________________________________________________________________________
00615 void TGL5DDataSetEditor::YSliderSetMax()
00616 {
00617    //Value in a number entry was modified.
00618    if (fYRangeSliderMin->GetNumber() < fYRangeSliderMax->GetNumber()) {
00619       fYRangeSlider->SetPosition(fYRangeSliderMin->GetNumber(), 
00620                                  fYRangeSliderMax->GetNumber());
00621       EnableGridTabButtons();
00622    } else
00623       fYRangeSliderMax->SetNumber(fYRangeSlider->GetMaxPosition());
00624 }
00625 
00626 //______________________________________________________________________________
00627 void TGL5DDataSetEditor::ZSliderSetMin()
00628 {
00629    //Value in a number entry was modified.
00630    if (fZRangeSliderMin->GetNumber() < fZRangeSliderMax->GetNumber()) {
00631       fZRangeSlider->SetPosition(fZRangeSliderMin->GetNumber(), 
00632                                  fZRangeSliderMax->GetNumber());
00633       EnableGridTabButtons();
00634    } else
00635       fZRangeSliderMin->SetNumber(fZRangeSlider->GetMinPosition());
00636 
00637 }
00638 
00639 //______________________________________________________________________________
00640 void TGL5DDataSetEditor::ZSliderSetMax()
00641 {
00642    //Value in a number entry was modified.
00643    if (fZRangeSliderMin->GetNumber() < fZRangeSliderMax->GetNumber()) {
00644       fZRangeSlider->SetPosition(fZRangeSliderMin->GetNumber(), 
00645                                  fZRangeSliderMax->GetNumber());
00646       EnableGridTabButtons();
00647    } else
00648       fYRangeSliderMax->SetNumber(fZRangeSlider->GetMaxPosition());
00649 }
00650 
00651 //______________________________________________________________________________
00652 void TGL5DDataSetEditor::RollbackGridParameters()
00653 {
00654    //"Cancel" button was pressed in a "Grid" tab.
00655    //Return old values.
00656    SetGridTabWidgets();
00657    DisableGridTabButtons();
00658 }
00659 
00660 //______________________________________________________________________________
00661 void TGL5DDataSetEditor::ApplyGridParameters()
00662 {
00663    //"Apply" button was pressed in a "Grid" tab.
00664    //Modify all meshes.
00665    DisableGridTabButtons();
00666    //
00667    fDataSet->GetXAxis()->Set(fNCellsXEntry->GetIntNumber(), 
00668                              fXRangeSlider->GetMinPosition(), 
00669                              fXRangeSlider->GetMaxPosition());
00670 
00671    fDataSet->GetYAxis()->Set(fNCellsYEntry->GetIntNumber(), 
00672                              fYRangeSlider->GetMinPosition(), 
00673                              fYRangeSlider->GetMaxPosition());
00674 
00675    fDataSet->GetZAxis()->Set(fNCellsZEntry->GetIntNumber(), 
00676                              fZRangeSlider->GetMinPosition(), 
00677                              fZRangeSlider->GetMaxPosition());
00678 
00679    fPainter->ResetGeometryRanges();
00680    if (gPad)
00681       gPad->Update();
00682 }
00683 
00684 //______________________________________________________________________________
00685 void TGL5DDataSetEditor::HighlightClicked()
00686 {
00687    //Check, if selected surface must be highlighted.
00688    if (fSelectedSurface == -1)
00689       return;
00690    
00691    fHidden->fIterators[fSelectedSurface]->fHighlight = fHighlightCheck->IsOn();
00692 
00693    if (gPad)
00694       gPad->Update();
00695 }
00696 
00697 //______________________________________________________________________________
00698 void TGL5DDataSetEditor::SurfaceSelected(Int_t id)
00699 {
00700    //Surface was selected in a list box.
00701    //Enable surface controls and set them into
00702    //correct state.
00703    if (id >= 0) {
00704       //Check, if the index is valid.
00705       if (!fHidden->IsValid(id)) {
00706          Error("SurfaceSelected", "Got wrong index %d", id);
00707          return;
00708       }
00709 
00710       if (fSelectedSurface != -1) {
00711          //Previously selected surface IS ALWAYS
00712          //valid index, so no index check here.
00713          fHidden->fIterators[fSelectedSurface]->fHighlight = kFALSE;
00714       }
00715 
00716       EnableSurfaceControls();
00717 
00718 
00719       SurfIter_t surf = fHidden->fIterators[fSelectedSurface = id];
00720       surf->fHighlight = fHighlightCheck->IsOn();
00721       //Surface is visible/invisible - check/uncheck.
00722       fVisibleCheck->SetOn(!surf->fHide);
00723       fSurfColorSelect->SetColor(TColor::Number2Pixel(surf->fColor), kFALSE);
00724       fSurfAlphaSlider->SetPosition(surf->fAlpha);
00725 
00726       if (gPad)
00727          gPad->Update();
00728    } else if (fSelectedSurface != -1) {
00729       //Deselect.
00730       fHidden->fIterators[fSelectedSurface]->fHighlight = kFALSE;
00731       fSelectedSurface = -1;
00732       DisableSurfaceControls();//No surface is selected, no working controls.
00733       if (gPad)
00734          gPad->Update();
00735    }
00736 }
00737 
00738 //______________________________________________________________________________
00739 void TGL5DDataSetEditor::VisibleClicked()
00740 {
00741    //Hide/show selected surface.
00742 
00743    //In principle, this control can be enabled,
00744    //only if some surface was selected and
00745    //fSelectedSurface != -1. But I do not trust to
00746    //ROOT's GUI so I have a check.
00747    if (fSelectedSurface != -1) {
00748       fHidden->fIterators[fSelectedSurface]->fHide = !(fVisibleCheck->IsOn());
00749       if (gPad)
00750          gPad->Update();
00751    }
00752 }
00753 
00754 //______________________________________________________________________________
00755 void TGL5DDataSetEditor::ColorChanged(Pixel_t pixel)
00756 {
00757    //Change the color of the selected surface.
00758 
00759    if (fSelectedSurface != -1) {
00760       fHidden->fIterators[fSelectedSurface]->fColor = Color_t(TColor::GetColor(pixel));
00761       if (gPad)
00762          gPad->Update();
00763    }
00764 }
00765 
00766 //______________________________________________________________________________
00767 void TGL5DDataSetEditor::AlphaChanged(Int_t alpha)
00768 {
00769    //Change transparency of selected surface.
00770 
00771    if (fSelectedSurface != -1) {
00772       fHidden->fIterators[fSelectedSurface]->fAlpha = alpha;
00773       if (gPad)
00774          gPad->Update();
00775    }
00776 }
00777 
00778 //______________________________________________________________________________
00779 void TGL5DDataSetEditor::RemoveSurface()
00780 {
00781    //Remove selected surface.
00782    if (fSelectedSurface != -1) {
00783       
00784       SurfIter_t it = fHidden->fIterators[fSelectedSurface];
00785       fHidden->fIterators.erase(fSelectedSurface);
00786       fIsoList->RemoveEntry(fSelectedSurface);
00787       fIsoList->Layout();
00788       fPainter->RemoveSurface(it);
00789       DisableSurfaceControls();
00790       fSelectedSurface = -1;
00791 
00792       if (gPad)
00793          gPad->Update();
00794    }
00795 }
00796 
00797 //______________________________________________________________________________
00798 void TGL5DDataSetEditor::AddNewSurface()
00799 {
00800    //Add new iso-surface.
00801    fPainter->AddSurface(fNewIsoEntry->GetNumber());
00802    SetModel(fDataSet);
00803 
00804    if (gPad)
00805       gPad->Update();
00806 }
00807 
00808 //______________________________________________________________________________
00809 void TGL5DDataSetEditor::ApplyAlpha()
00810 {
00811    // Slot connected to the "Apply" button for alpha value.
00812 
00813    if (fPainter) {
00814       fApplyAlpha->SetState(kButtonDisabled);
00815       fPainter->SetAlpha(fAlpha->GetNumber());
00816       fAlpha->SetNumber(fPainter->GetAlpha());
00817 
00818       //Update other tabs and change controls' states.
00819       SetModel(fDataSet);
00820    }
00821 
00822    if (gPad)
00823       gPad->Update();
00824 }
00825 
00826 
00827 //______________________________________________________________________________
00828 void TGL5DDataSetEditor::ApplyPlanes()
00829 {
00830    // Slot connected to the Apply Planes button.
00831 
00832    if (fPainter) {
00833       //fApplyPlanes->SetState(kButtonDisabled);
00834       fPainter->SetNContours((Int_t)fNumberOfPlanes->GetIntNumber());
00835       fNumberOfPlanes->SetIntNumber(fPainter->GetNContours());
00836 
00837       //Update other tabs and change controls' states.
00838       SetModel(fDataSet);
00839    }
00840 
00841    if (gPad)
00842       gPad->Update();
00843 }
00844 
00845 //______________________________________________________________________________
00846 void TGL5DDataSetEditor::BoxCutToggled()
00847 {
00848    // Slot connected to the Show BoxCut check button.
00849 
00850    if (fPainter) 
00851       fPainter->ShowBoxCut(fShowBoxCut->IsOn());
00852    if (gPad)
00853       gPad->Update();
00854 }
00855 
00856 //______________________________________________________________________________
00857 void TGL5DDataSetEditor::AlphaChanged()
00858 {
00859    // Slot connected to the Alpha entry.
00860 
00861    fApplyAlpha->SetState(kButtonUp);
00862 }
00863 
00864 //______________________________________________________________________________
00865 void TGL5DDataSetEditor::NContoursChanged()
00866 {
00867    // Slot connected to the Number of Planes value-entry.
00868 
00869 //   fApplyPlanes->SetState(kButtonUp);
00870 }

Generated on Tue Jul 5 14:18:05 2011 for ROOT_528-00b_version by  doxygen 1.5.1