]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/guiTable.cpp
Add MapSettingsManager and new mapgen setting script API functions
[dragonfireclient.git] / src / guiTable.cpp
index e915770a412da09dec79233c745cfde581b1ad45..3cc95ce4fcde25bc9fba53900f7680775e2569b5 100644 (file)
@@ -556,24 +556,46 @@ 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;
 
-       --index;
+       --index; // Switch from 1-based indexing to 0-based indexing
 
        s32 rowcount = m_rows.size();
-
-       if (index >= rowcount)
+       if (rowcount == 0) {
+               return;
+       } else if (index < 0) {
+               index = 0;
+       } else if (index >= rowcount) {
                index = rowcount - 1;
-       while (index >= 0 && m_rows[index].visible_index < 0)
-               --index;
+       }
+
+       // If the selected row is not visible, open its ancestors to make it visible
+       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;
+               for (s32 j = index - 1; j >= 0; --j) {
+                       if (m_rows[j].indent < indent) {
+                               opened_trees.insert(j);
+                               indent = m_rows[j].indent;
+                       }
+               }
+               setOpenedTrees(opened_trees);
+       }
+
        if (index >= 0) {
                m_selected = m_rows[index].visible_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
@@ -596,11 +618,11 @@ void GUITable::setDynamicData(const DynamicData &dyndata)
        m_keynav_time = dyndata.keynav_time;
        m_keynav_buffer = dyndata.keynav_buffer;
 
-       m_scrollbar->setPos(dyndata.scrollpos);
-
        setSelected(dyndata.selected);
        m_sel_column = 0;
        m_sel_doubleclick = false;
+
+       m_scrollbar->setPos(dyndata.scrollpos);
 }
 
 const c8* GUITable::getTypeName() const
@@ -906,6 +928,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;
@@ -929,7 +956,7 @@ s32 GUITable::allocString(const std::string &text)
        std::map<std::string, s32>::iterator it = m_alloc_strings.find(text);
        if (it == m_alloc_strings.end()) {
                s32 id = m_strings.size();
-               std::wstring wtext = narrow_to_wide(text);
+               std::wstring wtext = utf8_to_wide(text);
                m_strings.push_back(core::stringw(wtext.c_str()));
                m_alloc_strings.insert(std::make_pair(text, id));
                return id;
@@ -1091,7 +1118,9 @@ void GUITable::getOpenedTrees(std::set<s32> &opened_trees) const
 
 void GUITable::setOpenedTrees(const std::set<s32> &opened_trees)
 {
-       s32 old_selected = getSelected();
+       s32 old_selected = -1;
+       if (m_selected >= 0)
+               old_selected = m_visible_rows[m_selected];
 
        std::vector<s32> parents;
        std::vector<s32> closed_parents;
@@ -1143,7 +1172,9 @@ void GUITable::setOpenedTrees(const std::set<s32> &opened_trees)
 
        updateScrollBar();
 
-       setSelected(old_selected);
+       // m_selected must be updated since it is a visible row index
+       if (old_selected >= 0)
+               m_selected = m_rows[old_selected].visible_index;
 }
 
 void GUITable::openTree(s32 to_open)