From 1d6bfb727a8015e82cd4060a0c73cf3fc719e818 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Tue, 21 Sep 2021 21:55:12 +0300
Subject: [PATCH] SL-16022 Fixed Tab not cycling through all options

---
 indra/llui/llmenugl.cpp                        | 18 ++++++++++++++++++
 indra/newview/llviewerwindow.cpp               |  1 +
 .../newview/skins/default/xui/en/main_view.xml | 14 ++++++++++++--
 .../default/xui/en/panel_navigation_bar.xml    |  1 -
 .../skins/default/xui/en/panel_status_bar.xml  |  1 -
 5 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index cdaf03ebde4..6b9bf425d26 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -1363,6 +1363,9 @@ class LLMenuItemBranchDownGL : public LLMenuItemBranchGL
 	virtual BOOL handleKeyHere(KEY key, MASK mask);
 	
 	virtual BOOL handleAcceleratorKey(KEY key, MASK mask);
+    
+    virtual void onFocusLost();
+    virtual void setFocus(BOOL b);
 };
 
 LLMenuItemBranchDownGL::LLMenuItemBranchDownGL( const Params& p) :
@@ -1517,6 +1520,21 @@ BOOL LLMenuItemBranchDownGL::handleAcceleratorKey(KEY key, MASK mask)
 
 	return handled;
 }
+void LLMenuItemBranchDownGL::onFocusLost()
+{
+    // needed for tab-based selection
+    LLMenuItemBranchGL::onFocusLost();
+    LLMenuGL::setKeyboardMode(FALSE);
+    setHighlight(FALSE);
+}
+
+void LLMenuItemBranchDownGL::setFocus(BOOL b)
+{
+    // needed for tab-based selection
+    LLMenuItemBranchGL::setFocus(b);
+    LLMenuGL::setKeyboardMode(b);
+    setHighlight(b);
+}
 
 BOOL LLMenuItemBranchDownGL::handleKeyHere(KEY key, MASK mask)
 {
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 32f18b1d5c5..017d3d1bfdf 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2231,6 +2231,7 @@ void LLViewerWindow::initWorldUI()
 	gStatusBar->setShape(status_bar_container->getLocalRect());
 	// sync bg color with menu bar
 	gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor().get() );
+    // add InBack so that gStatusBar won't be drawn over menu
 	status_bar_container->addChildInBack(gStatusBar);
 	status_bar_container->setVisible(TRUE);
 
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 9885e37cea6..a675dd7ab3d 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -8,6 +8,15 @@
  tab_stop="false" 
  name="main_view"
  width="1024">
+
+  <!-- At the moment layout_stack is not an LLUICtrl,
+  but Tab requires focus_root to function and focus_root
+  functionality is implemented in LLUICtrl -->
+  <panel follows="all"
+         height="768"
+         name="menu_tab_wrapper"
+         focus_root="true"
+         top="0">
   <layout_stack border_size="0"
                 follows="all"
                 mouse_opaque="false"
@@ -18,12 +27,12 @@
     <layout_panel mouse_opaque="true"
               follows="left|right|top"
               name="status_bar_container"
-              tab_stop="false"
               height="19"
               left="0"
               top="0"
               width="1024"
               auto_resize="false"
+              default_tab_group="1"
               visible="true">
       <view mouse_opaque="false"
             follows="all"
@@ -31,13 +40,13 @@
             left="0"
             top="0"
             width="1024"
+            tab_group="1"
             height="19"/>
     </layout_panel>
     <layout_panel auto_resize="false"
                   height="34"
                   mouse_opaque="false"
                   name="nav_bar_container"
-                  tab_stop="false"
                   width="1024"
                   visible="false"/>
     <layout_panel auto_resize="true"  
@@ -99,6 +108,7 @@
              tab_stop="false"/>
     </layout_panel>
   </layout_stack>
+  </panel> <!--menu_tab_wrapper-->
  
   <panel top="0"
         follows="all"
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index 1c9aa1eb832..b44c19810b7 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -4,7 +4,6 @@
  background_visible="true"
  bg_opaque_color="MouseGray"
  follows="left|top|right"
- focus_root="true" 
  height="34"
  layout="topleft"
  name="navigation_bar"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 9023d68ea95..b711ed0e1ce 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -11,7 +11,6 @@
  mouse_opaque="false"
  name="status"
  top="19"
- tab_stop="false"
  width="1000">
     <panel.string
      name="packet_loss_tooltip">
-- 
GitLab