1 #include "ReveManager.h"
3 #include <Reve/Viewer.h>
4 #include <Reve/Scene.h>
6 #include <Reve/EventBase.h>
8 #include <Reve/RGBrowser.h>
9 #include <Reve/RGEditor.h>
13 #include <TGToolBar.h>
15 #include <TGTextEntry.h>
16 #include <TGSplitter.h>
17 #include <TRootEmbeddedCanvas.h>
19 #include <TGStatusBar.h>
21 #include <TGLSAViewer.h>
33 #include <TVirtualX.h>
37 #include <TGeoShape.h>
38 #include <KeySymbols.h>
39 #include "TVirtualGL.h"
40 #include "TPluginManager.h"
47 Reve::ReveManager* gReve = 0;
49 /**************************************************************************/
51 ReveManager::ReveManager(UInt_t w, UInt_t h) :
66 fResetCameras (kFALSE),
67 fDropLogicals (kFALSE),
68 fKeepEmptyCont (kFALSE),
69 fTimerActive (kFALSE),
76 static const Exc_t eH("ReveManager::ReveManager ");
79 throw(eH + "There can be only one!");
83 fRedrawTimer.Connect("Timeout()", "Reve::ReveManager", this, "DoRedraw3D()");
84 fMacroFolder = new TFolder("EVE", "Visualization macros");
85 gROOT->GetListOfBrowsables()->Add(fMacroFolder);
89 fBrowser = new RGBrowser(w, h);
90 fStatusBar = fBrowser->GetStatusBar();
93 fBrowser->StartEmbedding(0);
94 fLTEFrame = new RGLTEFrame("REVE");
95 fBrowser->StopEmbedding();
96 fBrowser->SetTabTitle("Reve", 0);
97 fEditor = fLTEFrame->fEditor;
100 fBrowser->StartEmbedding(1);
101 TGLSAViewer* glv = new TGLSAViewer(gClient->GetRoot(), 0, fEditor);
102 //glv->GetFrame()->SetCleanup(kNoCleanup);
103 glv->ToggleEditObject();
104 fBrowser->StopEmbedding();
105 fBrowser->SetTabTitle("GLViewer", 1);
108 fBrowser->InitPlugins();
109 fBrowser->MapWindow();
111 // --------------------------------
113 fViewers = new ViewerList("Viewers");
114 fViewers->IncDenyDestroy();
115 AddToListTree(fViewers, kTRUE);
117 fViewer = new Viewer("GL-One");
118 fViewer->SetGLViewer(glv);
119 fViewer->IncDenyDestroy();
120 AddRenderElement(fViewer, fViewers);
122 fScenes = new SceneList ("Scenes");
123 fScenes->IncDenyDestroy();
124 AddToListTree(fScenes, kTRUE);
126 fGlobalScene = new Scene("Geometry scene");
127 fGlobalScene->IncDenyDestroy();
128 AddRenderElement(fGlobalScene, fScenes);
130 fEventScene = new Scene("Event scene");
131 fEventScene->IncDenyDestroy();
132 AddRenderElement(fEventScene, fScenes);
134 fViewer->AddScene(fGlobalScene);
135 fViewer->AddScene(fEventScene);
137 /**************************************************************************/
138 /**************************************************************************/
140 fEditor->DisplayObject(GetGLViewer());
142 gSystem->ProcessEvents();
145 ReveManager::~ReveManager()
150 /**************************************************************************/
152 TCanvas* ReveManager::AddCanvasTab(const char* name)
154 // Add a new canvas tab.
156 fBrowser->StartEmbedding(1, -1);
157 TCanvas* c = new TCanvas;
158 fBrowser->StopEmbedding();
159 fBrowser->SetTabTitle(name, 1, -1);
164 TGWindow* ReveManager::GetMainWindow() const
166 // Get the main window, i.e. the first created reve-browser.
171 TGLViewer* ReveManager::GetGLViewer() const
173 // Get default TGLViewer.
175 return fViewer->GetGLViewer();
178 Viewer* ReveManager::SpawnNewViewer(const Text_t* name, const Text_t* title,
181 // Create a new GL viewer.
183 Viewer* v = new Viewer(name, title);
185 if (embed) fBrowser->StartEmbedding(1);
186 v->SpawnGLViewer(gClient->GetRoot(), embed ? fEditor : 0);
188 if (embed) fBrowser->StopEmbedding(), fBrowser->SetTabTitle(name, 1);
189 AddRenderElement(v, fViewers);
193 Scene* ReveManager::SpawnNewScene(const Text_t* name, const Text_t* title)
195 // Create a new scene.
197 Scene* s = new Scene(name, title);
198 AddRenderElement(s, fScenes);
202 /**************************************************************************/
204 /**************************************************************************/
206 TMacro* ReveManager::GetMacro(const Text_t* name) const
208 return dynamic_cast<TMacro*>(fMacroFolder->FindObject(name));
211 /**************************************************************************/
213 /**************************************************************************/
215 void ReveManager::EditRenderElement(RenderElement* rnr_element)
217 static const Exc_t eH("ReveManager::EditRenderElement ");
219 fEditor->DisplayRenderElement(rnr_element);
222 /**************************************************************************/
224 /**************************************************************************/
226 void ReveManager::RegisterRedraw3D()
228 // Register a request for 3D redraw.
230 fRedrawTimer.Start(0, kTRUE);
234 void ReveManager::DoRedraw3D()
236 // Perform 3D redraw of scenes and viewers whose contents has
239 // printf("ReveManager::DoRedraw3D redraw triggered\n");
241 fScenes ->RepaintChangedScenes();
242 fViewers->RepaintChangedViewers(fResetCameras, fDropLogicals);
244 fResetCameras = kFALSE;
245 fDropLogicals = kFALSE;
247 fTimerActive = kFALSE;
250 void ReveManager::FullRedraw3D(Bool_t resetCameras, Bool_t dropLogicals)
252 // Perform 3D redraw of all scenes and viewers.
254 fScenes ->RepaintAllScenes();
255 fViewers->RepaintAllViewers(resetCameras, dropLogicals);
258 /**************************************************************************/
260 void ReveManager::RenderElementChanged(RenderElement* rnr_element)
262 std::list<RenderElement*> scenes;
263 rnr_element->CollectSceneParents(scenes);
264 ScenesChanged(scenes);
267 void ReveManager::ScenesChanged(std::list<RenderElement*>& scenes)
269 for (RenderElement::List_i s=scenes.begin(); s!=scenes.end(); ++s)
270 ((Scene*)*s)->Changed();
273 /**************************************************************************/
275 int ReveManager::SpawnGuiAndRun(int argc, char **argv)
280 TRint theApp("App", &argc, argv);
283 /* gReve = */ new ReveManager(w, h);
290 gReve->SetStatusLine(exc.Data());
291 fprintf(stderr, "Exception: %s\n", exc.Data());
297 void ReveManager::SpawnGui()
303 /* gReve = */ new ReveManager(w, h);
306 /**************************************************************************/
307 /**************************************************************************/
309 TGListTree* ReveManager::GetListTree() const
311 return fLTEFrame->fListTree;
315 ReveManager::AddToListTree(RenderElement* re, Bool_t open, TGListTree* lt)
317 // Add rnr-el as a top-level to a list-tree.
318 // Please add a single copy of a render-element as a top level
319 // or we will have to check for that, too.
321 if (lt == 0) lt = GetListTree();
322 TGListTreeItem* lti = re->AddIntoListTree(lt, (TGListTreeItem*)0);
323 if (open) lt->OpenItem(lti);
327 void ReveManager::RemoveFromListTree(RenderElement* re, TGListTree* lt, TGListTreeItem* lti)
329 // Remove top-level rnr-el from list-tree with specified tree-item.
331 static const Exc_t eH("ReveManager::RemoveFromListTree ");
333 if (lti->GetParent())
334 throw(eH + "not a top-level item.");
336 re->RemoveFromListTree(lt, 0);
339 /**************************************************************************/
341 TGListTreeItem* ReveManager::AddEvent(EventBase* event)
343 fCurrentEvent = event;
344 fCurrentEvent->IncDenyDestroy();
345 AddRenderElement(fCurrentEvent, fEventScene);
346 return AddToListTree(event, kTRUE);
349 TGListTreeItem* ReveManager::AddRenderElement(RenderElement* rnr_element,
350 RenderElement* parent)
353 if (fCurrentEvent == 0)
354 AddEvent(new EventBase("Event", "Auto-created event directory"));
355 parent = fCurrentEvent;
358 return parent->AddElement(rnr_element);
361 TGListTreeItem* ReveManager::AddGlobalRenderElement(RenderElement* rnr_element,
362 RenderElement* parent)
365 parent = fGlobalScene;
367 return parent->AddElement(rnr_element);
370 /**************************************************************************/
372 void ReveManager::RemoveRenderElement(RenderElement* rnr_element,
373 RenderElement* parent)
375 parent->RemoveElement(rnr_element);
378 void ReveManager::PreDeleteRenderElement(RenderElement* rnr_element)
380 if (fEditor->GetRnrElement() == rnr_element)
381 fEditor->DisplayObject(0);
384 /**************************************************************************/
386 void ReveManager::RenderElementSelect(RenderElement* rnr_element)
388 EditRenderElement(rnr_element);
391 Bool_t ReveManager::RenderElementPaste(RenderElement* rnr_element)
393 RenderElement* src = fEditor->GetRnrElement();
395 return rnr_element->HandleElementPaste(src);
399 void ReveManager::RenderElementChecked(RenderElement* rnrEl, Bool_t state)
401 rnrEl->SetRnrState(state);
403 if (fEditor->GetModel() == rnrEl->GetEditorObject())
404 fEditor->DisplayRenderElement(rnrEl);
406 rnrEl->ElementChanged();
409 /**************************************************************************/
411 void ReveManager::NotifyBrowser(TGListTreeItem* parent_lti)
413 TGListTree* lt = GetListTree();
415 lt->OpenItem(parent_lti);
419 void ReveManager::NotifyBrowser(RenderElement* parent)
421 TGListTreeItem* parent_lti = parent ? parent->FindListTreeItem(GetListTree()) : 0;
422 NotifyBrowser(parent_lti);
425 /**************************************************************************/
426 // GeoManager registration
427 /**************************************************************************/
429 TGeoManager* ReveManager::GetGeometry(const TString& filename)
431 static const Exc_t eH("ReveManager::GetGeometry ");
433 TString exp_filename = filename;
434 gSystem->ExpandPathName(exp_filename);
435 printf("%s loading: '%s' -> '%s'.\n", eH.Data(),
436 filename.Data(), exp_filename.Data());
438 std::map<TString, TGeoManager*>::iterator g = fGeometries.find(filename);
439 if (g != fGeometries.end()) {
442 if (gSystem->AccessPathName(exp_filename, kReadPermission))
443 throw(eH + "file '" + exp_filename + "' not readable.");
445 TGeoManager::Import(filename);
446 if (gGeoManager == 0)
447 throw(eH + "GeoManager import failed.");
448 gGeoManager->GetTopVolume()->VisibleDaughters(1);
450 // Import colors exported by Gled, if they exist.
452 TFile f(exp_filename, "READ");
453 TObjArray* collist = (TObjArray*) f.Get("ColorList");
456 TIter next(gGeoManager->GetListOfVolumes());
458 while ((vol = (TGeoVolume*) next()) != 0)
460 Int_t oldID = vol->GetLineColor();
461 TColor* col = (TColor*)collist->At(oldID);
463 col->GetRGB(r, g, b);
464 Int_t newID = TColor::GetColor(r,g,b);
465 vol->SetLineColor(newID);
470 fGeometries[filename] = gGeoManager;
475 /**************************************************************************/
476 // Testing exceptions
477 /**************************************************************************/
479 void ReveManager::SetStatusLine(const char* text)
481 fStatusBar->SetText(text);
484 void ReveManager::ThrowException(const char* text)
486 static const Exc_t eH("ReveManager::ThrowException ");