From 8aaff7fc62571efcf289f3e51ba1c49ae1b92d14 Mon Sep 17 00:00:00 2001 From: elexis Date: Mon, 22 Jan 2018 04:45:27 +0000 Subject: [PATCH] Implement an auto-scroll setting for GUI lists. Patch By: fpre / ffffffff Fixes #4987, refs #4254 This allows the replay menu and lobby to focus the selected element if, but only if it is expected by the user. Replaces 3f5648767d which scrolled the selected player into view every single time a new playerlist was received by the lobby server. This was SVN commit r20958. --- binaries/data/mods/mod/gui/gui.rnc | 1 + binaries/data/mods/mod/gui/gui.rng | 5 +++++ binaries/data/mods/mod/gui/modmod/modmod.xml | 2 ++ binaries/data/mods/public/gui/loadgame/load.xml | 1 + binaries/data/mods/public/gui/lobby/lobby.js | 3 +++ binaries/data/mods/public/gui/replaymenu/replay_menu.xml | 1 + source/gui/CList.cpp | 9 ++++++++- 7 files changed, 21 insertions(+), 1 deletion(-) diff --git a/binaries/data/mods/mod/gui/gui.rnc b/binaries/data/mods/mod/gui/gui.rnc index bd075eebae..55e182ad86 100644 --- a/binaries/data/mods/mod/gui/gui.rnc +++ b/binaries/data/mods/mod/gui/gui.rnc @@ -47,6 +47,7 @@ base_settings = # Defaults are not put in here, because it ruins the concept of styles. ex_settings = attribute anchor { valign }?& + attribute auto_scroll { bool }?& attribute buffer_zone { xsd:decimal }?& attribute buffer_width { xsd:decimal }?& attribute button_width { xsd:decimal }?& diff --git a/binaries/data/mods/mod/gui/gui.rng b/binaries/data/mods/mod/gui/gui.rng index 974c95ca96..c1c8338a7e 100644 --- a/binaries/data/mods/mod/gui/gui.rng +++ b/binaries/data/mods/mod/gui/gui.rng @@ -174,6 +174,11 @@ + + + + + diff --git a/binaries/data/mods/mod/gui/modmod/modmod.xml b/binaries/data/mods/mod/gui/modmod/modmod.xml index 5108e7d5ef..765295fa96 100644 --- a/binaries/data/mods/mod/gui/modmod/modmod.xml +++ b/binaries/data/mods/mod/gui/modmod/modmod.xml @@ -62,6 +62,7 @@ selected_column_order="1" size="0 25 100%-2 100%" font="sans-stroke-13" + auto_scroll="true" > showModDescription(this.name); applyFilters(); @@ -113,6 +114,7 @@ size="0 25 96%-5 100%" font="sans-stroke-13" tooltip_style="pgToolTip" + auto_scroll="true" > showModDescription(this.name); disableMod(); diff --git a/binaries/data/mods/public/gui/loadgame/load.xml b/binaries/data/mods/public/gui/loadgame/load.xml index 2b5b34480f..4e5811d2ae 100644 --- a/binaries/data/mods/public/gui/loadgame/load.xml +++ b/binaries/data/mods/public/gui/loadgame/load.xml @@ -22,6 +22,7 @@ sortable="true" size="24 4 100%-24 100%-70" type="olist" + auto_scroll="true" > selectionChanged(); init(); diff --git a/binaries/data/mods/public/gui/lobby/lobby.js b/binaries/data/mods/public/gui/lobby/lobby.js index 6f9bbbc697..b41fdfac47 100644 --- a/binaries/data/mods/public/gui/lobby/lobby.js +++ b/binaries/data/mods/public/gui/lobby/lobby.js @@ -801,6 +801,7 @@ function selectGameFromPlayername() if (g_SelectedPlayer != splitRatingFromNick(player.Name).nick) continue; + gameList.auto_scroll = true; if (player.Team == "observer") { foundAsObserver = true; @@ -1084,6 +1085,8 @@ function updateGameList() // Change these last, otherwise crash gamesBox.list = list; gamesBox.list_data = list_data; + + gamesBox.auto_scroll = false; gamesBox.selected = selectedGameIndex; updateGameSelection(); diff --git a/binaries/data/mods/public/gui/replaymenu/replay_menu.xml b/binaries/data/mods/public/gui/replaymenu/replay_menu.xml index 280e1b34fb..90917ba079 100644 --- a/binaries/data/mods/public/gui/replaymenu/replay_menu.xml +++ b/binaries/data/mods/public/gui/replaymenu/replay_menu.xml @@ -57,6 +57,7 @@ selected_column="months" selected_column_order="-1" font="sans-stroke-13" + auto_scroll="true" > displayReplayDetails(); diff --git a/source/gui/CList.cpp b/source/gui/CList.cpp index 03c8cbd56a..74ea7135f9 100644 --- a/source/gui/CList.cpp +++ b/source/gui/CList.cpp @@ -45,6 +45,7 @@ CList::CList() AddSetting(GUIST_CColor, "textcolor"); AddSetting(GUIST_CColor, "textcolor_selected"); AddSetting(GUIST_int, "selected"); // Index selected. -1 is none. + AddSetting(GUIST_bool, "auto_scroll"); AddSetting(GUIST_int, "hovered"); AddSetting(GUIST_CStrW, "tooltip"); AddSetting(GUIST_CStr, "tooltip_style"); @@ -56,6 +57,7 @@ CList::CList() GUI::SetSetting(this, "scrollbar", false); GUI::SetSetting(this, "selected", -1); GUI::SetSetting(this, "hovered", -1); + GUI::SetSetting(this, "auto_scroll", false); // Add scroll-bar CGUIScrollBarVertical* bar = new CGUIScrollBarVertical(); @@ -161,7 +163,12 @@ void CList::HandleMessage(SGUIMessage& Message) { // TODO: Check range - UpdateAutoScroll(); + bool auto_scroll; + + GUI::GetSetting(this, "auto_scroll", auto_scroll); + + if (auto_scroll) + UpdateAutoScroll(); // TODO only works if lower-case, shouldn't it be made case sensitive instead? ScriptEvent("selectionchange");