Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4UIQt.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // $Id$
28 //
29 // L. Garnier
30 
31 #ifdef G4UI_BUILD_QT_SESSION
32 
33 #include "G4Types.hh"
34 
35 #include <string.h>
36 
37 #include "G4UIQt.hh"
38 #include "G4UImanager.hh"
39 #include "G4StateManager.hh"
40 #include "G4UIcommandTree.hh"
41 #include "G4UIcommandStatus.hh"
42 
43 #include "G4Qt.hh"
44 
45 #include <qapplication.h>
46 #include <qmessagebox.h>
47 #include <qlineedit.h>
48 #include <qwidget.h>
49 #include <qmenubar.h>
50 #include <qlayout.h>
51 #include <qpushbutton.h>
52 #include <qlabel.h>
53 #include <qsplitter.h>
54 #include <qscrollbar.h>
55 #include <qdialog.h>
56 #include <qevent.h>
57 #include <qtextedit.h>
58 #include <qsignalmapper.h>
59 #include <qtabwidget.h>
60 #include <qtabbar.h>
61 #include <qstringlist.h>
62 
63 #include <qmainwindow.h>
64 #include <qmenu.h>
65 #include <qlistwidget.h>
66 #include <qtreewidget.h>
67 #include <qgroupbox.h>
68 #include <qscrollarea.h>
69 #include <qtoolbox.h>
70 #include <qradiobutton.h>
71 #include <qbuttongroup.h>
72 #include <qcombobox.h>
73 #include <qsignalmapper.h>
74 #include <qpainter.h>
75 #include <qcolordialog.h>
76 #include <qtoolbar.h>
77 #include <qfiledialog.h>
78 
79 
80 
81 #include <stdlib.h>
82 
83 // Pourquoi Static et non variables de classe ?
84 static G4bool exitSession = true;
85 static G4bool exitPause = true;
86 
107 G4UIQt::G4UIQt (
108  int argc
109 ,char** argv
110 )
111 :fMainWindow(NULL)
112 ,fCommandLabel(NULL)
113 ,fCommandArea(NULL)
114 ,fCoutTBTextArea(NULL)
115 ,fHelpArea(NULL)
116 ,fG4cout("")
117 ,fHelpTreeWidget(NULL)
118 ,fHelpTBWidget(NULL)
119 ,fHistoryTBWidget(NULL)
120 ,fCoutTBWidget(NULL)
121 ,fSceneTreeComponentsTBWidget(NULL)
122 ,fHelpLine(NULL)
123 ,fViewerTabWidget(NULL)
124 ,fCoutText("Output")
125 ,fLastQTabSizeX(0)
126 ,fLastQTabSizeY(0)
127 ,fToolbarApp(NULL)
128 ,fToolbarUser(NULL)
129 ,fMoveSelected(false)
130 ,fRotateSelected(true)
131 ,fPickSelected(false)
132 ,fZoomInSelected(false)
133 ,fZoomOutSelected(false)
134 {
135 
136  G4Qt* interactorManager = G4Qt::getInstance (argc,argv,(char*)"Qt");
137  if (!(QApplication*)interactorManager->GetMainInteractor()) {
138  G4cout << "G4UIQt : Unable to init Qt. Aborted" << G4endl;
139  }
140 
142  if(UI!=NULL) UI->SetSession(this);
143  if(UI!=NULL) UI->SetG4UIWindow(this);
144 
145  // Check if already define in external app QMainWindow
146  bool found = false;
147  Q_FOREACH (QWidget *widget, QApplication::allWidgets()) {
148  if ((found== false) && (widget->inherits("QMainWindow"))) {
149  found = true;
150  }
151  }
152 
153  if (found) {
154  G4cout << "G4UIQt : Found an external App with a QMainWindow already defined. Aborted" << G4endl;
155  return ;
156  }
157  fMainWindow = new QMainWindow();
158 
159 
160 #ifdef G4DEBUG_INTERFACES_BASIC
161  printf("G4UIQt::Initialise after main window creation +++++++++++\n");
162 #endif
163 
164 
165  // the splitter
166  fMainSplitterWidget = new QSplitter(Qt::Horizontal,fMainWindow);
167 
168  QWidget *leftSplitterWidget = new QWidget(fMainSplitterWidget);
169  QVBoxLayout * layoutLeftSplitterWidget = new QVBoxLayout();
170  leftSplitterWidget->setLayout(layoutLeftSplitterWidget);
171  fRightSplitterWidget = new QSplitter(Qt::Vertical,fMainSplitterWidget);
172 
173 
174  fUITabWidget = new QTabWidget();
175  // fUITabWidget->setMinimumHeight(100);
176 
177  // Set layouts
178  QWidget* commandLineWidget = new QWidget();
179  QVBoxLayout *layoutCommandLine = new QVBoxLayout();
180  commandLineWidget->setLayout(layoutCommandLine);
181 
182  // fill them
183 
184  fCommandLabel = new QLabel("",commandLineWidget);
185 
186  fCommandArea = new QLineEdit(commandLineWidget);
187  fCommandArea->installEventFilter(this);
188  fCommandArea->activateWindow();
189 
190  fCommandArea->setFocusPolicy ( Qt::StrongFocus );
191  fCommandArea->setFocus(Qt::TabFocusReason);
192 
193  commandLineWidget->setSizePolicy (QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum));
194 
195 
196  layoutCommandLine->addWidget(fCommandLabel);
197  layoutCommandLine->addWidget(fCommandArea);
198 
199  fHelpTBWidget = new QWidget(fUITabWidget);
200  fHistoryTBWidget = new QWidget(fUITabWidget);
201  fSceneTreeComponentsTBWidget = new QTabWidget(fUITabWidget);
202 
203 #if QT_VERSION < 0x040200
204  fSceneTreeComponentsTBWidget->hide();
205 #else
206  fSceneTreeComponentsTBWidget->setVisible(false);
207 #endif
208 
209  fEmptyViewerTabLabel = new QLabel(" If you want to have a Viewer, please use /vis/open commands. ");
210 
211  layoutLeftSplitterWidget->addWidget(fUITabWidget);
212 
213  fCoutTBWidget = new QGroupBox("Output");
214 
215  // fill right splitter
216  fRightSplitterWidget->addWidget(fEmptyViewerTabLabel);
217  fRightSplitterWidget->addWidget(fCoutTBWidget);
218  fRightSplitterWidget->addWidget(commandLineWidget);
219 
220  // set the splitter size
221  QList<int> list2;
222  list2.append(600);
223  list2.append(150);
224  // fRightSplitterWidget->setSizes(list2);
225 
226 
227  CreateVisParametersTBWidget();
228  CreateHelpTBWidget();
229  CreateHistoryTBWidget();
230 
231  CreateCoutTBWidget();
232 
233 
234 
235 
236 
237  // the right splitter
238  fUITabWidget->addTab(fSceneTreeComponentsTBWidget,"Scene tree");
239  fUITabWidget->addTab(fHelpTBWidget,"Help");
240  fUITabWidget->addTab(fHistoryTBWidget,"History");
241  fUITabWidget->setCurrentWidget(fSceneTreeComponentsTBWidget);
242 
243  // Only at creation. Will be set visible when sessionStart();
244  #if QT_VERSION < 0x040200
245  fEmptyViewerTabLabel->hide();
246  #else
247  fEmptyViewerTabLabel->setVisible(false);
248  #endif
249 
250 
251  fMainSplitterWidget->addWidget(leftSplitterWidget);
252  fMainSplitterWidget->addWidget(fRightSplitterWidget);
253  // set the splitter size
254  QList<int> list;
255  list.append(200 );
256  list.append(650);
257  fMainSplitterWidget->setSizes(list);
258 
259 
260 #ifdef G4DEBUG_INTERFACES_BASIC
261  printf("G4UIQt::G4UIQt :: 5\n");
262 #endif
263 
264 
265  fMainWindow->setCentralWidget(fMainSplitterWidget);
266 
267 #ifdef G4DEBUG_INTERFACES_BASIC
268  printf("G4UIQt::G4UIQt :: 6\n");
269 #endif
270 
271  // Connect signal
272  connect(fCommandArea, SIGNAL(returnPressed()), SLOT(CommandEnteredCallback()));
273  connect(fUITabWidget, SIGNAL(currentChanged(int)), SLOT(ToolBoxActivated(int)));
274 
275  if(UI!=NULL) UI->SetCoutDestination(this); // TO KEEP
276 
277  fMainWindow->setWindowTitle(QFileInfo( QCoreApplication::applicationFilePath() ).fileName());
278  fMainWindow->resize(300,600);
279  fMainWindow->move(QPoint(50,50));
280 
281  // Set not visible until session start
282  #if QT_VERSION < 0x040200
283  fMainWindow->hide();
284  #else
285  fMainWindow->setVisible(false);
286  #endif
287 
288 #ifdef G4DEBUG_INTERFACES_BASIC
289  printf("G4UIQt::G4UIQt END\n");
290 #endif
291 }
292 
293 
294 
295 G4UIQt::~G4UIQt(
296 )
297 {
298 #ifdef G4DEBUG_INTERFACES_BASIC
299  printf("G4UIQt::~G4UIQt Delete\n");
300 #endif
301  G4UImanager* UI = G4UImanager::GetUIpointer(); // TO KEEP
302  if(UI!=NULL) { // TO KEEP
303  UI->SetSession(NULL); // TO KEEP
304  UI->SetG4UIWindow(NULL);
305  UI->SetCoutDestination(NULL); // TO KEEP
306  }
307 
308  if (fMainWindow!=NULL) {
309 #ifdef G4DEBUG_INTERFACES_BASIC
310  printf("G4UIQt::~G4UIQt DELETE fMainWindow\n");
311 #endif
312  delete fMainWindow;
313  }
314 }
315 
318 void G4UIQt::CreateHistoryTBWidget(
319 )
320 {
321 
322  QVBoxLayout *layoutHistoryTB = new QVBoxLayout();
323  fHistoryTBTableList = new QListWidget();
324  fHistoryTBTableList->setSelectionMode(QAbstractItemView::SingleSelection);
325  connect(fHistoryTBTableList, SIGNAL(itemSelectionChanged()), SLOT(CommandHistoryCallback()));
326  fHistoryTBTableList->installEventFilter(this);
327 
328  layoutHistoryTB->addWidget(fHistoryTBTableList);
329 
330  fHistoryTBWidget->setLayout(layoutHistoryTB);
331 }
332 
335 void G4UIQt::CreateHelpTBWidget(
336 )
337 {
338 
339 
340  QWidget *helpWidget = new QWidget();
341  QHBoxLayout *helpLayout = new QHBoxLayout();
342  QVBoxLayout *vLayout = new QVBoxLayout();
343  fHelpVSplitter = new QSplitter(Qt::Horizontal);
344  fHelpLine = new QLineEdit(fHelpTBWidget);
345  helpLayout->addWidget(new QLabel("Search :",helpWidget));
346  helpLayout->addWidget(fHelpLine);
347  connect( fHelpLine, SIGNAL( editingFinished () ), this, SLOT( LookForHelpStringCallback() ) );
348 
349  // Create Help tree
350  FillHelpTree();
351 
352  fHelpArea = new QTextEdit();
353  fHelpArea->setReadOnly(true);
354 
355  // Set layouts
356 
357  if (fHelpTreeWidget) {
358  fHelpVSplitter->addWidget(fHelpTreeWidget);
359  }
360  fHelpVSplitter->addWidget(fHelpArea);
361 
362  vLayout->addWidget(helpWidget);
363  vLayout->addWidget(fHelpVSplitter,1);
364 
365  fHelpTBWidget->setMinimumSize(50,50);
366  fHelpTBWidget->setSizePolicy (QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum));
367 
368  // set the splitter size
369  QList<int> list;
370  list.append( 50 );
371  list.append( 50 );
372  fHelpVSplitter->setSizes(list);
373 
374  helpWidget->setLayout(helpLayout);
375  fHelpTBWidget->setLayout(vLayout);
376 }
377 
378 
381 void G4UIQt::CreateCoutTBWidget(
382 )
383 {
384  QVBoxLayout *layoutCoutTB = new QVBoxLayout();
385 
386  fCoutTBTextArea = new QTextEdit(fCoutTBWidget);
387  fCoutFilter = new QLineEdit(fCoutTBWidget);
388  QLabel* coutFilterLabel = new QLabel("Filter : ",fCoutTBWidget);
389 
390  QPushButton *coutTBClearButton = new QPushButton("clear",fCoutTBWidget);
391  connect(coutTBClearButton, SIGNAL(clicked()), SLOT(ClearButtonCallback()));
392  connect(fCoutFilter, SIGNAL(textEdited ( const QString &)), SLOT(CoutFilterCallback( const QString &)));
393 
394  fCoutTBTextArea->setReadOnly(true);
395 
396  QWidget* coutButtonWidget = new QWidget(fCoutTBWidget);
397  QHBoxLayout* layoutCoutTBButtons = new QHBoxLayout(coutButtonWidget);
398  layoutCoutTBButtons->addWidget(coutTBClearButton);
399  layoutCoutTBButtons->addWidget(coutFilterLabel);
400  layoutCoutTBButtons->addWidget(fCoutFilter);
401 
402  layoutCoutTB->addWidget(fCoutTBTextArea);
403  layoutCoutTB->addWidget(coutButtonWidget);
404 
405  fCoutTBWidget->resize(100,100);
406  fCoutTBTextArea->setMinimumHeight(10);
407  fCoutTBWidget->setMinimumHeight(150);
408  // fCoutTBTextArea->setSizePolicy (QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum));
409  fCoutTBWidget->setSizePolicy (QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum));
410  fCoutTBWidget->setLayout(layoutCoutTB);
411 }
412 
413 
416 void G4UIQt::CreateVisParametersTBWidget(
417 )
418 {
419 }
420 
421 
424 QTabWidget* G4UIQt::GetSceneTreeComponentsTBWidget(
425 )
426 {
427  return fSceneTreeComponentsTBWidget;
428 }
429 
430 
434 bool G4UIQt::AddTabWidget(
435  QWidget* aWidget
436 ,QString name
437 ,int sizeX
438 ,int sizeY
439 )
440 {
441 #ifdef G4DEBUG_INTERFACES_BASIC
442  printf("G4UIQt::AddTabWidget %d %d\n",sizeX, sizeY);
443 #endif
444 
445  if (fViewerTabWidget == NULL) {
446 #ifdef G4DEBUG_INTERFACES_BASIC
447  printf("G4UIQt::AddTabWidget +++++\n");
448 #endif
449 
450  fViewerTabWidget = new G4QTabWidget(fRightSplitterWidget);
451 #if QT_VERSION < 0x040500
452 #else
453  fViewerTabWidget->setTabsClosable (true);
454 #endif
455 
456 #if QT_VERSION < 0x040200
457 #else
458  fViewerTabWidget->setUsesScrollButtons (true);
459 #endif
460  QSizePolicy policy = fViewerTabWidget->sizePolicy();
461  policy.setHorizontalStretch(1);
462  policy.setVerticalStretch(1);
463  fViewerTabWidget->setSizePolicy(policy);
464 
465 #if QT_VERSION < 0x040500
466 #else
467  connect(fViewerTabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(TabCloseCallback(int)));
468 #endif
469  connect(fViewerTabWidget, SIGNAL(currentChanged ( int ) ), SLOT(UpdateTabWidget(int)));
470  }
471 
472  fLastQTabSizeX = sizeX;
473  fLastQTabSizeY = sizeY;
474 
475  if (!aWidget) {
476  return false;
477  }
478 
479  // Remove QLabel
480 
481  // L.Garnier 26/05/2010 : not exactly the same in qt3. Could cause some
482  // troubles
483  if (fEmptyViewerTabLabel != NULL) {
484  int index = fRightSplitterWidget->indexOf(fEmptyViewerTabLabel);
485  if ( index != -1) {
486  fEmptyViewerTabLabel->hide();
487  fEmptyViewerTabLabel->setParent(NULL);
488  delete fEmptyViewerTabLabel;
489  fEmptyViewerTabLabel = NULL;
490 
491  fRightSplitterWidget->insertWidget(index,fViewerTabWidget);
492 
493  aWidget->setParent(fViewerTabWidget);
494  }
495  }
496 
497 #ifdef G4DEBUG_INTERFACES_BASIC
498  printf("G4UIQt::AddTabWidget ADD %d %d + %d %d---------------------------------------------------\n",sizeX, sizeY,sizeX-fViewerTabWidget->width(),sizeY-fViewerTabWidget->height());
499 #endif
500 
501 
502  // Problems with resize. The widgets are not realy drawn at this step,
503  // then we have to force them on order to check the size
504 
505  fViewerTabWidget->insertTab(fViewerTabWidget->count(),aWidget,name);
506 
507  fViewerTabWidget->setCurrentIndex(fViewerTabWidget->count()-1);
508 
509  // Set visible
510  #if QT_VERSION < 0x040200
511  fViewerTabWidget->setLastTabCreated(fViewerTabWidget->currentIndex());
512  #else
513  fViewerTabWidget->setLastTabCreated(fViewerTabWidget->currentIndex());
514  #endif
515 
516  fViewerTabWidget->resize(sizeX,sizeY);
517 
518  return true;
519 }
520 
521 
522 void G4UIQt::UpdateTabWidget(int tabNumber) {
523 #ifdef G4DEBUG_INTERFACES_BASIC
524  printf("G4UIQt::UpdateTabWidget %d\n",tabNumber);
525 #endif
526  if ( fViewerTabWidget == NULL) {
527  fViewerTabWidget = new G4QTabWidget;
528  }
529 
530 #ifdef G4DEBUG_INTERFACES_BASIC
531  printf("G4UIQt::UpdateTabWidget CALL REPAINT tabGL\n");
532 #endif
533 
534  fViewerTabWidget->setCurrentIndex(tabNumber);
535 
536  // Send this signal to unblock graphic updates !
537  fViewerTabWidget->setTabSelected(false);
538 
539  #if QT_VERSION < 0x040200
540  fViewerTabWidget->show();
541  #else
542  fViewerTabWidget->setVisible(true);
543  #endif
544 
545  // This will send a paintEvent to OGL Viewers
546  fViewerTabWidget->setTabSelected(true);
547 
548  QCoreApplication::sendPostedEvents () ;
549 
550 #ifdef G4DEBUG_INTERFACES_BASIC
551  printf("G4UIQt::UpdateTabWidget END\n");
552 #endif
553 }
554 
555 
558 void G4UIQt::ResizeTabWidget( QResizeEvent* e) {
559  for (G4int a=0;a<fViewerTabWidget->count() ;a++) {
560 #ifdef G4DEBUG_INTERFACES_BASIC
561  printf("G4UIQt::ResizeTabWidget +++++++++++++++++++++++++++++++++++++++\n");
562 #endif
563  fViewerTabWidget->widget(a)->resize(e->size());
564  }
565 }
566 
567 
570 G4UIsession* G4UIQt::SessionStart (
571 )
572 {
573 #ifdef G4DEBUG_INTERFACES_BASIC
574  printf("G4UIQt::G4UIQt SessionStart\n");
575 #endif
576 
577  G4Qt* interactorManager = G4Qt::getInstance ();
578 
579  Prompt("Session :");
580  exitSession = false;
581 /*
582  if (fEmptyViewerTabLabel != NULL) {
583  bool visible = false;
584  if (fViewerTabWidget != NULL) {
585  if (fViewerTabWidget->isVisible()) {
586  visible = true;
587  }
588  }
589  }
590 */
591  #if QT_VERSION < 0x040200
592  fMainWindow->show();
593  #else
594  fMainWindow->setVisible(true);
595  #endif
596  // get the size of the tabbar
597  int tabBarX = 0;
598  int tabBarY = 0;
599 
600  if (fViewerTabWidget != NULL) {
601  tabBarX = -fViewerTabWidget->widget(0)->width();
602  tabBarY = -fViewerTabWidget->widget(0)->height();
603  }
604  fMainWindow->resize(tabBarX+fMainWindow->width()+fLastQTabSizeX,tabBarY+fMainWindow->height()+fLastQTabSizeY);
605 
606  QCoreApplication::sendPostedEvents () ;
607 
608 #ifdef G4DEBUG_INTERFACES_BASIC
609  printf("G4UIQt::G4UIQt SessionStart2\n");
610 #endif
611  interactorManager->DisableSecondaryLoop (); // TO KEEP
612  if ((QApplication*)interactorManager->GetMainInteractor())
613  ((QApplication*)interactorManager->GetMainInteractor())->exec();
614 
615  // on ne passe pas le dessous ? FIXME ????
616  // je ne pense pas 13/06
617 
618  // void* event; // TO KEEP
619  // while((event = interactorManager->GetEvent())!=NULL) { // TO KEEP
620  // interactorManager->DispatchEvent(event); // TO KEEP
621  // if(exitSession==true) break; // TO KEEP
622  // } // TO KEEP
623 
624  interactorManager->EnableSecondaryLoop ();
625  return this;
626 }
627 
628 
634 void G4UIQt::Prompt (
635  G4String aPrompt
636 )
637 {
638  if (!aPrompt) return;
639 
640  fCommandLabel->setText((char*)aPrompt.data());
641 }
642 
643 
644 
645 void G4UIQt::SessionTerminate (
646 )
647 {
648  G4Qt* interactorManager = G4Qt::getInstance ();
649  fMainWindow->close();
650  ((QApplication*)interactorManager->GetMainInteractor())->exit();
651 }
652 
653 
654 
663 void G4UIQt::PauseSessionStart (
664  const G4String& aState
665 )
666 {
667  if (!aState) return;
668 
669  if(aState=="G4_pause> ") { // TO KEEP
670  SecondaryLoop ("Pause, type continue to exit this state"); // TO KEEP
671  } // TO KEEP
672 
673  if(aState=="EndOfEvent") { // TO KEEP
674  // Picking with feed back in event data Done here !!!
675  SecondaryLoop ("End of event, type continue to exit this state"); // TO KEEP
676  } // TO KEEP
677 }
678 
679 
680 
685 void G4UIQt::SecondaryLoop (
686  G4String aPrompt
687 )
688 {
689  if (!aPrompt) return;
690 
691  G4Qt* interactorManager = G4Qt::getInstance (); // TO KEEP ?
692  Prompt(aPrompt); // TO KEEP
693  exitPause = false; // TO KEEP
694  void* eventTmp; // TO KEEP
695  while((eventTmp = interactorManager->GetEvent())!=NULL) { // TO KEEP
696  interactorManager->DispatchEvent(eventTmp); // TO KEEP
697  if(exitPause==true) break; // TO KEEP
698  } // TO KEEP
699  Prompt("Session :"); // TO KEEP
700 }
701 
702 
703 
709 G4int G4UIQt::ReceiveG4cout (
710  const G4String& aString
711  )
712 {
713  if (!aString) return 0;
714 
715  QStringList newStr;
716 
717  // Add to stringList
718  newStr = QStringList(QString((char*)aString.data()).trimmed());
719  fG4cout += newStr;
720 
721  QStringList result = newStr.filter(fCoutFilter->text());
722 
723  if (result.join("\n").isEmpty()) {
724  return 0;
725  }
726  fCoutTBTextArea->append(result.join("\n"));
727  fCoutTBTextArea->repaint();
728 
729  fCoutTBTextArea->verticalScrollBar()->setSliderPosition(fCoutTBTextArea->verticalScrollBar()->maximum());
730 
731  return 0;
732 }
733 
734 
740 G4int G4UIQt::ReceiveG4cerr (
741  const G4String& aString
742 )
743 {
744  if (!aString) return 0;
745 
746  QStringList newStr;
747 
748  // Add to stringList
749  newStr = QStringList(QString((char*)aString.data()).trimmed());
750  fG4cout += newStr;
751 
752  QStringList result = newStr.filter(fCoutFilter->text());
753 
754  // Suppress space, \n,\t,\r...
755  if (QString(aString.data()).trimmed() != "") {
756  QMessageBox::critical(fMainWindow, "Error",aString.data());
757  }
758  QColor previousColor = fCoutTBTextArea->textColor();
759  fCoutTBTextArea->setTextColor(Qt::red);
760  fCoutTBTextArea->append(result.join("\n"));
761  fCoutTBTextArea->setTextColor(previousColor);
762  fCoutTBTextArea->verticalScrollBar()->setSliderPosition(fCoutTBTextArea->verticalScrollBar()->maximum());
763  fCoutTBTextArea->repaint();
764  return 0;
765 }
766 
767 
768 
774 void G4UIQt::AddMenu (
775  const char* aName
776 ,const char* aLabel
777 )
778 {
779  if (aName == NULL) return;
780  if (aLabel == NULL) return;
781 
782  QMenu *fileMenu = new QMenu(aLabel);
783  fMainWindow->menuBar()->addMenu(fileMenu);
784 
785  AddInteractor (aName,(G4Interactor)fileMenu);
786 }
787 
788 
795 void G4UIQt::AddButton (
796  const char* aMenu
797 ,const char* aLabel
798 ,const char* aCommand
799 )
800 {
801  if(aMenu==NULL) return; // TO KEEP
802  if(aLabel==NULL) return; // TO KEEP
803  if(aCommand==NULL) return; // TO KEEP
804 
805  QMenu *parentTmp = (QMenu*)GetInteractor(aMenu);
806 
807  if(parentTmp==NULL) {
808  G4cout << "Menu name " << aMenu<< " does not exist, please define it before using it."<< G4endl;
809  }
810 
811  // Find the command in the command tree
813  if(UI==NULL) return;
814  G4UIcommandTree * treeTop = UI->GetTree();
815 
816  G4String cmd = aCommand;
817  G4int cmdEndPos = cmd.find_first_of(" \t");
818  if(cmdEndPos!=G4int(std::string::npos)) {
819  cmd.erase(cmdEndPos);
820  }
821 
822  if(treeTop->FindPath(aCommand) == NULL) {
823  G4cout << "Warning: command '"<< aCommand <<"' does not exist, please define it before using it."<< G4endl;
824  }
825 
826  QSignalMapper *signalMapper = new QSignalMapper(this);
827  QAction *action = parentTmp->addAction(aLabel, signalMapper, SLOT(map()));
828 
829  connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(ButtonCallback(const QString&)));
830  signalMapper->setMapping(action, QString(aCommand));
831 }
832 
833 
834 
835 
839 void G4UIQt::AddIcon(const char* aLabel, const char* aIconFile, const char* aCommand, const char* aFileName){
840  if(aLabel==NULL) return; // TO KEEP
841  // special case, aCommand could be NULL if aIconFile is not user_icon
842  if ((aCommand==NULL) && (std::string(aIconFile) == "user_icon")) return; // TO KEEP
843 
844  QPixmap pix;
845  bool userToolBar = false;
846 
847  if (std::string(aIconFile) == "user_icon") {
848  // try to open a file
849  pix = QPixmap(aFileName);
850  if (pix.isNull()) {
851  G4cout << "Warning: file '"<< aFileName <<"' is incorrect or does not exist, this command will not be build"<< G4endl;
852  return;
853  }
854  userToolBar = true;
855  } else if (std::string(aIconFile) == "open") {
856  const char * const xpm[]={
857  "32 32 33 1",
858  " c None",
859  "+ c #09091E",
860  "@ c #191B18",
861  "# c #5F615F",
862  "$ c #777977",
863  "% c #AEB1AF",
864  "& c #929491",
865  "* c #515250",
866  "= c #858784",
867  "- c #333533",
868  "; c #000100",
869  "> c #272926",
870  ", c #424341",
871  "' c #696C6A",
872  ") c #5F4927",
873  "! c #583D18",
874  "~ c #6E6A5B",
875  "{ c #47351D",
876  "] c #E0A554",
877  "^ c #FFD67B",
878  "/ c #EFB465",
879  "( c #FDBF6C",
880  "_ c #FFCD76",
881  ": c #806238",
882  "< c #362611",
883  "[ c #0B0D0A",
884  "} c #68471B",
885  "| c #523E22",
886  "1 c #B78A51",
887  "2 c #A17B44",
888  "3 c #D6A45E",
889  "4 c #C29354",
890  "5 c #A1A3A0",
891  " ",
892  " ",
893  " +@@@# ",
894  " $% +& * ",
895  " #= $ -; ",
896  " %>;+ ",
897  " ,;;+ ",
898  " &#$''#' >;;;+ ",
899  " =)!)!!!!~ *#$'' ",
900  " {]^/((_({- %%%%%%%%%%% ",
901  " {(^_^^^^:<{{{{{{{{{{{{{[& ",
902  " {/_/(((((/]]]]]]]]]]]/]!# ",
903  " {/^(((((_^^^^^^^^^^^^^^:# ",
904  " {/^(((_^^____________^^}$ ",
905  " {/^(((((/////////////((!# ",
906  " {/^/^_:<|||||||||||||||@@****1 ",
907  " {/^/^(<[)||||||||||||||))!!}<; ",
908  " {/^_(:|234444444444444444432)1 ",
909  " {/_^/<)34444444444444444443}, ",
910  " {/^(2{:41111111111111111142|5 ",
911  " {3^3<:31111111111111111143}- ",
912  " {/^2<:31111111111111111441|' ",
913  " {_/<:41111111111111111143}, ",
914  " {(4<:31111111111111111144!# ",
915  " )4))44111111111111111144}, ",
916  " )2<:31111111111111111144{# ",
917  " @|:14444444444444444444}* ",
918  " ;@434444444444444444434<# ",
919  " ;[))))))))))))))))))))!~ ",
920  " ++++++++++++++++++++++;% ",
921  " ",
922  " "}
923  ;
924  pix = QPixmap(xpm);
925 
926  } else if (std::string(aIconFile) == "save") {
927  const char * const xpm[]={
928  "32 32 24 1",
929  " c None",
930  "+ c #000200",
931  "@ c #141E43",
932  "# c #000C56",
933  "$ c #494A47",
934  "% c #636662",
935  "& c #312F2A",
936  "* c #191B19",
937  "= c #002992",
938  "- c #003DFF",
939  "; c #041DA5",
940  "> c #A8A9A3",
941  ", c #FDFFFC",
942  "' c #DDE0DD",
943  ") c #818783",
944  "! c #C9CBC8",
945  "~ c #0116C3",
946  "{ c #C5C8FA",
947  "] c #6596FC",
948  "^ c #A0B4F9",
949  "/ c #0B2AFD",
950  "( c #799BE3",
951  "_ c #5F4826",
952  ": c #D5D8D5",
953  " ",
954  " ",
955  " +++++++++++++++++++++++++ ",
956  " +@##+$%%%%%%%%%%%%%%%&*$%&+ ",
957  " +=-;@>,,''',,,,,,,',,)&!,)+ ",
958  " +;-~@>,,,,,,,,,,,,,,,>$!,)+ ",
959  " +=-~@>,,,,,{]]]]]^,,,>*&$&+ ",
960  " +=-~@>,,,,,'{^{^^{,,,>*#=#+ ",
961  " +=-~@>,,,,,,,,,,,,,,,>@~/=+ ",
962  " +=-~@>,,,{{{''''{',,,>@~-=+ ",
963  " +=-~@>,,'^]]]]]]({,,,>@~-=+ ",
964  " +=-~@>,,,{{{{{{{{{,,,>@~-=+ ",
965  " +=-~@>,,,,,'{^{{^{,,,>@~-=+ ",
966  " +=-~@>,,,,,]]]]]]],,,>@~-=+ ",
967  " +=-~*>,,,,,,,,,,,,,,,>@~-=+ ",
968  " +=-~@>,,,,,,,,,,,,,,,>@~-=+ ",
969  " +=-/=$%%%%%%%%%%%%%%%$=/-=+ ",
970  " +=---;###############;---=+ ",
971  " +=---////////////////----=+ ",
972  " +=----------------///----=+ ",
973  " +=---=@##############@#--=+ ",
974  " +=---@+++++++++++*%))_+~-=+ ",
975  " +=---#+++++++++++&:,,>@~-=+ ",
976  " +=---#+++++++++++$',,>@~-=+ ",
977  " +=---#+++++++++++&!,,>@~-=+ ",
978  " +=/--#+++++++++++&',,>@~-=+ ",
979  " @;--#+++++++++++$',,>@~-=+ ",
980  " @;;@+++++++++++*)!>%@=;#+ ",
981  " @++++++++++++++*&**++@++ ",
982  " ",
983  " ",
984  " "}
985  ;
986  pix = QPixmap(xpm);
987  } else if (std::string(aIconFile) == "move") {
988  const char * const xpm[]={
989  "32 32 16 1",
990  " c None",
991  ". c #F1F1F1",
992  "+ c #939393",
993  "@ c #282828",
994  "# c #787878",
995  "$ c #000000",
996  "% c #CCCCCC",
997  "& c #1A1A1A",
998  "* c #0D0D0D",
999  "= c #5D5D5D",
1000  "- c #AEAEAE",
1001  "; c #BBBBBB",
1002  "> c #C9C9C9",
1003  ", c #D6D6D6",
1004  "' c #FFFFFF",
1005  ") c #999999",
1006  " ",
1007  " ",
1008  " ",
1009  " ",
1010  " .. ",
1011  " ++ ",
1012  " .@@. ",
1013  " #$$# ",
1014  " %&$$*% ",
1015  " =$$$$= ",
1016  " -**$$**- ",
1017  " %;%&*>;% ",
1018  " -% @& %- ",
1019  " ,=*; @& ;*=, ",
1020  " .#*$$> >$$*#. ",
1021  " ')&$$$$*@@ @@*$$$$&)' ",
1022  " ')&$$$$*@@ @@*$$$$&+' ",
1023  " .#*$$> >$$*#. ",
1024  " ,=*; @& ;*=, ",
1025  " -% @& %- ",
1026  " %;%&*>>% ",
1027  " -**$$**- ",
1028  " =$$$$= ",
1029  " %&$$*% ",
1030  " #$$# ",
1031  " .@@. ",
1032  " ++ ",
1033  " .. ",
1034  " ",
1035  " ",
1036  " ",
1037  " "}
1038  ;
1039  pix = QPixmap(xpm);
1040 
1041  } else if (std::string(aIconFile) == "rotate") {
1042  const char * const xpm[]={
1043  "32 32 27 1",
1044  " c None",
1045  ". c #003333",
1046  "+ c #000066",
1047  "@ c #1A1A1A",
1048  "# c #003399",
1049  "$ c #3333CC",
1050  "% c #000033",
1051  "& c #353535",
1052  "* c #434343",
1053  "= c #336699",
1054  "- c #3399FF",
1055  "; c #003366",
1056  "> c #5D5D5D",
1057  ", c #282828",
1058  "' c #3399CC",
1059  ") c #333333",
1060  "! c #3366CC",
1061  "~ c #333399",
1062  "{ c #505050",
1063  "] c #666666",
1064  "^ c #333366",
1065  "/ c #0033CC",
1066  "( c #3366FF",
1067  "_ c #336666",
1068  ": c #787878",
1069  "< c #868686",
1070  "[ c #6B6B6B",
1071  " .++@ ",
1072  " #$$%&* ",
1073  " =--; *>, ",
1074  " '-= )>& ",
1075  " !-', ,>* ",
1076  " !!=--= >* ",
1077  " =------!!~@&)@ ",
1078  " --------!*{{{*&, ",
1079  " -------=){*{{{>>{) ",
1080  " ,!-----= ){& ,&{{@",
1081  " ,*>!----= &>& )@",
1082  " ){>)~---= *]) @",
1083  " @*>, --! ,&@ ",
1084  " @{* '! ,-!=~^,@ ",
1085  " @& == {/(----!^ ",
1086  " _ ]:;(----' ",
1087  " ==_ >{+(----~ ",
1088  " !-!!======!!(((---! ",
1089  " ='--------------! ",
1090  " =!!!!'!!=; !-! ",
1091  " &<* !~ ",
1092  " @. *[* ; ",
1093  " ;+)>* ",
1094  " @@ ",
1095  " ",
1096  " ",
1097  " ",
1098  " ",
1099  " ",
1100  " ",
1101  " ",
1102  " "}
1103  ;
1104  pix = QPixmap(xpm);
1105 
1106  } else if (std::string(aIconFile) == "pick") {
1107  const char * const xpm[]={
1108  "32 32 2 1",
1109  " c None",
1110  ". c #000000",
1111  " ",
1112  " ",
1113  " ",
1114  " ",
1115  " ",
1116  " ",
1117  " ",
1118  " . ",
1119  " .. ",
1120  " ... ",
1121  " .... ",
1122  " ..... ",
1123  " ...... ",
1124  " ....... ",
1125  " ....... ",
1126  " ........ ",
1127  " ..... ",
1128  " ...... ",
1129  " .. .. ",
1130  " . .. ",
1131  " ... ",
1132  " .. ",
1133  " .. ",
1134  " ",
1135  " ",
1136  " ",
1137  " ",
1138  " ",
1139  " ",
1140  " ",
1141  " ",
1142  " "}
1143  ;
1144  pix = QPixmap(xpm);
1145  } else if (std::string(aIconFile) == "zoom_in") {
1146  const char * const xpm[]={
1147  "32 32 11 1",
1148  " c None",
1149  ". c #C9CBC8",
1150  "+ c #A8A9A3",
1151  "@ c #818783",
1152  "# c #D5D8D5",
1153  "$ c #9BCCCC",
1154  "% c #5FC7F4",
1155  "& c #FDFFFC",
1156  "* c #636662",
1157  "= c #9599CE",
1158  "- c #DDE0DD",
1159  " ",
1160  " ",
1161  " ",
1162  " ",
1163  " ",
1164  " .++@@++. ",
1165  " +++..#.+++ ",
1166  " .@+...++++#+@. ",
1167  " @$.%%+&&&@%..@ ",
1168  " ++.%%%+&&&*%%.++ ",
1169  " .+#%%%%+&&&*%%.#+ ",
1170  " ++..%%%+&&&*%%%.++ ",
1171  " +#.+++++&&&*++++.+ ",
1172  " @.+&&&&&&&&&&&&&+@ ",
1173  " @#+&&&&&&&&&&&&&+@ ",
1174  " @.+&&&&&&&&&&&&&+. ",
1175  " +++@***+&&&****@+. ",
1176  " ....++++&&&*++++.. ",
1177  " ++.===+&&&*%=.++ ",
1178  " @..==+&&&*=..@#& ",
1179  " .@+#.+&&&@-+@@*@ ",
1180  " +++.++++++ *+@* ",
1181  " .+@@@++. @**+* ",
1182  " .*@*+* ",
1183  " .*@*+* ",
1184  " +*@@* ",
1185  " .**+ ",
1186  " ",
1187  " ",
1188  " ",
1189  " ",
1190  " "}
1191  ;
1192  pix = QPixmap(xpm);
1193  } else if (std::string(aIconFile) == "zoom_out") {
1194  const char * const xpm[]={
1195  "32 32 11 1",
1196  " c None",
1197  ". c #C9CBC8",
1198  "+ c #A8A9A3",
1199  "@ c #818783",
1200  "# c #D5D8D5",
1201  "$ c #5FC7F4",
1202  "% c #9BCCCC",
1203  "& c #FDFFFC",
1204  "* c #636662",
1205  "= c #9599CE",
1206  "- c #DDE0DD",
1207  " ",
1208  " ",
1209  " ",
1210  " ",
1211  " ",
1212  " .++@@++. ",
1213  " +++..#.+++ ",
1214  " .@+..$$$$.#+@. ",
1215  " @%.$$$$$$$$..@ ",
1216  " ++.$$$$$$$$$$.++ ",
1217  " .+#$$$$$$$$$$$.#+ ",
1218  " ++..$$$$$$$$$$$.++ ",
1219  " +#.+++++++++++++.+ ",
1220  " @.+&&&&&&&&&&&&&+@ ",
1221  " @#+&&&&&&&&&&&&&+@ ",
1222  " @.+&&&&&&&&&&&&&+. ",
1223  " +++@***********@+. ",
1224  " ....++++++++++++.. ",
1225  " ++.===$$$$$$=.++ ",
1226  " @..===$$$$=..@#& ",
1227  " .@+#.$$$..-+@@*@ ",
1228  " +++#--.+++ *+@* ",
1229  " .+@@@++. @**+* ",
1230  " .*@*+* ",
1231  " .*@*+* ",
1232  " +*@@* ",
1233  " .**+ ",
1234  " ",
1235  " ",
1236  " ",
1237  " ",
1238  " "}
1239  ;
1240  pix = QPixmap(xpm);
1241  } else if (std::string(aIconFile) == "wireframe") {
1242  const char * const xpm[]={
1243  "32 32 24 1",
1244  " c None",
1245  "+ c #E4E4E4",
1246  "@ c #D5D5D5",
1247  "# c #E1E1E1",
1248  "$ c #E7E7E7",
1249  "% c #D8D8D8",
1250  "& c #A7A7A7",
1251  "* c #000000",
1252  "= c #989898",
1253  "- c #8A8A8A",
1254  "; c #B5B5B5",
1255  "> c #1B1B1B",
1256  ", c #676767",
1257  "' c #959595",
1258  ") c #4A4A4A",
1259  "! c #878787",
1260  "~ c #D3D3D3",
1261  "{ c #C4C4C4",
1262  "] c #A4A4A4",
1263  "^ c #5B5B5B",
1264  "/ c #B3B3B3",
1265  "( c #787878",
1266  "_ c #C7C7C7",
1267  ": c #585858",
1268  " ",
1269  " +@@# ",
1270  " $%@@@@@&****=+ ",
1271  " +&********&@-***; ",
1272  " +@@@&**&@@@@@@$ @*-&>&+ ",
1273  " +*****&+ %*@ ,**'# ",
1274  " @***)!~ @*{&*****+ ",
1275  " @*!]***&+ +-*^**'~!*@ ",
1276  " @*~ +@&**&@@@@@@&****&+ ~*@ ",
1277  " @*@ +&********&-*= @*@ ",
1278  " @*@ $%@-*-@$ @*@ @*@ ",
1279  " @*@ @*@ %*% @*@ ",
1280  " @*@ %*% %*% @*@ ",
1281  " @*@ %*% %*% @*@ ",
1282  " @*@ %*% %*% @*@ ",
1283  " @*@ %*% %*% @*@ ",
1284  " @*@ %*% %*% @*@ ",
1285  " @*@ @*@ %*% @*@ ",
1286  " @*@ =*-+ @*@ @*@ ",
1287  " @*@ $%@@&****&@-*-+ @*@ ",
1288  " @*@ $@&*****&@@&******&~~!*@ ",
1289  " @*{/***&@@%$ $@-*-&*****+ ",
1290  " @*)*)(-~ @*@ ~)**] ",
1291  " +*******&@@@@+ %*_+]**] ",
1292  " +@@@@@&******&@%+_*^**]# ",
1293  " $%@@@&****:**&+ ",
1294  " +%@&**& ",
1295  " ++ ",
1296  " ",
1297  " ",
1298  " ",
1299  " "}
1300  ;
1301  pix = QPixmap(xpm);
1302  } else if (std::string(aIconFile) == "solid") {
1303  const char * const xpm[]={
1304  "32 32 33 1",
1305  " c None",
1306  "+ c #C2DEDE",
1307  "@ c #B5D7DF",
1308  "# c #ACD6E6",
1309  "$ c #60C0EC",
1310  "% c #4EB7EE",
1311  "& c #53B9ED",
1312  "* c #82CEEA",
1313  "= c #CFDDDA",
1314  "- c #94C9E8",
1315  "; c #0960FF",
1316  "> c #0943FF",
1317  ", c #0949FF",
1318  "' c #3CB3F0",
1319  ") c #71C7EB",
1320  "! c #73CBE5",
1321  "~ c #D3DDDB",
1322  "{ c #C4DDDE",
1323  "] c #B7D5DF",
1324  "^ c #2DACF5",
1325  "/ c #59C1ED",
1326  "( c #5FC0ED",
1327  "_ c #85CEE9",
1328  ": c #096BFF",
1329  "< c #2AACF6",
1330  "[ c #5CBEEC",
1331  "} c #7ACAE4",
1332  "| c #73CAEB",
1333  "1 c #71C8E5",
1334  "2 c #D1DDDA",
1335  "3 c #CBDDD9",
1336  "4 c #67C1EB",
1337  "5 c #80CDEA",
1338  " ",
1339  " ",
1340  " +@@@@@@#$%&*= ",
1341  " +-;>>>>>>>>>,')!~ ",
1342  " {]@@-;>>>>>>>>>>>>^/(_= ",
1343  " {:>>>>>>>>>>>>>>>>><//[)!= ",
1344  " ]>>>>>>>>>>>>>>>>>><////[)} ",
1345  " @>>>>>>>>>>>>>>>>>><//////| ",
1346  " @>>>>>>>>>>>>>>>>>><//////| ",
1347  " @>>>>>>>>>>>>>>>>>><//////| ",
1348  " @>>>>>>>>>>>>>>>>>><//////| ",
1349  " @>>>>>>>>>>>>>>>>>><//////| ",
1350  " @>>>>>>>>>>>>>>>>>><//////| ",
1351  " @>>>>>>>>>>>>>>>>>><//////| ",
1352  " @>>>>>>>>>>>>>>>>>><//////| ",
1353  " @>>>>>>>>>>>>>>>>>><//////| ",
1354  " @>>>>>>>>>>>>>>>>>><//////| ",
1355  " @>>>>>>>>>>>>>>>>>><//////| ",
1356  " @>>>>>>>>>>>>>>>>>><//////| ",
1357  " @>>>>>>>>>>>>>>>>>><//////| ",
1358  " @>>>>>>>>>>>>>>>>>><//////| ",
1359  " @>>>>>>>>>>>>>>>>>></////[1 ",
1360  " @>>>>>>>>>>>>>>>>>><////[*2 ",
1361  " {:>>>>>>>>>>>>>>>>><//[)12 ",
1362  " +@@@@@-;>>>>>>>>>><[)13 ",
1363  " {]@@@-;>>>,'*3 ",
1364  " +@@#452 ",
1365  " ",
1366  " ",
1367  " ",
1368  " ",
1369  " "}
1370  ;
1371  pix = QPixmap(xpm);
1372  } else if (std::string(aIconFile) == "hidden_line_removal") {
1373  const char * const xpm[]={
1374  "32 32 15 1",
1375  " c None",
1376  "+ c #D5D5D5",
1377  "@ c #C7C7C7",
1378  "# c #9C9C9C",
1379  "$ c #000000",
1380  "% c #8E8E8E",
1381  "& c #808080",
1382  "* c #A9A9A9",
1383  "= c #D8D8D8",
1384  "- c #CACACA",
1385  "; c #181818",
1386  "> c #9F9F9F",
1387  ", c #ACACAC",
1388  "' c #B9B9B9",
1389  ") c #555555",
1390  " ",
1391  " +@@+ ",
1392  " +@@@@@@#$$$$%+ ",
1393  " +#$$$$$$$$#@&$$$* ",
1394  " =-@@#$$#@@@@@-= @$&#;>= ",
1395  " =$$$$$#+ -$@ *$$%+ ",
1396  " -$&@-= -$- #$$$= ",
1397  " -$@ -$- +&$- ",
1398  " @$@ @$@ @$@ ",
1399  " @$@ @$@ @$@ ",
1400  " @$@ @$@ @$@ ",
1401  " @$@ @$@ @$@ ",
1402  " @$@ @$@ @$@ ",
1403  " @$@ @$@ @$@ ",
1404  " @$@ @$@ @$@ ",
1405  " @$@ @$@ @$@ ",
1406  " @$@ @$@ @$@ ",
1407  " @$@ @$@ @$@ ",
1408  " @$@ @$@ @$@ ",
1409  " @$@ @$@ @$@ ",
1410  " @$@ @$@ @$@ ",
1411  " @$@ @$@ #$= ",
1412  " -$&@@@-= -$- =>;, ",
1413  " =$$$$$$$#@@@-= -$'+#$$, ",
1414  " =-@@@@#$$$$$$#@-+'$)$$#+ ",
1415  " =-@@@#$$$$)$$#+ ",
1416  " +@@#$$# ",
1417  " ++ ",
1418  " ",
1419  " ",
1420  " ",
1421  " "}
1422  ;
1423  pix = QPixmap(xpm);
1424  } else if (std::string(aIconFile) == "hidden_line_and_surface_removal") {
1425  const char * const xpm[]={
1426  "32 32 40 1",
1427  " c None",
1428  "+ c #FFFFFF",
1429  "@ c #89A2E9",
1430  "# c #5378E3",
1431  "$ c #A2B5ED",
1432  "% c #5379E3",
1433  "& c #5076E3",
1434  "* c #3E69E4",
1435  "= c #0C43F8",
1436  "- c #043FFE",
1437  "; c #CDD9ED",
1438  "> c #BDCDE9",
1439  ", c #FBFCFC",
1440  "' c #406AE4",
1441  ") c #0439FE",
1442  "! c #0137FF",
1443  "~ c #4F75E3",
1444  "{ c #9EB5E3",
1445  "] c #829FE0",
1446  "^ c #B6C6E7",
1447  "/ c #9DB4E3",
1448  "( c #7E9CE0",
1449  "_ c #B2C3E9",
1450  ": c #7E9AE0",
1451  "< c #86A2E1",
1452  "[ c #CAD6ED",
1453  "} c #5177E3",
1454  "| c #829CE0",
1455  "1 c #BCCCE9",
1456  "2 c #3A67E6",
1457  "3 c #0A43FA",
1458  "4 c #95ACE1",
1459  "5 c #BBCBE9",
1460  "6 c #A9BBE5",
1461  "7 c #96AFE1",
1462  "8 c #BDCBE9",
1463  "9 c #4067E4",
1464  "0 c #6485E5",
1465  "a c #E3EAF3",
1466  "b c #CAD6F3",
1467  " ",
1468  " ",
1469  " ++++ ",
1470  " ++++++++@#$+++ ",
1471  " ++@%####&*=-#+;>, ",
1472  " +++++@'=)))))))!)~+{]^++ ",
1473  " +$%&*=)!!!!!!!!!)~+/(]_+++ ",
1474  " +#-))!!!!!!!!!!!)~+/(::<[+ ",
1475  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1476  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1477  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1478  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1479  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1480  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1481  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1482  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1483  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1484  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1485  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1486  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1487  " +#)!!!!!!!!!!!!!!}+/::::{+ ",
1488  " +#)!!!!!!!!!!!!!!}+/:::|1+ ",
1489  " +$#}}~23!!!!!!!!)~+/(]45, ",
1490  " +++++++@#}}~23!!)~+678++ ",
1491  " ++++++@#~90+a++ ",
1492  " ++++b++ ",
1493  " ++ ",
1494  " ",
1495  " ",
1496  " ",
1497  " ",
1498  " "}
1499  ;
1500  pix = QPixmap(xpm);
1501  } else if (std::string(aIconFile) == "perspective") {
1502  const char * const xpm[]={
1503  "32 32 3 1",
1504  " c None",
1505  ". c #D5D8D5",
1506  "+ c #000000",
1507  " ",
1508  " ",
1509  " ",
1510  " ",
1511  " ",
1512  " ................ ",
1513  " ....+++++++++++++++. ",
1514  " ...++++..+.........+++. ",
1515  " ..++..............++..+. ",
1516  " .+++++++++++++++++.. .+. ",
1517  " .+...............+. .+. ",
1518  " .+. .+. .+. .+. ",
1519  " .+. .+. .+. .+. ",
1520  " .+. .+. .+. .+. ",
1521  " .+. .+. .+. .+. ",
1522  " .+. .+. .+. .+. ",
1523  " .+. .+. .+. .+. ",
1524  " .+. .+. .+. .+. ",
1525  " .+. .+. .+. .+. ",
1526  " .+. .+......+....+. ",
1527  " .+. ..++++++.+.++++. ",
1528  " .+. .++.......+...+.. ",
1529  " .+. .++. .+..++. ",
1530  " .+. ..+.. .+..+. ",
1531  " .+..++. .+.+. ",
1532  " .+.++. .+++. ",
1533  " .+++.............++. ",
1534  " .+++++++++++++++++. ",
1535  " ................... ",
1536  " ",
1537  " ",
1538  " "}
1539  ;
1540  pix = QPixmap(xpm);
1541  } else if (std::string(aIconFile) == "ortho") {
1542  const char * const xpm[]={
1543  "32 32 3 1",
1544  " c None",
1545  ". c #D5D8D5",
1546  "@ c #000000",
1547  " ",
1548  " ",
1549  " ",
1550  " ................... ",
1551  " ..@@@@@@@@@@@@@@@@@. ",
1552  " ..@@@.............@@@. ",
1553  " ..@@.@. ..@..@. ",
1554  " ..@@ ..@. .@@...@. ",
1555  " ..@@..............@@.. .@. ",
1556  " .@@@@@@@@@@@@@@@@@.. .@. ",
1557  " .@...............@. .@. ",
1558  " .@. .@. .@. .@. ",
1559  " .@. .@. .@. .@. ",
1560  " .@. .@. .@. .@. ",
1561  " .@. .@. .@. .@. ",
1562  " .@. .@. .@. .@. ",
1563  " .@. .@. .@. .@. ",
1564  " .@. .@. .@. .@. ",
1565  " .@. .@. .@. .@. ",
1566  " .@. .@. .@. .@. ",
1567  " .@. .@. .@. .@. ",
1568  " .@. .@........@......@. ",
1569  " .@. .@@@@@@@@@.@.@@@@@@. ",
1570  " .@. .@@+........@....@@.. ",
1571  " .@...@. .@...@... ",
1572  " .@.@@. .@.@@ . ",
1573  " .@@@.............@@@.. ",
1574  " .@@@@@@@@@@@@@@@@@... ",
1575  " ................... ",
1576  " ",
1577  " ",
1578  " "}
1579  ;
1580  pix = QPixmap(xpm);
1581  } else {
1582  G4cout << "Parameter"<< aIconFile <<" not defined"<< G4endl;
1583  return;
1584  }
1585  QToolBar *currentToolbar = NULL;
1586  if (userToolBar) {
1587  if (fToolbarUser == NULL) {
1588  fToolbarUser = new QToolBar(fMainWindow);
1589  fToolbarUser->setIconSize (QSize(20,20));
1590  fMainWindow->addToolBar(Qt::TopToolBarArea, fToolbarUser);
1591  }
1592  currentToolbar = fToolbarUser;
1593  } else {
1594  if (fToolbarApp == NULL) {
1595  fToolbarApp = new QToolBar(fMainWindow);
1596  fToolbarApp->setIconSize (QSize(20,20));
1597  fMainWindow->addToolBar(Qt::TopToolBarArea, fToolbarApp);
1598  }
1599  currentToolbar = fToolbarApp;
1600  }
1601 
1602  QSignalMapper *signalMapper = new QSignalMapper(this);
1603  QAction *action = currentToolbar->addAction(pix,aLabel, signalMapper, SLOT(map()));
1604 
1605 
1606  // special cases :"open"
1607  if (std::string(aIconFile) == "open") {
1608  connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(OpenIconCallback(const QString&)));
1609  signalMapper->setMapping(action, QString(aCommand));
1610 
1611  // special cases :"save"
1612  } else if (std::string(aIconFile) == "save") {
1613  connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(SaveIconCallback(const QString&)));
1614  signalMapper->setMapping(action, QString(aCommand));
1615 
1616  // special cases : cursor style
1617  } else if ((std::string(aIconFile) == "move") ||
1618  (std::string(aIconFile) == "rotate") ||
1619  (std::string(aIconFile) == "pick") ||
1620  (std::string(aIconFile) == "zoom_out") ||
1621  (std::string(aIconFile) == "zoom_in")) {
1622  action->setCheckable(TRUE);
1623  action->setChecked(TRUE);
1624  action->setData(aIconFile);
1625 
1626  connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(ChangeCursorStyle(const QString&)));
1627  signalMapper->setMapping(action, QString(aIconFile));
1628 
1629  if (std::string(aIconFile) == "move") {
1630  SetIconMoveSelected();
1631  }
1632  if (std::string(aIconFile) == "rotate") {
1633  SetIconRotateSelected();
1634  }
1635  if (std::string(aIconFile) == "pick") {
1636  SetIconPickSelected();
1637  }
1638  if (std::string(aIconFile) == "zoom_in") {
1639  SetIconZoomInSelected();
1640  }
1641  if (std::string(aIconFile) == "zoom_out") {
1642  SetIconZoomOutSelected();
1643  }
1644 
1645  // special case : surface style
1646  } else if ((std::string(aIconFile) == "hidden_line_removal") ||
1647  (std::string(aIconFile) == "hidden_line_and_surface_removal") ||
1648  (std::string(aIconFile) == "solid") ||
1649  (std::string(aIconFile) == "wireframe")) {
1650  action->setCheckable(TRUE);
1651  action->setChecked(TRUE);
1652  action->setData(aIconFile);
1653  connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(ChangeSurfaceStyle(const QString&)));
1654  signalMapper->setMapping(action, QString(aIconFile));
1655 
1656  if (std::string(aIconFile) == "hidden_line_removal") {
1657  SetIconHLRSelected();
1658  }
1659  if (std::string(aIconFile) == "hidden_line_and_surface_removal") {
1660  SetIconHLHSRSelected();
1661  }
1662  if (std::string(aIconFile) == "solid") {
1663  SetIconSolidSelected();
1664  }
1665  if (std::string(aIconFile) == "wireframe") {
1666  SetIconWireframeSelected();
1667  }
1668 
1669  // special case : perspective/ortho
1670  } else if ((std::string(aIconFile) == "perspective") ||
1671  (std::string(aIconFile) == "ortho")) {
1672  action->setCheckable(TRUE);
1673  action->setChecked(TRUE);
1674  action->setData(aIconFile);
1675  connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(ChangePerspectiveOrtho(const QString&)));
1676  signalMapper->setMapping(action, QString(aIconFile));
1677 
1678  if (std::string(aIconFile) == "perspective") {
1679  SetIconPerspectiveSelected();
1680  }
1681  if (std::string(aIconFile) == "ortho") {
1682  SetIconOrthoSelected();
1683  }
1684 
1685  } else {
1686 
1687  // Find the command in the command tree
1689  if(UI==NULL) return;
1690  G4UIcommandTree * treeTop = UI->GetTree();
1691 
1692  if(treeTop->FindPath(aCommand) == NULL) {
1693  G4cout << "Warning: command '"<< aCommand <<"' does not exist, please define it before using it."<< G4endl;
1694  }
1695 
1696  connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(ButtonCallback(const QString&)));
1697  signalMapper->setMapping(action, QString(aCommand));
1698  }
1699 }
1700 
1701 
1702 
1703 void G4UIQt::ActivateCommand(
1704  G4String newCommand
1705 )
1706 {
1707  if (!fHelpTreeWidget) {
1708  return;
1709  }
1710  // Look for the choosen command "newCommand"
1711  size_t i = newCommand.index(" ");
1712  G4String targetCom ="";
1713  if( i != std::string::npos )
1714  {
1715  G4String newValue = newCommand(i+1,newCommand.length()-(i+1));
1716  newValue.strip(G4String::both);
1717  targetCom = ModifyToFullPathCommand( newValue );
1718  }
1719 #ifdef G4DEBUG_INTERFACES_BASIC
1720  printf("G4UIQt::ActivateCommand found : %s \n",targetCom.data());
1721 #endif
1722  if (targetCom != "") {
1723  OpenHelpTreeOnCommand(targetCom.data());
1724  }
1725 
1726  fUITabWidget->setCurrentWidget(fHelpTBWidget);
1727 }
1728 
1729 
1730 
1737 void G4UIQt::InitHelpTreeAndVisParametersWidget()
1738 {
1739 
1740  if (! fHelpTreeWidget ) {
1741  fHelpTreeWidget = new QTreeWidget();
1742  }
1743 
1744  // build widget
1745  fHelpTreeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
1746  QStringList labels;
1747  labels << QString("Command");
1748  fHelpTreeWidget->setHeaderLabels(labels);
1749 
1750 
1751  connect(fHelpTreeWidget, SIGNAL(itemSelectionChanged ()),this, SLOT(HelpTreeClicCallback()));
1752  connect(fHelpTreeWidget, SIGNAL(itemDoubleClicked (QTreeWidgetItem*,int)),this, SLOT(HelpTreeDoubleClicCallback()));
1753 
1754 }
1761 void G4UIQt::FillHelpTree()
1762 {
1763  if (! fHelpTreeWidget ) {
1764  InitHelpTreeAndVisParametersWidget();
1765  }
1766 
1767  QString searchText = fHelpLine->text();
1768 
1769  if (searchText =="") {
1770  // clear old help tree
1771  // fHelpTreeWidget->clear();
1772  } else {
1773  return;
1774  }
1775 
1776  if (fHelpArea) {
1777 #if QT_VERSION < 0x040200
1778  fHelpArea->clear();
1779 #else
1780  fHelpArea->setText("");
1781 #endif
1782  }
1783 
1784  if (fHelpLine) {
1785 #if QT_VERSION < 0x040200
1786  fHelpLine->clear();
1787 #else
1788  fHelpLine->setText("");
1789 #endif
1790  }
1791 
1793  if(UI==NULL) return;
1794  G4UIcommandTree * treeTop = UI->GetTree();
1795 
1796  G4int treeSize = treeTop->GetTreeEntry();
1797  QTreeWidgetItem * newItem = NULL;
1798  QString commandText = "";
1799  for (int a=0;a<treeSize;a++) {
1800  // Creating new item
1801  newItem = NULL;
1802 
1803  commandText = QString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()).trimmed();
1804 
1805  // if already exist, don't create it !
1806  for (int b=0;b<fHelpTreeWidget->topLevelItemCount();b++) {
1807  if (!newItem)
1808  newItem = FindTreeItem(fHelpTreeWidget->topLevelItem(b),commandText);
1809  }
1810 
1811  if (newItem == NULL) {
1812 
1813  newItem = new QTreeWidgetItem(fHelpTreeWidget);
1814  newItem->setText(0,GetShortCommandPath(commandText));
1815  }
1816 
1817  // look for childs
1818  CreateHelpTree(newItem,treeTop->GetTree(a+1));
1819  }
1820 
1821 }
1822 
1823 
1824 
1829 void G4UIQt::CreateHelpTree(
1830  QTreeWidgetItem *aParent
1831 ,G4UIcommandTree *aCommandTree
1832 )
1833 {
1834  if (aParent == NULL) return;
1835  if (aCommandTree == NULL) return;
1836 
1837 
1838  // Creating new item
1839  QTreeWidgetItem * newItem;
1840 
1841  QString commandText = "";
1842  // Get the Sub directories
1843  for (int a=0;a<aCommandTree->GetTreeEntry();a++) {
1844 
1845  commandText = QString((char*)(aCommandTree->GetTree(a+1)->GetPathName()).data()).trimmed();
1846 
1847  // if already exist, don't create it !
1848  newItem = FindTreeItem(aParent,commandText);
1849  if (newItem == NULL) {
1850  newItem = new QTreeWidgetItem(aParent);
1851  newItem->setText(0,GetShortCommandPath(commandText));
1852  }
1853  CreateHelpTree(newItem,aCommandTree->GetTree(a+1));
1854  }
1855 
1856  // Get the Commands
1857 
1858  for (int a=0;a<aCommandTree->GetCommandEntry();a++) {
1859 
1860  QStringList stringList;
1861  commandText = QString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()).trimmed();
1862 
1863  // if already exist, don't create it !
1864  newItem = FindTreeItem(aParent,commandText);
1865  if (newItem == NULL) {
1866  newItem = new QTreeWidgetItem(aParent);
1867  newItem->setText(0,GetShortCommandPath(commandText));
1868 
1869 #if QT_VERSION < 0x040202
1870  fHelpTreeWidget->setItemExpanded(newItem,false);
1871 #else
1872  newItem->setExpanded(false);
1873 #endif
1874  }
1875  }
1876 }
1877 
1878 
1879 
1880 
1886 bool G4UIQt::CreateVisCommandGroupAndToolBox(
1887  G4UIcommand* aCommand
1888 ,QWidget* aParent
1889 ,int aDepthLevel
1890 ,bool isDialog
1891 )
1892 {
1893  QString commandText = QString((char*)(aCommand->GetCommandPath().data())).section("/",-aDepthLevel);
1894 
1895  if (commandText == NULL) {
1896  return false;
1897  }
1898 
1899  // Look if groupBox is create
1900  // QGroupBox* gBoxCommandWidget;
1901  QWidget* newParentWidget = NULL;
1902  bool found = false;
1903  QString commandSection = commandText.left(commandText.indexOf("/"));
1904 
1905  if (aDepthLevel == 1) {
1906  QToolBox* currentParent = dynamic_cast<QToolBox*>(aParent);
1907  if (currentParent != 0){
1908 
1909  // already exists ?
1910  for (int a=0; a<currentParent->count(); a++) {
1911  if (currentParent->itemText(a) == commandSection) {
1912  found = true;
1913  newParentWidget = currentParent->widget(a);
1914  }
1915  }
1916  }
1917  // Not found ? create it
1918  if (!found) {
1919  newParentWidget = new QGroupBox();
1920  // newParentWidget->setSizePolicy (QSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum));
1921  newParentWidget->setLayout(new QVBoxLayout());
1922  if (currentParent != 0){
1923  currentParent->addItem(newParentWidget,commandSection);
1924  } else {
1925  if (!aParent->layout()) {
1926  aParent->setLayout(new QVBoxLayout());
1927  }
1928  aParent->layout()->addWidget(newParentWidget);
1929  }
1930 
1931  if (commandText.indexOf("/") == -1) {
1932 
1933  // Guidance
1934  QString guidance;
1935  G4int n_guidanceEntry = aCommand->GetGuidanceEntries();
1936  for( G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) {
1937  guidance += QString((char*)(aCommand->GetGuidanceLine(i_thGuidance)).data()) + "\n";
1938  }
1939  newParentWidget->setToolTip(guidance);
1940  }
1941 
1942  QScrollArea* sc = dynamic_cast<QScrollArea*>(newParentWidget->parent()->parent());
1943  if (sc != 0) {
1944  sc->ensureWidgetVisible(newParentWidget);
1945  // sc->setSizePolicy (QSizePolicy(QSizePolicy::Maximum,QSizePolicy::Maximum));
1946 
1947  }
1948  }
1949  } else {
1950 
1951  // try to know if this level is already there
1952  QGroupBox* currentParent = dynamic_cast<QGroupBox*>(aParent);
1953  if (currentParent != 0){
1954 
1955  // if depth==2, then we add a [more parameters inside] to the toolBoxItem parent
1956  // QGroupBox > QWidget > QScrollArea > QToolBox
1957  if (aDepthLevel == 2){
1958  QToolBox* parentToolBox = dynamic_cast<QToolBox*>(currentParent->parent()->parent()->parent());
1959  if (parentToolBox != 0) {
1960  // parentToolBox->setItemText(parentToolBox->indexOf(currentParent),"[more parameters inside]");
1961  }
1962  }
1963  for (int a=0; a<aParent->layout()->count(); a++) {
1964  QGroupBox* gb = dynamic_cast<QGroupBox*>(aParent->layout()->itemAt(a)->widget());
1965  if (gb != 0) {
1966  if (gb->title() == commandSection) {
1967  found = true;
1968  newParentWidget = gb;
1969  }
1970  }
1971  }
1972  }
1973 
1974  // Not found ? create it
1975  if (!found) {
1976  newParentWidget = new QGroupBox(commandSection);
1977  newParentWidget->setLayout(new QVBoxLayout());
1978  if (!aParent->layout()) {
1979  aParent->setLayout(new QVBoxLayout());
1980  }
1981  aParent->layout()->addWidget(newParentWidget);
1982 
1983  // set toolTip
1984  // Guidance
1985  QString guidance;
1986  G4int n_guidanceEntry = aCommand->GetGuidanceEntries();
1987  for( G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) {
1988  guidance += QString((char*)(aCommand->GetGuidanceLine(i_thGuidance)).data()) + "\n";
1989  }
1990  newParentWidget->setToolTip(guidance);
1991  }
1992  }
1993 
1994  // fill command groupbox
1995  if (commandText.indexOf("/") == -1) {
1996  if (CreateCommandWidget(aCommand, newParentWidget,isDialog)) {
1997  return true;
1998  }
1999  } else {
2000  CreateVisCommandGroupAndToolBox(aCommand,newParentWidget, aDepthLevel-1,isDialog);
2001  }
2002 
2003  return true;
2004 }
2005 
2006 
2007 
2013 bool G4UIQt::CreateCommandWidget(G4UIcommand* aCommand, QWidget* aParent, bool isDialog) {
2014 
2015  if (aCommand == NULL) {
2016  return false;
2017  }
2018 
2019 
2020  // parameters
2021  G4int n_parameterEntry = aCommand->GetParameterEntries();
2022  if( n_parameterEntry > 0 ) {
2023  G4UIparameter *param;
2024 
2025  // Re-implementation of G4UIparameter.cc
2026  QWidget* paramWidget = new QWidget();
2027  QGridLayout* gridLayout = new QGridLayout(paramWidget);
2028 
2029  // Special case for colour, try to display a color chooser if we found red/green/blue parameter
2030  unsigned int nbColorParameter = 0;
2031  bool isStillColorParameter = false;
2032  bool isColorDialogAdded = false;
2033  QLabel* redLabel = NULL;
2034  QLabel* greenLabel = NULL;
2035  QString redDefaultStr = "";
2036  QString greenDefaultStr = "";
2037  QString blueDefaultStr = "";
2038  QWidget* redInput = NULL;
2039  QWidget* greenInput = NULL;
2040 
2041  for( G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
2042  QString txt;
2043  param = aCommand->GetParameter(i_thParameter);
2044  QLabel* label = new QLabel(QString((char*)(param->GetParameterName()).data()));
2045 
2046  if ((label->text() == "red") || (label->text() == "red_or_string")){
2047  nbColorParameter ++;
2048  isStillColorParameter = true;
2049  } else if ((label->text() == "green") && isStillColorParameter) {
2050  nbColorParameter ++;
2051  } else if ((label->text() == "blue") && isStillColorParameter) {
2052  nbColorParameter ++;
2053  } else if (!isColorDialogAdded) {
2054 
2055  // not following red/green/blue parameters ?
2056  if (nbColorParameter == 1) {
2057  gridLayout->addWidget(redLabel,i_thParameter-1,0);
2058  gridLayout->addWidget(redInput,i_thParameter-1,1);
2059  } else if (nbColorParameter == 2) {
2060  gridLayout->addWidget(redLabel,i_thParameter-2,0);
2061  gridLayout->addWidget(redInput,i_thParameter-2,1);
2062  gridLayout->addWidget(greenLabel,i_thParameter-1,0);
2063  gridLayout->addWidget(greenInput,i_thParameter-1,1);
2064  }
2065  nbColorParameter = 0;
2066  }
2067  // Check parameter type, could be NULL if not found
2068  QWidget* input = NULL;
2069  if ((QString(QChar(param->GetParameterType())) == "d") || (QString(QChar(param->GetParameterType())) == "i")) {
2070  input = new QLineEdit();
2071  // set default value
2072  dynamic_cast<QLineEdit*>(input)->setText(QString((char*)(param->GetDefaultValue()).data()));
2073 
2074  if (((label->text() == "red") || (label->text() == "red_or_string")) && isStillColorParameter) {
2075  redDefaultStr = QString((char*)(param->GetDefaultValue()).data());
2076  } else if ((label->text() == "green") && isStillColorParameter) {
2077  greenDefaultStr = QString((char*)(param->GetDefaultValue()).data());
2078  } else if ((label->text() == "green") && isStillColorParameter) {
2079  blueDefaultStr = QString((char*)(param->GetDefaultValue()).data());
2080  }
2081 
2082  } else if (QString(QChar(param->GetParameterType())) == "b") {
2083  input = new QWidget();
2084  QHBoxLayout* layout = new QHBoxLayout(input);
2085 
2086  QButtonGroup* buttons = new QButtonGroup();
2087  QRadioButton* radioOff = new QRadioButton("0");
2088  QRadioButton* radioOn = new QRadioButton("1");
2089  buttons->addButton(radioOn);
2090  buttons->addButton(radioOff);
2091  layout->addWidget(radioOn);
2092  layout->addWidget(radioOff);
2093 
2094  // set default value
2095  QString defaultValue = QString((char*)(param->GetDefaultValue()).data());
2096  if (defaultValue == "0") {
2097  radioOff->setChecked(true);
2098  } else if (defaultValue == "1") {
2099  radioOn->setChecked(true);
2100  }
2101  } else if ((QString(QChar(param->GetParameterType())) == "s") && (!param->GetParameterCandidates().isNull())) {
2102  input = new QComboBox();
2103  QString candidates = QString((char*)(param->GetParameterCandidates()).data());
2104  QStringList list = candidates.split (" ");
2105 
2106  // add all candidates to widget
2107  QString defaultValue = QString((char*)(param->GetDefaultValue()).data());
2108  for (int a=0; a<list.size(); a++) {
2109  dynamic_cast<QComboBox*>(input)->addItem(list.at(a));
2110  if (list.at(a) == defaultValue) {
2111  dynamic_cast<QComboBox*>(input)->setCurrentIndex(a);
2112  }
2113  }
2114 
2115  } else if ((QString(QChar(param->GetParameterType())) == "s")) { // string
2116  input = new QLineEdit();
2117  // set default value
2118  dynamic_cast<QLineEdit*>(input)->setText(QString((char*)(param->GetDefaultValue()).data()));
2119 
2120  } else if ((QString(QChar(param->GetParameterType())) == "c")) { // on/off
2121  input = new QWidget();
2122  QHBoxLayout* layout = new QHBoxLayout(input);
2123 
2124  QButtonGroup* buttons = new QButtonGroup();
2125  QRadioButton* radioOff = new QRadioButton("off");
2126  QRadioButton* radioOn = new QRadioButton("on");
2127  buttons->addButton(radioOn);
2128  buttons->addButton(radioOff);
2129  layout->addWidget(radioOn);
2130  layout->addWidget(radioOff);
2131 
2132  // set default value
2133  QString defaultValue = QString((char*)(param->GetDefaultValue()).data());
2134  if (defaultValue == "off") {
2135  radioOff->setChecked(true);
2136  } else if (defaultValue == "on") {
2137  radioOn->setChecked(true);
2138  }
2139 
2140  } else {
2141  input = new QLineEdit();
2142  dynamic_cast<QLineEdit*>(input)->setText(QString((char*)(param->GetDefaultValue()).data()));
2143  }
2144 
2145  txt += "\nParameter : " + QString((char*)(param->GetParameterName()).data()) + "\n";
2146  if( ! param->GetParameterGuidance().isNull() )
2147  txt += QString((char*)(param->GetParameterGuidance()).data())+ "\n" ;
2148 
2149  txt += " Parameter type : " + QString(QChar(param->GetParameterType())) + "\n";
2150  if(param->IsOmittable()){
2151  txt += " Omittable : True\n";
2152  } else {
2153  txt += " Omittable : False\n";
2154  }
2155  if( param->GetCurrentAsDefault() ) {
2156  txt += " Default value : taken from the current value\n";
2157  } else if( ! param->GetDefaultValue().isNull() ) {
2158  txt += " Default value : " + QString((char*)(param->GetDefaultValue()).data())+ "\n";
2159  }
2160  if( ! param->GetParameterRange().isNull() ) {
2161  txt += " Parameter range : " + QString((char*)(param->GetParameterRange()).data())+ "\n";
2162  }
2163  if( ! param->GetParameterCandidates().isNull() ) {
2164  txt += " Candidates : " + QString((char*)(param->GetParameterCandidates()).data())+ "\n";
2165  }
2166 
2167  if (isStillColorParameter && (nbColorParameter != 0)) {
2168  if ((label->text() == "red") || (label->text() == "red_or_string")) {
2169  redLabel = label;
2170  redInput = input;
2171  } else if (label->text() == "green") {
2172  greenLabel = label;
2173  greenInput = input;
2174  } else if (label->text() == "blue") {
2175 
2176  // we have all, then add a color chooser
2177 
2178  // Create a pixmap with the default color
2179  QColor qc;
2180  if ((redDefaultStr != "") && (redDefaultStr != "") && (redDefaultStr != "")) {
2181  qc.setRgbF(redDefaultStr.toDouble(),
2182  greenDefaultStr.toDouble(),
2183  blueDefaultStr.toDouble());
2184  }
2185  QPixmap pixmap = QPixmap(QSize(16, 16));
2186  pixmap.fill (qc);
2187  QPainter painter(&pixmap);
2188  painter.setPen(Qt::black);
2189  painter.drawRect(0,0,15,15); // Draw contour
2190 
2191  input = new QPushButton("Change color");
2192  dynamic_cast<QPushButton*>(input)->setIcon(pixmap);
2193  dynamic_cast<QPushButton*>(input)->setAccessibleName(redDefaultStr+" "+greenDefaultStr+" "+blueDefaultStr);
2194  label = new QLabel("Choose color");
2195 
2196  // less 1 because we have to add one to the row number
2197  nbColorParameter--;
2198  gridLayout->addWidget(label,i_thParameter-nbColorParameter,0);
2199  input->setToolTip("Select the current color");
2200  gridLayout->addWidget(input,i_thParameter-nbColorParameter,1);
2201 
2202  // Connect pushButton to ColorDialog in callback
2203  QSignalMapper* signalMapper = new QSignalMapper(this);
2204  signalMapper->setMapping(input,input);
2205  connect(input, SIGNAL(clicked()), signalMapper, SLOT(map()));
2206  connect(signalMapper, SIGNAL(mapped(QWidget*)),this, SLOT(ChangeColorCallback(QWidget*)));
2207 
2208  isColorDialogAdded = true;
2209  isStillColorParameter = false;
2210  }
2211  } else {
2212  gridLayout->addWidget(label,i_thParameter-nbColorParameter,0);
2213  input->setToolTip(txt);
2214  gridLayout->addWidget(input,i_thParameter-nbColorParameter,1);
2215  }
2216  }
2217  // add command name in hidden value at last line position 0
2218  QLabel* name = new QLabel(QString((char*)(aCommand->GetCommandPath().data())));
2219  name->hide();
2220  gridLayout->addWidget(name,n_parameterEntry-nbColorParameter,0);
2221 
2222  QPushButton* applyButton = new QPushButton("Apply");
2223  if (!isDialog) {
2224 
2225  gridLayout->addWidget(applyButton,n_parameterEntry-nbColorParameter,1);
2226 
2227  QSignalMapper* signalMapper = new QSignalMapper(this);
2228  signalMapper->setMapping(applyButton, paramWidget);
2229  connect(applyButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
2230  connect(signalMapper, SIGNAL(mapped(QWidget*)),this, SLOT(VisParameterCallback(QWidget*)));
2231  } else {
2232  // Apply/Cancel buttons
2233 
2234  applyButton->setAutoDefault( TRUE );
2235  applyButton->setDefault( TRUE );
2236  gridLayout->addWidget(applyButton,n_parameterEntry-nbColorParameter,0);
2237 
2238  QPushButton* cancelButton = new QPushButton( tr( "&Cancel" ));
2239  cancelButton->setAutoDefault( TRUE );
2240  gridLayout->addWidget(cancelButton,n_parameterEntry-nbColorParameter,1);
2241 
2242  QSignalMapper* signalMapper = new QSignalMapper(this);
2243  signalMapper->setMapping(applyButton, paramWidget);
2244  connect(applyButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
2245  connect(signalMapper, SIGNAL(mapped(QWidget*)),this, SLOT(VisParameterCallback(QWidget*)));
2246 
2247  QWidget * parentCheck = aParent;
2248  QDialog* parentDialog = NULL;
2249  bool found = false;
2250  while ((parentCheck->parentWidget()) != NULL) {
2251  parentCheck = parentCheck->parentWidget();
2252  parentDialog = dynamic_cast<QDialog*>(parentCheck);
2253  if (parentDialog) {
2254  connect( applyButton, SIGNAL( clicked() ), parentDialog, SLOT( accept() ) );
2255  connect( cancelButton, SIGNAL( clicked() ), parentDialog, SLOT( reject() ) );
2256  found = true;
2257  }
2258  }
2259  if (!found) {
2260  return false;
2261  }
2262  }
2263 
2264  if (!aParent->layout()) {
2265  aParent->setLayout(new QVBoxLayout());
2266  }
2267  aParent->layout()->addWidget(paramWidget);
2268  }
2269 
2270  return true;
2271 }
2272 
2273 
2278 QTreeWidgetItem* G4UIQt::FindTreeItem(
2279  QTreeWidgetItem *aParent
2280 ,const QString& aCommand
2281 )
2282 {
2283  if (aParent == NULL) return NULL;
2284 
2285  // Suppress last "/"
2286  QString myCommand = aCommand;
2287 
2288  if (myCommand.lastIndexOf("/") == (myCommand.size()-1)) {
2289  myCommand = myCommand.left(myCommand.size()-1);
2290  }
2291 
2292  if (GetLongCommandPath(aParent) == myCommand)
2293  return aParent;
2294 
2295  QTreeWidgetItem * tmp = NULL;
2296  for (int a=0;a<aParent->childCount();a++) {
2297  if (!tmp)
2298  tmp = FindTreeItem(aParent->child(a),myCommand);
2299  }
2300  return tmp;
2301 }
2302 
2303 
2304 
2312 QString G4UIQt::GetCommandList (
2313  const G4UIcommand *aCommand
2314 )
2315 {
2316 
2317  QString txt ="";
2318  if (aCommand == NULL)
2319  return txt;
2320 
2321  G4String commandPath = aCommand->GetCommandPath();
2322  G4String rangeString = aCommand->GetRange();
2323  G4int n_guidanceEntry = aCommand->GetGuidanceEntries();
2324  G4int n_parameterEntry = aCommand->GetParameterEntries();
2325 
2326  if ((commandPath == "") &&
2327  (rangeString == "") &&
2328  (n_guidanceEntry == 0) &&
2329  (n_parameterEntry == 0)) {
2330  return txt;
2331  }
2332 
2333  if((commandPath.length()-1)!='/') {
2334  txt += "Command " + QString((char*)(commandPath).data()) + "\n";
2335  }
2336  txt += "Guidance :\n";
2337 
2338  for( G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) {
2339  txt += QString((char*)(aCommand->GetGuidanceLine(i_thGuidance)).data()) + "\n";
2340  }
2341  if( ! rangeString.isNull() ) {
2342  txt += " Range of parameters : " + QString((char*)(rangeString).data()) + "\n";
2343  }
2344  if( n_parameterEntry > 0 ) {
2345  G4UIparameter *param;
2346 
2347  // Re-implementation of G4UIparameter.cc
2348 
2349  for( G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
2350  param = aCommand->GetParameter(i_thParameter);
2351  txt += "\nParameter : " + QString((char*)(param->GetParameterName()).data()) + "\n";
2352  if( ! param->GetParameterGuidance().isNull() )
2353  txt += QString((char*)(param->GetParameterGuidance()).data())+ "\n" ;
2354  txt += " Parameter type : " + QString(QChar(param->GetParameterType())) + "\n";
2355  if(param->IsOmittable()){
2356  txt += " Omittable : True\n";
2357  } else {
2358  txt += " Omittable : False\n";
2359  }
2360  if( param->GetCurrentAsDefault() ) {
2361  txt += " Default value : taken from the current value\n";
2362  } else if( ! param->GetDefaultValue().isNull() ) {
2363  txt += " Default value : " + QString((char*)(param->GetDefaultValue()).data())+ "\n";
2364  }
2365  if( ! param->GetParameterRange().isNull() ) {
2366  txt += " Parameter range : " + QString((char*)(param->GetParameterRange()).data())+ "\n";
2367  }
2368  if( ! param->GetParameterCandidates().isNull() ) {
2369  txt += " Candidates : " + QString((char*)(param->GetParameterCandidates()).data())+ "\n";
2370  }
2371  }
2372  }
2373  return txt;
2374 }
2375 
2376 
2382 G4bool G4UIQt::IsGUICommand(
2383  const G4UIcommand *aCommand
2384 )
2385 {
2386  if (aCommand == NULL)
2387  return false;
2388 
2389  G4int n_parameterEntry = aCommand->GetParameterEntries();
2390 
2391  if( n_parameterEntry > 0 ) {
2392  G4UIparameter *param;
2393 
2394  // Re-implementation of G4UIparameter.cc
2395 
2396  for( G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
2397  param = aCommand->GetParameter(i_thParameter);
2398  if (QString(QChar(param->GetParameterType())) == "d") {
2399  return true;
2400  }
2401  if (QString(QChar(param->GetParameterType())) == "b") {
2402  return true;
2403  }
2404  if (QString(QChar(param->GetParameterType())) == "i") {
2405  return true;
2406  }
2407  if (QString(QChar(param->GetParameterType())) == "s" && (!param->GetParameterCandidates().isNull())) {
2408  return true;
2409  }
2410  }
2411  }
2412  return false;
2413 }
2414 
2415 
2418 G4bool G4UIQt::GetHelpChoice(
2419  G4int&
2420 )
2421 {
2422 #ifdef G4DEBUG_INTERFACES_BASIC
2423  printf("G4UIQt::GetHelpChoice SHOULD NEVER GO HERE");
2424 #endif
2425  return true;
2426 }
2427 
2428 
2436 bool G4UIQt::eventFilter( // Should stay with a minuscule eventFilter because of Qt
2437  QObject *aObj
2438 ,QEvent *aEvent
2439 )
2440 {
2441  bool moveCommandCursor = false;
2442  if (aObj == NULL) return false;
2443  if (aEvent == NULL) return false;
2444 
2445  if (aObj == fHistoryTBTableList) {
2446  if (aEvent->type() == QEvent::KeyPress) {
2447  fCommandArea->setFocus();
2448  }
2449  }
2450  if (aObj == fCommandArea) {
2451  if (aEvent->type() == QEvent::KeyPress) {
2452  QKeyEvent *e = static_cast<QKeyEvent*>(aEvent);
2453  if ((e->key() == (Qt::Key_Down)) ||
2454  (e->key() == (Qt::Key_PageDown)) ||
2455  (e->key() == (Qt::Key_Up)) ||
2456  (e->key() == (Qt::Key_PageUp))) {
2457  int selection = fHistoryTBTableList->currentRow();
2458  if (fHistoryTBTableList->count()) {
2459  if (selection == -1) {
2460  selection = fHistoryTBTableList->count()-1;
2461  } else {
2462  if (e->key() == (Qt::Key_Down)) {
2463  if (selection <(fHistoryTBTableList->count()-1))
2464  selection++;
2465  } else if (e->key() == (Qt::Key_PageDown)) {
2466  selection = fHistoryTBTableList->count()-1;
2467  } else if (e->key() == (Qt::Key_Up)) {
2468  if (selection >0)
2469  selection --;
2470  } else if (e->key() == (Qt::Key_PageUp)) {
2471  selection = 0;
2472  }
2473  }
2474  fHistoryTBTableList->clearSelection();
2475 #if QT_VERSION < 0x040202
2476  fHistoryTBTableList->setItemSelected(fHistoryTBTableList->item(selection),true);
2477 #else
2478  fHistoryTBTableList->item(selection)->setSelected(true);
2479 #endif
2480  fHistoryTBTableList->setCurrentItem(fHistoryTBTableList->item(selection));
2481  }
2482  moveCommandCursor = true;
2483  } else if (e->key() == (Qt::Key_Tab)) {
2484  G4String ss = Complete(fCommandArea->text().toStdString().c_str());
2485  fCommandArea->setText((char*)(ss.data()));
2486 
2487  // do not pass by parent, it will disable widget tab focus !
2488  return true;
2489  // L.Garnier : MetaModifier is CTRL for MAC, but I don't want to put a MAC
2490  // specific #ifdef
2491  } else if (((e->modifiers () == Qt::ControlModifier) || (e->modifiers () == Qt::MetaModifier)) && (e->key() == Qt::Key_A)) {
2492  fCommandArea->home(false);
2493  return true;
2494  } else if (((e->modifiers () == Qt::ControlModifier) || (e->modifiers () == Qt::MetaModifier)) && (e->key() == Qt::Key_E)) {
2495  fCommandArea->end(false);
2496  return true;
2497  }
2498  }
2499  }
2500  bool res= false;
2501  // change cursor position if needed
2502  if (moveCommandCursor == true) {
2503 #ifdef G4DEBUG_INTERFACES_BASIC
2504  printf("G4UIQt::eventFilter setCursor Position\n");
2505 #endif
2506  fCommandArea->setCursorPosition ( fCommandArea->text().length() );
2507  fCommandArea->setCursorPosition (4);
2508  } else {
2509  // pass the event on to the parent class
2510  res = QObject::eventFilter(aObj, aEvent);
2511  }
2512  return res;
2513 }
2514 
2515 
2516 
2517 
2518 /***************************************************************************/
2519 //
2520 // SLOTS DEFINITIONS
2521 //
2522 /***************************************************************************/
2523 
2526 void G4UIQt::ShowHelpCallback (
2527 )
2528 {
2529  TerminalHelp("");
2530 }
2531 
2532 
2535 void G4UIQt::ClearButtonCallback (
2536 )
2537 {
2538  fCoutTBTextArea->clear();
2539  fG4cout.clear();
2540 }
2541 
2544 void G4UIQt::ExitSession (
2545 )
2546 {
2547  SessionTerminate();
2548 }
2549 
2550 void G4UIQt::ExitHelp(
2551 ) const
2552 {
2553 }
2554 
2558 void G4UIQt::CommandEnteredCallback (
2559 )
2560 {
2561  G4String command (fCommandArea->text().toStdString().c_str());
2562  if (fCommandArea->text().trimmed() != "") {
2563  fHistoryTBTableList->addItem(fCommandArea->text());
2564  fHistoryTBTableList->clearSelection();
2565  fHistoryTBTableList->setCurrentItem(NULL);
2566  fCommandArea->setText("");
2567 
2568  G4Qt* interactorManager = G4Qt::getInstance ();
2569  if (interactorManager) {
2570  interactorManager->FlushAndWaitExecution();
2571  }
2572  if (command(0,4) != "help") {
2573  ApplyShellCommand (command,exitSession,exitPause);
2574  } else {
2575  ActivateCommand(command);
2576  }
2577  // Rebuild help tree
2578  FillHelpTree();
2579 
2580  if(exitSession==true)
2581  SessionTerminate();
2582  }
2583 }
2584 
2585 
2588 void G4UIQt::VisParameterCallback(QWidget* widget){
2589  if (widget == NULL) {
2590  return;
2591  }
2592 
2593  // Look in all the Grid layout, but only column 1 (0 is the parameter name)
2594  QGridLayout* grid = dynamic_cast<QGridLayout*>(widget->layout());
2595  if (grid == 0) {
2596  return;
2597  }
2598  QString command;
2599 #if QT_VERSION < 0x040400
2600  QWidget* name = grid->itemAt(grid->columnCount()*(grid->rowCount()-2))->widget();
2601 #else
2602  QWidget* name = grid->itemAtPosition(grid->rowCount()-1,0)->widget();
2603 #endif
2604  if (widget == NULL) {
2605  return;
2606  }
2607  if (dynamic_cast<QLabel*>(name) == 0) {
2608  return;
2609  }
2610  command += (dynamic_cast<QLabel*>(name))->text()+" ";
2611 
2612  for (int a=0;a<grid->rowCount()-1; a++) {
2613 #if QT_VERSION < 0x040400
2614  QWidget* widgetTmp = grid->itemAt(a*grid->columnCount()+1)->widget();
2615 #else
2616  QWidget* widgetTmp = grid->itemAtPosition(a,1)->widget();
2617 #endif
2618 
2619  // 4 kind of widgets : QLineEdit / QComboBox / radioButtonsGroup / QPushButton (color chooser)
2620  if (widgetTmp != NULL) {
2621 
2622  if (dynamic_cast<QLineEdit*>(widgetTmp) != 0) {
2623  command += (dynamic_cast<QLineEdit*>(widgetTmp))->text()+" ";
2624 
2625  } else if (dynamic_cast<QComboBox*>(widgetTmp) != 0){
2626  command += (dynamic_cast<QComboBox*>(widgetTmp))->itemText((dynamic_cast<QComboBox*>(widgetTmp))->currentIndex())+" ";
2627 
2628  // Color chooser
2629  } else if (dynamic_cast<QPushButton*>(widgetTmp) != 0){
2630  command += widgetTmp->accessibleName()+" ";
2631 
2632  // Check for Button group
2633  } else if (dynamic_cast<QWidget*>(widgetTmp) != 0){
2634  if (widgetTmp->layout()->count() > 0){
2635  if (dynamic_cast<QRadioButton*>(widgetTmp->layout()->itemAt(0)->widget()) != 0) {
2636  QAbstractButton * checked = (dynamic_cast<QRadioButton*>(widgetTmp->layout()->itemAt(0)->widget()))->group()->checkedButton();
2637  if (checked != 0) {
2638  command += (dynamic_cast<QRadioButton*>(widgetTmp->layout()->itemAt(0)->widget()))->group()->checkedButton()->text()+" ";
2639  }
2640  }
2641  }
2642 
2643  }
2644  }
2645  }
2646  if (command != "") {
2648  if(UI != NULL) {
2649  UI->ApplyCommand(command.toStdString().c_str());
2650  }
2651  }
2652 }
2653 
2654 
2660 void G4UIQt::ButtonCallback (
2661  const QString& aCommand
2662 )
2663 {
2664  G4String ss = G4String(aCommand.toStdString().c_str());
2665  ss = ss.strip(G4String::leading);
2666 
2668  if(UI==NULL) return;
2669  G4UIcommandTree * treeTop = UI->GetTree();
2670 
2671  G4UIcommand* command = treeTop->FindPath(ss);
2672 
2673  if (command) {
2674  // if is GUI, then open a dialog
2675  if (IsGUICommand(command)) {
2676  QDialog* menuParameterDialog = new QDialog();
2677 
2678  if (CreateVisCommandGroupAndToolBox(command,menuParameterDialog,1,true)) {
2679  menuParameterDialog->setWindowTitle (aCommand);
2680  menuParameterDialog->setSizePolicy (QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum));
2681 
2682  // exec this dialog, apply the command automaticaly, and return
2683  menuParameterDialog->exec();
2684  return;
2685  }
2686  }
2687  }
2688 
2689  ApplyShellCommand(ss,exitSession,exitPause);
2690 
2691  // Rebuild help tree
2692  FillHelpTree();
2693 
2694  if(exitSession==true)
2695  SessionTerminate();
2696 }
2697 
2698 
2699 
2702 void G4UIQt::HelpTreeClicCallback (
2703 )
2704 {
2705  QTreeWidgetItem* item = NULL;
2706  if (!fHelpTreeWidget)
2707  return ;
2708 
2709  if (!fHelpArea)
2710  return;
2711 
2712  QList<QTreeWidgetItem *> list =fHelpTreeWidget->selectedItems();
2713  if (list.isEmpty())
2714  return;
2715  item = list.first();
2716  if (!item)
2717  return;
2718 
2720  if(UI==NULL) return;
2721  G4UIcommandTree * treeTop = UI->GetTree();
2722 
2723  std::string itemText = GetLongCommandPath(item).toStdString();
2724 
2725  G4UIcommand* command = treeTop->FindPath(itemText.c_str());
2726 
2727  if (command) {
2728  #if QT_VERSION < 0x040200
2729  fHelpArea->clear();
2730  fHelpArea->append(GetCommandList(command));
2731  #else
2732  fHelpArea->setText(GetCommandList(command));
2733  #endif
2734  } else { // this is a command
2735  G4UIcommandTree* path = treeTop->FindCommandTree(itemText.c_str());
2736  if ( path) {
2737  // this is not a command, this is a sub directory
2738  // We display the Title
2739  #if QT_VERSION < 0x040200
2740  fHelpArea->clear();
2741  fHelpArea->append(path->GetTitle().data());
2742  #else
2743  fHelpArea->setText(path->GetTitle().data());
2744  #endif
2745  }
2746  }
2747 }
2748 
2751 void G4UIQt::HelpTreeDoubleClicCallback (
2752 )
2753 {
2754  HelpTreeClicCallback();
2755 
2756  QTreeWidgetItem* item = NULL;
2757  if (!fHelpTreeWidget)
2758  return ;
2759 
2760  if (!fHelpArea)
2761  return;
2762 
2763  QList<QTreeWidgetItem *> list =fHelpTreeWidget->selectedItems();
2764  if (list.isEmpty())
2765  return;
2766  item = list.first();
2767  if (!item)
2768  return;
2769 
2770  fCommandArea->clear();
2771  fCommandArea->setText(GetLongCommandPath(item));
2772 }
2773 
2774 
2778 void G4UIQt::CommandHistoryCallback(
2779 )
2780 {
2781  QListWidgetItem* item = NULL;
2782  if (!fHistoryTBTableList)
2783  return ;
2784 
2785 
2786  QList<QListWidgetItem *> list =fHistoryTBTableList->selectedItems();
2787  if (list.isEmpty())
2788  return;
2789  item = list.first();
2790  if (!item)
2791  return;
2792  fCommandArea->setText(item->text());
2793 #ifdef G4DEBUG_INTERFACES_BASIC
2794  printf("G4UIQt::CommandHistoryCallback change text\n");
2795 #endif
2796 }
2797 
2798 
2799 void G4UIQt::CoutFilterCallback(
2800 const QString & text) {
2801 
2802  QStringList result = fG4cout.filter(text);
2803  fCoutTBTextArea->setPlainText(result.join("\n"));
2804 
2805  fCoutTBTextArea->repaint();
2806  fCoutTBTextArea->verticalScrollBar()->setSliderPosition(fCoutTBTextArea->verticalScrollBar()->maximum());
2807 
2808  }
2809 
2814 void G4UIQt::LookForHelpStringCallback(
2815 )
2816 {
2817  QString searchText = fHelpLine->text();
2818 
2819 #if QT_VERSION < 0x040200
2820  fHelpArea->clear();
2821 #else
2822  fHelpArea->setText("");
2823 #endif
2824  if (searchText =="") {
2825  // clear old help tree
2826  fHelpTreeWidget->clear();
2827 
2828  FillHelpTree();
2829 
2830  return;
2831  } else {
2832  OpenHelpTreeOnCommand(searchText);
2833  }
2834 }
2835 
2836 
2837 void G4UIQt::OpenHelpTreeOnCommand(
2838  const QString & searchText
2839 )
2840 {
2841  // the help tree
2843  if(UI==NULL) return;
2844  G4UIcommandTree * treeTop = UI->GetTree();
2845 
2846  G4int treeSize = treeTop->GetTreeEntry();
2847 
2848  // clear old help tree
2849  fHelpTreeWidget->clear();
2850 
2851  // look for new items
2852 
2853  int tmp = 0;
2854 
2855  QMap<int,QString> commandResultMap;
2856  QMap<int,QString> commandChildResultMap;
2857 
2858  for (int a=0;a<treeSize;a++) {
2859  G4UIcommand* command = treeTop->FindPath(treeTop->GetTree(a+1)->GetPathName().data());
2860  tmp = GetCommandList (command).count(searchText,Qt::CaseInsensitive);
2861  if (tmp >0) {
2862  commandResultMap.insertMulti(tmp,QString((char*)(treeTop->GetTree(a+1)->GetPathName()).data()));
2863  }
2864  // look for childs
2865  commandChildResultMap = LookForHelpStringInChildTree(treeTop->GetTree(a+1),searchText);
2866  // insert new childs
2867  if (!commandChildResultMap.empty()) {
2868  QMap<int,QString>::const_iterator i = commandChildResultMap.constBegin();
2869  while (i != commandChildResultMap.constEnd()) {
2870  commandResultMap.insertMulti(i.key(),i.value());
2871  i++;
2872  }
2873  commandChildResultMap.clear();
2874  }
2875  }
2876 
2877  // build new help tree
2878  fHelpTreeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
2879  fHelpTreeWidget->setColumnCount(2);
2880  QStringList labels;
2881  labels << QString("Command") << QString("Match");
2882  fHelpTreeWidget->setHeaderLabels(labels);
2883 
2884  if (commandResultMap.empty()) {
2885 #if QT_VERSION < 0x040200
2886  fHelpArea->clear();
2887  fHelpArea->append("No match found");
2888 #else
2889  fHelpArea->setText("No match found");
2890 #endif
2891  return;
2892  }
2893 
2894  QMap<int,QString>::const_iterator i = commandResultMap.constEnd();
2895  i--;
2896  // 10 maximum progress values
2897  float multValue = 10.0/(float)(i.key());
2898  QString progressChar = "|";
2899  QString progressStr = "|";
2900 
2901  QTreeWidgetItem * newItem;
2902  bool end = false;
2903  while (!end) {
2904  if (i == commandResultMap.constBegin()) {
2905  end = true;
2906  }
2907  for(int a=0;a<int(i.key()*multValue);a++) {
2908  progressStr += progressChar;
2909  }
2910  newItem = new QTreeWidgetItem(fHelpTreeWidget);
2911  QString commandStr = i.value().trimmed();
2912 
2913  if (commandStr.indexOf("/") == 0) {
2914  commandStr = commandStr.right(commandStr.size()-1);
2915  }
2916 
2917  newItem->setText(0,commandStr);
2918  newItem->setText(1,progressStr);
2919 
2920 #if QT_VERSION < 0x040200
2921 #else
2922  newItem->setForeground ( 1, QBrush(Qt::blue) );
2923 #endif
2924  progressStr = "|";
2925  i--;
2926  }
2927  fHelpTreeWidget->resizeColumnToContents (0);
2928  fHelpTreeWidget->sortItems(1,Qt::DescendingOrder);
2929  // fHelpTreeWidget->setColumnWidth(1,10);//resizeColumnToContents (1);
2930 }
2931 
2932 
2933 
2934 
2935 QMap<int,QString> G4UIQt::LookForHelpStringInChildTree(
2936  G4UIcommandTree *aCommandTree
2937 ,const QString & text
2938  )
2939 {
2940  QMap<int,QString> commandResultMap;
2941  if (aCommandTree == NULL) return commandResultMap;
2942 
2943 
2944  // Get the Sub directories
2945  int tmp = 0;
2946  QMap<int,QString> commandChildResultMap;
2947 
2948  for (int a=0;a<aCommandTree->GetTreeEntry();a++) {
2949  const G4UIcommand* command = aCommandTree->GetGuidance();
2950  tmp = GetCommandList (command).count(text,Qt::CaseInsensitive);
2951  if (tmp >0) {
2952  commandResultMap.insertMulti(tmp,QString((char*)(aCommandTree->GetTree(a+1)->GetPathName()).data()));
2953  }
2954  // look for childs
2955  commandChildResultMap = LookForHelpStringInChildTree(aCommandTree->GetTree(a+1),text);
2956 
2957  if (!commandChildResultMap.empty()) {
2958  // insert new childs
2959  QMap<int,QString>::const_iterator i = commandChildResultMap.constBegin();
2960  while (i != commandChildResultMap.constEnd()) {
2961  commandResultMap.insertMulti(i.key(),i.value());
2962  i++;
2963  }
2964  commandChildResultMap.clear();
2965  }
2966  }
2967  // Get the Commands
2968 
2969  for (int a=0;a<aCommandTree->GetCommandEntry();a++) {
2970  const G4UIcommand* command = aCommandTree->GetCommand(a+1);
2971  tmp = GetCommandList (command).count(text,Qt::CaseInsensitive);
2972  if (tmp >0) {
2973  commandResultMap.insertMulti(tmp,QString((char*)(aCommandTree->GetCommand(a+1)->GetCommandPath()).data()));
2974  }
2975 
2976  }
2977  return commandResultMap;
2978 }
2979 
2980 
2981 QString G4UIQt::GetShortCommandPath(
2982 QString commandPath
2983 )
2984 {
2985  if (commandPath.indexOf("/") == 0) {
2986  commandPath = commandPath.right(commandPath.size()-1);
2987  }
2988 
2989  commandPath = commandPath.right(commandPath.size()-commandPath.lastIndexOf("/",-2)-1);
2990 
2991  if (commandPath.lastIndexOf("/") == (commandPath.size()-1)) {
2992  commandPath = commandPath.left(commandPath.size()-1);
2993  }
2994 
2995  return commandPath;
2996 }
2997 
2998 
2999 QString G4UIQt::GetLongCommandPath(
3000  QTreeWidgetItem* item
3001 )
3002 {
3003  if (item == NULL) return "";
3004 
3005  // rebuild path:
3006  QString itemText = "";
3007  itemText = item->text(0);
3008 
3009  while (item->parent() != NULL) {
3010  itemText = item->parent()->text(0)+"/"+itemText;
3011  item = item->parent();
3012  }
3013  itemText = "/"+itemText;
3014 
3015  return itemText;
3016 }
3017 
3018 
3019 void G4UIQt::ChangeColorCallback(QWidget* widget) {
3020  if (widget == NULL) {
3021  return;
3022  }
3023 
3024  QPushButton* button = dynamic_cast<QPushButton*>(widget);
3025  if (button == 0) {
3026  return;
3027  }
3028  QString value = button->accessibleName();
3029 
3030  QColor old;
3031  old.setRgbF(value.section(" ",0,1).toDouble(),
3032  value.section(" ",1,2).toDouble(),
3033  value.section(" ",2,3).toDouble());
3034 #if QT_VERSION < 0x040500
3035  bool a;
3036  QColor color = QColor(QColorDialog::getRgba (old.rgba(),&a,fUITabWidget));
3037 #else
3038  QColor color = QColorDialog::getColor(old,
3039  fUITabWidget,
3040  "Change color",
3041  QColorDialog::ShowAlphaChannel);
3042 #endif
3043 
3044 
3045  if (color.isValid()) {
3046  // rebuild the widget icon
3047  QPixmap pixmap = QPixmap(QSize(16, 16));
3048  pixmap.fill (color);
3049  QPainter painter(&pixmap);
3050  painter.setPen(Qt::black);
3051  painter.drawRect(0,0,15,15); // Draw contour
3052 
3053  button->setAccessibleName(QString::number(color.redF())+" "+
3054  QString::number(color.greenF())+" "+
3055  QString::number(color.blueF())+" "
3056  );
3057  button->setIcon(pixmap);
3058 
3059 
3060  }
3061 }
3062 
3063 
3064 void G4UIQt::ChangeCursorStyle(const QString& action) {
3065 
3066  // Theses actions should be in the app toolbar
3067 
3068  fMoveSelected = true;
3069  fPickSelected = true;
3070  fRotateSelected = true;
3071  fZoomInSelected = true;
3072  fZoomOutSelected = true;
3073 
3074  if (fToolbarApp == NULL) return;
3075  QList<QAction *> list = fToolbarApp->actions ();
3076  for (int i = 0; i < list.size(); ++i) {
3077  if (list.at(i)->data().toString () == action) {
3078  list.at(i)->setChecked(TRUE);
3079  } else if (list.at(i)->data().toString () == "move") {
3080  fMoveSelected = false;
3081  list.at(i)->setChecked(FALSE);
3082  } else if (list.at(i)->data().toString () == "pick") {
3083  fPickSelected = false;
3084  list.at(i)->setChecked(FALSE);
3085  } else if (list.at(i)->data().toString () == "rotate") {
3086  fRotateSelected = false;
3087  list.at(i)->setChecked(FALSE);
3088  } else if (list.at(i)->data().toString () == "zoom_in") {
3089  fZoomInSelected = false;
3090  list.at(i)->setChecked(FALSE);
3091  } else if (list.at(i)->data().toString () == "zoom_out") {
3092  fZoomOutSelected = false;
3093  list.at(i)->setChecked(FALSE);
3094  }
3095  }
3096  // FIXME : Should connect this to Vis
3097 }
3098 
3099 
3100 /* A little bit like "void G4OpenGLQtViewer::toggleDrawingAction(int aAction)"
3101  But for all viewers, not only Qt
3102 
3103 FIXME : Should be a feedback when changing viewer !
3104 
3105  */
3106 void G4UIQt::ChangeSurfaceStyle(const QString& action) {
3107 
3108  // Theses actions should be in the app toolbar
3109 
3110  if (fToolbarApp == NULL) return;
3111  QList<QAction *> list = fToolbarApp->actions ();
3112  for (int i = 0; i < list.size(); ++i) {
3113  if (list.at(i)->data().toString () == action) {
3114  list.at(i)->setChecked(TRUE);
3115  } else if (list.at(i)->data().toString () == "hidden_line_removal") {
3116  list.at(i)->setChecked(FALSE);
3117  } else if (list.at(i)->data().toString () == "hidden_line_and_surface_removal") {
3118  list.at(i)->setChecked(FALSE);
3119  } else if (list.at(i)->data().toString () == "solid") {
3120  list.at(i)->setChecked(FALSE);
3121  } else if (list.at(i)->data().toString () == "wireframe") {
3122  list.at(i)->setChecked(FALSE);
3123  }
3124  }
3125  // FIXME : Should connect this to Vis
3126 
3127  if (action == "hidden_line_removal") {
3128  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/style w");
3129  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/hiddenEdge 1");
3130 
3131  } else if (action == "hidden_line_and_surface_removal") {
3132  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/style s");
3133  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/hiddenEdge 1");
3134 
3135  } else if (action == "solid") {
3136  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/style s");
3137  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/hiddenEdge 0");
3138 
3139  } else if (action == "wireframe") {
3140  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/style w");
3141  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/hiddenEdge 0");
3142  }
3143 }
3144 
3145 
3146 void G4UIQt::OpenIconCallback(const QString& aCommand) {
3147 
3148  QString nomFich = QFileDialog::getOpenFileName(fMainWindow, "Load", "vis", "Macro files (*.mac)");
3149  if (nomFich != "") {
3150  G4UImanager::GetUIpointer()->ApplyCommand((QString(aCommand)+ QString(" ")+ nomFich).toStdString().c_str());
3151  }
3152 }
3153 
3154 
3155 void G4UIQt::SaveIconCallback(const QString& aCommand) {
3156 
3157  QString nomFich = QFileDialog::getSaveFileName(fMainWindow, "Save", "viewerState", "Macro files (*.mac)");
3158  if (nomFich != "") {
3159  G4UImanager::GetUIpointer()->ApplyCommand((QString(aCommand)+ QString(" ")+nomFich).toStdString().c_str());
3160  }
3161 }
3162 
3163 
3164 
3165 void G4UIQt::ChangePerspectiveOrtho(const QString& action) {
3166 
3167  // Theses actions should be in the app toolbar
3168 
3169  if (fToolbarApp == NULL) return;
3170  QList<QAction *> list = fToolbarApp->actions ();
3171  QString checked = "";
3172  for (int i = 0; i < list.size(); ++i) {
3173  if (list.at(i)->data().toString () == action) {
3174  list.at(i)->setChecked(TRUE);
3175  checked = list.at(i)->data().toString ();
3176  } else if (list.at(i)->data().toString () == "persepective") {
3177  list.at(i)->setChecked(FALSE);
3178  } else if (list.at(i)->data().toString () == "ortho") {
3179  list.at(i)->setChecked(FALSE);
3180  }
3181  }
3182 
3183  if ((action == "ortho") && (checked == "ortho")) {
3184  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/projection o");
3185  } else if ((action == "perspective") && (checked == "perspective")) {
3186  G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/set/projection p");
3187  }
3188 }
3189 
3190 
3191 
3192 void G4UIQt::SetIconMoveSelected() {
3193  // Theses actions should be in the app toolbar
3194  fMoveSelected = true;
3195  fRotateSelected = false;
3196  fPickSelected = false;
3197  fZoomInSelected = false;
3198  fZoomOutSelected = false;
3199 
3200  if (fToolbarApp == NULL) return;
3201  QList<QAction *> list = fToolbarApp->actions ();
3202  for (int i = 0; i < list.size(); ++i) {
3203  if (list.at(i)->data().toString () == "move") {
3204  list.at(i)->setChecked(TRUE);
3205  } else if (list.at(i)->data().toString () == "rotate") {
3206  list.at(i)->setChecked(FALSE);
3207  } else if (list.at(i)->data().toString () == "pick") {
3208  list.at(i)->setChecked(FALSE);
3209  } else if (list.at(i)->data().toString () == "zoom_in") {
3210  list.at(i)->setChecked(FALSE);
3211  } else if (list.at(i)->data().toString () == "zoom_out") {
3212  list.at(i)->setChecked(FALSE);
3213  }
3214  }
3215 }
3216 
3217 
3218 void G4UIQt::SetIconRotateSelected() {
3219  // Theses actions should be in the app toolbar
3220  fRotateSelected = true;
3221  fMoveSelected = false;
3222  fPickSelected = false;
3223  fZoomInSelected = false;
3224  fZoomOutSelected = false;
3225 
3226  if (fToolbarApp == NULL) return;
3227  QList<QAction *> list = fToolbarApp->actions ();
3228  for (int i = 0; i < list.size(); ++i) {
3229  if (list.at(i)->data().toString () == "rotate") {
3230  list.at(i)->setChecked(TRUE);
3231  } else if (list.at(i)->data().toString () == "move") {
3232  list.at(i)->setChecked(FALSE);
3233  } else if (list.at(i)->data().toString () == "pick") {
3234  list.at(i)->setChecked(FALSE);
3235  } else if (list.at(i)->data().toString () == "zoom_in") {
3236  list.at(i)->setChecked(FALSE);
3237  } else if (list.at(i)->data().toString () == "zoom_out") {
3238  list.at(i)->setChecked(FALSE);
3239  }
3240  }
3241 }
3242 
3243 
3244 void G4UIQt::SetIconPickSelected() {
3245  // Theses actions should be in the app toolbar
3246  fPickSelected = true;
3247  fMoveSelected = false;
3248  fRotateSelected = false;
3249  fZoomInSelected = false;
3250  fZoomOutSelected = false;
3251 
3252  if (fToolbarApp == NULL) return;
3253  QList<QAction *> list = fToolbarApp->actions ();
3254  for (int i = 0; i < list.size(); ++i) {
3255  if (list.at(i)->data().toString () == "pick") {
3256  list.at(i)->setChecked(TRUE);
3257  } else if (list.at(i)->data().toString () == "move") {
3258  list.at(i)->setChecked(FALSE);
3259  } else if (list.at(i)->data().toString () == "rotate") {
3260  list.at(i)->setChecked(FALSE);
3261  } else if (list.at(i)->data().toString () == "zoom_in") {
3262  list.at(i)->setChecked(FALSE);
3263  } else if (list.at(i)->data().toString () == "zoom_out") {
3264  list.at(i)->setChecked(FALSE);
3265  }
3266  }
3267 }
3268 
3269 
3270 void G4UIQt::SetIconZoomInSelected() {
3271  // Theses actions should be in the app toolbar
3272  fZoomInSelected = true;
3273  fMoveSelected = false;
3274  fRotateSelected = false;
3275  fPickSelected = false;
3276  fZoomOutSelected = false;
3277 
3278  if (fToolbarApp == NULL) return;
3279  QList<QAction *> list = fToolbarApp->actions ();
3280  for (int i = 0; i < list.size(); ++i) {
3281  if (list.at(i)->data().toString () == "zoom_in") {
3282  list.at(i)->setChecked(TRUE);
3283  } else if (list.at(i)->data().toString () == "move") {
3284  list.at(i)->setChecked(FALSE);
3285  } else if (list.at(i)->data().toString () == "rotate") {
3286  list.at(i)->setChecked(FALSE);
3287  } else if (list.at(i)->data().toString () == "pick") {
3288  list.at(i)->setChecked(FALSE);
3289  } else if (list.at(i)->data().toString () == "zoom_out") {
3290  list.at(i)->setChecked(FALSE);
3291  }
3292  }
3293 }
3294 
3295 
3296 void G4UIQt::SetIconZoomOutSelected() {
3297  // Theses actions should be in the app toolbar
3298  fZoomOutSelected = true;
3299  fMoveSelected = false;
3300  fRotateSelected = false;
3301  fPickSelected = false;
3302  fZoomInSelected = false;
3303 
3304  if (fToolbarApp == NULL) return;
3305  QList<QAction *> list = fToolbarApp->actions ();
3306  for (int i = 0; i < list.size(); ++i) {
3307  if (list.at(i)->data().toString () == "zoom_out") {
3308  list.at(i)->setChecked(TRUE);
3309  } else if (list.at(i)->data().toString () == "move") {
3310  list.at(i)->setChecked(FALSE);
3311  } else if (list.at(i)->data().toString () == "rotate") {
3312  list.at(i)->setChecked(FALSE);
3313  } else if (list.at(i)->data().toString () == "pick") {
3314  list.at(i)->setChecked(FALSE);
3315  } else if (list.at(i)->data().toString () == "zoom_in") {
3316  list.at(i)->setChecked(FALSE);
3317  }
3318  }
3319 }
3320 
3321 
3322 void G4UIQt::SetIconSolidSelected() {
3323  // Theses actions should be in the app toolbar
3324 
3325  if (fToolbarApp == NULL) return;
3326  QList<QAction *> list = fToolbarApp->actions ();
3327  for (int i = 0; i < list.size(); ++i) {
3328  if (list.at(i)->data().toString () == "solid") {
3329  list.at(i)->setChecked(TRUE);
3330  } else if (list.at(i)->data().toString () == "hidden_line_removal") {
3331  list.at(i)->setChecked(FALSE);
3332  } else if (list.at(i)->data().toString () == "hidden_line_and_surface_removal") {
3333  list.at(i)->setChecked(FALSE);
3334  } else if (list.at(i)->data().toString () == "wireframe") {
3335  list.at(i)->setChecked(FALSE);
3336  }
3337  }
3338 }
3339 
3340 
3341 void G4UIQt::SetIconWireframeSelected() {
3342  // Theses actions should be in the app toolbar
3343 
3344  if (fToolbarApp == NULL) return;
3345  QList<QAction *> list = fToolbarApp->actions ();
3346  for (int i = 0; i < list.size(); ++i) {
3347  if (list.at(i)->data().toString () == "wireframe") {
3348  list.at(i)->setChecked(TRUE);
3349  } else if (list.at(i)->data().toString () == "hidden_line_removal") {
3350  list.at(i)->setChecked(FALSE);
3351  } else if (list.at(i)->data().toString () == "hidden_line_and_surface_removal") {
3352  list.at(i)->setChecked(FALSE);
3353  } else if (list.at(i)->data().toString () == "solid") {
3354  list.at(i)->setChecked(FALSE);
3355  }
3356  }
3357 }
3358 
3359 
3360 void G4UIQt::SetIconHLRSelected() {
3361  // Theses actions should be in the app toolbar
3362 
3363  if (fToolbarApp == NULL) return;
3364  QList<QAction *> list = fToolbarApp->actions ();
3365  for (int i = 0; i < list.size(); ++i) {
3366  if (list.at(i)->data().toString () == "hidden_line_removal") {
3367  list.at(i)->setChecked(TRUE);
3368  } else if (list.at(i)->data().toString () == "solid") {
3369  list.at(i)->setChecked(FALSE);
3370  } else if (list.at(i)->data().toString () == "hidden_line_and_surface_removal") {
3371  list.at(i)->setChecked(FALSE);
3372  } else if (list.at(i)->data().toString () == "wireframe") {
3373  list.at(i)->setChecked(FALSE);
3374  }
3375  }
3376 }
3377 
3378 
3379 void G4UIQt::SetIconHLHSRSelected() {
3380  // Theses actions should be in the app toolbar
3381 
3382  if (fToolbarApp == NULL) return;
3383  QList<QAction *> list = fToolbarApp->actions ();
3384  for (int i = 0; i < list.size(); ++i) {
3385  if (list.at(i)->data().toString () == "hidden_line_and_surface_removal") {
3386  list.at(i)->setChecked(TRUE);
3387  } else if (list.at(i)->data().toString () == "solid") {
3388  list.at(i)->setChecked(FALSE);
3389  } else if (list.at(i)->data().toString () == "hidden_line_removal") {
3390  list.at(i)->setChecked(FALSE);
3391  } else if (list.at(i)->data().toString () == "wireframe") {
3392  list.at(i)->setChecked(FALSE);
3393  }
3394  }
3395 }
3396 
3397 
3398 void G4UIQt::SetIconPerspectiveSelected() {
3399  // Theses actions should be in the app toolbar
3400 
3401  if (fToolbarApp == NULL) return;
3402  QList<QAction *> list = fToolbarApp->actions ();
3403  for (int i = 0; i < list.size(); ++i) {
3404  if (list.at(i)->data().toString () == "perspective") {
3405  list.at(i)->setChecked(TRUE);
3406  } else if (list.at(i)->data().toString () == "ortho") {
3407  list.at(i)->setChecked(FALSE);
3408  }
3409  }
3410 }
3411 
3412 
3413 
3414 void G4UIQt::SetIconOrthoSelected() {
3415  // Theses actions should be in the app toolbar
3416 
3417  if (fToolbarApp == NULL) return;
3418  QList<QAction *> list = fToolbarApp->actions ();
3419  for (int i = 0; i < list.size(); ++i) {
3420  if (list.at(i)->data().toString () == "ortho") {
3421  list.at(i)->setChecked(TRUE);
3422  } else if (list.at(i)->data().toString () == "perspective") {
3423  list.at(i)->setChecked(FALSE);
3424  }
3425  }
3426 }
3427 
3428 
3429 
3430 G4QTabWidget::G4QTabWidget(
3431 QSplitter*& split
3432 ):QTabWidget(split)
3433  ,tabSelected(false)
3434  ,lastCreated(-1)
3435 {
3436 }
3437 
3438 G4QTabWidget::G4QTabWidget(
3439 ):QTabWidget()
3440  ,tabSelected(false)
3441  ,lastCreated(-1)
3442 {
3443 }
3444 
3445 
3446 
3447 #if QT_VERSION < 0x040500
3448 void G4UIQt::TabCloseCallback(int){
3449 #else
3450 void G4UIQt::TabCloseCallback(int a){
3451 #endif
3452 #if QT_VERSION < 0x040500
3453 #else
3454  QWidget* temp = fViewerTabWidget->widget(a);
3455  fViewerTabWidget->removeTab (a);
3456 
3457  delete temp;
3458 
3459  if (fViewerTabWidget->count() == 0) {
3460  if (fEmptyViewerTabLabel == NULL) {
3461  fEmptyViewerTabLabel = new QLabel(" If you want to have a Viewer, please use /vis/open commands. ");
3462  }
3463 
3464  // fill right splitter
3465  fRightSplitterWidget->insertWidget(0,fEmptyViewerTabLabel);
3466 
3467  fMainSplitterWidget->show();
3468  fEmptyViewerTabLabel->show();
3469  fViewerTabWidget->setParent(0);
3470  fViewerTabWidget->setVisible(false);
3471  delete fViewerTabWidget;
3472  fViewerTabWidget = NULL;
3473  }
3474 #endif
3475 }
3476 
3477 
3478 void G4UIQt::ToolBoxActivated(int a){
3479 
3480  if (fUITabWidget->widget(a) == fHelpTBWidget) {
3481  // Rebuild the help tree
3482  FillHelpTree();
3483  } else if (fUITabWidget->widget(a) == fSceneTreeComponentsTBWidget) {
3484 #if QT_VERSION < 0x040200
3485  fSceneTreeComponentsTBWidget->show();
3486 #else
3487  fSceneTreeComponentsTBWidget->setVisible(true);
3488 #endif
3489  }
3490 }
3491 
3492 
3493 void G4QTabWidget::paintEvent(
3494 QPaintEvent *
3495 )
3496 {
3497 
3498  if (currentWidget()) {
3499 
3500  if ( isTabSelected()) {
3501 
3502  QCoreApplication::sendPostedEvents () ;
3503 
3504 #ifdef G4DEBUG_INTERFACES_BASIC
3505  printf("G4QTabWidget::paintEvent OK\n");
3506 #endif
3507  QString text = tabText (currentIndex());
3508 
3509  if (lastCreated == -1) {
3510  QString paramSelect = QString("/vis/viewer/select ")+text;
3512  if(UI != NULL) {
3513  UI->ApplyCommand(paramSelect.toStdString().c_str());
3514  }
3515  } else {
3516  lastCreated = -1;
3517  }
3518  setTabSelected(false);
3519  }
3520  }
3521 }
3522 
3523 #endif