diff options
author | Merov Linden <merov@lindenlab.com> | 2011-10-24 19:24:58 -0700 |
---|---|---|
committer | Merov Linden <merov@lindenlab.com> | 2011-10-24 19:24:58 -0700 |
commit | 5b0a1ac026e0ca06526cc0c03325b223a051ea63 (patch) | |
tree | 0ef12dea2d1adecc57f55fd408194a5085797070 | |
parent | ec06835e8acf21e2d4b0f05fca1634a66fafdb46 (diff) |
EXP-1460 : Make the caret in favorites toolbar display more consistently and with less finicky hit testing
-rw-r--r-- | indra/newview/llfavoritesbar.cpp | 58 |
1 files changed, 28 insertions, 30 deletions
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index c48b809114..6c9058caf1 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -443,17 +443,17 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, { setLandingTab(dest); } - /* - * the condition dest == NULL can be satisfied not only in the case - * of dragging to the right from the last tab of the favbar. there is a - * small gap between each tab. if the user drags something exactly there - * then mLandingTab will be set to NULL and the dragged item will be pushed - * to the end of the favorites bar. this is incorrect behavior. that's why - * we need an additional check which excludes the case described previously - * making sure that the mouse pointer is beyond the last tab. - */ - else if (mLastTab && x >= mLastTab->getRect().mRight) + else if (mLastTab && (x >= mLastTab->getRect().mRight)) { + /* + * the condition dest == NULL can be satisfied not only in the case + * of dragging to the right from the last tab of the favbar. there is a + * small gap between each tab. if the user drags something exactly there + * then mLandingTab will be set to NULL and the dragged item will be pushed + * to the end of the favorites bar. this is incorrect behavior. that's why + * we need an additional check which excludes the case described previously + * making sure that the mouse pointer is beyond the last tab. + */ setLandingTab(NULL); } @@ -467,7 +467,6 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, if (drop) { handleExistingFavoriteDragAndDrop(x, y); - showDragMarker(FALSE); } } else @@ -490,7 +489,6 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, setLandingTab(NULL); } handleNewFavoriteDragAndDrop(item, favorites_id, x, y); - showDragMarker(FALSE); } } } @@ -664,7 +662,7 @@ void LLFavoritesBarCtrl::draw() { // mouse pointer hovers over an existing tab LLRect rect = mLandingTab->getRect(); - mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h); + mImageDragIndication->draw(rect.mLeft, rect.getHeight(), w, h); } else if (mLastTab) { @@ -672,6 +670,8 @@ void LLFavoritesBarCtrl::draw() LLRect rect = mLastTab->getRect(); mImageDragIndication->draw(rect.mRight, rect.getHeight(), w, h); } + // Once drawn, mark this false so we won't draw it again (unless we hit the favorite bar again) + mShowDragMarker = FALSE; } } @@ -743,7 +743,7 @@ void LLFavoritesBarCtrl::updateButtons() if (first_changed_item_index <= mItems.count()) { // Rebuild the buttons only - // child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator + // child_list_t is a linked list, so safe to erase from the middle if we pre-increment the iterator while (child_it != childs->end()) { @@ -832,9 +832,9 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem /** * WORKAROUND: - * there are some problem with displaying of fonts in buttons. - * Empty space (or ...) is displaying instead of last symbols, even though the width of the button is enough. - * Problem will gone, if we stretch out the button. For that reason I have to put additional 20 pixels. + * There are some problem with displaying of fonts in buttons. + * Empty space or ellipsis might be displayed instead of last symbols, even though the width of the button is enough. + * The problem disappears if we pad the button with 20 pixels. */ int required_width = mFont->getWidth(item->getName()) + 20; int width = required_width > def_button_width? def_button_width : required_width; @@ -862,7 +862,6 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem fav_btn->setRect(butt_rect); // change only left and save bottom fav_btn->setFont(mFont); - fav_btn->setName(item->getName()); fav_btn->setLabel(item->getName()); fav_btn->setToolTip(item->getName()); fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID())); @@ -1320,25 +1319,24 @@ BOOL LLFavoritesBarCtrl::handleHover(S32 x, S32 y, MASK mask) LLUICtrl* LLFavoritesBarCtrl::findChildByLocalCoords(S32 x, S32 y) { - LLUICtrl* ctrl = 0; - S32 screenX, screenY; + LLUICtrl* ctrl = NULL; const child_list_t* list = getChildList(); - localPointToScreen(x, y, &screenX, &screenY); - - // look for a child which contains the point (screenX, screenY) in it's rectangle for (child_list_const_iter_t i = list->begin(); i != list->end(); ++i) { - LLRect rect; - localRectToScreen((*i)->getRect(), &rect); - - if (rect.pointInRect(screenX, screenY)) + // Look only for children that are favorite buttons + if ((*i)->getName() == "favorites_bar_btn") { - ctrl = dynamic_cast<LLUICtrl*>(*i); - break; + LLRect rect = (*i)->getRect(); + // We consider a button hit if the cursor is left of the right side + // This makes the hit a bit less finicky than hitting directly on the button itself + if (x <= rect.mRight) + { + ctrl = dynamic_cast<LLUICtrl*>(*i); + break; + } } } - return ctrl; } |