gui_event.cpp
来自「ncbi源码」· C++ 代码 · 共 504 行 · 第 1/2 页
CPP
504 行
// currently we support only one generic key hold at a time int key = (m_stPressedKeys.size() == 1) ? *m_stPressedKeys.begin() : 0; // shortcuts have priority TShortcutTemplate sh_templ = x_EncodeShortcutTemplate(m_Modifiers, key); TTemplToShortcut::const_iterator it = m_TemplToShortcut.find(sh_templ); if(it != m_TemplToShortcut.end()) { m_GUISignal = it->second; } else { // handling mouse states/signals TModTemplate templ = x_EncodeModTemplate(m_Modifiers, key); TTemplToState::const_iterator it = m_TemplToState.find(templ); m_GUIState = (it != m_TemplToState.end()) ? it->second : eDefaultState; TEventTemplate e_templ= x_EncodeEventTemplate(m_GUIState, m_MouseEvent); TTemplToSignal::const_iterator it1 = m_TemplToSignal.find(e_templ); if(it1 != m_TemplToSignal.end()) { m_GUISignal = it1->second; } else { switch(m_MouseEvent) { case eMouseMove: m_GUISignal = eDefaultSignal; break; case eLeftMousePush: case eMiddleMousePush: case eRightMousePush: m_GUISignal = ePush; break; case eLeftMouseDrag: case eMiddleMouseDrag: case eRightMouseDrag: m_GUISignal = eDrag; break; case eLeftMouseRelease: case eMiddleMouseRelease: case eRightMouseRelease: m_GUISignal = eRelease; break; } } } //cout << "\nState " << m_GUIState << " Signal " << m_GUISignal;}CGUIEvent::EGUIState CGUIEvent::GetGUIState() const{ return m_GUIState;}CGUIEvent::EGUISignal CGUIEvent::GetGUISignal() const{ return m_GUISignal;}void CGUIEvent::RegisterState(EGUIState state, int mod_flags, int key){ TModTemplate templ = x_EncodeModTemplate(mod_flags, key); m_TemplToState[templ] = state;}void CGUIEvent::RegisterSignal(EGUISignal signal, EGUIState state, EMouseEvent event){ TEventTemplate templ = x_EncodeEventTemplate(state, event); m_TemplToSignal[templ] = signal;}void CGUIEvent::RegisterShortcut(EGUISignal signal, int mod_flags, int key){ TShortcutTemplate templ = x_EncodeShortcutTemplate(mod_flags, key); m_TemplToShortcut[templ] = signal;}void CGUIEvent::StandardConfig(){ RegisterState(CGUIEvent::eSelectState, 0, 0); RegisterState(CGUIEvent::eSelectExtState, CGUIEvent::fShift, 0); // OS-specific settings#if defined(NCBI_OS_MAC) || defined(NCBI_OS_DARWIN) RegisterState(CGUIEvent::eSelectIncState, CGUIEvent::fShift, 0); RegisterState(CGUIEvent::eSelectIncState, CGUIEvent::fMeta, 0); RegisterState(CGUIEvent::ePopupState, CGUIEvent::fCtrl, 0); RegisterSignal(CGUIEvent::ePopupSignal, CGUIEvent::ePopupState, CGUIEvent::eLeftMousePush); #elif defined(NCBI_OS_UNIX) RegisterState(CGUIEvent::eSelectIncState, CGUIEvent::fCtrl, 0); RegisterState(CGUIEvent::eSelectExtState, CGUIEvent::fShift | CGUIEvent::fCtrl, 0); RegisterSignal(CGUIEvent::ePopupSignal, CGUIEvent::eSelectState, CGUIEvent::eRightMouseRelease); #elif defined(NCBI_OS_MSWIN) RegisterState(CGUIEvent::eSelectIncState, CGUIEvent::fCtrl, 0); RegisterState(CGUIEvent::eSelectExtState, CGUIEvent::fShift | CGUIEvent::fCtrl, 0); RegisterSignal(CGUIEvent::ePopupSignal, CGUIEvent::eSelectState, CGUIEvent::eRightMouseRelease); RegisterSignal(CGUIEvent::eSelectSignal, CGUIEvent::eSelectState, CGUIEvent::eRightMousePush); #endif RegisterState(CGUIEvent::eSelectAltState, CGUIEvent::fAlt, 0); RegisterSignal(CGUIEvent::eSelectSignal, CGUIEvent::eSelectState, CGUIEvent::eLeftMousePush); RegisterSignal(CGUIEvent::eSelectSignal, CGUIEvent::eSelectIncState, CGUIEvent::eLeftMousePush); RegisterSignal(CGUIEvent::eSelectSignal, CGUIEvent::eSelectAltState, CGUIEvent::eLeftMousePush); RegisterSignal(CGUIEvent::eSelectSignal, CGUIEvent::eSelectExtState, CGUIEvent::eLeftMousePush); RegisterState(CGUIEvent::eZoomState, 0, 'z'); RegisterState(CGUIEvent::eZoomRectState, 0, 'r'); RegisterState(CGUIEvent::eMarkState, 0, 'm'); RegisterState(CGUIEvent::ePanState, 0, 'p'); // ### these signals below should be registered as Shortcuts ! RegisterState(CGUIEvent::eSelectAllState, CGUIEvent::fCtrl, 'a'); RegisterState(CGUIEvent::eCopyState, CGUIEvent::fCtrl, 'c'); RegisterState(CGUIEvent::eCutState, CGUIEvent::fCtrl, 'x'); RegisterState(CGUIEvent::ePasteState, CGUIEvent::fCtrl, 'v'); RegisterState(CGUIEvent::eUndoState, CGUIEvent::fCtrl, 'z'); RegisterState(CGUIEvent::eRedoState, CGUIEvent::fCtrl, 'y'); RegisterState(CGUIEvent::eDeleteState, 0, FL_Delete); RegisterShortcut(eMenuActivateSignal, 0, FL_F + 10); RegisterShortcut(eZoomInSignal, 0, FL_KP + '+'); // gray + RegisterShortcut(eZoomInSignal, 0, '='); // '+' RegisterShortcut(eZoomOutSignal, 0, FL_KP + '-'); // gray - RegisterShortcut(eZoomOutSignal, 0, '-'); RegisterShortcut(eZoomAllSignal, 0, FL_KP + '*'); // gray * RegisterShortcut(eZoomAllSignal, 0, '8'); // '*' }int CGUIEvent::GetAccelByEvent(){ int accel = 0; if(m_stPressedKeys.size() == 1) { int key = *m_stPressedKeys.begin(); accel = toupper(key); if(m_Modifiers & fShift) { accel |= FL_SHIFT; } if(m_Modifiers & fCtrl) { accel |= FL_CTRL; } if(m_Modifiers & fAlt) { accel |= FL_ALT; } if(m_Modifiers & fMeta) { accel |= FL_META; } } return accel;}CGUIEvent::TModTemplate CGUIEvent::x_EncodeModTemplate(int mod_flags, int key) const{ return (mod_flags << 16) | key;}CGUIEvent::TEventTemplate CGUIEvent::x_EncodeEventTemplate(EGUIState state, EMouseEvent event) const{ return (state << 16) | (0xFFFF & event);}CGUIEvent::TModTemplate CGUIEvent::x_EncodeShortcutTemplate(int mod_flags, int key) const{ return (mod_flags << 16) | key;}void CGUIEvent::x_UpdateEventState(){ int new_state = 0; int fl_state = Fl::event_state(); if(fl_state & FL_SHIFT) { new_state |= fShift; } if(fl_state & FL_CTRL) { new_state |= fCtrl; } if(fl_state & FL_ALT) { new_state |= fAlt; } if(fl_state & FL_META) { new_state |= fMeta; } m_Modifiers = new_state;}void CGUIEvent::x_OnKeyPressed(){ int key = Fl::event_key(); //cout << "\nCGUIEvent::x_OnKeyPressed() " << key; switch(key) { case FL_Shift_L: case FL_Shift_R: m_Modifiers |= fShift; break; case FL_Control_L: case FL_Control_R: m_Modifiers |= fCtrl; break; case FL_Alt_L: case FL_Alt_R: m_Modifiers |= fAlt; break; case FL_Meta_L: case FL_Meta_R: m_Modifiers |= fMeta; break; default: m_stPressedKeys.insert(key); break; }}void CGUIEvent::x_OnKeyReleased(){ int key = Fl::event_key(); //cout << "\nCGUIEvent::x_OnKeyReleased() " << key; switch(key) { case FL_Shift_L: case FL_Shift_R: m_Modifiers &= ~fShift; break; case FL_Control_L: case FL_Control_R: m_Modifiers &= ~fCtrl; break; case FL_Alt_L: case FL_Alt_R: m_Modifiers &= ~fAlt; break; case FL_Meta_L: case FL_Meta_R: m_Modifiers &= ~fMeta; break; default: m_stPressedKeys.erase(key); break; }}END_NCBI_SCOPE/* * =========================================================================== * $Log: gui_event.cpp,v $ * Revision 1000.1 2004/06/01 21:04:59 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * * Revision 1.6 2004/05/27 17:19:52 johnson * Add right mouse select signal to StandardConfig on mswin * * Revision 1.5 2004/05/21 22:27:51 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.4 2004/05/13 17:18:12 yazhuk * Added support for accelerators * * Revision 1.3 2004/04/05 14:39:36 yazhuk * Implemented support for Shortcuts * * Revision 1.2 2004/03/23 13:39:54 dicuccio * Added new event (eDeleteState) * * Revision 1.1 2004/03/17 19:51:59 yazhuk * Moved Event classes from fltk_utils.cpp * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?