Browse Source

Remember last selected hero

pull/3063/head
obligaron 5 years ago committed by Anders Jenbo
parent
commit
8dc1829ac0
  1. 6
      Source/DiabloUI/diabloui.cpp
  2. 2
      Source/DiabloUI/diabloui.h
  3. 21
      Source/DiabloUI/selhero.cpp

6
Source/DiabloUI/diabloui.cpp

@ -85,9 +85,9 @@ struct ScrollBarState {
} // namespace
void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector<std::unique_ptr<UiItemBase>> &items, bool itemsWraps, bool (*fnYesNo)())
void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector<std::unique_ptr<UiItemBase>> &items, bool itemsWraps, bool (*fnYesNo)(), size_t selectedItem /*= 0*/)
{
SelectedItem = 0;
SelectedItem = selectedItem;
SelectedItemMax = std::max(count - 1, 0);
ListViewportSize = count;
gfnListFocus = fnFocus;
@ -100,7 +100,7 @@ void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int valu
UiItemsWraps = itemsWraps;
ListOffset = nullptr;
if (fnFocus != nullptr)
fnFocus(0);
fnFocus(selectedItem);
#ifndef __SWITCH__
SDL_StopTextInput(); // input is enabled by default

2
Source/DiabloUI/diabloui.h

@ -119,7 +119,7 @@ void UiAddLogo(std::vector<std::unique_ptr<UiItemBase>> *vecDialog, int size = L
void UiFocusNavigationSelect();
void UiFocusNavigationEsc();
void UiFocusNavigationYesNo();
void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector<std::unique_ptr<UiItemBase>> &items, bool wraps = false, bool (*fnYesNo)() = NULL);
void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector<std::unique_ptr<UiItemBase>> &items, bool wraps = false, bool (*fnYesNo)() = NULL, size_t selectedItem = 0);
void UiInitScrollBar(UiScrollbar *uiSb, std::size_t viewportSize, const std::size_t *currentOffset);
void UiClearScreen();
void UiPollAndRender();

21
Source/DiabloUI/selhero.cpp

@ -16,6 +16,7 @@
#include "options.h"
#include "pfile.h"
#include "utils/language.h"
#include <menu.h>
namespace devilution {
@ -502,6 +503,7 @@ void selhero_Init()
void selhero_List_Init()
{
listOffset = 0;
size_t selectedItem = 0;
vecSelDlgItems.clear();
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 };
@ -512,6 +514,15 @@ void selhero_List_Init()
for (std::size_t i = 0; i < numViewportHeroes; i++) {
vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>("", -1));
}
// Adjust list to last selected hero
for (size_t i = 0; i < selhero_SaveCount; i++) {
if (selhero_heros[i].saveNumber == selhero_heroInfo.saveNumber) {
selectedItem = i;
if (i > (MaxViewportItems - 1))
listOffset = i - (MaxViewportItems - 1);
break;
}
}
SelheroUpdateViewportItems();
vecSelDlgItems.push_back(std::make_unique<UiList>(vecSelHeroDlgItems, PANEL_LEFT + 265, (UI_OFFSET_Y + 256), 320, 26, UiFlags::AlignCenter | UiFlags::FontSize24 | UiFlags::ColorUiGold));
@ -532,7 +543,7 @@ void selhero_List_Init()
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 489), (Sint16)(UI_OFFSET_Y + 429), 120, 35 };
vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("Cancel"), &UiFocusNavigationEsc, rect5, UiFlags::AlignCenter | UiFlags::FontSize30 | UiFlags::ColorUiGold));
UiInitList(selhero_SaveCount + 1, SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, SelheroListDeleteYesNo);
UiInitList(selhero_SaveCount + 1, SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, SelheroListDeleteYesNo, selectedItem);
UiInitScrollBar(scrollBar, MaxViewportItems, &listOffset);
if (selhero_isMultiPlayer) {
title = _("Multi Player Characters");
@ -560,6 +571,14 @@ static void UiSelHeroDialog(
selhero_Init();
if (selhero_SaveCount != 0) {
selhero_heroInfo = {};
// Search last used save and remember it as selected item
for (size_t i = 0; i < selhero_SaveCount; i++) {
if (selhero_heros[i].saveNumber == *saveNumber) {
memcpy(&selhero_heroInfo, &selhero_heros[i], sizeof(selhero_heroInfo));
break;
}
}
selhero_List_Init();
} else {
SelheroListSelect(selhero_SaveCount);

Loading…
Cancel
Save