]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/Reve/RGTopFrame.cxx
Added option to render GeoTopNodeRnrEl at a given global position (requires ROOT...
[u/mrichter/AliRoot.git] / EVE / Reve / RGTopFrame.cxx
CommitLineData
5a5a1232 1#include "RGTopFrame.h"
2
3#include "RGBrowser.h"
4#include "RGEditor.h"
5#include "VSDSelector.h"
6
7#include <Reve/RenderElement.h>
8
9#include <TGMenu.h>
10#include <TGTab.h>
11#include <TGToolBar.h>
12#include <TGLabel.h>
13#include <TGTextEntry.h>
14#include <TGSplitter.h>
15#include <TRootEmbeddedCanvas.h>
3adb4b94 16#include <TGMimeTypes.h>
5a5a1232 17
18#include <TGLSAViewer.h>
19#include <TH1F.h>
20#include <TView.h>
21
22#include <TROOT.h>
23#include <TFile.h>
3adb4b94 24#include <TMacro.h>
25#include <TFolder.h>
5a5a1232 26#include <TStyle.h>
27#include <TPad.h>
28#include <TCanvas.h>
29#include <TSystem.h>
30#include <TRint.h>
31#include <TVirtualX.h>
32#include <TPolyLine3D.h>
33#include <TPolyMarker3D.h>
34#include <TEnv.h>
35#include <TStyle.h>
36#include <KeySymbols.h>
37#include "TVirtualGL.h"
38#include "TPluginManager.h"
39
40#include <iostream>
41
42using namespace Reve;
43using namespace Reve;
44
45Reve::RGTopFrame* gReve = 0;
46
47namespace {
48
49enum RGBrowserMT {
50 M_LAYOUT_1,
51 M_LAYOUT_2,
52 M_LAYOUT_3
53};
54
55const char *xpm_names[] = {
56 "lay1.xpm",
57 "lay2.xpm",
58 "lay3.xpm",
59 0
60};
61
62ToolBarData_t tb_data[] = {
63 { "", "Standard list layout", kFALSE, M_LAYOUT_1, NULL },
64 { "", "TParticle latout", kFALSE, M_LAYOUT_2, NULL },
65 { "", "TGeo layout", kFALSE, M_LAYOUT_3, NULL },
66 { NULL, NULL, 0, 0, NULL }
67};
68
69} // unnamed namespace
70
71/**************************************************************************/
72
73
74void RGTopFrame::Init(){
915dabe1 75 fCC = 0;
76 fHistoCanvas = 0;
77 fSelector = 0;
78 fBrowser = 0;
79 fStatusBar = 0;
80 fVSDFile = "";
81
3adb4b94 82 fMacroFolder = new TFolder("EVE", "Visualization macros");
83 gROOT->GetListOfBrowsables()->Add(fMacroFolder);
84
85 fClient->GetMimeTypeList()->AddType("root/tmacro", "Reve::RMacro",
86 "tmacro_s.xpm", "tmacro_t.xpm", "");
87
915dabe1 88 fEditor = 0;
89
90 fCurrentEvent = 0;
91 fCurrentEventLTI = 0;
92 fGeometryLTI = 0;
5a5a1232 93
94 fRedrawDisabled = false;
95 fTimerActive = false;
96 fRedrawTimer.Connect("Timeout()", "Reve::RGTopFrame", this, "DoRedraw3D()");
97}
98
99
100RGTopFrame::RGTopFrame(const TGWindow *p, UInt_t w, UInt_t h, LookType_e look)
101 : TGMainFrame(p, w, h)
102{
103 Init();
104 TGLayoutHints *fL0 = new TGLayoutHints(kLHintsCenterX |kLHintsCenterY | kLHintsExpandY| kLHintsExpandX);
105 TGLayoutHints *fL1 = new TGLayoutHints(kLHintsCenterX |kLHintsCenterY | kLHintsExpandY| kLHintsExpandX,2,0,2,2);
106 TGLayoutHints* fL2 = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX | kLHintsExpandY,
107 2, 2, 2, 2);
108 TGCompositeFrame* fMainFrame = new TGCompositeFrame(this, w, h,kHorizontalFrame | kRaisedFrame);
109 fMainFrame->SetCleanup(kDeepCleanup);
110 TGVerticalFrame* fV2 = new TGVerticalFrame(fMainFrame, GetWidth()-40, GetHeight()-40, kSunkenFrame);
111
112 fMainFrame->AddFrame(fV2, fL1);
113
114 // ??? TGCanvas* fCanvasWindow = new TGCanvas(fV2,w,h);
115 TGTab* fDisplayFrame = new TGTab(fV2, GetWidth(), GetHeight());
116
117 // browser tab
118 TGCompositeFrame* tFrame1 = fDisplayFrame->AddTab("Object Browser");
119 fBrowser = new RGBrowser(tFrame1, w, h);
120 tFrame1->AddFrame(fBrowser, fL2);
121
122 // tree selection tab
123 TGCompositeFrame* tFrame2 = fDisplayFrame->AddTab("Tree Selections");
124 fSelector = new VSDSelector(fBrowser->GetListTree(), tFrame2);
125
126 // canvas
127 Reve::PushPad();
128 TGCompositeFrame* tFrame3 = fDisplayFrame->AddTab("Canvas");
129 TRootEmbeddedCanvas* fEmbeddedCanvas3 = new TRootEmbeddedCanvas("fEmbeddedCanvas3", tFrame3, 580, 360);
130 tFrame3->AddFrame(fEmbeddedCanvas3, fL2);
131 fEmbeddedCanvas3->GetCanvas()->SetBorderMode(0);
132 fCC = fEmbeddedCanvas3->GetCanvas();
133 // fCC->SetFillColor(1);
5a5a1232 134 Reve::PopPad();
135
5a5a1232 136 // histo canvas
137 TGCompositeFrame* frame4 = fDisplayFrame->AddTab("HistoCanvas");
138 TRootEmbeddedCanvas* ecanvas4 = new TRootEmbeddedCanvas("HistoCanvas", frame4, 580, 360);
139 frame4->AddFrame(ecanvas4, fL2);
140 fHistoCanvas = ecanvas4->GetCanvas();
141 fHistoCanvas->SetBorderMode(0);
142
5a5a1232 143 fV2->AddFrame(fDisplayFrame, fL0);
144 AddFrame(fMainFrame, fL0);
145
146 // Create status bar
147 Int_t parts[] = {45, 45, 10};
148 fStatusBar = new TGStatusBar(this, 50, 10, kHorizontalFrame);
149 fStatusBar->SetParts(parts, 3);
150 TGLayoutHints* fL6 = new TGLayoutHints(kLHintsBottom| kLHintsExpandX, 0, 0, 0, 0);
151 AddFrame(fStatusBar, fL6);
152 fStatusBar->SetText("GUI created", 0);
153
154 MapSubwindows();
155
156 /**************************************************************************/
157 /**************************************************************************/
158
159 fEditor = new RGEditor(fCC);
160 fEditor->GetCan()->ChangeOptions(0);
161
162 switch(look) {
163 case LT_Classic: {
164 fBrowser->SetupClassicLook();
165 // Need push/pop pad around here? Not.
166 fCC->GetViewer3D("ogl");
167 break;
168 }
169
170 case LT_Editor: {
171 fBrowser->SetupEditorLook(fEditor);
172 fCC->GetViewer3D("ogl");
173 break;
174 }
175
176 case LT_GLViewer: {
5a5a1232 177 fBrowser->SetupGLViewerLook(fEditor, fCC);
178 printf("Crap1 %d %d\n", GetWidth(), GetHeight());
179 break;
180 }
181
182 default: {
183 printf("RGTopFrame unknown look-type, ignoring.\n");
184 break;
185 }
186 }
187
188 TGLViewer* glv = dynamic_cast<TGLViewer*>(fCC->GetViewer3D());
189 if(glv) {
190 glv->SetSmartRefresh(true);
191 }
192
193 /**************************************************************************/
194 /**************************************************************************/
195
196 fGeometryLTI = GetListTree()->AddItem(0, "Geometry");
197 GetListTree()->OpenItem(fGeometryLTI);
198
199 Resize(GetDefaultSize()); // this is used here to init layout algorithm
200 SetWindowName("Reve");
201 MapWindow();
202
203 fEditor->DisplayObject(0);
204
205 gSystem->ProcessEvents();
206}
207
208/**************************************************************************/
209
210TGListTree* RGTopFrame::GetListTree()
211{
212 return fBrowser->GetListTree();
213}
214
215TGListTreeItem* RGTopFrame::GetEventTreeItem()
216{
217 // return fBrowser->GetListTree()->FindItemByPathname("Event");
218 return fCurrentEventLTI;
219}
220
221TGListTreeItem* RGTopFrame::GetGlobalTreeItem()
222{
223 return fGeometryLTI;
224}
225
3adb4b94 226/**************************************************************************/
227// Macro management
228/**************************************************************************/
229
230TMacro* RGTopFrame::GetMacro(const Text_t* name) const
231{
232 return dynamic_cast<TMacro*>(fMacroFolder->FindObject(name));
233}
234
5a5a1232 235/**************************************************************************/
236// Editor
237/**************************************************************************/
238
239void RGTopFrame::EditRenderElement(RenderElement* rnr_element)
240{
241 static const Exc_t eH("RGTopFrame::EditRenderElement ");
242
243 TObject* tobj = 0;
092578a7 244 if(rnr_element) tobj = rnr_element->GetObject();
5a5a1232 245 fEditor->DisplayObject(tobj);
246}
247
248/**************************************************************************/
249// 3D Pad management
250/**************************************************************************/
251
252void RGTopFrame::RegisterRedraw3D()
253{
254 fRedrawTimer.Start(0, kTRUE);
255 fTimerActive = true;
256}
257
258void RGTopFrame::DoRedraw3D()
259{
260 // printf("RGTopFrame::DoRedraw3D redraw triggered\n");
261 fCC->Modified();
262 fCC->Update();
263 fTimerActive = false;
264}
265
266/**************************************************************************/
267
268int RGTopFrame::SpawnGuiAndRun(int argc, char **argv)
269{
270 LookType_e revemode = LT_Editor;
2ef077e4 271 if(argc >= 3 && (strcmp(argv[1], "-revemode")==0 || strcmp(argv[1], "-mode")==0)) {
5a5a1232 272 LookType_e m = LookType_e(atoi(argv[2]));
273 if(m >= LT_Classic && m <= LT_GLViewer)
274 revemode = m;
275 printf("revemode = %d\n", revemode);
276 }
277
278 TRint theApp("App", &argc, argv);
279 Int_t w = 800;
280 Int_t h = 600;
281
282 gReve = new RGTopFrame(gClient->GetRoot(), w, h, revemode);
283 run_loop:
284 try {
285 theApp.Run();
286 }
287 catch(std::string exc) {
288 gReve->GetStatusBar()->SetText(exc.c_str());
371dc0b2 289 fprintf(stderr, "Exception: %s\n", exc.c_str());
5a5a1232 290 goto run_loop;
291 }
292 return 0;
293}
294
295/**************************************************************************/
296/**************************************************************************/
297
298TGListTreeItem* RGTopFrame::AddEvent(TObject* event)
299{
092578a7 300 fCurrentEvent = event;
301 RenderElementObjPtr* rnrEv = new RenderElementObjPtr(event);
302 fCurrentEventLTI = rnrEv->AddIntoListTree(GetListTree(), 0);
5a5a1232 303 GetListTree()->OpenItem(fCurrentEventLTI);
304 return fCurrentEventLTI;
305}
306
307TGListTreeItem* RGTopFrame::AddRenderElement(RenderElement* rnr_element)
308{
092578a7 309 return AddRenderElement(GetEventTreeItem(), rnr_element);
5a5a1232 310}
311
312TGListTreeItem* RGTopFrame::AddRenderElement(TGListTreeItem* parent,
313 RenderElement* rnr_element)
314{
315 static const Exc_t eH("RGTopFrame::AddRenderElement ");
316
317 // Here could route rnr-element to several browsers/pads.
318
319 TGListTreeItem* newitem =
320 rnr_element->AddIntoListTree(GetListTree(), parent);
321 NotifyBrowser();
322
323 return newitem;
324}
325
326TGListTreeItem* RGTopFrame::AddGlobalRenderElement(RenderElement* rnr_element)
327{
092578a7 328 return AddGlobalRenderElement(GetGlobalTreeItem(), rnr_element);
5a5a1232 329}
330
092578a7 331TGListTreeItem* RGTopFrame::AddGlobalRenderElement(TGListTreeItem* parent,
5a5a1232 332 RenderElement* rnr_element)
333{
334 static const Exc_t eH("RGTopFrame::AddGlobalRenderElement ");
335
336 // Here could route rnr-element to several browsers/pads.
337
338 TGListTreeItem* newitem =
092578a7 339 rnr_element->AddIntoListTree(GetListTree(), parent);
5a5a1232 340 NotifyBrowser();
341
342 return newitem;
343}
344
345/**************************************************************************/
346
347void RGTopFrame::DrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
348{
349 if(pad == 0) pad = GetCC();
350 { Reve::PadHolder pHolder(false, pad);
351 rnr_element->GetObject()->Draw();
352 }
353 Redraw3D();
354}
355
5a34ca2d 356void RGTopFrame::UndrawRenderElement(RenderElement* rnr_element, TVirtualPad* pad)
357{
358 if(pad == 0) pad = GetCC();
359 { Reve::PadHolder pHolder(false, pad);
360 pad->GetListOfPrimitives()->Remove(rnr_element->GetObject());
361 }
362 Redraw3D();
363}
364
5a5a1232 365/**************************************************************************/
366
367void RGTopFrame::RenderElementChecked(TObject* obj, Bool_t state)
368{
092578a7 369 // Item's user-data is blindly casted into TObject.
370 // We recast it blindly back into the render element.
371
372 RenderElement* rnrEl = (RenderElement*) obj;
373 rnrEl->SetRnrElement(state);
5a5a1232 374}
375
376/**************************************************************************/
377
378void RGTopFrame::NotifyBrowser(TGListTreeItem* parent)
379{
380 TGListTree* l_tree = GetListTree();
381 if(parent)
382 l_tree->OpenItem(parent);
5a34ca2d 383 gClient->NeedRedraw(l_tree);
5a5a1232 384}
385
386/**************************************************************************/
387// GeoManager registration
388/**************************************************************************/
389
390TGeoManager* RGTopFrame::GetGeometry(const TString& filename)
391{
392 static const Exc_t eH("RGTopFrame::GetGeometry ");
393
394 TString exp_filename = filename;
395 gSystem->ExpandPathName(exp_filename);
396 printf("%s loading: '%s' -> '%s'.\n", eH.Data(),
397 filename.Data(), exp_filename.Data());
398
399 std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
400 if(g != fGeometries.end()) {
401 return g->second;
402 } else {
403 if(gSystem->AccessPathName(exp_filename, kReadPermission))
404 throw(eH + "file '" + exp_filename + "' not readable.");
405 gGeoManager = 0;
406 TGeoManager::Import(filename);
407 if(gGeoManager == 0)
408 throw(eH + "GeoManager import failed.");
409 gGeoManager->GetTopVolume()->VisibleDaughters(1);
410
411 // Import colors exported by Gled, if they exist.
412 {
413 TFile f(exp_filename, "READ");
414 TObjArray* collist = (TObjArray*) f.Get("ColorList");
415 f.Close();
416 if(collist != 0) {
417 TSeqCollection* glist = gROOT->GetListOfColors();
418 glist->Clear();
419 glist->AddAll(collist);
420 }
421 }
422
423 fGeometries[filename] = gGeoManager;
424 return gGeoManager;
425 }
426}