BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) { if (!childrenHandleMouseDown(x, y, mask)) { // Route future Mouse messages here preemptively. (Release on mouse up.) gFocusMgr.setMouseCapture( this ); if (hasTabStop() && !getIsChrome()) { setFocus(TRUE); } /* * ATTENTION! This call fires another mouse down callback. * If you wish to remove this call emit that signal directly * by calling LLUICtrl::mMouseDownSignal(x, y, mask); */ LLUICtrl::handleMouseDown(x, y, mask); if(mMouseDownSignal) (*mMouseDownSignal)(this, LLSD()); mMouseDownTimer.start(); mMouseDownFrame = (S32) LLFrameTimer::getFrameCount(); mMouseHeldDownCount = 0; if (getSoundFlags() & MOUSE_DOWN) { make_ui_sound("UISndClick"); } } return TRUE; }
BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) gFocusMgr.setMouseCapture( this ); if (hasTabStop() && !getIsChrome()) { setFocus(TRUE); } if (mMouseDownCallback) { (*mMouseDownCallback)(mCallbackUserData); } mMouseDownTimer.start(); mMouseDownFrame = (S32) LLFrameTimer::getFrameCount(); if (getSoundFlags() & MOUSE_DOWN) { make_ui_sound("UISndClick"); } return TRUE; }
LLXMLNodePtr LLUICtrl::getXML(bool save_children) const { LLXMLNodePtr node = LLView::getXML(save_children); node->createChild("tab_stop", TRUE)->setBoolValue(hasTabStop()); return node; }
void LLUICtrl::initFromXML(LLXMLNodePtr node, LLView* parent) { BOOL has_tab_stop = hasTabStop(); node->getAttributeBOOL("tab_stop", has_tab_stop); setTabStop(has_tab_stop); LLView::initFromXML(node, parent); }
BOOL LLRadioGroup::handleMouseDown(S32 x, S32 y, MASK mask) { // grab focus preemptively, before child button takes mousecapture // if (hasTabStop()) { focusFirstItem(FALSE, FALSE); } return LLUICtrl::handleMouseDown(x, y, mask); }
BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; // Let scrollbar have first dibs handled = LLView::childrenHandleMouseDown(x, y, mask) != NULL; if( !handled) { if( allowsEmbeddedItems() ) { setCursorAtLocalPos( x, y, FALSE ); llwchar wc = 0; if (mCursorPos < getLength()) { wc = getWText()[mCursorPos]; } LLPointer<LLInventoryItem> item_at_pos = LLEmbeddedItems::getEmbeddedItemPtr(wc); if (item_at_pos) { mDragItem = item_at_pos; mDragItemChar = wc; mDragItemSaved = LLEmbeddedItems::getEmbeddedItemSaved(wc); gFocusMgr.setMouseCapture( this ); mMouseDownX = x; mMouseDownY = y; S32 screen_x; S32 screen_y; localPointToScreen(x, y, &screen_x, &screen_y ); LLToolDragAndDrop::getInstance()->setDragStart( screen_x, screen_y ); if (hasTabStop()) { setFocus( TRUE ); } handled = TRUE; } else { mDragItem = NULL; } } if (!handled) { handled = LLTextEditor::handleMouseDown(x, y, mask); } } return handled; }
BOOL LLButton::handleRightMouseDown(S32 x, S32 y, MASK mask) { if (!childrenHandleRightMouseDown(x, y, mask)) { // Route future Mouse messages here preemptively. (Release on mouse up.) gFocusMgr.setMouseCapture( this ); if (hasTabStop() && !getIsChrome()) { setFocus(TRUE); } // if (pointInView(x, y)) // { // } } // send the mouse down signal LLUICtrl::handleRightMouseDown(x,y,mask); // *TODO: Return result of LLUICtrl call above? Should defer to base class // but this might change the mouse handling of existing buttons in a bad way // if they are not mouse opaque. return TRUE; }
BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; // Let scrollbar have first dibs handled = LLView::childrenHandleMouseDown(x, y, mask) != NULL; // enable I Agree checkbox if the user scrolled through entire text BOOL was_scrolled_to_bottom = (mScrollbar->getDocPos() == mScrollbar->getDocPosMax()); if (mOnScrollEndCallback && was_scrolled_to_bottom) { mOnScrollEndCallback(mOnScrollEndData); } if( !handled && mTakesNonScrollClicks) { if (!(mask & MASK_SHIFT)) { deselect(); } BOOL start_select = TRUE; if( allowsEmbeddedItems() ) { setCursorAtLocalPos( x, y, FALSE ); llwchar wc = 0; if (mCursorPos < getLength()) { wc = getWChar(mCursorPos); } LLInventoryItem* item_at_pos = LLEmbeddedItems::getEmbeddedItem(wc); if (item_at_pos) { mDragItem = item_at_pos; mDragItemChar = wc; mDragItemSaved = LLEmbeddedItems::getEmbeddedItemSaved(wc); gFocusMgr.setMouseCapture( this ); mMouseDownX = x; mMouseDownY = y; S32 screen_x; S32 screen_y; localPointToScreen(x, y, &screen_x, &screen_y ); LLToolDragAndDrop::getInstance()->setDragStart( screen_x, screen_y ); start_select = FALSE; } else { mDragItem = NULL; } } if( start_select ) { // If we're not scrolling (handled by child), then we're selecting if (mask & MASK_SHIFT) { S32 old_cursor_pos = mCursorPos; setCursorAtLocalPos( x, y, TRUE ); if (hasSelection()) { /* Mac-like behavior - extend selection towards the cursor if (mCursorPos < mSelectionStart && mCursorPos < mSelectionEnd) { // ...left of selection mSelectionStart = llmax(mSelectionStart, mSelectionEnd); mSelectionEnd = mCursorPos; } else if (mCursorPos > mSelectionStart && mCursorPos > mSelectionEnd) { // ...right of selection mSelectionStart = llmin(mSelectionStart, mSelectionEnd); mSelectionEnd = mCursorPos; } else { mSelectionEnd = mCursorPos; } */ // Windows behavior mSelectionEnd = mCursorPos; } else { mSelectionStart = old_cursor_pos; mSelectionEnd = mCursorPos; } // assume we're starting a drag select mIsSelecting = TRUE; } else { setCursorAtLocalPos( x, y, TRUE ); startSelection(); } gFocusMgr.setMouseCapture( this ); } handled = TRUE; } if (hasTabStop()) { setFocus(TRUE); handled = TRUE; } // Delay cursor flashing resetKeystrokeTimer(); return handled; }
// can't tab to children of a non-tab-stop widget BOOL LLUICtrl::canFocusChildren() const { return hasTabStop(); }
void LLUICtrl::initFromXML(LLXMLNodePtr node, LLView* parent) { std::string name; if(node->getAttributeString("name", name)) setName(name); BOOL has_tab_stop = hasTabStop(); node->getAttributeBOOL("tab_stop", has_tab_stop); setTabStop(has_tab_stop); node->getAttributeBOOL("requests_front", mRequestsFront); std::string str = node->getName()->mString; std::string attrib_str; LLXMLNodePtr child_node; //Since so many other callback 'types' piggyback off of the commitcallback registrar as well as use the same callback signature //we can assemble a nice little static list to iterate down instead of copy-pasting mostly similar code for each instance. //Validate/enable callbacks differ, as it uses its own registry/callback signature. This could be worked around with a template, but keeping //all the code local to this scope is more beneficial. typedef boost::signals2::connection (LLUICtrl::*commit_fn)( const commit_signal_t::slot_type& cb ); static std::pair<std::string,commit_fn> sCallbackRegistryMap[3] = { std::pair<std::string,commit_fn>(".commit_callback",&LLUICtrl::setCommitCallback), std::pair<std::string,commit_fn>(".mouseenter_callback",&LLUICtrl::setMouseEnterCallback), std::pair<std::string,commit_fn>(".mouseleave_callback",&LLUICtrl::setMouseLeaveCallback) }; for(S32 i= 0; i < sizeof(sCallbackRegistryMap)/sizeof(sCallbackRegistryMap[0]);++i) { if(node->getChild((str+sCallbackRegistryMap[i].first).c_str(),child_node,false)) { if(child_node->getAttributeString("function",attrib_str)) { commit_callback_t* func = (CommitCallbackRegistry::getValue(attrib_str)); if (func) { if(child_node->getAttributeString("parameter",attrib_str)) (this->*sCallbackRegistryMap[i].second)(boost::bind((*func), this, LLSD(attrib_str))); else (this->*sCallbackRegistryMap[i].second)(commit_signal_t::slot_type(*func)); } } } } if(node->getChild((str+".validate_callback").c_str(),child_node,false)) { if(child_node->getAttributeString("function",attrib_str)) { enable_callback_t* func = (EnableCallbackRegistry::getValue(attrib_str)); if (func) { if(child_node->getAttributeString("parameter",attrib_str)) setValidateCallback(boost::bind((*func), this, LLSD(attrib_str))); else setValidateCallback(enable_signal_t::slot_type(*func)); } } } LLView::initFromXML(node, parent); if (node->getAttributeString("enabled_control", attrib_str)) { LLControlVariable* control = findControl(attrib_str); if (control) setEnabledControlVariable(control); } if (node->getAttributeString("disabled_control", attrib_str)) { LLControlVariable* control = findControl(attrib_str); if (control) setDisabledControlVariable(control); } if(node->getAttributeString("visibility_control",attrib_str) || node->getAttributeString("visiblity_control",attrib_str)) { LLControlVariable* control = findControl(attrib_str); if (control) setMakeVisibleControlVariable(control); } if(node->getAttributeString("invisibility_control",attrib_str) || node->getAttributeString("invisiblity_control",attrib_str)) { LLControlVariable* control = findControl(attrib_str); if (control) setMakeInvisibleControlVariable(control); } }