From da3da7dacf850c5d72e1b15db2edaf5c2542a693 Mon Sep 17 00:00:00 2001 From: Fons Rademakers <Fons.Rademakers@cern.ch> Date: Mon, 23 Jul 2007 15:01:36 +0000 Subject: [PATCH] Frm Matevz: New class - separate ClipSetEditor from TGLViewerEditor. git-svn-id: http://root.cern.ch/svn/root/trunk@19426 27541ba8-7e3a-0410-8455-c3a389f83636 --- gl/inc/TGLClipSetEditor.h | 87 +++++++++++++ gl/src/TGLClipSetEditor.cxx | 240 ++++++++++++++++++++++++++++++++++++ 2 files changed, 327 insertions(+) create mode 100644 gl/inc/TGLClipSetEditor.h create mode 100644 gl/src/TGLClipSetEditor.cxx diff --git a/gl/inc/TGLClipSetEditor.h b/gl/inc/TGLClipSetEditor.h new file mode 100644 index 00000000000..4f70f679e3c --- /dev/null +++ b/gl/inc/TGLClipSetEditor.h @@ -0,0 +1,87 @@ +// @(#)root/gl:$Name$:$Id$ +// Author: Matevz Tadel, Jun 2007 + +/************************************************************************* + * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. * + * All rights reserved. * + * * + * For the licensing terms see $ROOTSYS/LICENSE. * + * For the list of contributors see $ROOTSYS/README/CREDITS. * + *************************************************************************/ + +#ifndef ROOT_TGLClipSetEditor +#define ROOT_TGLClipSetEditor + +#ifndef ROOT_TGedFrame +#include "TGedFrame.h" +#endif +#ifndef ROOT_TGLUtil +#include "TGLUtil.h" +#endif + +class TGButton; +class TGCheckButton; +class TGNumberEntry; +class TGButtonGroup; +class TGLClipSet; + + +class TGLClipSetSubEditor : public TGVerticalFrame { + +private: + TGLClipSetSubEditor(const TGLClipSetSubEditor&); // Not implemented + TGLClipSetSubEditor& operator=(const TGLClipSetSubEditor&); // Not implemented + +protected: + TGLClipSet *fM; + + EClipType fCurrentClip; + TGButtonGroup *fTypeButtons; + + TGCompositeFrame *fPlanePropFrame; + TGNumberEntry *fPlaneProp[4]; + + TGCompositeFrame *fBoxPropFrame; + TGNumberEntry *fBoxProp[6]; + TGCheckButton *fClipInside; + TGCheckButton *fClipEdit; + TGCheckButton *fClipShow; + TGButton *fApplyButton; + +public: + TGLClipSetSubEditor(const TGWindow* p); + virtual ~TGLClipSetSubEditor() {} + + void SetModel(TGLClipSet* m); + + void Changed(); //*SIGNAL* + + //Clipping manipulation + void ClipValueChanged(); + void ClipTypeChanged(Int_t); + void UpdateViewerClip(); + + ClassDef(TGLClipSetSubEditor, 0) // Sub-editor for TGLClipSet +}; + + +class TGLClipSetEditor : public TGedFrame { + +private: + TGLClipSetEditor(const TGLClipSetEditor&); // Not implemented + TGLClipSetEditor& operator=(const TGLClipSetEditor&); // Not implemented + +protected: + TGLClipSet *fM; // fModel dynamic-casted to TGLClipSet + TGLClipSetSubEditor *fSE; + +public: + TGLClipSetEditor(const TGWindow* p=0, Int_t width=170, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground()); + virtual ~TGLClipSetEditor() {} + + virtual void SetModel(TObject* obj); + + ClassDef(TGLClipSetEditor, 0) // Editor for TGLClipSet +}; + +#endif diff --git a/gl/src/TGLClipSetEditor.cxx b/gl/src/TGLClipSetEditor.cxx new file mode 100644 index 00000000000..37c75e14c92 --- /dev/null +++ b/gl/src/TGLClipSetEditor.cxx @@ -0,0 +1,240 @@ +// @(#)root/gl:$Name$:$Id$ +// Author: Matevz Tadel, Jun 2007 + +/************************************************************************* + * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. * + * All rights reserved. * + * * + * For the licensing terms see $ROOTSYS/LICENSE. * + * For the list of contributors see $ROOTSYS/README/CREDITS. * + *************************************************************************/ + +#include "TGLClipSetEditor.h" +#include "TGLClip.h" +#include "TVirtualPad.h" +#include "TColor.h" +#include "TGLabel.h" +#include "TGButton.h" +#include "TGButtonGroup.h" +#include "TGNumberEntry.h" + + +//______________________________________________________________________ +// TGLClipSetSubEditor +// +// + +ClassImp(TGLClipSetSubEditor) + +//______________________________________________________________________ +TGLClipSetSubEditor::TGLClipSetSubEditor(const TGWindow *p) : + TGVerticalFrame(p), + fM(0), + fCurrentClip(kClipNone), + fTypeButtons(0), + fPlanePropFrame(0), + fPlaneProp(), + fBoxPropFrame(0), + fBoxProp(), + fClipInside(0), + fClipEdit(0), + fClipShow(0), + fApplyButton(0) +{ + // Constructor. + + fTypeButtons = new TGButtonGroup(this, "Clip Type"); + new TGRadioButton(fTypeButtons, "None"); + new TGRadioButton(fTypeButtons, "Plane"); + new TGRadioButton(fTypeButtons, "Box"); + + AddFrame(fTypeButtons, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + // Clip inside / edit + fClipInside = new TGCheckButton(this, "Clip away inside"); + AddFrame(fClipInside, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + fClipEdit = new TGCheckButton(this, "Edit In Viewer"); + AddFrame(fClipEdit, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + fClipShow = new TGCheckButton(this, "Show In Viewer"); + AddFrame(fClipShow, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + // Plane properties + fPlanePropFrame = new TGCompositeFrame(this); + //fPlanePropFrame->SetCleanup(kDeepCleanup); + AddFrame(fPlanePropFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + static const char * const planeStr[] = { "aX + ", "bY +", "cZ + ", "d = 0" }; + + for (Int_t i = 0; i < 4; ++i) { + TGLabel *label = new TGLabel(fPlanePropFrame, planeStr[i]); + fPlanePropFrame->AddFrame(label, new TGLayoutHints(kLHintsTop | kLHintsLeft, 3, 3, 3, 3)); + fPlaneProp[i] = new TGNumberEntry(fPlanePropFrame, 1., 8); + fPlanePropFrame->AddFrame(fPlaneProp[i], new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + } + + // Box properties + fBoxPropFrame = new TGCompositeFrame(this); + AddFrame(fBoxPropFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + static const char * const boxStr[] = {"Center X", "Center Y", "Center Z", "Length X", "Length Y", "Length Z" }; + + for (Int_t i = 0; i < 6; ++i) { + TGLabel *label = new TGLabel(fBoxPropFrame, boxStr[i]); + fBoxPropFrame->AddFrame(label, new TGLayoutHints(kLHintsTop | kLHintsLeft, 3, 3, 3, 3)); + fBoxProp[i] = new TGNumberEntry(fBoxPropFrame, 1., 8); + fBoxPropFrame->AddFrame(fBoxProp[i], new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + } + + // Apply button + fApplyButton = new TGTextButton(this, "Apply"); + AddFrame(fApplyButton, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + fTypeButtons->Connect("Clicked(Int_t)", "TGLClipSetSubEditor", this, "ClipTypeChanged(Int_t)"); + fClipInside->Connect("Clicked()", "TGLClipSetSubEditor", this, "UpdateViewerClip()"); + fClipEdit->Connect("Clicked()", "TGLClipSetSubEditor", this, "UpdateViewerClip()"); + fClipShow->Connect("Clicked()", "TGLClipSetSubEditor", this, "UpdateViewerClip()"); + + for (Int_t i = 0; i < 4; ++i) + fPlaneProp[i]->Connect("ValueSet(Long_t)", "TGLClipSetSubEditor", this, "ClipValueChanged()"); + + for (Int_t i = 0; i < 6; ++i) + fBoxProp[i]->Connect("ValueSet(Long_t)", "TGLClipSetSubEditor", this, "ClipValueChanged()"); + + fApplyButton->Connect("Pressed()", "TGLClipSetSubEditor", this, "UpdateViewerClip()"); +} + +//______________________________________________________________________ +void TGLClipSetSubEditor::SetModel(TGLClipSet* m) +{ + // Set model object. + + fM = m; + + Double_t clip[6] = {0.}; + + fM->GetClipState(fCurrentClip, clip); + + fApplyButton->SetState(kButtonDisabled); + + // Button ids run from 1 + if (TGButton *btn = fTypeButtons->GetButton(fCurrentClip+1)) { + btn->SetDown(); + fTypeButtons->SetButton(fCurrentClip+1); + } + Bool_t active = (fCurrentClip != kClipNone); + fClipInside->SetEnabled(active); + fClipEdit ->SetEnabled(active); + fClipShow ->SetEnabled(active); + if (active) { + fClipEdit->SetDown(fM->GetShowManip()); + fClipShow->SetDown(fM->GetShowClip()); + fClipInside->SetDown(fM->GetCurrentClip()->GetMode() == TGLClip::kInside); + + if (fCurrentClip == kClipPlane) { + HideFrame(fBoxPropFrame); + ShowFrame(fPlanePropFrame); + for (Int_t i = 0; i < 4; ++i) + fPlaneProp[i]->SetNumber(clip[i]); + } else if (fCurrentClip == kClipBox) { + HideFrame(fPlanePropFrame); + ShowFrame(fBoxPropFrame); + for (Int_t i = 0; i < 6; ++i) + fBoxProp[i]->SetNumber(clip[i]); + } + } else { + HideFrame(fPlanePropFrame); + HideFrame(fBoxPropFrame); + } +} + +//______________________________________________________________________ +void TGLClipSetSubEditor::Changed() +{ + // Emit Changed signal. + + Emit("Changed()"); +} + +//______________________________________________________________________________ +void TGLClipSetSubEditor::ClipValueChanged() +{ + // One of number entries was changed. + + fApplyButton->SetState(kButtonUp); +} + +//______________________________________________________________________________ +void TGLClipSetSubEditor::ClipTypeChanged(Int_t id) +{ + // Clip type radio button changed - update viewer. + + switch (id) + { + case 2: fCurrentClip = kClipPlane; break; + case 3: fCurrentClip = kClipBox; break; + default: fCurrentClip = kClipNone; break; + } + fM->SetClipType(fCurrentClip); + SetModel(fM); + ((TGMainFrame*)GetMainFrame())->Layout(); + Changed(); +} + +//______________________________________________________________________________ +void TGLClipSetSubEditor::UpdateViewerClip() +{ + // Change clipping volume. + + Double_t data[6] = {0.}; + // Fetch GUI state for clip if 'type' into 'data' vector + if (fCurrentClip == kClipPlane) + for (Int_t i = 0; i < 4; ++i) + data[i] = fPlaneProp[i]->GetNumber(); + else if (fCurrentClip == kClipBox) + for (Int_t i = 0; i < 6; ++i) + data[i] = fBoxProp[i]->GetNumber(); + + fApplyButton->SetState(kButtonDisabled); + + fM->SetClipState(fCurrentClip, data); + fM->SetShowManip(fClipEdit->IsDown()); + fM->SetShowClip (fClipShow->IsDown()); + if (fCurrentClip != kClipNone) + fM->GetCurrentClip()->SetMode(fClipInside->IsDown() ? TGLClip::kInside : TGLClip::kOutside); + + Changed(); +} + + +//______________________________________________________________________ +// TGLClipSetEditor +// +// + +ClassImp(TGLClipSetEditor) + +//______________________________________________________________________ +TGLClipSetEditor::TGLClipSetEditor(const TGWindow *p, Int_t width, Int_t height, + UInt_t options, Pixel_t back) : + TGedFrame(p, width, height, options | kVerticalFrame, back), + fM (0), + fSE (0) +{ + // Constructor. + + MakeTitle("TGLClipSet"); + + fSE = new TGLClipSetSubEditor(this); + AddFrame(fSE, new TGLayoutHints(kLHintsTop, 2, 0, 2, 2)); + fSE->Connect("Changed()", "TGLClipSetEditor", this, "Update()"); +} + +/**************************************************************************/ + +//______________________________________________________________________ +void TGLClipSetEditor::SetModel(TObject* obj) +{ + // Set model object. + + fM = dynamic_cast<TGLClipSet*>(obj); + fSE->SetModel(fM); +} -- GitLab