diff options
Diffstat (limited to 'indra/llui')
-rw-r--r-- | indra/llui/llflatlistview.cpp | 14 | ||||
-rw-r--r-- | indra/llui/llflatlistview.h | 2 | ||||
-rw-r--r-- | indra/llui/llfloater.cpp | 6 | ||||
-rw-r--r-- | indra/llui/llfloater.h | 3 | ||||
-rw-r--r-- | indra/llui/llscrollbar.cpp | 16 | ||||
-rw-r--r-- | indra/llui/llscrollbar.h | 1 | ||||
-rw-r--r-- | indra/llui/llscrollcontainer.cpp | 6 | ||||
-rw-r--r-- | indra/llui/llscrollingpanellist.cpp | 4 | ||||
-rw-r--r-- | indra/llui/llscrollingpanellist.h | 2 | ||||
-rw-r--r-- | indra/llui/lltextbase.cpp | 11 | ||||
-rw-r--r-- | indra/llui/lltextbase.h | 1 | ||||
-rw-r--r-- | indra/llui/lltexteditor.cpp | 12 | ||||
-rw-r--r-- | indra/llui/llurlentry.cpp | 3 | ||||
-rw-r--r-- | indra/llui/llurlregistry.cpp | 12 | ||||
-rw-r--r-- | indra/llui/llurlregistry.h | 4 | ||||
-rw-r--r-- | indra/llui/llview.cpp | 46 | ||||
-rw-r--r-- | indra/llui/llview.h | 2 | ||||
-rw-r--r-- | indra/llui/tests/llurlentry_test.cpp | 4 |
18 files changed, 120 insertions, 29 deletions
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index e9df361472..bba5464b00 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -44,6 +44,9 @@ const LLSD UNSELECTED_EVENT = LLSD().insert("selected", false); static const std::string COMMENT_TEXTBOX = "comment_text"; +//forward declaration +bool llsds_are_equal(const LLSD& llsd_1, const LLSD& llsd_2); + LLFlatListView::Params::Params() : item_pad("item_pad"), allow_select("allow_select"), @@ -333,6 +336,17 @@ void LLFlatListView::sort() rearrangeItems(); } +bool LLFlatListView::updateValue(const LLSD& old_value, const LLSD& new_value) +{ + if (old_value.isUndefined() || new_value.isUndefined()) return false; + if (llsds_are_equal(old_value, new_value)) return false; + + item_pair_t* item_pair = getItemPair(old_value); + if (!item_pair) return false; + + item_pair->second = new_value; + return true; +} ////////////////////////////////////////////////////////////////////////// // PROTECTED STUFF diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index af5a9cfa9b..888258efdc 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -273,6 +273,8 @@ public: void setComparator(const ItemComparator* comp) { mItemComparator = comp; } void sort(); + bool updateValue(const LLSD& old_value, const LLSD& new_value); + protected: /** Pairs LLpanel representing a single item LLPanel and LLSD associated with it */ diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 647c816fdf..3b9ab3ddda 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1252,6 +1252,12 @@ BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons inde return FALSE; } +BOOL LLFloater::handleScrollWheel(S32 x, S32 y, S32 clicks) +{ + LLPanel::handleScrollWheel(x,y,clicks); + return TRUE;//always +} + // virtual BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask) { diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index cbe374252f..366f146821 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -208,6 +208,9 @@ public: virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask); + + virtual BOOL handleScrollWheel(S32 x, S32 y, S32 mask); + virtual void draw(); virtual void onOpen(const LLSD& key) {} diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index cb4147709d..0d674528dc 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -409,8 +409,13 @@ BOOL LLScrollbar::handleHover(S32 x, S32 y, MASK mask) BOOL LLScrollbar::handleScrollWheel(S32 x, S32 y, S32 clicks) { - changeLine( clicks * mStepSize, TRUE ); - return TRUE; + S32 pos = llclamp(mDocPos + clicks * mStepSize, 0, getDocPosMax()); + if (pos != mDocPos) + { + setDocPos(pos, TRUE); + return TRUE; + } + return FALSE; } BOOL LLScrollbar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, @@ -452,6 +457,13 @@ BOOL LLScrollbar::handleMouseUp(S32 x, S32 y, MASK mask) return handled; } +BOOL LLScrollbar::handleDoubleClick(S32 x, S32 y, MASK mask) +{ + // just treat a double click as a second click + return handleMouseDown(x, y, mask); +} + + void LLScrollbar::reshape(S32 width, S32 height, BOOL called_from_parent) { if (width == getRect().getWidth() && height == getRect().getHeight()) return; diff --git a/indra/llui/llscrollbar.h b/indra/llui/llscrollbar.h index 2e95779624..865a1db409 100644 --- a/indra/llui/llscrollbar.h +++ b/indra/llui/llscrollbar.h @@ -93,6 +93,7 @@ public: virtual BOOL handleKeyHere(KEY key, MASK mask); virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); virtual BOOL handleHover(S32 x, S32 y, MASK mask); virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index 5597d494fe..d8606c6889 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -235,6 +235,8 @@ BOOL LLScrollContainer::handleKeyHere(KEY key, MASK mask) BOOL LLScrollContainer::handleScrollWheel( S32 x, S32 y, S32 clicks ) { + if(LLUICtrl::handleScrollWheel(x,y,clicks)) + return TRUE; for( S32 i = 0; i < SCROLLBAR_COUNT; i++ ) { // Note: tries vertical and then horizontal @@ -246,9 +248,7 @@ BOOL LLScrollContainer::handleScrollWheel( S32 x, S32 y, S32 clicks ) return TRUE; } } - - // Eat scroll wheel event (to avoid scrolling nested containers?) - return TRUE; + return FALSE; } BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, diff --git a/indra/llui/llscrollingpanellist.cpp b/indra/llui/llscrollingpanellist.cpp index 13fbe1d576..4f55c0507c 100644 --- a/indra/llui/llscrollingpanellist.cpp +++ b/indra/llui/llscrollingpanellist.cpp @@ -50,7 +50,7 @@ void LLScrollingPanelList::clearPanels() reshape( 1, 1, FALSE ); } -void LLScrollingPanelList::addPanel( LLScrollingPanel* panel ) +S32 LLScrollingPanelList::addPanel( LLScrollingPanel* panel ) { addChildInBack( panel ); mPanelList.push_front( panel ); @@ -79,6 +79,8 @@ void LLScrollingPanelList::addPanel( LLScrollingPanel* panel ) childp->translate( -childp->getRect().mLeft, cur_y - childp->getRect().mBottom); cur_y -= GAP_BETWEEN_PANELS; } + + return total_height; } void LLScrollingPanelList::removePanel(LLScrollingPanel* panel) diff --git a/indra/llui/llscrollingpanellist.h b/indra/llui/llscrollingpanellist.h index 9da15822d0..3abfbcbbe7 100644 --- a/indra/llui/llscrollingpanellist.h +++ b/indra/llui/llscrollingpanellist.h @@ -77,7 +77,7 @@ public: virtual void draw(); void clearPanels(); - void addPanel( LLScrollingPanel* panel ); + S32 addPanel( LLScrollingPanel* panel ); void removePanel( LLScrollingPanel* panel ); void removePanel( U32 panel_index ); void updatePanels(BOOL allow_modify); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 3c5213a0b3..4cf8d76827 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2291,6 +2291,17 @@ BOOL LLNormalTextSegment::handleRightMouseDown(S32 x, S32 y, MASK mask) return FALSE; } +BOOL LLNormalTextSegment::handleMouseDown(S32 x, S32 y, MASK mask) +{ + if (getStyle() && getStyle()->isLink()) + { + // eat mouse down event on hyperlinks, so we get the mouse up + return TRUE; + } + + return FALSE; +} + BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask) { if (getStyle() && getStyle()->isLink()) diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 903396c78a..ca9b1cc123 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -436,6 +436,7 @@ public: /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask); diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 74ffad0f53..7c925b8899 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -2505,6 +2505,8 @@ void LLTextEditor::updateSegments() void LLTextEditor::updateLinkSegments() { + LLWString wtext = getWText(); + // update any segments that contain a link for (segment_set_t::iterator it = mSegments.begin(); it != mSegments.end(); ++it) { @@ -2514,13 +2516,13 @@ void LLTextEditor::updateLinkSegments() // if the link's label (what the user can edit) is a valid Url, // then update the link's HREF to be the same as the label text. // This lets users edit Urls in-place. - LLUrlMatch match; LLStyleSP style = static_cast<LLStyleSP>(segment->getStyle()); - std::string url_label = getText().substr(segment->getStart(), segment->getEnd()-segment->getStart()); - if (LLUrlRegistry::instance().findUrl(url_label, match)) + LLWString url_label = wtext.substr(segment->getStart(), segment->getEnd()-segment->getStart()); + if (LLUrlRegistry::instance().hasUrl(url_label)) { - LLStringUtil::trim(url_label); - style->setLinkHREF(url_label); + std::string new_url = wstring_to_utf8str(url_label); + LLStringUtil::trim(new_url); + style->setLinkHREF(new_url); } } } diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index c1da73fa83..e04ccfbc2f 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -302,10 +302,11 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa // // LLUrlEntryGroup Describes a Second Life group Url, e.g., // secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about +// secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect // LLUrlEntryGroup::LLUrlEntryGroup() { - mPattern = boost::regex("secondlife:///app/group/[\\da-f-]+/about", + mPattern = boost::regex("secondlife:///app/group/[\\da-f-]+/\\w+", boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_group.xml"; mIcon = "Generic_Group"; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 8413de0837..249c7320d6 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -192,3 +192,15 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr } return false; } + +bool LLUrlRegistry::hasUrl(const std::string &text) +{ + LLUrlMatch match; + return findUrl(text, match); +} + +bool LLUrlRegistry::hasUrl(const LLWString &text) +{ + LLUrlMatch match; + return findUrl(text, match); +} diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index 85e934e4b5..d7800d8cfc 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -81,6 +81,10 @@ public: bool findUrl(const LLWString &text, LLUrlMatch &match, const LLUrlLabelCallback &cb = &LLUrlRegistryNullCallback); + // return true if the given string contains a URL that findUrl would match + bool hasUrl(const std::string &text); + bool hasUrl(const LLWString &text); + private: LLUrlRegistry(); friend class LLSingleton<LLUrlRegistry>; diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 7db6eab9ad..31f12fe312 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -655,7 +655,7 @@ LLView* LLView::childrenHandleToolTip(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; @@ -672,6 +672,26 @@ LLView* LLView::childrenHandleToolTip(S32 x, S32 y, MASK mask) } +LLView* LLView::childFromPoint(S32 x, S32 y) +{ + if (!getVisible() ) + return false; + for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it) + { + LLView* viewp = *child_it; + S32 local_x = x - viewp->getRect().mLeft; + S32 local_y = y - viewp->getRect().mBottom; + if (!viewp->pointInView(local_x, local_y) + || !viewp->getVisible() ) + { + continue; + } + return viewp; + + } + return 0; +} + BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; @@ -895,18 +915,12 @@ LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; break; } - - if (viewp->blockMouseEvent(local_x, local_y)) - { - handled_view = viewp; - break; - } } } return handled_view; @@ -933,7 +947,7 @@ LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; @@ -1023,7 +1037,7 @@ LLView* LLView::childrenHandleMouseDown(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; break; @@ -1061,7 +1075,7 @@ LLView* LLView::childrenHandleRightMouseDown(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; @@ -1100,7 +1114,7 @@ LLView* LLView::childrenHandleMiddleMouseDown(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; break; @@ -1139,7 +1153,7 @@ LLView* LLView::childrenHandleDoubleClick(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; break; @@ -1176,7 +1190,7 @@ LLView* LLView::childrenHandleMouseUp(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; break; @@ -1213,7 +1227,7 @@ LLView* LLView::childrenHandleRightMouseUp(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; break; @@ -1250,7 +1264,7 @@ LLView* LLView::childrenHandleMiddleMouseUp(S32 x, S32 y, MASK mask) { if (sDebugMouseHandling) { - sMouseHandlerMessage = std::string("->") + viewp->mName + sMouseHandlerMessage; + sMouseHandlerMessage = std::string("/") + viewp->mName + sMouseHandlerMessage; } handled_view = viewp; break; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 5e35068733..73146b2c1f 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -445,6 +445,8 @@ public: /*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const; /*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const; + virtual LLView* childFromPoint(S32 x, S32 y); + // view-specific handlers virtual void onMouseEnter(S32 x, S32 y, MASK mask); virtual void onMouseLeave(S32 x, S32 y, MASK mask); diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 468fae2ec5..128cd134c1 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -308,6 +308,10 @@ namespace tut "secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about", "secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about"); + testRegex("Group Url ", r, + "secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect", + "secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect"); + testRegex("Group Url in text", r, "XXX secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about XXX", "secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about"); |