Geant4 Cross Reference |
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 // Guy Barrand 13th April 2023 27 28 #ifndef G4TOOLSSGQTZBVIEWER_HH 29 #define G4TOOLSSGQTZBVIEWER_HH 30 31 #include "G4ToolsSGViewer.hh" 32 33 #include "G4Qt.hh" 34 #include "G4UIQt.hh" 35 #include "G4UImanager.hh" 36 37 #include <toolx/Qt/zb_viewer> 38 39 #include <qmainwindow.h> 40 41 class G4ToolsSGQtZBDestroyCallback : public QObject { 42 Q_OBJECT 43 public: 44 G4ToolsSGQtZBDestroyCallback(G4VViewer* a_viewer):fViewer(a_viewer) {} 45 virtual ~G4ToolsSGQtZBDestroyCallback() {} 46 private: 47 G4ToolsSGQtZBDestroyCallback(const G4ToolsSGQtZBDestroyCallback&); 48 G4ToolsSGQtZBDestroyCallback& operator=(const G4ToolsSGQtZBDestroyCallback&); 49 public slots: 50 void execute(){ 51 delete fViewer; 52 } 53 private: 54 G4VViewer* fViewer; 55 }; 56 57 class G4ToolsSGQtZBViewer : public G4ToolsSGViewer<toolx::Qt::session,toolx::Qt::zb_viewer> { 58 using parent = G4ToolsSGViewer<toolx::Qt::session,toolx::Qt::zb_viewer>; 59 public: 60 G4ToolsSGQtZBViewer(toolx::Qt::session& a_session,G4ToolsSGSceneHandler& a_scene_handler, const G4String& a_name) 61 :parent(a_session,a_scene_handler,a_name) 62 ,fSGQWidget(nullptr) 63 ,fDestroyCallback(0) 64 { 65 fDestroyCallback = new G4ToolsSGQtZBDestroyCallback(this); 66 } 67 virtual ~G4ToolsSGQtZBViewer() { 68 delete fDestroyCallback; //it will remove the below signal/slot connection. 69 } 70 protected: 71 G4ToolsSGQtZBViewer(const G4ToolsSGQtZBViewer& a_from):parent(a_from){} 72 G4ToolsSGQtZBViewer& operator=(const G4ToolsSGQtZBViewer&) {return *this;} 73 public: 74 virtual void Initialise() { 75 if(fSGQWidget) return; //done. 76 parent::Initialise(); 77 if(!fSGViewer) { 78 G4cerr << "G4ToolsSGQtZBViewer::Initialise: ERROR: G4ToolsSGQtZBViewer has no toolx::Qt::zb_viewer." << G4endl; 79 return; 80 } 81 fSGQWidget = fSGViewer->shell(); 82 if (!fSGQWidget) { 83 G4cerr << "G4ToolsSGQtZBViewer::Initialise: ERROR: toolx::Qt::zb_viewer has no QWidget shell." << G4endl; 84 return; 85 } 86 87 {G4UImanager* ui = G4UImanager::GetUIpointer(); 88 G4UIsession* session = ui->GetG4UIWindow(); 89 fUIQt = session? dynamic_cast<G4UIQt*>(session) :nullptr; 90 if(fUIQt) { 91 G4Qt* interactorManager = G4Qt::getInstance (); 92 if (!interactorManager->IsExternalApp()) { 93 fSGViewer->set_own_shell(false); 94 fUIQt->AddTabWidget(fSGQWidget,QString(GetName())); 95 QObject::connect(fSGQWidget,SIGNAL(destroyed()),fDestroyCallback,SLOT(execute())); 96 97 QMainWindow* main_window = fUIQt->GetMainWindow(); 98 if(main_window) { 99 main_window->show(); 100 interactorManager->FlushAndWaitExecution(); 101 } 102 } 103 }} 104 105 fSGViewer->enable_keyboard_focus(); 106 } 107 108 virtual void SetView() { 109 #ifdef __APPLE__ 110 if(fSGQWidget && fSGViewer) { 111 if( (2*fSGQWidget->width() == int(fSGViewer->width())) && 112 (2*fSGQWidget->height() == int(fSGViewer->height())) ){ 113 // With Qt/Cocoa, the received size in 114 // tools::sg::glarea::resizeGL is twice the QWidget::[width(),height()]! 115 // In general it does not pose problem, except when rendering 2D texts. 116 // In order to have similar sizes than other platforms, we have to double 117 // their pixel heights. 118 fVP.SetGlobalMarkerScale(2); 119 } 120 } 121 #endif 122 parent::SetView(); 123 } 124 125 virtual void UpdateGUISceneTree() { 126 if (fUIQt) fUIQt->UpdateSceneTree(fSceneTree); 127 } 128 129 protected: 130 G4UIQt* fUIQt = nullptr; 131 QWidget* fSGQWidget; 132 G4ToolsSGQtZBDestroyCallback* fDestroyCallback; 133 }; 134 135 #endif 136