1 #include "RGTopFrame.h"
5 #include "VSDSelector.h"
7 #include <Reve/RenderElement.h>
11 #include <TGToolBar.h>
13 #include <TGTextEntry.h>
14 #include <TGSplitter.h>
15 #include <TRootEmbeddedCanvas.h>
17 #include <TGLSAViewer.h>
28 #include <TVirtualX.h>
29 #include <TPolyLine3D.h>
30 #include <TPolyMarker3D.h>
33 #include <KeySymbols.h>
34 #include "TVirtualGL.h"
35 #include "TPluginManager.h"
42 Reve::RGTopFrame* gReve = 0;
52 const char *xpm_names[] = {
59 ToolBarData_t tb_data[] = {
60 { "", "Standard list layout", kFALSE, M_LAYOUT_1, NULL },
61 { "", "TParticle latout", kFALSE, M_LAYOUT_2, NULL },
62 { "", "TGeo layout", kFALSE, M_LAYOUT_3, NULL },
63 { NULL, NULL, 0, 0, NULL }
66 } // unnamed namespace
68 /**************************************************************************/
71 void RGTopFrame::Init(){
76 fRedrawDisabled = false;
78 fRedrawTimer.Connect("Timeout()", "Reve::RGTopFrame", this, "DoRedraw3D()");
82 RGTopFrame::RGTopFrame(const TGWindow *p, UInt_t w, UInt_t h, LookType_e look)
83 : TGMainFrame(p, w, h)
86 TGLayoutHints *fL0 = new TGLayoutHints(kLHintsCenterX |kLHintsCenterY | kLHintsExpandY| kLHintsExpandX);
87 TGLayoutHints *fL1 = new TGLayoutHints(kLHintsCenterX |kLHintsCenterY | kLHintsExpandY| kLHintsExpandX,2,0,2,2);
88 TGLayoutHints* fL2 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY,
90 TGCompositeFrame* fMainFrame = new TGCompositeFrame(this, w, h,kHorizontalFrame | kRaisedFrame);
91 fMainFrame->SetCleanup(kDeepCleanup);
92 TGVerticalFrame* fV2 = new TGVerticalFrame(fMainFrame, GetWidth()-40, GetHeight()-40, kSunkenFrame);
94 fMainFrame->AddFrame(fV2, fL1);
96 // ??? TGCanvas* fCanvasWindow = new TGCanvas(fV2,w,h);
97 TGTab* fDisplayFrame = new TGTab(fV2, GetWidth(), GetHeight());
100 TGCompositeFrame* tFrame1 = fDisplayFrame->AddTab("Object Browser");
101 fBrowser = new RGBrowser(tFrame1, w, h);
102 tFrame1->AddFrame(fBrowser, fL2);
104 // tree selection tab
105 TGCompositeFrame* tFrame2 = fDisplayFrame->AddTab("Tree Selections");
106 fSelector = new VSDSelector(fBrowser->GetListTree(), tFrame2);
110 TGCompositeFrame* tFrame3 = fDisplayFrame->AddTab("Canvas");
111 TRootEmbeddedCanvas* fEmbeddedCanvas3 = new TRootEmbeddedCanvas("fEmbeddedCanvas3", tFrame3, 580, 360);
112 tFrame3->AddFrame(fEmbeddedCanvas3, fL2);
113 fEmbeddedCanvas3->GetCanvas()->SetBorderMode(0);
114 fCC = fEmbeddedCanvas3->GetCanvas();
115 // fCC->SetFillColor(1);
117 { // Workaround for empty scene.
118 TPolyMarker3D* bugmark = new TPolyMarker3D(8);
119 // bugmark->SetMarkerStyle(2);
120 // bugmark->SetMarkerColor(1);
121 const Float_t a = 10.0;
122 bugmark->SetPoint(0, a, a,a);
123 bugmark->SetPoint(1, a, -a,a);
124 bugmark->SetPoint(2, -a, -a,a);
125 bugmark->SetPoint(3, -a, a,a);
127 bugmark->SetPoint(4, a, a,-a);
128 bugmark->SetPoint(5, a, -a,-a);
129 bugmark->SetPoint(6, -a, a,-a);
130 bugmark->SetPoint(7, -a, -a,-a);
138 TGCompositeFrame* frame4 = fDisplayFrame->AddTab("HistoCanvas");
139 TRootEmbeddedCanvas* ecanvas4 = new TRootEmbeddedCanvas("HistoCanvas", frame4, 580, 360);
140 frame4->AddFrame(ecanvas4, fL2);
141 fHistoCanvas = ecanvas4->GetCanvas();
142 fHistoCanvas->SetBorderMode(0);
145 fV2->AddFrame(fDisplayFrame, fL0);
146 AddFrame(fMainFrame, fL0);
149 Int_t parts[] = {45, 45, 10};
150 fStatusBar = new TGStatusBar(this, 50, 10, kHorizontalFrame);
151 fStatusBar->SetParts(parts, 3);
152 TGLayoutHints* fL6 = new TGLayoutHints(kLHintsBottom| kLHintsExpandX, 0, 0, 0, 0);
153 AddFrame(fStatusBar, fL6);
154 fStatusBar->SetText("GUI created", 0);
158 /**************************************************************************/
159 /**************************************************************************/
161 fEditor = new RGEditor(fCC);
162 fEditor->GetCan()->ChangeOptions(0);
166 fBrowser->SetupClassicLook();
167 // Need push/pop pad around here? Not.
168 fCC->GetViewer3D("ogl");
173 fBrowser->SetupEditorLook(fEditor);
174 fCC->GetViewer3D("ogl");
179 printf("LT_GLViewer this option currently somewhat broken!\n");
180 fBrowser->SetupGLViewerLook(fEditor, fCC);
181 printf("Crap1 %d %d\n", GetWidth(), GetHeight());
186 printf("RGTopFrame unknown look-type, ignoring.\n");
191 TGLViewer* glv = dynamic_cast<TGLViewer*>(fCC->GetViewer3D());
193 glv->SetSmartRefresh(true);
196 /**************************************************************************/
197 /**************************************************************************/
199 fGeometryLTI = GetListTree()->AddItem(0, "Geometry");
200 GetListTree()->OpenItem(fGeometryLTI);
202 Resize(GetDefaultSize()); // this is used here to init layout algorithm
203 SetWindowName("Reve");
206 fEditor->DisplayObject(0);
208 gSystem->ProcessEvents();
211 /**************************************************************************/
213 TGListTree* RGTopFrame::GetListTree()
215 return fBrowser->GetListTree();
218 TGListTreeItem* RGTopFrame::GetEventTreeItem()
220 // return fBrowser->GetListTree()->FindItemByPathname("Event");
221 return fCurrentEventLTI;
224 TGListTreeItem* RGTopFrame::GetGlobalTreeItem()
229 /**************************************************************************/
231 /**************************************************************************/
233 void RGTopFrame::EditRenderElement(RenderElement* rnr_element)
235 static const Exc_t eH("RGTopFrame::EditRenderElement ");
238 if(rnr_element) tobj = dynamic_cast<TObject*>(rnr_element);
239 fEditor->DisplayObject(tobj);
242 /**************************************************************************/
244 /**************************************************************************/
246 void RGTopFrame::RegisterRedraw3D()
248 fRedrawTimer.Start(0, kTRUE);
252 void RGTopFrame::DoRedraw3D()
254 // printf("RGTopFrame::DoRedraw3D redraw triggered\n");
257 fTimerActive = false;
260 /**************************************************************************/
262 int RGTopFrame::SpawnGuiAndRun(int argc, char **argv)
264 LookType_e revemode = LT_Editor;
265 if(argc >= 3 && strcmp(argv[1], "-revemode")==0) {
266 LookType_e m = LookType_e(atoi(argv[2]));
267 if(m >= LT_Classic && m <= LT_GLViewer)
269 printf("revemode = %d\n", revemode);
272 TRint theApp("App", &argc, argv);
276 gReve = new RGTopFrame(gClient->GetRoot(), w, h, revemode);
281 catch(std::string exc) {
282 gReve->GetStatusBar()->SetText(exc.c_str());
288 /**************************************************************************/
289 /**************************************************************************/
291 TGListTreeItem* RGTopFrame::AddEvent(TObject* event)
293 fCurrentEvent = event;
294 fCurrentEventLTI = GetListTree()->AddItem(0, event->GetName());
295 fCurrentEventLTI->SetUserData(event);
296 fCurrentEventLTI->SetTipText(event->GetTitle());
297 GetListTree()->OpenItem(fCurrentEventLTI);
298 return fCurrentEventLTI;
301 TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* rnr_element)
303 static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
305 // Here could route rnr-element to several browsers/pads.
307 TGListTreeItem* newitem =
308 rnr_element->AddIntoListTree(GetListTree(), GetEventTreeItem());
314 TGListTreeItem* RGTopFrame::AddRenderElement(TGListTreeItem* parent,
315 RenderElement* rnr_element)
317 static const Exc_t eH("RGTopFrame::AddRenderElement ");
319 // Here could route rnr-element to several browsers/pads.
321 TGListTreeItem* newitem =
322 rnr_element->AddIntoListTree(GetListTree(), parent);
328 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* rnr_element)
330 return AddGlobalRenderElement(GetEventTreeItem(), rnr_element);
333 TGListTreeItem* RGTopFrame::AddGlobalRenderElement(TGListTreeItem* ,
334 RenderElement* rnr_element)
336 static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
338 // Here could route rnr-element to several browsers/pads.
340 TGListTreeItem* newitem =
341 rnr_element->AddIntoListTree(GetListTree(), GetGlobalTreeItem());
347 /**************************************************************************/
349 void RGTopFrame::DrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
351 if(pad == 0) pad = GetCC();
352 { Reve::PadHolder pHolder(false, pad);
353 rnr_element->GetObject()->Draw();
358 /**************************************************************************/
360 void RGTopFrame::RenderElementChecked(TObject* obj, Bool_t state)
362 RenderElement* rnr_element = dynamic_cast<RenderElement*>(obj);
363 // printf("Checked %p %p %d\n", obj, rnr_element, state);
365 rnr_element->SetRnrElement(state);
368 /**************************************************************************/
370 void RGTopFrame::NotifyBrowser(TGListTreeItem* parent)
372 TGListTree* l_tree = GetListTree();
374 l_tree->OpenItem(parent);
375 l_tree->GetClient()->NeedRedraw(l_tree);
378 /**************************************************************************/
379 // GeoManager registration
380 /**************************************************************************/
382 TGeoManager* RGTopFrame::GetGeometry(const TString& filename)
384 static const Exc_t eH("RGTopFrame::GetGeometry ");
386 TString exp_filename = filename;
387 gSystem->ExpandPathName(exp_filename);
388 printf("%s loading: '%s' -> '%s'.\n", eH.Data(),
389 filename.Data(), exp_filename.Data());
391 std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
392 if(g != fGeometries.end()) {
395 if(gSystem->AccessPathName(exp_filename, kReadPermission))
396 throw(eH + "file '" + exp_filename + "' not readable.");
398 TGeoManager::Import(filename);
400 throw(eH + "GeoManager import failed.");
401 gGeoManager->GetTopVolume()->VisibleDaughters(1);
403 // Import colors exported by Gled, if they exist.
405 TFile f(exp_filename, "READ");
406 TObjArray* collist = (TObjArray*) f.Get("ColorList");
409 TSeqCollection* glist = gROOT->GetListOfColors();
411 glist->AddAll(collist);
415 fGeometries[filename] = gGeoManager;