00001
00002
00003
00004 #include "GeomBrowser.h"
00005 #include "StarGeomTreeWidget.h"
00006 #ifndef NO_GEANT_MAKER
00007 # include "StChain.h"
00008 # include "St_geant_Maker/St_geant_Maker.h"
00009 #endif
00010
00011 #include "TROOT.h"
00012 #include "TDataSetIter.h"
00013 #include "TSystem.h"
00014 #include "TFile.h"
00015 #include "TKey.h"
00016 #include "TGeoManager.h"
00017 #include "TPad.h"
00018 #include "StDraw3D.h"
00019 #include "TVirtualViewer3D.h"
00020 #include "TQtGLViewerImp.h"
00021 #include "TQtRootViewer3D.h"
00022 #include "TGQt.h"
00023 #include "TQtWidget.h"
00024 #include "TQtRootCommandCombo.h"
00025 #include "TQtRangeControl.h"
00026 #ifndef NO_GEANT_MAKER
00027 # include "TextEdit.h"
00028 #endif
00029 #include <QApplication>
00030 #include <QComboBox>
00031 #include <QFileInfo>
00032 #include <QMessageBox>
00033 #include <QSplitter>
00034 #include <QToolBar>
00035 #include <QHBoxLayout>
00036 #include <QVBoxLayout>
00037 #include <QDir>
00038 #include <QAction>
00039 #include <QMenuBar>
00040 #include <QMenu>
00041 #include <QFileDialog>
00042 #include <QList>
00043 #include <QByteArray>
00044 #include <QImageWriter>
00045 #include <QPrinter>
00046 #include <QPrintDialog>
00047 #include <QDebug>
00048 #include <QStatusBar>
00049 #include "StQtDelayRedrawTimer.h"
00050
00051 int GeomBrowser::Geant3Init = 0;
00052
00053 static void RefreshCanvas(TQtWidget *w)
00054 {
00055
00056 if (w) {
00057 TVirtualPad *savePad = (gPad == w->GetCanvas() ) ? 0 : gPad;
00058 if (savePad) w->cd();
00059 w->Refresh();
00060 if (savePad) savePad->cd();
00061 }
00062 }
00063
00064
00065 GeomBrowser::GeomBrowser(QWidget *parent): QMainWindow (parent)
00066 , fTreeWidget(0),fFile(0),fChain(0),fGeant(0),fGeometrySelector(0)
00067 , fCurrentViewer(0),fGeometryLoaded(false)
00068 , fSingleVolumeCanvas(0), fComplexVolumeCanvas(0),fEventDisplay()
00069 , fRootCommand(0), fCurrentWidget(0)
00070 , fFile_New(0), fFile_Open(0), fFile_Reload(0), fFile_Save(0), fFile_SaveAs(0)
00071 , fFile_Print(0), fFile_Exit(0)
00072 , fView_Coin3DAction(0), fView_GLAction(0)
00073 , fEditGeoSrc(0), fStatusBar(0),fDepthControl(0),fDelayDrawTimer(0)
00074 {
00075 this->setWindowTitle(tr("STAR Geometry Browser"));
00076 CreateActions();
00077 CreateMenu();
00078 CreateToolBar();
00079 CreateGuiLayout();
00080 CreateStatusBar();
00081 Init();
00082 Connect();
00083 }
00084
00085 GeomBrowser::~GeomBrowser()
00086 {
00087 delete fFile; fFile = 0;
00088 delete fEventDisplay; fEventDisplay = 0;
00089 }
00090
00091
00092 void GeomBrowser::Connect()
00093 {
00094
00095 fFile_New-> setEnabled(false);
00096 connect(fFile_Open,(SIGNAL(triggered())), this,SLOT(fileOpenSlot()) );
00097 connect(fFile_Reload,(SIGNAL(triggered())), this,SLOT(fileReloadSlot()));
00098
00099 connect(fFile_Save,SIGNAL(triggered()), this,SLOT(fileSaveSlot()) );
00100 connect(fFile_SaveAs,SIGNAL(triggered()), this,SLOT(fileSaveAsSlot()));
00101 connect(fFile_Print,SIGNAL(triggered()), this,SLOT(filePrintSlot()) );
00102 connect(fFile_Exit,SIGNAL(triggered()), this,SLOT(fileExitSlot()) );
00103
00104 connect(fView_GLAction, SIGNAL(triggered()),this,SLOT(viewGLSlot()) );
00105 connect(fView_Coin3DAction,SIGNAL(triggered()),this,SLOT(viewCoin3DSlot()));
00106
00107 if (fGeometrySelector)
00108 connect(fGeometrySelector,SIGNAL(currentIndexChanged(const QString &))
00109 ,this,SLOT(STAR_geometry_activated( const QString &)));
00110
00111 connect(fTreeWidget,SIGNAL(DrawObject(TObject *,bool))
00112 ,this,SLOT(DrawObject(TObject *, bool)));
00113
00114 connect(fTreeWidget, SIGNAL(ObjectInfo(QString ))
00115 , fStatusBar, SLOT( showMessage(const QString & )));
00116
00117 connect(fDepthControl, SIGNAL(ValueChanged(int))
00118 , this, SLOT( DrawObject()));
00119 connect(fDepthControl, SIGNAL(ValueChanged(int))
00120 , fTreeWidget, SLOT(SetDepthCB(int)));
00121 connect(fDelayDrawTimer, SIGNAL(DrawObjectSignal(TObject *,bool))
00122 ,this,SLOT(DrawObject(TObject *, bool)));
00123 }
00125
00126 void GeomBrowser::CreateActions()
00127 {
00129 fFile_New = new QAction( QIcon(":/FileNew.xpm"),"&New", this);
00130 fFile_Open = new QAction( QIcon(":/fileopen.xpm"),"&Open", this);
00131 fFile_Open ->setToolTip(tr("Open an existing geometry file"));
00132
00133 fFile_Reload = new QAction( QIcon(":/reload.xpm") ,"Reload", this);
00134 fFile_Save = new QAction( QIcon(":/FileSave.xpm"),"&Save", this);
00135 fFile_SaveAs = new QAction( "Save As", this);
00136 fFile_Print = new QAction( QIcon(":/printer.xpm"),"&Print", this);
00137
00138 fFile_Exit = new QAction( QIcon(":/quit.xpm") ,"E&xit", this);
00139 fFile_Exit ->setToolTip(tr("Close all windows and terminate the applciation"));
00140
00141 fView_Coin3DAction = new QAction( QIcon(":/snapshot.xpm"),"Open&Inventor", this);
00142 fView_Coin3DAction ->setToolTip(tr("Open the Coin3D-based 3D geometry viewer"));
00143 fView_GLAction = new QAction( QIcon(":/qglviewer.icon.xpm") , "Open&GL" , this);
00144 fView_GLAction ->setToolTip(tr("Open the QGLViewer-based 3D geometry viewer"));
00145
00146 #ifndef NO_GEANT_MAKER
00147 fEditGeoSrc = new QAction( QIcon(":/manual.xpm"), "Edit Geant Geometry", this);
00148 fEditGeoSrc ->setToolTip(tr("Find and display the MORTRAN file defining the picked volume to edit"));
00149 fEditGeoSrc->setCheckable(true);
00150 #endif
00151 }
00152
00154
00155 void GeomBrowser::CreateMenu()
00156 {
00158 QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
00159 fileMenu->addAction(fFile_New);
00160 fileMenu->addAction(fFile_Open);
00161 fileMenu->addAction(fFile_Reload);
00162 fileMenu->addSeparator();
00163 fileMenu->addAction(fFile_Save);
00164 fileMenu->addAction(fFile_SaveAs);
00165 fileMenu->addSeparator();
00166 fileMenu->addAction(fFile_Print);
00167 fileMenu->addSeparator();
00168 fileMenu->addAction(fFile_Exit);
00169
00170 QMenu *viewMenu = menuBar()->addMenu(tr("&View"));
00171 viewMenu->addAction(fView_Coin3DAction);
00172 viewMenu->addAction(fView_GLAction);
00173 }
00174
00176
00177 void GeomBrowser::CreateToolBar()
00178 {
00180 QToolBar *fileMenu = new QToolBar(this);
00181 fileMenu->addAction(fFile_Open);
00182 fileMenu->addAction(fFile_Exit);
00183 fileMenu->addAction(fFile_New);
00184 fileMenu->addAction(fFile_Reload);
00185 fileMenu->addSeparator();
00186 fileMenu->addAction(fFile_Save);
00187 fileMenu->addAction(fFile_SaveAs);
00188 fileMenu->addSeparator();
00189 fileMenu->addAction(fFile_Print);
00190 fileMenu->addSeparator();
00191 addToolBar(fileMenu);
00192
00193 QToolBar *viewMenu = new QToolBar(this);
00194 viewMenu->addAction(fView_Coin3DAction);
00195 viewMenu->addAction(fView_GLAction);
00196 addToolBar(viewMenu);
00197
00198 QToolBar *depthTool = new QToolBar(this);
00199 fDepthControl = new TQtRangeControl(depthTool);
00200 depthTool->addWidget(fDepthControl);
00201 addToolBar(depthTool);
00202
00203 #ifndef NO_GEANT_MAKER
00204 QToolBar *editTool = new QToolBar(this);
00205 editTool->addAction(fEditGeoSrc);
00206 addToolBar(editTool);
00207
00208 QToolBar *selectTool = new QToolBar(this);
00209 fGeometrySelector = new QComboBox(selectTool);
00210 selectTool->addWidget (fGeometrySelector);
00211 addToolBar(selectTool);
00212 #endif
00213 }
00214
00215
00216 void GeomBrowser::CreateGuiLayout()
00217 {
00218 QWidget *thisCentralWidget = new QWidget(this);
00219 setCentralWidget(thisCentralWidget);
00220 fSingleVolumeCanvas = new TQtWidget(this);
00221 fComplexVolumeCanvas = new TQtWidget(this);
00222 QSplitter *hsplitter = new QSplitter(Qt::Vertical,this);
00223 hsplitter->setOpaqueResize(false);
00224 hsplitter->addWidget(fSingleVolumeCanvas);
00225 hsplitter->addWidget(fComplexVolumeCanvas);
00226
00227 QSplitter *vsplitter = new QSplitter(Qt::Horizontal,this);
00228 vsplitter->setOpaqueResize(false);
00229 fTreeWidget = new StarGeomTreeWidget(this);
00230 vsplitter->addWidget(fTreeWidget);
00231 vsplitter->addWidget(hsplitter);
00232
00233 QVBoxLayout *vbox = new QVBoxLayout(thisCentralWidget);
00234 fRootCommand = new TQtRootCommandCombo(this);
00235 vbox->addWidget(vsplitter);
00236 vbox->addWidget(fRootCommand);
00237 }
00238
00239
00240 void GeomBrowser::CreateStatusBar()
00241 {
00242 fStatusBar = statusBar();
00243 }
00244
00245
00246
00247 void GeomBrowser::Init()
00248 {
00249 #ifndef WIN32
00250 if (gSystem->Load("libTable") <0)
00251 {
00252 QString errorMsg = "Can not load the ROOT shared library: ";
00253 errorMsg += "libTable.so";
00254 QMessageBox::critical(this, "ROOT shared library load error", errorMsg
00255 , QMessageBox::Ok,QMessageBox::NoButton );
00256
00257 }
00258 if (gSystem->Load("libGeom")<0)
00259 {
00260 QString errorMsg = "Can not load the ROOT shared library: ";
00261 errorMsg += "libGeom.so";
00262 QMessageBox::critical(this, "ROOT shared library load error", errorMsg
00263 , QMessageBox::Ok,QMessageBox::NoButton );
00264
00265 }
00266 #endif
00267
00268 #ifdef NO_GEANT_MAKER
00269 if (fGeometrySelector) {
00270 fGeometrySelector->setEnabled(FALSE);
00271 fGeometrySelector->hide();
00272 }
00273 #else
00274
00275 fTextEdit = new TextEdit(this);
00276 fTextEdit->setCaption( "GEANT3 geometry editor" );
00277 fTextEdit->resize( 640, 800 );
00278
00279
00280
00281
00282
00283 QString file("pams/geometry/geometry/geometry.g");
00284 QString path(".:$STAR");
00285 connect(fTextEdit,SIGNAL(textSaved(const QString &)),this,SLOT(RemakeGeomSlot(const QString &)));
00286 const char *found = gSystem->Which((const char*)path, (const char*)file);
00287 if (found) {
00288 if (found[0]) {
00289 QFile geomFile(found);
00290 if (geomFile.open(IO_ReadOnly)) {
00291 QString line;
00292 QRegExp exp("^\\s+\\bCase\\b.+");
00293 char bufLine[1024];
00294 while (geomFile.readLine(bufLine, sizeof(bufLine)) >=0 )
00295 {
00296 line = bufLine;
00297 if (line.contains( exp ) ) {
00298 line = line.simplifyWhiteSpace ();
00299 QString tag = line.section(' ',1,1);
00300
00301
00302 tag.remove("on");
00303 tag.stripWhiteSpace();
00304
00305
00306 if (!(tag.isEmpty()
00307 || tag.contains("COMPLETE")
00308 || tag.contains("HELP")
00309 || tag.contains("_ON")
00310 || tag.contains("_OFF")
00311 || tag.contains("NO_BREM")
00312 || tag.contains("LOW")
00313 || tag.contains("TPC_")
00314 || tag.contains("DUMM")
00315 || tag.contains("ONLY") ) ) {
00316
00317 fGeometrySelector->insertItem(tag);
00318
00319 }
00320 }
00321 }
00322 } else {
00323 assert(0);
00324 }
00325 }
00326 }
00327 delete [] found;
00328 #endif
00329 fGeometryLoaded = false;
00330 fChain = 0;
00331 fGeant = 0;
00332
00333 fCurrentViewer = 0;
00334 fFile = 0;
00335
00336
00337
00338
00339
00340
00341
00342 fRootCommand->insertItem(0,".qqqqqq");
00343 fRootCommand->insertItem(0,".q");
00344 fRootCommand->insertItem(0,"gGeometry->SetBomb(1.7);");
00345 fRootCommand->insertItem(0,"gPad->SetFillColor(kBlack);");
00346 fRootCommand->insertItem(0,"gPad->SetFillColor(kWhite);");
00347
00348
00349 fComplexVolumeCanvas->GetCanvas()->SetFillColor(kBlack);
00350
00351 char *libRQTGL = 0;
00352 libRQTGL = gSystem->DynamicPathName("libRQTGL",kTRUE);
00353 fView_GLAction->setEnabled(libRQTGL);
00354
00355
00356 libRQTGL = 0;
00357
00358
00359 libRQTGL = gSystem->DynamicPathName("libRQIVTGL",kTRUE);
00360 fView_Coin3DAction->setEnabled(libRQTGL);
00361
00362
00363 fCurrentWidget = fSingleVolumeCanvas; fCurrentWidget->cd();
00364
00365
00366 TKey *key = 0;
00367 char **argv = qApp->argv();
00368 if (qApp->argc() > 1 && QFileInfo(argv[1]).isReadable() ) {
00369
00370 fSaveFileName = argv[1];
00371 qDebug() << " file " << fSaveFileName;
00372 fFile=new TFile(fSaveFileName.toStdString().c_str());
00373 fSaveFileName = "";
00374
00375
00376
00377 TIter next(fFile->GetListOfKeys());
00378
00379 int countObject = 0;
00380 while((key = (TKey*) next())) {
00381 if (fTreeWidget->AddModel2ListView(key->ReadObj(),QString())) countObject++;
00382 }
00383 if (!countObject)
00384 QMessageBox::warning(this,"Open ROOT geometry file","No 3D object was found here");
00385
00386
00387
00388 } else {
00389
00390 fSaveFileName = "$STAR/StarDb/VmcGeometry/";
00391 if (gGeoManager) {
00392 fTreeWidget->AddModel2ListView(gGeoManager->GetTopVolume(),QString());
00393 }
00394 }
00395 fDelayDrawTimer = new StQtDelayRedrawTimer(this);
00396 }
00397
00398
00399 void GeomBrowser::fileOpenMacro( const QString &fileName )
00400 {
00401
00402 QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
00403 std::string str = fileName.toStdString();
00404 int n = str.size();
00405 if ( gGeoManager) {
00406 }
00407 else if (str.substr(n-2,n-1)==".h") {
00408 int err = gROOT->Macro(str.c_str());
00409 if (err) gGeoManager = 0;
00410 }
00411 else if (!gROOT->LoadMacro(str.c_str())) {
00412 TDataSet *topSet = (TDataSet *)gROOT->ProcessLineFast("CreateTable()");
00413 }
00414 if ( gGeoManager) {
00415 fOpenFileName = fileName;
00416 QString name = gGeoManager->GetName();
00417 fTreeWidget->AddModel2ListView(gGeoManager,name);
00418 }
00419
00420
00421 if (!gGeoManager) {
00422 QMessageBox::warning(this,"Open ROOT macro geometry file","Can not open the macro file");
00423 }
00424 CleanGeoManager();
00425 QApplication::restoreOverrideCursor();
00426 }
00427
00428
00429 void GeomBrowser::fileOpenRoot( const QString &fileName )
00430 {
00431 QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
00432 if (fFile) delete fFile;
00433 QString base = QFileInfo(fileName).completeBaseName();
00434 fFile = TFile::Open(fileName.toStdString().c_str());
00435 if (!fFile->IsZombie()) {
00436 TKey *key = 0;
00437 TIter next(fFile->GetListOfKeys());
00438
00439
00440 TQtLockUpdateWidget listLock(fTreeWidget);
00441
00442 int countObject = 0;
00443 while((key = (TKey*) next())) {
00444 TObject *o = key->ReadObj();
00445 QString name = QString("%1.%2").arg(base).arg(o->GetName());
00446 if (fTreeWidget->AddModel2ListView(o,name)) countObject++;
00447 }
00448 if (!countObject)
00449 QMessageBox::warning(this,"Open ROOT geometry file"
00450 ,"No 3D object was found here");
00451 fOpenFileName = fileName;
00452 } else {
00453 delete fFile; fFile=0;
00454 QString errorMsg = "Zombie ROOT file: ";
00455 errorMsg += fileName;
00456 QMessageBox::critical(this, "ROOT file access error", errorMsg
00457 , QMessageBox::Ok,QMessageBox::NoButton );
00458 }
00459 CleanGeoManager();
00460 QApplication::restoreOverrideCursor();
00461 }
00462
00463
00464 St_geant_Maker & GeomBrowser::Geant()
00465 {
00466
00467 #ifndef NO_GEANT_MAKER
00468 if (!fGeant) {
00469 gSystem->Load("St_base");
00470 gSystem->Load("StChain");
00471 gSystem->Load("St_Tables");
00472 gSystem->Load("St_g2t.so");
00473 gSystem->Load("StarMagField");
00474 gSystem->Load("St_geant_Maker");
00475 gSystem->Load("StUtilities");
00476 fChain = new StChain();
00477 fGeant = new St_geant_Maker();
00478 }
00479 #endif
00480 return *fGeant;
00481 }
00482
00483
00484 void GeomBrowser::fileOpenZebra( const QString &fileName )
00485 {
00486
00487 #ifndef NO_GEANT_MAKER
00488 QString kuipCmd = "gfile p ";
00489 kuipCmd += fileName;
00490 QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
00491 Geant().SetInputFile(fileName);
00492 if (Geant3Init) {
00493 Geant().Do("gdrop all");
00494 Geant().Do((const char *)kuipCmd);
00495 Geant().Do("gclose all");
00496 } else {
00497 fChain->Init(); Geant3Init = 1;
00498 }
00499
00500 QApplication::restoreOverrideCursor();
00501 #else
00502 if (fileName.isEmpty()) {}
00503 if (fGeometrySelector) fGeometrySelector->setEnabled(FALSE);
00504 #endif
00505 }
00506
00507 void GeomBrowser::fileOpenInventor( const QString &fileName )
00508 {
00509
00510 if (fView_Coin3DAction->isEnabled() ) {
00511 TVirtualViewer3D *viewer = viewCoin3DSlot();
00512 if (viewer) {
00513 TQtRootViewer3D *v = (TQtRootViewer3D*)(viewer);
00514 if (v) {
00515 TGLViewerImp *viewerImp = v->GetViewerImp();
00516 if (viewerImp) viewerImp->ReadInputFile(fileName.toStdString().c_str());
00517 }
00518 }
00519 }
00520 }
00521
00522 TVirtualViewer3D *GeomBrowser::viewCoin3DSlot()
00523 {
00524
00525 if (fCurrentViewer)
00526 ((TQtRootViewer3D*)fCurrentViewer)->DisconnectPad();
00527
00528 TVirtualPad *pad3d = fComplexVolumeCanvas->GetCanvas() ? fComplexVolumeCanvas->GetCanvas() : gPad;
00529 fCurrentViewer = TVirtualViewer3D::Viewer3D(pad3d,"oiv");
00530 if (fCurrentViewer) {
00531
00532 TGQt::SetCoinFlag(1);
00533 fCurrentViewer->BeginScene();
00534 fCurrentViewer->EndScene();
00535 TQtRootViewer3D *v = (TQtRootViewer3D*)(fCurrentViewer);
00536 if (v) {
00537 TGLViewerImp *viewerImp = v->GetViewerImp();
00538 if (viewerImp)
00539 {
00540 viewerImp->MakeCurrent();
00541 connect(&viewerImp->Signals(),SIGNAL( ObjectSelected(TObject *, const QPoint&))
00542 , this, SLOT(ObjectSelected(TObject *, const QPoint &)));
00543 connect(&viewerImp->Signals(),SIGNAL( ObjectSelected(TObject *, const QPoint&))
00544 , fTreeWidget, SLOT(SelectByTObject(TObject *, const QPoint &)));
00545 connect(&viewerImp->Signals(),SIGNAL( destroyed())
00546 , this, SLOT(ViewerDestroyed()));
00547 }
00548 fEventDisplay = new StDraw3D(fCurrentViewer,pad3d);
00549 }
00550 } else {
00551 fView_Coin3DAction->setEnabled(false);
00552 }
00553 return fCurrentViewer;
00554 }
00555
00556 void GeomBrowser::SelectGeometry( const QString &geomTag )
00557 {
00558
00559
00560
00561 int indx = fGeometrySelector->findText(geomTag,Qt::MatchFixedString | Qt::MatchWrap);
00562 if (indx > 0) {
00563 fGeometrySelector->setCurrentIndex(indx);
00564
00565 } else {
00566 QMessageBox::warning (fGeometrySelector,"STAR Geometry Tag",QString("STAR GEANT Geometry Tag <b>\"%1\"</b> was not found").arg(geomTag));
00567 }
00568 }
00569
00570
00571 void GeomBrowser::STAR_geometry_activated( const QString &geoVersion )
00572 {
00573 #ifndef NO_GEANT_MAKER
00574 QString kuipCmd = "detp geometry ";
00575 kuipCmd += geoVersion;
00576 QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
00577
00578 if (!fGeometryLoaded) fGeometryLoaded = !gSystem->Load("geometry");
00579 if (fGeometryLoaded) {
00580
00581 Geant().LoadGeometry((const char*)kuipCmd );
00582 if (Geant3Init) {
00583 Geant().Do("gdrop all");
00584 Geant().Do((const char *)kuipCmd);
00585 if (false)
00586 Geant().Do("make geometry");
00587 else
00588 Geant().Geometry();
00589
00590 } else {
00591 fChain->Init(); Geant3Init = 1;
00592 }
00593
00594 TVolume *v = dynamic_cast<TVolume *>(Geant().GetDataSet("HALL"));
00595 if (v) {
00596
00597
00598 TVolume *cave = (TVolume *)v->FindByName("CAVE");
00599 if (cave) {
00600 cave->SetVisibility(TVolume::ENodeSEEN(2));
00601 }
00602 TVolume *hall = (TVolume *)v->FindByName("HALL");
00603 if (hall) {
00604 hall->SetVisibility(TVolume::ENodeSEEN(2));
00605 v = hall;
00606 }
00607 gPad->SetFillColor(kBlack);
00608 fTreeWidget->AddModel2ListView(v,geoVersion);
00609 }
00610 }
00611 QApplication::restoreOverrideCursor();
00612 #else
00613 if (geoVersion.isEmpty() ){}
00614 #endif
00615 }
00616
00627
00628 void GeomBrowser::DrawObject(TObject *obj,bool expanded)
00629 {
00630
00631 if ( (sender() != fDelayDrawTimer ) || fDelayDrawTimer->IsActive(expanded) ) {
00632
00633 fDelayDrawTimer->DrawObject(obj,expanded,fDepthControl->Value());
00634 return;
00635 }
00636 if (!obj && fTreeWidget) obj = fTreeWidget->CurrentObject();
00637 if (obj) {
00638 TVolume *volume = dynamic_cast<TVolume *>(obj);
00639 TQtWidget *view = expanded ? fComplexVolumeCanvas:fSingleVolumeCanvas;
00640 if(volume && view) {
00641 QCursor currentCursor = cursor();
00642 int depth = expanded ? fDepthControl->Value() : 1;
00643
00644 TVolume::ENodeSEEN s = volume->GetVisibility();
00645 TDataSet *set = volume;
00646 if ( s & TVolume::kThisUnvisible ) {
00647 TDataSetIter nextVolume(volume, depth);
00648 set = 0;
00649 while ( (set = nextVolume()) ) {
00650 s = ((TVolume *)set)->GetVisibility();
00651 if ( !(s & (TVolume::kThisUnvisible) )) break;
00652 }
00653 }
00654
00655 setEnabled(false);
00656 view->cd();
00657 if (set) {
00658 volume->Draw(QString().setNum(depth).toStdString().c_str());
00659 } else
00660 view->GetCanvas()->Clear();
00661 RefreshCanvas(view);
00662 setEnabled(true);
00663 }
00664 }
00665 }
00666
00667
00668 void GeomBrowser::ObjectSelected( TObject *obj, const QPoint &)
00669 {
00670
00671
00672 if (obj->InheritsFrom(TDataSet::Class()) ) {
00673
00674 #ifndef NO_GEANT_MAKER
00675 #if 1
00676 QString srcFile=(const char*)Geant().GetVolumeSrcFile(obj->GetName());
00677 if (!srcFile.isEmpty() && fEditGeoSrc->isChecked() ) {
00678 fTextEdit->show();
00679 fTextEdit->load(srcFile);
00680 fTextEdit->findBlock(QString(obj->GetName()));
00681
00682
00683
00684
00685 }
00686 #endif
00687 #endif
00688 }
00689 }
00690
00691
00692
00693 void GeomBrowser::fileOpenSlot()
00694 {
00695 static QString thisCintCommand;
00696 static QString filetypes = "STAR Geometry macro (*.C);"
00697 ";ROOT files (*.root);"
00698 #ifndef NO_GEANT_MAKER
00699 ";GEANT3 Zebra file (*.fz)"
00700 #endif
00701 ";";
00702 QString selectedFilter;
00703 QString dir = fSaveFileName;
00704 if (dir.isEmpty()) dir = gSystem->WorkingDirectory();
00705 else {
00706 TString exp(fSaveFileName.toStdString().c_str());
00707 gSystem->ExpandPathName(exp);
00708 dir = exp.Data();
00709 dir = QFileInfo(dir).path();
00710 }
00711
00712 QString fileName = QFileDialog::getOpenFileName (this
00713 , "Open ROOT file "
00714 , dir
00715 , filetypes
00716 , &selectedFilter);
00717 if (!fileName.isEmpty()){
00718 QFileInfo openFile(fileName);
00719 if (openFile.suffix().contains("C")) {
00720 fileOpenMacro(fileName);
00721 } else if (openFile.suffix().contains("fz")) {
00722 fileOpenZebra(fileName);
00723 } else {
00724 fileOpenRoot(fileName);
00725 }
00726 }
00727 }
00728
00729
00730 void GeomBrowser::fileSaveSlot()
00731 {
00732
00733 if (!(fSaveFileName.isEmpty()) ) {
00734 TQtWidget *sav = fCurrentWidget ? fCurrentWidget : fSingleVolumeCanvas;
00735 sav->Save(fSaveFileName);
00736 } else {
00737 fileSaveAsSlot();
00738 }
00739 }
00740
00741 void GeomBrowser::fileSaveAsSlot()
00742 {
00743 QString filter =
00744 "C++ macro (*.cpp,*.cxx,*.C);"
00745 ";Postscript (*.ps);"
00746 ";Encapsulated Postscript (*.eps);"
00747 ";Scalable Vector Graphics (*.svg);"
00748 ";ROOT file (*.root);"
00749 ";Image (";
00750
00751
00752 QList<QByteArray> formats = QImageWriter::supportedImageFormats();
00753 QList<QByteArray>::const_iterator j;
00754 int i = 0;
00755 for (j = formats.constBegin(); j != formats.constEnd(); ++j)
00756 {
00757 if (i) filter +=',';
00758 filter += "*.";
00759 QString str = *j; i++;
00760 filter += str.toLower();
00761 }
00762 filter +=");";
00763 filter +=";all files (*.*);;";
00764
00765 QString selectedFilter;
00766 QString dir = fSaveFileName;
00767 if (dir.isEmpty()) dir = gSystem->WorkingDirectory();
00768 else dir = QFileInfo(dir).path();
00769
00770 QString thatFile = QFileDialog::getSaveFileName(this, tr("Save File"),
00771 dir,filter);
00772
00773 if (thatFile.isEmpty()) return;
00774 fSaveFileName = thatFile;
00775
00776 QString fileNameExtension = QFileInfo(thatFile).suffix();
00777 QString saveType = fileNameExtension.toUpper();
00778
00779 fSingleVolumeCanvas->Save(fSaveFileName,saveType.toStdString().c_str(),-1);
00780 }
00781
00782 void GeomBrowser::filePrintSlot()
00783 {
00784
00785 QPrinter printer;
00786 QPrintDialog printDialog(&printer, this);
00787 if (printDialog.exec() == QDialog::Accepted) {
00788 QPainter pnt(&printer);
00789 TQtWidget *sav = fCurrentWidget ? fCurrentWidget : fSingleVolumeCanvas;
00790 pnt.drawPixmap(0,0,*sav->GetOffScreenBuffer());
00791 }
00792 }
00793
00794 void GeomBrowser::fileExitSlot()
00795 {
00796 gROOT->ProcessLine(".q");
00797 }
00798
00799
00800 void GeomBrowser::RemakeGeomSlot( const QString &)
00801 {
00802 #ifndef NO_GEANT_MAKER
00803 Geant().SetRemake(kTRUE);
00804 #endif
00805 }
00806
00807
00808 void GeomBrowser::viewGLSlot()
00809 {
00810
00811 TVirtualPad *pad3d = fSingleVolumeCanvas->GetCanvas() ? fSingleVolumeCanvas->GetCanvas() : gPad;
00812
00813 TVirtualViewer3D *viewer = TVirtualViewer3D::Viewer3D(pad3d,"ogl");
00814 if (viewer) {
00815
00816 TGQt::SetCoinFlag(0);
00817 viewer->BeginScene();
00818 viewer->EndScene();
00819 TQtRootViewer3D *v = (TQtRootViewer3D*)(viewer);
00820 if (v) {
00821 TGLViewerImp *viewerImp = v->GetViewerImp();
00822 if (viewerImp)
00823 {
00824 connect(&viewerImp->Signals(),SIGNAL( ObjectSelected(TObject *, const QPoint&))
00825 , this, SLOT(ObjectSelected(TObject *, const QPoint &)));
00826 }
00827 }
00828 } else {
00829 fView_GLAction->setEnabled(FALSE);
00830 }
00831 }
00832
00833
00834 void GeomBrowser::fileReloadSlot()
00835 {
00836
00837 QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
00838
00839 fSingleVolumeCanvas->setUpdatesEnabled( FALSE );
00840 fComplexVolumeCanvas->setUpdatesEnabled( FALSE );
00841
00842 fSingleVolumeCanvas->GetCanvas()->Clear();
00843 fComplexVolumeCanvas->GetCanvas()->Clear();
00844 fSingleVolumeCanvas->GetCanvas()->Update();
00845 fComplexVolumeCanvas->GetCanvas()->Update();
00846
00847 fTreeWidget->ClearCB();
00848 if (!fOpenFileName.isEmpty()){
00849 QFileInfo openFile(fOpenFileName);
00850 if (openFile.suffix().contains("C"))
00851 fileOpenMacro(fOpenFileName);
00852 else {
00853 fileOpenRoot(fOpenFileName);
00854 }
00855 } else {
00856 fileOpenSlot();
00857 }
00858 fSingleVolumeCanvas->setUpdatesEnabled( TRUE );
00859 fComplexVolumeCanvas->setUpdatesEnabled( TRUE );
00860 CleanGeoManager();
00861 QApplication::restoreOverrideCursor();
00862 }
00863
00864
00865 void GeomBrowser::CleanGeoManager()
00866 {
00867 #if 0
00868 if (fGeoManager2Delete) {
00869 delete fGeoManager2Delete;fGeoManager2Delete = 0;
00870 gGeoManager = 0;
00871 }
00872 #endif
00873 }
00874
00875
00876 void GeomBrowser::ViewerDestroyed()
00877 {
00878
00879 fCurrentViewer = 0;
00880 }
00881
00882 #if 0
00883
00884 #include "TVolumePosition.h"
00885
00886
00887
00888 static pair<QString,QString> MakeVolumeDsc(const QString &s)
00889 {
00890
00891
00892 QString key = s.left(4);
00893 pair<QString, QString> volumeDiscriptor(key,s);
00894 return volumeDiscriptor;
00895 }
00896
00897 static map<QString,QString> MakeVolumeMap(const QString &fileName)
00898 {
00899 QFile file( fileName );
00900 map<QString,QString> thisMap;
00901 if ( file.open( IO_ReadOnly ) ) {
00902 QTextStream stream( &file );
00903 QString line;
00904 while ( !stream.atEnd() ) {
00905 line = stream.readLine();
00906 thisMap.insert(MakeVolumeDsc(line));
00907 }
00908 file.close();
00909 }
00910 return thisMap;
00911 }
00912
00913
00914 static const QString &GetVolumeDescriptor(const QString &volumeName,bool richText=false)
00915 {
00916 static bool first = true;
00917 static map<QString,QString> volumeMap;
00918 static QString dsc;
00919 static bool errorMessage = false;
00920 #ifdef NO_GEANT_MAKER
00921 static QString dsc="No STAR GEANT3 narrative description is provided";
00922 static bool StarGeant = false;
00923 #else
00924 static QString dsc;
00925 static bool StarGeant = true;
00926 #endif
00927 if (!StarGeant) return dsc;
00928 if (first) {
00929 first = false;
00930 TString helpFile = "volumes.txt";
00931 const char *fullPath = gSystem->Which("./:./StDb/geometry:$STAR/StDb/geometry",helpFile);
00932 if (fullPath) {
00933 volumeMap = MakeVolumeMap(fullPath);
00934 } else if (!errorMessage) {
00935 errorMessage = true;
00936 QMessageBox::critical(0
00937 ,"STAR Geometry narrative description"
00938 ,QString("No file <%1> file under %2 was found")
00939 .arg(helpFile.Data())
00940 .arg("./:./StDb/geometry:$STAR/StDb/geometry"));
00941 }
00942 delete [] fullPath; fullPath=0;
00943 }
00944 map<QString,QString>::iterator it;
00945 it = volumeMap.find(volumeName);
00946 if (it!=volumeMap.end()) {
00947 dsc = richText ? "<p><b>" : "";
00948 dsc += it->second;
00949 } else dsc = "";
00950 dsc.replace(" comment =",richText ? ":</b> ": ": ");
00951 return dsc;
00952 }
00953
00954
00955
00956 void GeomBrowser::listView1_selectionChanged()
00957 {
00958 QListViewItem *i =fTreeWidget->currentItem();
00959 if (i) {
00960 if ( i->isSelected() ) listView1_selectionChanged(i);
00961 }
00962 }
00963
00964
00965 void GeomBrowser::listView1_selectionChanged( QListViewItem *item )
00966 {
00967 if (item) {
00968
00969 drawItem(item, 1, fComplexVolumeCanvas);
00970 #if o
00971 TQtObjectListItem* itemRoot =(TQtObjectListItem* )item;
00972 TObject *obj = itemRoot->Object();
00973 TObject *objInfo = obj;
00974 TVolume *volume = dynamic_cast<TVolume *>(obj);
00975 objInfo = volume->GetShape();
00976 if (fInspector) delete fInspector;
00977 fInspector = (TQtInspectImp *)(gGuiFactory->CreateInspectorImp(objInfo,frame6->width(),frame6->height()));
00978
00979 fInspector->move(frame6->pos());
00980
00981
00982 #endif
00983 }
00984 }
00985
00986
00987
00988 void GeomBrowser::listView1_contextMenuRequested( QListViewItem *item, const QPoint &pos, int col )
00989 {
00990 if (item && col >= 0) {
00991
00992 QPtrList<QListViewItem> lst;
00993 int nSelected = 0;
00994 QListViewItemIterator it(fTreeWidget, QListViewItemIterator::Selected );
00995 while ( it.current() ) {
00996 lst.append( it.current() );
00997 ++it;++nSelected;
00998 }
00999 if (nSelected == 1) {
01000 if (!fContextMenu) fContextMenu = new TContextMenu("BrowserContextMenu");
01001 TQtObjectListItem* that =(TQtObjectListItem* )item;
01002 if (that->Object())
01003 fContextMenu->Popup(pos.x(),pos.y(), that->Object(),(TBrowser *)0);
01004 } else {
01005 int response = -1;
01006 static QPopupMenu *contextMenu = 0;
01007 static int menus[5];
01008 if (!contextMenu) {
01009 contextMenu = new QPopupMenu(fTreeWidget);
01010 int itemPosition = -1;
01011
01012 contextMenu->insertItem("Visibility:");
01013 contextMenu->insertSeparator();
01014
01015 itemPosition = contextMenu->insertItem("&Both");
01016 int j =0;
01017 menus[j++] = itemPosition;
01018 contextMenu->setWhatsThis(itemPosition,"Make the selected volumes and its children visible");
01019
01020 contextMenu->setWhatsThis(itemPosition=contextMenu->insertItem("&Children")
01021 ,"Make the selected the children of the selected volumes visible but the volume itself none");
01022 menus[j++] = itemPosition;
01023
01024 contextMenu->setWhatsThis(itemPosition=contextMenu->insertItem("&None")
01025 ,"Make the selected the volumes invisible");
01026 menus[j++] = itemPosition;
01027 contextMenu->insertSeparator();
01028 contextMenu->setWhatsThis(itemPosition=contextMenu->insertItem("&Save")
01029 ,"Save the selected object into ROOT file");
01030 menus[j++] = itemPosition;
01031
01032 contextMenu->setWhatsThis(itemPosition=contextMenu->insertItem("&Color")
01033 ,"Change the color of the selected object");
01034 menus[j++] = itemPosition;
01035 }
01036 response = contextMenu->exec(QCursor::pos());
01037 if (response != -1 ) {
01038 TUpdateList listLock(fTreeWidget);
01039 QListViewItem *i;
01040 bool saved = false;
01041 Color_t rootColor = -1;
01042 Style_t rootStyle = -1;
01043 TVolume *topVolumeToSave = 0;
01044 TFile *file2Save = 0;
01045 for ( i = lst.first(); i; i = lst.next() ) {
01046 TQtObjectListItem* itemRoot =(TQtObjectListItem* )i;
01047 TObject *obj = itemRoot->Object();
01048 TVolume *volume = dynamic_cast<TVolume *>(obj);
01049
01050 if (volume) {
01051 TVolume::ENodeSEEN s = volume->GetVisibility();
01052 if ( response == menus[0] ) {
01053 itemRoot->setState(QCheckListItem::On); s = TVolume::kBothVisible;
01054 } else if (response == menus[1]) {
01055 itemRoot->setState(QCheckListItem::NoChange); s = TVolume::kThisUnvisible;
01056 } else if (response == menus[2]) {
01057 itemRoot->setState(QCheckListItem::Off) ; s = TVolume::kNoneVisible;
01058 } else if (response == menus[3]) {
01059 if (topVolumeToSave) {
01060 topVolumeToSave->Add(volume);
01061 } else if (!saved) {
01062 saved = true;
01063
01064 QString filter = "ROOT file (*.root);";
01065 QString selectedFilter;
01066 QString dir = fSaveFileName;
01067 if (dir.isEmpty()) dir = gSystem->WorkingDirectory();
01068 else dir = QFileInfo(dir).dirPath();
01069
01070 QString thatFile = QFileDialog::getSaveFileName(dir
01071 , filter, this, "SaveAs"
01072 , "Save the volulme as"
01073 , &selectedFilter);
01074
01075 if (thatFile.isEmpty()) {
01076 response = -1;
01077 } else {
01078 TDirectory *save = gDirectory;
01079 file2Save = TFile::Open((const char *)thatFile,"RECREATE");
01080 topVolumeToSave = new TVolume("GeomBrowse","saved",(TShape *)0);
01081 save->cd();
01082 }
01083 }
01084 } else if (response == menus[4]) {
01085
01086 Color_t vc = volume->GetLineColor();
01087 Style_t vs = volume->GetFillStyle();
01088 if (rootColor == -1) {
01089 float r,g,b;
01090 int a = 0;
01091 gROOT->GetColor(vc)->GetRGB(r,g,b);
01092 if (4000 >= vs && vs < 5000) a = vs-4000;
01093 QRgb initial = qRgba(int(r*255),int(g*255),int(b*255),a);
01094 bool ok;
01095 QRgb color = QColorDialog::getRgba(initial, &ok, this,"Change the Volume Color" );
01096 if (ok) {
01097 int red = qRed(color);
01098 int green = qGreen(color);
01099 int blue = qBlue(color);
01100 int alpha = qAlpha(color);
01101 rootColor = TColor::GetColor(red, green, blue);
01102 if ( (alpha > 0) && (alpha != vs-4000) ) rootStyle = 4000+alpha;
01103 } else {
01104 response = -1;
01105 }
01106 }
01107 if (rootColor != -1 && vc != rootColor) volume->SetLineColor(rootColor);
01108 if (rootStyle != -1 && vs != rootStyle) volume->SetFillStyle(rootStyle);
01109 } else { response = -1; }
01110
01111 if (volume->GetVisibility() != s) volume->SetVisibility(s);
01112 }
01113 }
01114 if (file2Save) {
01115 TDirectory *save = gDirectory;
01116 file2Save->cd();
01117 topVolumeToSave->Write();
01118 file2Save->Close();
01119 delete file2Save; file2Save=0;
01120 delete topVolumeToSave; topVolumeToSave = 0;
01121 save->cd();
01122 }
01123 }
01124 if (response != -1) RefreshCanvas(fSingleVolumeCanvas);
01125 }
01126 }
01127 }
01128
01129
01130 void GeomBrowser::slider1_valueChanged( int val )
01131 {
01132 drawItem(fCurrentDrawn, val, fSingleVolumeCanvas );
01133 }
01134
01135
01136
01137 inline static Int_t CountInstances(TVolume *parent, TVolume *child)
01138 {
01139
01140 Int_t counter = 0;
01141 TList *positions = parent->GetListOfPositions();
01142 TIter next(positions);
01143 while (TVolumePosition *pos = (TVolumePosition *)next() )
01144 if (pos->GetNode() == child ) counter++;
01145 return counter;
01146 }
01147
01148
01149 void GeomBrowser::listView1_expanded(QListViewItem *item)
01150 {
01151 if (item) {
01152
01153 TQtObjectListItem* itemRoot =(TQtObjectListItem* )item;
01154 TObject *obj = itemRoot->Object();
01155 TVolume *volume = dynamic_cast<TVolume *>(obj);
01156
01157 TUpdateList listLock(item->listView());
01158
01159 TDataSetIter next(volume);
01160 TVolume *child = 0;
01161 while ( (child = (TVolume *)next()) ) {
01162 TQtObjectListItem* itemChild = new TQtObjectListItem(child,itemRoot,child->GetName(),QCheckListItem::CheckBox);
01163 itemChild->setText(1,child->GetTitle());
01164 itemChild->setText(3,child->ClassName());
01165 Int_t nVolume = CountInstances(volume,child);
01166 if (nVolume >1)
01167 itemChild->setText(2,QString("> #%1").arg(nVolume));
01168 itemChild->setExpandable(child->GetListSize());
01169 SetVisibility(itemChild, child->GetVisibility());
01170 }
01171 }
01172 }
01173
01174
01175 void GeomBrowser::listView1_onItem( QListViewItem *item )
01176 {
01177 if (item) {
01178 TQtObjectListItem* itemRoot =(TQtObjectListItem* )item;
01179 TObject *obj = itemRoot->Object();
01180 if (obj && gPad) {
01181 QString m = "The ";
01182 TVolume::ENodeSEEN s = ((TVolume *)obj)->GetVisibility();
01183 if ( s & TVolume::kThisUnvisible) m += "in";
01184 m += "visible volume: ";
01185 QString dsc= GetVolumeDescriptor(obj->GetName());
01186 if (dsc.isEmpty() ) {
01187 const char *info = obj->GetObjectInfo(gPad->XtoPixel(0),gPad->YtoPixel(0));
01188 if (info) m += info;
01189 } else {
01190 m += dsc;
01191 }
01192 statusBar()->message(m);
01193 }
01194 #if 0
01195 TVolume *volume = dynamic_cast<TVolume *>(obj);
01196 if (fInspector) delete fInspector;
01197 fInspector = dynamic_cast<TQtInspectImp *>(gGuiFactory->CreateInspectorImp(obj));
01198 fInspector->reparent(this);
01199 fInspector->Show();
01200 #endif
01201 #ifndef WIN32
01202 gSystem->ProcessEvents();
01203 #endif
01204 }
01205 }
01206
01207
01208
01209 void GeomBrowser::dtor()
01210 {
01211 delete fFile; fFile = 0;
01212 delete fContextMenu; fContextMenu = 0;
01213 }
01214
01215 void GeomBrowser::rootCommandExecute()
01216 {
01217
01218 gROOT->ProcessLine(fRootCommand->lineEdit()->text());
01219 RefreshCanvas(fSingleVolumeCanvas);
01220
01221 }
01222
01223 void GeomBrowser::listView1_clicked( QListViewItem *item )
01224 {
01225 if (item) {
01226 TQtObjectListItem* itemRoot =(TQtObjectListItem* )item;
01227 TObject *obj = itemRoot->Object();
01228 TVolume *volume = dynamic_cast<TVolume *>(obj);
01229
01230
01231 if (volume) {
01232 TVolume::ENodeSEEN s = volume->GetVisibility();
01233 #if (QT_VERSION > 0x030100)
01234 switch ( itemRoot->state() ){
01235 case QCheckListItem::On : s = TVolume::kBothVisible; break;
01236 case QCheckListItem::NoChange: s = TVolume::kThisUnvisible; break;
01237 case QCheckListItem::Off : s = TVolume::kNoneVisible; break;
01238 default: s = TVolume::kBothVisible; break;
01239
01240 };
01241 #else
01242 s = ( itemRoot->isOn() ) ? TVolume::kBothVisible : TVolume::kThisUnvisible ;
01243 #endif
01244
01245 if (volume->GetVisibility() != s) {
01246 volume->SetVisibility(s);
01247
01248 QString m = "The ";
01249 if ( s & TVolume::kThisUnvisible) m += "in";
01250 m += "visible volume: ";
01251 const char *info = obj->GetObjectInfo(gPad->XtoPixel(0),gPad->YtoPixel(0));
01252 if (info) m += info;
01253 statusBar()->message(m);
01254
01255
01256 if (item == item->listView()->selectedItem() )
01257 drawItem(item, 1, fComplexVolumeCanvas);
01258
01259
01260 if (fCurrentDrawn) RefreshCanvas(fSingleVolumeCanvas);
01261 }
01262 QString dsc = GetVolumeDescriptor(volume->GetName(),true);
01263 if (dsc.isEmpty()) {
01264 dsc = QString("<p>No desciption was found for <b>%1</b><br>Edit the <code>volumes.txt</code> file")
01265 .arg(volume->GetName());
01266 }
01267
01268
01269 }
01270 }
01271 }
01272
01273 void GeomBrowser::listView1_collapsed( QListViewItem *item )
01274 {
01275 if (item) {
01276
01277 TUpdateList listLock(item->listView());
01278
01279 QListViewItemIterator it(item);
01280 while ( it.current() ) {
01281 if ( (it.current() != item) && (it.current() == fCurrentDrawn) )
01282 { fCurrentDrawn =0; break; }
01283 ++it;
01284 }
01285
01286 QListViewItem* child = 0;;
01287 while ( (child = item->firstChild()) ){
01288 delete child;
01289 }
01290 if (!item->depth()) item->setOpen(true);
01291 }
01292 }
01293
01294
01295 void GeomBrowser::listView1_doubleClicked( QListViewItem *item )
01296 {
01297 if (item && fCurrentDrawn != item) {
01298
01299 {
01300 TUpdateList listLock(item->listView());
01301
01302 TObject *obj = 0;
01303 const QIconSet *set = 0;
01304 if ( fCurrentDrawn ) {
01305 obj = ((TQtObjectListItem *)fCurrentDrawn)->Object();
01306 if (obj) {
01307 if (obj->InheritsFrom(TVolume::Class()) )
01308 set = TQtIconBrowserImp::Shape2GeoShapeIcon(((TVolume *)obj)->GetShape()->ClassName());
01309 else if (obj->InheritsFrom(TVolumeView::Class()) )
01310 set = TQtIconBrowserImp::Shape2GeoShapeIcon(((TVolumeView *)obj)->GetShape()->ClassName());
01311 else if (obj->InheritsFrom(TShape::Class()) )
01312 set = TQtIconBrowserImp::Shape2GeoShapeIcon(((TShape *)obj)->ClassName());
01313 else if (obj->InheritsFrom(TGeoVolume::Class()) )
01314 set = TQtIconBrowserImp::IconList()->GetIcon(((TGeoVolume *)(obj))->GetShape()->GetName());
01315 }
01316 fCurrentDrawn->setPixmap(0,set ? set->pixmap(QIconSet::Small,true,QIconSet::On) : QPixmap());
01317 fCurrentDrawn->setPixmap(1,QPixmap());
01318 }
01319
01320 fCurrentDrawn = item;
01321 obj = ((TQtObjectListItem *)fCurrentDrawn)->Object();
01322 if (obj) {
01323 if (obj->InheritsFrom(TVolume::Class()) )
01324 set = TQtIconBrowserImp::Shape2GeoShapeIcon(((TVolume *)obj)->GetShape()->ClassName());
01325 else if (obj->InheritsFrom(TVolumeView::Class()) )
01326 set = TQtIconBrowserImp::Shape2GeoShapeIcon(((TVolumeView *)obj)->GetShape()->ClassName());
01327 else if (obj->InheritsFrom(TShape::Class()) )
01328 set = TQtIconBrowserImp::Shape2GeoShapeIcon(((TShape *)obj)->ClassName());
01329 else if (obj->InheritsFrom(TGeoVolume::Class()) )
01330 set = TQtIconBrowserImp::IconList()->GetIcon(((TGeoVolume *)(obj))->GetShape()->GetName());
01331 }
01332
01333 fCurrentDrawn->setPixmap(0,fIconSet.pixmap(QIconSet::Small,true,QIconSet::On));
01334
01335 fCurrentDrawn->setPixmap(1,set ? set->pixmap(QIconSet::Small,true,QIconSet::On)
01336 : QPixmap::fromMimeSource("arrow_left.xpm"));
01337 }
01338 drawItem(fCurrentDrawn, spinBox1->value(), fSingleVolumeCanvas );
01339 }
01340 }
01341
01342
01343
01344
01345 void GeomBrowser::SetVisibility( TQtObjectListItem * item, TVolume::ENodeSEEN vis )
01346 {
01347
01348 if (item) {
01349 #if (QT_VERSION > 0x030100)
01350 item->setTristate(item->isExpandable());
01351 QCheckListItem::ToggleState s = QCheckListItem::Off;
01352 switch (vis) {
01353 case TVolume::kBothVisible: s = QCheckListItem::On; break;
01354 case TVolume::kSonUnvisible: s = QCheckListItem::On; break;
01355 case TVolume::kThisUnvisible: s = item->isExpandable() ?
01356 QCheckListItem::NoChange : QCheckListItem::Off;
01357 break;
01358 case TVolume::kNoneVisible: s = QCheckListItem::Off; break;
01359 };
01360 item->setState(s);
01361 #else
01362 bool s = true;
01363 switch (vis) {
01364 case TVolume::kBothVisible: s = true; break;
01365 case TVolume::kSonUnvisible: s = true; break;
01366 case TVolume::kThisUnvisible: s = false; break;
01367 case TVolume::kNoneVisible: s = false; break;
01368 };
01369 item->setOn(s);
01370 #endif
01371 }
01372 }
01373
01374
01375
01376
01377 void GeomBrowser::TurnGeomSrcEditor(bool on)
01378 {
01379
01380 if (on)
01381 QWhatsThis::display("Select the 3D image of the detector volume to popu the text editor");
01382 }
01383
01384
01385 #endif