Fix Lint broken by b662a4577d692329b9ca83525e6039f2ddcd1ac1
[oweals/minetest.git] / src / guiTable.cpp
index b327782e28c4f44ef3b0c6aa8eaa52185d99c838..d223e3069b0409f387af40a0e202e65b3669f6f7 100644 (file)
@@ -556,6 +556,8 @@ s32 GUITable::getSelected() const
 
 void GUITable::setSelected(s32 index)
 {
+       s32 old_selected = m_selected;
+
        m_selected = -1;
        m_sel_column = 0;
        m_sel_doubleclick = false;
@@ -563,16 +565,15 @@ void GUITable::setSelected(s32 index)
        --index; // Switch from 1-based indexing to 0-based indexing
 
        s32 rowcount = m_rows.size();
-       if (rowcount == 0) {
+       if (rowcount == 0 || index < 0) {
                return;
-       } else if (index < 0) {
-               index = 0;
        } else if (index >= rowcount) {
                index = rowcount - 1;
        }
 
        // If the selected row is not visible, open its ancestors to make it visible
-       if (m_rows[index].visible_index < 0) {
+       bool selection_invisible = m_rows[index].visible_index < 0;
+       if (selection_invisible) {
                std::set<s32> opened_trees;
                getOpenedTrees(opened_trees);
                s32 indent = m_rows[index].indent;
@@ -590,7 +591,9 @@ void GUITable::setSelected(s32 index)
                assert(m_selected >= 0 && m_selected < (s32) m_visible_rows.size());
        }
 
-       autoScroll();
+       if (m_selected != old_selected || selection_invisible) {
+               autoScroll();
+       }
 }
 
 GUITable::DynamicData GUITable::getDynamicData() const
@@ -825,7 +828,7 @@ bool GUITable::OnEvent(const SEvent &event)
                }
                else if (event.KeyInput.PressedDown && event.KeyInput.Char) {
                        // change selection based on text as it is typed
-                       s32 now = getTimeMs();
+                       u64 now = porting::getTimeMs();
                        if (now - m_keynav_time >= 500)
                                m_keynav_buffer = L"";
                        m_keynav_time = now;
@@ -923,6 +926,11 @@ bool GUITable::OnEvent(const SEvent &event)
                                                sel_doubleclick) {
                                        sendTableEvent(sel_column, sel_doubleclick);
                                }
+
+                               // Treeview: double click opens/closes trees
+                               if (m_has_tree_column && sel_doubleclick) {
+                                       toggleVisibleTree(m_selected, 0, false);
+                               }
                        }
                }
                return true;