[Radar] Feature request: Have Focus Next/Prev wrap around when it reaches the end

This commit is contained in:
Inusaito Sayori
2013-12-06 13:10:12 -05:00
parent 062973aaaf
commit 36d8df602c

View File

@@ -1252,26 +1252,35 @@ void LLFloaterAvatarList::setFocusAvatar(const LLUUID& id)
} }
} }
// Simple function to decrement iterators, wrapping back if needed
template<typename T>
T prev_iter(const T& cur, const T& begin, const T& end)
{
return ((cur == begin) ? end : cur) - 1;
}
template<typename T> template<typename T>
void decrement_focus_target(T begin, T end, BOOL marked_only) void decrement_focus_target(T begin, T end, BOOL marked_only)
{ {
T iter = begin; for (T iter = begin; iter != end; ++iter)
while(iter != end && !(*iter)->isFocused()) ++iter;
if(iter == end)
return;
T prev_iter = iter;
while(prev_iter != begin)
{ {
const LLAvatarListEntry& entry = *((--prev_iter)->get()); LLAvatarListEntry& old = *(iter->get());
if(entry.isInList() && (entry.isMarked() || !marked_only) && gAgentCamera.lookAtObject(entry.getID(), false)) if (!old.isFocused()) continue;
for (T prev = prev_iter(iter, begin, end); prev != iter; prev = prev_iter(prev, begin, end))
{ {
(*iter)->setFocus(FALSE); LLAvatarListEntry& entry = *(prev->get());
(*prev_iter)->setFocus(TRUE); if (!entry.isInList()) continue;
gAgentCamera.lookAtObject((*prev_iter)->getID(), false); if (marked_only && !entry.isMarked()) continue;
return; if (gAgentCamera.lookAtObject(entry.getID(), false))
{
old.setFocus(false);
entry.setFocus(true);
return;
}
} }
// Nothing else to focus
break;
} }
gAgentCamera.lookAtObject((*iter)->getID(), false);
} }
void LLFloaterAvatarList::focusOnPrev(BOOL marked_only) void LLFloaterAvatarList::focusOnPrev(BOOL marked_only)