Skip to content

Commit c4d1862

Browse files
committedOct 17, 2015
Fix GUITable selection issues with trees
- setOpenedTrees(): this internal function was calling setSelected() to update m_selected. Since setSelected() calls autoScroll(), this caused the scrollbar to scroll back to the selected row in some cases when that shouldn't be done. For example, clicking the "+" to open a tree caused autoscroll. Fix this by making setOpenedTrees() modify m_selected directly. - setDynamicData(): set scrollbar position after calling setSelected(), not before. This avoids setSelected()'s autoscroll messing up the scrollbar position again. - setSelected(): If an invisible row is selected, open all parents of the selected row in order to make the selected row visible. This fixes the issue where all the trees are closed again whenever you return from the setting edit dialog to the settings tab.
1 parent 6b40824 commit c4d1862

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed
 

Diff for: ‎src/guiTable.cpp

+30-9
Original file line numberDiff line numberDiff line change
@@ -560,14 +560,31 @@ void GUITable::setSelected(s32 index)
560560
m_sel_column = 0;
561561
m_sel_doubleclick = false;
562562

563-
--index;
563+
--index; // Switch from 1-based indexing to 0-based indexing
564564

565565
s32 rowcount = m_rows.size();
566-
567-
if (index >= rowcount)
566+
if (rowcount == 0) {
567+
return;
568+
} else if (index < 0) {
569+
index = 0;
570+
} else if (index >= rowcount) {
568571
index = rowcount - 1;
569-
while (index >= 0 && m_rows[index].visible_index < 0)
570-
--index;
572+
}
573+
574+
// If the selected row is not visible, open its ancestors to make it visible
575+
if (m_rows[index].visible_index < 0) {
576+
std::set<s32> opened_trees;
577+
getOpenedTrees(opened_trees);
578+
s32 indent = m_rows[index].indent;
579+
for (s32 j = index - 1; j >= 0; --j) {
580+
if (m_rows[j].indent < indent) {
581+
opened_trees.insert(j);
582+
indent = m_rows[j].indent;
583+
}
584+
}
585+
setOpenedTrees(opened_trees);
586+
}
587+
571588
if (index >= 0) {
572589
m_selected = m_rows[index].visible_index;
573590
assert(m_selected >= 0 && m_selected < (s32) m_visible_rows.size());
@@ -596,11 +613,11 @@ void GUITable::setDynamicData(const DynamicData &dyndata)
596613
m_keynav_time = dyndata.keynav_time;
597614
m_keynav_buffer = dyndata.keynav_buffer;
598615

599-
m_scrollbar->setPos(dyndata.scrollpos);
600-
601616
setSelected(dyndata.selected);
602617
m_sel_column = 0;
603618
m_sel_doubleclick = false;
619+
620+
m_scrollbar->setPos(dyndata.scrollpos);
604621
}
605622

606623
const c8* GUITable::getTypeName() const
@@ -1091,7 +1108,9 @@ void GUITable::getOpenedTrees(std::set<s32> &opened_trees) const
10911108

10921109
void GUITable::setOpenedTrees(const std::set<s32> &opened_trees)
10931110
{
1094-
s32 old_selected = getSelected();
1111+
s32 old_selected = -1;
1112+
if (m_selected >= 0)
1113+
old_selected = m_visible_rows[m_selected];
10951114

10961115
std::vector<s32> parents;
10971116
std::vector<s32> closed_parents;
@@ -1143,7 +1162,9 @@ void GUITable::setOpenedTrees(const std::set<s32> &opened_trees)
11431162

11441163
updateScrollBar();
11451164

1146-
setSelected(old_selected);
1165+
// m_selected must be updated since it is a visible row index
1166+
if (old_selected >= 0)
1167+
m_selected = m_rows[old_selected].visible_index;
11471168
}
11481169

11491170
void GUITable::openTree(s32 to_open)

0 commit comments

Comments
 (0)
Please sign in to comment.