void MsgRouter::_updateMarkedWidget(bool bPostMouseMoveMsgs) { Widget_p pNowMarked = 0; Widget_p pWidgetTarget = m_pRoot->findWidget( m_pointerPos, WG_SEARCH_ACTION_TARGET ); // Figure out which button of currently pressed has been pressed the longest. // Mouse is only allowed to mark Widgets that were marked on press of that button. int button = 0; // Button that has been pressed for longest, 0 = no button pressed for( int i = 1 ; i <= WG_MAX_BUTTONS ; i++ ) { if( m_bButtonPressed[i] && (button == 0 || m_pLatestPressMsgs[i]->timestamp() < m_pLatestPressMsgs[button]->timestamp()) ) button = i; } // We are only marking the Widget if no mouse button is pressed or the first pressed button // was pressed on it. if( button == 0 || pWidgetTarget == m_latestPressWidgets[button].rawPtr() ) pNowMarked = pWidgetTarget; // Post Leave events for widgets no longer marked, // Post Enter events for new marked widgets // and Move events for those already marked Widget * pFirstAlreadyMarked = _updateEnteredWidgets( pNowMarked.rawPtr() ); if( bPostMouseMoveMsgs && pFirstAlreadyMarked ) post( new MouseMoveMsg( pFirstAlreadyMarked ) ); // Copy content of pNowMarked to m_pMarkedWidget m_pMarkedWidget = pNowMarked.rawPtr(); // Update PointerStyle WgPointerStyle newStyle; if( pNowMarked && pNowMarked->isEnabled() ) newStyle = pNowMarked->pointerStyle(); else if( button != 0 ) newStyle = m_pointerStyle; else newStyle = WG_POINTER_DEFAULT; if( newStyle != m_pointerStyle ) { post( new PointerChangeMsg( newStyle ) ); m_pointerStyle = newStyle; } }
bool MsgRouter::setKeyboardFocus( const Widget_p& pFocus ) { // Return if Widget is not child of our root. if( pFocus && (!pFocus->hook() || pFocus->hook()->root() != m_pRoot) ) return false; // Handle old focus. Widget * pOldFocus = m_keyFocusWidget.rawPtr(); if( pFocus == pOldFocus ) return true; if( pOldFocus ) _setWidgetFocused( pOldFocus, false ); // Handle new focus, possibly switching focus group. if( pFocus ) { // Check what focus group (if any) this Widget belongs to. m_keyFocusGroup = 0; Container * p = pFocus->_parent(); while( p ) { if( p->_isPanel() && static_cast<Panel*>(p)->isFocusGroup() ) { m_keyFocusGroup = static_cast<Panel*>(p); break; } p = p->_parent(); } // Activate focus _setWidgetFocused( pFocus.rawPtr(), true ); } // Set members and exit. m_keyFocusWidget = pFocus.rawPtr(); m_focusGroupMap[m_keyFocusGroup] = pFocus.rawPtr(); return true; }
bool Capsule::removeWidget( const Widget_p& pWidget ) { if( m_hook._widget() != pWidget.rawPtr() ) return false; m_hook._setWidget(0); _requestRender(); _requestResize(); return true; }
CapsuleHook_p Capsule::setWidget( const Widget_p& pWidget ) { if( !pWidget ) return 0; m_hook._setWidget(pWidget.rawPtr()); pWidget->_setSize(size()); _requestRender(); _requestResize(); return &m_hook; }
Hook_p RootPanel::setWidget( const Widget_p& pWidget ) { if( !pWidget ) return 0; m_hook._setWidget(pWidget.rawPtr()); m_hook._widget()->_onNewSize(m_geo.size()); m_hook._widget()->_onCollectPatches( m_dirtyPatches, geo(), geo() ); return &m_hook; }
ModalHook_p ModalLayer::addModalWidget( const Widget_p& pWidget, const Rect& geometry, WgOrigo origo ) { // Create MyHook and fill in members. ModalHook * pHook = new ModalHook( this ); pHook->_setWidget(pWidget.rawPtr()); pHook->m_origo = origo; pHook->m_placementGeo = geometry; m_modalHooks.pushBack(pHook); // Refresh geometry and request render. pHook->_refreshRealGeo(); _updateKeyboardFocus(); return pHook; }
void InputHandler::setPointer( const RootPanel_p& pRoot, Coord pos, int64_t timestamp ) { Coord prevPointerPos = m_pointerPos; if( timestamp == 0 ) timestamp = m_timeStamp; m_pointerPos = pos; m_pMarkedRoot = 0; Widget_p pNowMarked = 0; Widget_p pWidgetTarget = 0; if( pRoot && pRoot->geo().contains( pos ) ) { m_pMarkedRoot = pRoot.rawPtr(); pWidgetTarget = pRoot->findWidget( m_pointerPos, SearchMode::ActionTarget ); } // Figure out which button of currently pressed has been pressed the longest. // Mouse is only allowed to mark Widgets that were marked on press of that button. int button = 0; // Button that has been pressed for longest, 0 = no button pressed for( int i = 1 ; i <= MouseButton_Max ; i++ ) { if( m_bButtonPressed[i] && (button == 0 || m_latestPressTimestamps[i] < m_latestPressTimestamps[button]) ) button = i; } // We are only marking the Widget if no mouse button is pressed or the first pressed button // was pressed on it. if( button == 0 || pWidgetTarget == m_latestPressWidgets[button].rawPtr() ) pNowMarked = pWidgetTarget; // Post Leave events for widgets no longer marked, // Post Enter events for new marked widgets // and Move events for those already marked Widget * pFirstAlreadyMarked = _updateEnteredWidgets( pNowMarked.rawPtr(), timestamp ); if( pFirstAlreadyMarked ) Base::msgRouter()->post( new MouseMoveMsg( m_inputId, pFirstAlreadyMarked, m_modKeys, pos, timestamp ) ); // Copy content of pNowMarked to m_pMarkedWidget m_pMarkedWidget = pNowMarked.rawPtr(); // Post events for button drag for( int i = 0 ; i <= MouseButton_Max ; i++ ) { if( m_bButtonPressed[i] ) Base::msgRouter()->post( new MouseDragMsg( m_inputId, (MouseButton) i, m_latestPressWidgets[i].rawPtr(), m_latestPressPosition[i], prevPointerPos, m_modKeys, m_pointerPos, timestamp ) ); } // Update PointerStyle PointerStyle newStyle; if( pNowMarked && pNowMarked->isEnabled() ) newStyle = pNowMarked->pointerStyle(); else if( button != 0 ) newStyle = m_pointerStyle; else newStyle = PointerStyle::Default; if( newStyle != m_pointerStyle ) { Base::msgRouter()->post( new PointerChangeMsg( m_inputId, newStyle ) ); m_pointerStyle = newStyle; } }