FIRE-29862: Add a way to select all gestures (and other stuff as well)

meow-7.2.2
Ansariel 2020-07-14 15:46:45 +02:00
parent 0c632b5b17
commit 24f83da506
3 changed files with 139 additions and 0 deletions

View File

@ -2514,6 +2514,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
if (selected_item)
{
handleRightMouseDown(selected_item->getRect().getCenterX(), selected_item->getRect().getCenterY(), MASK_NONE);
handled = TRUE;
}
break;
}
@ -2523,11 +2524,139 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
}
}
// TODO: multiple: shift-up, shift-down, shift-home, shift-end, select all
// <FS:Ansariel> Let's just do this!
else if (mask == MASK_CONTROL)
{
switch (key)
{
case 'A':
if (canSelectAll())
{
selectAll();
handled = TRUE;
}
break;
default:
break;
}
}
else if (mask == MASK_SHIFT)
{
switch (key)
{
case KEY_UP:
if (mAllowKeyboardMovement || hasFocus())
{
auto selected_items = getAllSelected();
auto last = selected_items.back();
if (mLastSelected == last && selected_items.size() > 1)
{
deselectItem(last);
mLastSelected = getAllSelected().back(); // Use updated selection
}
else
{
auto items = getAllData();
auto first = std::find(items.begin(), items.end(), selected_items.front());
if (first != items.end() && first > items.begin())
{
selectItem(*(--first), FALSE);
}
}
handled = TRUE;
}
break;
case KEY_DOWN:
if (mAllowKeyboardMovement || hasFocus())
{
auto selected_items = getAllSelected();
auto first = selected_items.front();
if (mLastSelected == first && selected_items.size() > 1)
{
deselectItem(first);
mLastSelected = getAllSelected().front(); // Use updated selection
}
else
{
auto items = getAllData();
auto last = std::find(items.begin(), items.end(), selected_items.back());
if (last != items.end() && last < items.end() - 1)
{
selectItem(*(++last), FALSE);
}
}
handled = TRUE;
}
break;
case KEY_HOME:
if (mAllowKeyboardMovement || hasFocus())
{
auto items = getAllData();
auto first = std::find(items.begin(), items.end(), getAllSelected().front());
for (auto it = items.begin(); it != items.end(); ++it)
{
if (it <= first)
{
selectItem(*it, FALSE);
}
else
{
deselectItem(*it);
}
}
handled = TRUE;
}
break;
case KEY_END:
if (mAllowKeyboardMovement || hasFocus())
{
auto items = getAllData();
auto last = std::find(items.begin(), items.end(), getAllSelected().back());
for (auto it = items.begin(); it != items.end(); ++it)
{
if (it >= last)
{
selectItem(*it, FALSE);
}
else
{
deselectItem(*it);
}
}
handled = TRUE;
}
break;
default:
break;
}
}
// </FS:Ansariel>
}
return handled;
}
// <FS:Ansariel> Needed for keyboard selection in radar
void LLScrollListCtrl::setLastSelectedItem(const LLUUID& id)
{
for (auto item : getAllSelected())
{
if (item->getUUID() == id)
{
mLastSelected = item;
break;
}
}
}
// </FS:Ansariel>
BOOL LLScrollListCtrl::handleUnicodeCharHere(llwchar uni_char)
{
if ((uni_char < 0x20) || (uni_char == 0x7F)) // Control character or DEL

View File

@ -275,6 +275,7 @@ public:
std::vector<LLScrollListItem*> getAllSelected() const;
S32 getNumSelected() const;
LLScrollListItem* getLastSelectedItem() const { return mLastSelected; }
void setLastSelectedItem(const LLUUID& id); // <FS:Ansariel> Needed for keyboard selection in radar
// iterate over all items
LLScrollListItem* getFirstData() const;

View File

@ -326,6 +326,11 @@ void FSPanelRadar::updateList(const std::vector<LLSD>& entries, const LLSD& stat
static const std::string typingColumnIcon = getString("TypingColumnIcon");
// Store current selection and scroll position
LLUUID last_selected_id;
if (mRadarList->getLastSelectedItem())
{
last_selected_id = mRadarList->getLastSelectedItem()->getUUID();
}
std::vector<LLScrollListItem*> selected_items = mRadarList->getAllSelected();
uuid_vec_t selected_ids;
for (std::vector<LLScrollListItem*>::iterator it = selected_items.begin(); it != selected_items.end(); ++it)
@ -458,6 +463,10 @@ void FSPanelRadar::updateList(const std::vector<LLSD>& entries, const LLSD& stat
if (!selected_ids.empty())
{
mRadarList->selectMultiple(selected_ids);
if (last_selected_id.notNull())
{
mRadarList->setLastSelectedItem(last_selected_id);
}
}
updateButtons();