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 + -
显示快捷键?