File indexing completed on 2024-04-06 12:11:39
0001 #include "Fireworks/Core/interface/FWGLEventHandler.h"
0002 #include "Fireworks/Core/interface/FWGUIManager.h"
0003 #include "Fireworks/Core/interface/FWEveView.h"
0004 #include "Fireworks/Core/interface/FW3DViewBase.h"
0005 #include "Fireworks/Core/src/FW3DViewDistanceMeasureTool.h"
0006
0007 #include "KeySymbols.h"
0008 #include "TGLViewer.h"
0009 #include "TGLWidget.h"
0010 #include "TGLPhysicalShape.h"
0011 #include "TGLLogicalShape.h"
0012 #include "TEveGedEditor.h"
0013 #include "TEveViewer.h"
0014 #include "FWGeoTopNodeScene.h"
0015 #include "TVirtualX.h"
0016
0017 FWGLEventHandler::FWGLEventHandler(TGWindow *w, TObject *obj, TEveCaloLego *l)
0018 : TEveLegoEventHandler(w, obj, l), m_viewer(nullptr) {}
0019
0020
0021 void FWGLEventHandler::PopupContextMenu(TGLPhysicalShape *pshp, Event_t *event, Int_t gx, Int_t gy) {
0022
0023
0024 if (event->fState & kKeyShiftMask && event->fState & kKeyControlMask) {
0025 TGLEventHandler::PopupContextMenu(pshp, event, gx, gy);
0026 return;
0027 }
0028
0029 if (m_viewer && pshp) {
0030 SelectForClicked(event);
0031
0032 if (pshp->GetLogical()) {
0033 FWGeoTopNodeGLScene *js = dynamic_cast<FWGeoTopNodeGLScene *>(pshp->GetLogical()->GetScene());
0034 if (js) {
0035 js->GeoPopupMenu(gx, gy, fGLViewer);
0036 return;
0037 }
0038 }
0039
0040 openSelectedModelContextMenu_(gx, gy);
0041 }
0042 }
0043
0044
0045
0046 Bool_t FWGLEventHandler::HandleButton(Event_t *event) {
0047 Bool_t res = TEveLegoEventHandler::HandleButton(event);
0048 if (m_viewer && m_viewer->requestGLHandlerPick() && event->fType == kButtonPress) {
0049 Int_t x, y;
0050 Window_t childdum;
0051 gVirtualX->TranslateCoordinates(
0052 gClient->GetDefaultRoot()->GetId(), fGLViewer->GetGLWidget()->GetId(), event->fX, event->fY, x, y, childdum);
0053 fGLViewer->RequestSelect(event->fX, event->fY);
0054 if (fGLViewer->GetSelRec().GetN() > 0) {
0055 TGLVector3 v(event->fX, event->fY, 0.5 * fGLViewer->GetSelRec().GetMinZ());
0056 fGLViewer->CurrentCamera().WindowToViewport(v);
0057 v = fGLViewer->CurrentCamera().ViewportToWorld(v);
0058 FW3DViewBase *v3d = dynamic_cast<FW3DViewBase *>(m_viewer);
0059 v3d->setCurrentDMTVertex(v.X(), v.Y(), v.Z());
0060 }
0061 }
0062
0063 return res;
0064 }
0065
0066 Bool_t FWGLEventHandler::HandleKey(Event_t *event) {
0067 UInt_t keysym;
0068 char tmp[2];
0069 gVirtualX->LookupString(event, tmp, sizeof(tmp), keysym);
0070
0071 if (m_viewer && (keysym == kKey_Enter || keysym == kKey_Return || keysym == kKey_Space)) {
0072 if (event->fType == kGKeyPress) {
0073 Int_t x, y;
0074 Window_t childdum;
0075 gVirtualX->TranslateCoordinates(
0076 fGLViewer->GetGLWidget()->GetId(), gClient->GetDefaultRoot()->GetId(), event->fX, event->fY, x, y, childdum);
0077
0078 fGLViewer->RequestSelect(event->fX, event->fY);
0079 PopupContextMenu(fGLViewer->GetSelRec().GetPhysShape(), event, x, y);
0080 }
0081 return kTRUE;
0082 } else {
0083 return TEveLegoEventHandler::HandleKey(event);
0084 }
0085 }
0086
0087 Bool_t FWGLEventHandler::HandleFocusChange(Event_t *event) {
0088
0089
0090
0091 if (m_viewer && m_viewer->viewer() && event->fType == kFocusOut)
0092 TEveGedEditor::ElementChanged(m_viewer->viewer());
0093
0094 return TGLEventHandler::HandleFocusChange(event);
0095 }
0096
0097
0098 Bool_t FWGLEventHandler::HandleCrossing(Event_t *event) {
0099
0100
0101
0102 if (m_viewer && m_viewer->viewer() && event->fType == kLeaveNotify)
0103 TEveGedEditor::ElementChanged(m_viewer->viewer());
0104
0105 return TGLEventHandler::HandleCrossing(event);
0106 }