X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2FguiTable.cpp;h=3cc95ce4fcde25bc9fba53900f7680775e2569b5;hb=d1df09841d0eac7a88f638676b80ec848522cca5;hp=a7a53f581e2f61d9edb64ebc3eb8cebf10909948;hpb=0d1eedcccc8b83fd5f5a9a75389fe8ac97d2c697;p=dragonfireclient.git diff --git a/src/guiTable.cpp b/src/guiTable.cpp index a7a53f581..3cc95ce4f 100644 --- a/src/guiTable.cpp +++ b/src/guiTable.cpp @@ -33,9 +33,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "util/numeric.h" #include "util/string.h" // for parseColorString() -#include "main.h" #include "settings.h" // for settings #include "porting.h" // for dpi +#include "guiscalingfilter.h" /* GUITable @@ -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 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::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 &opened_trees) const void GUITable::setOpenedTrees(const std::set &opened_trees) { - s32 old_selected = getSelected(); + s32 old_selected = -1; + if (m_selected >= 0) + old_selected = m_visible_rows[m_selected]; std::vector parents; std::vector closed_parents; @@ -1143,7 +1172,9 @@ void GUITable::setOpenedTrees(const std::set &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)