Browse Source

Use smart pointers for UI items

vector::push_back(new Foo(...)) leaks if resizing fails
pull/2326/head
Vladimir Olteanu 5 years ago committed by Anders Jenbo
parent
commit
c57560674e
  1. 54
      Source/DiabloUI/diabloui.cpp
  2. 8
      Source/DiabloUI/diabloui.h
  3. 29
      Source/DiabloUI/dialogs.cpp
  4. 6
      Source/DiabloUI/dialogs.h
  5. 30
      Source/DiabloUI/mainmenu.cpp
  6. 4
      Source/DiabloUI/progress.cpp
  7. 38
      Source/DiabloUI/selconn.cpp
  8. 92
      Source/DiabloUI/selgame.cpp
  9. 138
      Source/DiabloUI/selhero.cpp
  10. 20
      Source/DiabloUI/selok.cpp
  11. 20
      Source/DiabloUI/selyesno.cpp
  12. 11
      Source/DiabloUI/title.cpp
  13. 7
      Source/DiabloUI/ui_item.h

54
Source/DiabloUI/diabloui.cpp

@ -80,7 +80,7 @@ struct ScrollBarState {
} // namespace } // namespace
void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector<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)())
{ {
SelectedItem = 0; SelectedItem = 0;
SelectedItemMax = std::max(count - 1, 0); SelectedItemMax = std::max(count - 1, 0);
@ -89,7 +89,9 @@ void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int valu
gfnListSelect = fnSelect; gfnListSelect = fnSelect;
gfnListEsc = fnEsc; gfnListEsc = fnEsc;
gfnListYesNo = fnYesNo; gfnListYesNo = fnYesNo;
gUiItems = items; gUiItems.clear();
for (auto &item : items)
gUiItems.push_back(item.get());
UiItemsWraps = itemsWraps; UiItemsWraps = itemsWraps;
ListOffset = nullptr; ListOffset = nullptr;
if (fnFocus != nullptr) if (fnFocus != nullptr)
@ -101,7 +103,7 @@ void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int valu
textInputActive = false; textInputActive = false;
for (const auto &item : items) { for (const auto &item : items) {
if (item->m_type == UI_EDIT) { if (item->m_type == UI_EDIT) {
auto *pItemUIEdit = static_cast<UiEdit *>(item); auto *pItemUIEdit = static_cast<UiEdit *>(item.get());
SDL_SetTextInputRect(&item->m_rect); SDL_SetTextInputRect(&item->m_rect);
textInputActive = true; textInputActive = true;
#ifdef __SWITCH__ #ifdef __SWITCH__
@ -623,21 +625,21 @@ void LoadBackgroundArt(const char *pszFile, int frames)
RenderPresent(); RenderPresent();
} }
void UiAddBackground(std::vector<UiItemBase *> *vecDialog) void UiAddBackground(std::vector<std::unique_ptr<UiItemBase>> *vecDialog)
{ {
if (ArtBackgroundWidescreen.surface != nullptr) { if (ArtBackgroundWidescreen.surface != nullptr) {
SDL_Rect rectw = { 0, UI_OFFSET_Y, 0, 0 }; SDL_Rect rectw = { 0, UI_OFFSET_Y, 0, 0 };
vecDialog->push_back(new UiImage(&ArtBackgroundWidescreen, /*bAnimated=*/false, /*iFrame=*/0, rectw, UIS_CENTER)); vecDialog->push_back(std::make_unique<UiImage>(&ArtBackgroundWidescreen, /*bAnimated=*/false, /*iFrame=*/0, rectw, UIS_CENTER));
} }
SDL_Rect rect = { 0, UI_OFFSET_Y, 0, 0 }; SDL_Rect rect = { 0, UI_OFFSET_Y, 0, 0 };
vecDialog->push_back(new UiImage(&ArtBackground, /*bAnimated=*/false, /*iFrame=*/0, rect, UIS_CENTER)); vecDialog->push_back(std::make_unique<UiImage>(&ArtBackground, /*bAnimated=*/false, /*iFrame=*/0, rect, UIS_CENTER));
} }
void UiAddLogo(std::vector<UiItemBase *> *vecDialog, int size, int y) void UiAddLogo(std::vector<std::unique_ptr<UiItemBase>> *vecDialog, int size, int y)
{ {
SDL_Rect rect = { 0, (Sint16)(UI_OFFSET_Y + y), 0, 0 }; SDL_Rect rect = { 0, (Sint16)(UI_OFFSET_Y + y), 0, 0 };
vecDialog->push_back(new UiImage(&ArtLogos[size], /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER)); vecDialog->push_back(std::make_unique<UiImage>(&ArtLogos[size], /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER));
} }
void UiFadeIn() void UiFadeIn()
@ -933,6 +935,12 @@ void UiRenderItems(const std::vector<UiItemBase *> &items)
RenderItem(item); RenderItem(item);
} }
void UiRenderItems(const std::vector<std::unique_ptr<UiItemBase>> &items)
{
for (const auto &item : items)
RenderItem(item.get());
}
bool UiItemMouseEvents(SDL_Event *event, const std::vector<UiItemBase *> &items) bool UiItemMouseEvents(SDL_Event *event, const std::vector<UiItemBase *> &items)
{ {
if (items.empty()) { if (items.empty()) {
@ -963,6 +971,36 @@ bool UiItemMouseEvents(SDL_Event *event, const std::vector<UiItemBase *> &items)
return handled; return handled;
} }
bool UiItemMouseEvents(SDL_Event *event, const std::vector<std::unique_ptr<UiItemBase>> &items)
{
if (items.empty()) {
return false;
}
// In SDL2 mouse events already use logical coordinates.
#ifdef USE_SDL1
OutputToLogical(&event->button.x, &event->button.y);
#endif
bool handled = false;
for (const auto &item : items) {
if (HandleMouseEvent(*event, item.get())) {
handled = true;
break;
}
}
if (event->type == SDL_MOUSEBUTTONUP && event->button.button == SDL_BUTTON_LEFT) {
scrollBarState.downArrowPressed = scrollBarState.upArrowPressed = false;
for (const auto &item : items) {
if (item->m_type == UI_BUTTON)
HandleGlobalMouseUpButton(static_cast<UiButton *>(item.get()));
}
}
return handled;
}
void DrawMouse() void DrawMouse()
{ {
if (IsHardwareCursor() || sgbControllerActive) if (IsHardwareCursor() || sgbControllerActive)

8
Source/DiabloUI/diabloui.h

@ -108,20 +108,22 @@ bool UiSelectProvider(GameData *gameData);
void UiFadeIn(); void UiFadeIn();
void UiHandleEvents(SDL_Event *event); void UiHandleEvents(SDL_Event *event);
bool UiItemMouseEvents(SDL_Event *event, const std::vector<UiItemBase *> &items); bool UiItemMouseEvents(SDL_Event *event, const std::vector<UiItemBase *> &items);
bool UiItemMouseEvents(SDL_Event *event, const std::vector<std::unique_ptr<UiItemBase>> &items);
Sint16 GetCenterOffset(Sint16 w, Sint16 bw = 0); Sint16 GetCenterOffset(Sint16 w, Sint16 bw = 0);
void LoadPalInMem(const SDL_Color *pPal); void LoadPalInMem(const SDL_Color *pPal);
void DrawMouse(); void DrawMouse();
void LoadBackgroundArt(const char *pszFile, int frames = 1); void LoadBackgroundArt(const char *pszFile, int frames = 1);
void UiAddBackground(std::vector<UiItemBase *> *vecDialog); void UiAddBackground(std::vector<std::unique_ptr<UiItemBase> > *vecDialog);
void UiAddLogo(std::vector<UiItemBase *> *vecDialog, int size = LOGO_MED, int y = 0); void UiAddLogo(std::vector<std::unique_ptr<UiItemBase>> *vecDialog, int size = LOGO_MED, int y = 0);
void UiFocusNavigationSelect(); void UiFocusNavigationSelect();
void UiFocusNavigationEsc(); void UiFocusNavigationEsc();
void UiFocusNavigationYesNo(); void UiFocusNavigationYesNo();
void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector<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);
void UiInitScrollBar(UiScrollBar *uiSb, std::size_t viewportSize, const std::size_t *currentOffset); void UiInitScrollBar(UiScrollBar *uiSb, std::size_t viewportSize, const std::size_t *currentOffset);
void UiClearScreen(); void UiClearScreen();
void UiPollAndRender(); void UiPollAndRender();
void UiRenderItems(const std::vector<UiItemBase *> &items); void UiRenderItems(const std::vector<UiItemBase *> &items);
void UiRenderItems(const std::vector<std::unique_ptr<UiItemBase>> &items);
void UiInitList_clear(); void UiInitList_clear();
void mainmenu_restart_repintro(); void mainmenu_restart_repintro();

29
Source/DiabloUI/dialogs.cpp

@ -29,8 +29,8 @@ void DialogActionOK()
dialogEnd = true; dialogEnd = true;
} }
std::vector<UiItemBase *> vecNULL; std::vector<std::unique_ptr<UiItemBase>> vecNULL;
std::vector<UiItemBase *> vecOkDialog; std::vector<std::unique_ptr<UiItemBase>> vecOkDialog;
// clang-format off // clang-format off
#define BLANKCOLOR { 0, 0xFF, 0, 0 } #define BLANKCOLOR { 0, 0xFF, 0, 0 }
@ -163,26 +163,26 @@ void Init(const char *text, const char *caption, bool error, bool renderBehind)
{ {
if (caption == nullptr) { if (caption == nullptr) {
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 180), (Sint16)(UI_OFFSET_Y + 168), 280, 144 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 180), (Sint16)(UI_OFFSET_Y + 168), 280, 144 };
vecOkDialog.push_back(new UiImage(&dialogArt, rect1)); vecOkDialog.push_back(std::make_unique<UiImage>(&dialogArt, rect1));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 200), (Sint16)(UI_OFFSET_Y + 211), 240, 80 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 200), (Sint16)(UI_OFFSET_Y + 211), 240, 80 };
vecOkDialog.push_back(new UiText(text, rect2, UIS_CENTER)); vecOkDialog.push_back(std::make_unique<UiText>(text, rect2, UIS_CENTER));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 265), (Sint16)(UI_OFFSET_Y + 265), SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 265), (Sint16)(UI_OFFSET_Y + 265), SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT };
vecOkDialog.push_back(new UiButton(&SmlButton, _("OK"), &DialogActionOK, rect3, 0)); vecOkDialog.push_back(std::make_unique<UiButton>(&SmlButton, _("OK"), &DialogActionOK, rect3, 0));
} else { } else {
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 127), (Sint16)(UI_OFFSET_Y + 100), 385, 280 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 127), (Sint16)(UI_OFFSET_Y + 100), 385, 280 };
vecOkDialog.push_back(new UiImage(&dialogArt, rect1)); vecOkDialog.push_back(std::make_unique<UiImage>(&dialogArt, rect1));
SDL_Color color = { 255, 255, 0, 0 }; SDL_Color color = { 255, 255, 0, 0 };
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 147), (Sint16)(UI_OFFSET_Y + 110), 345, 20 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 147), (Sint16)(UI_OFFSET_Y + 110), 345, 20 };
vecOkDialog.push_back(new UiText(text, color, rect2, UIS_CENTER)); vecOkDialog.push_back(std::make_unique<UiText>(text, color, rect2, UIS_CENTER));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 147), (Sint16)(UI_OFFSET_Y + 141), 345, 190 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 147), (Sint16)(UI_OFFSET_Y + 141), 345, 190 };
vecOkDialog.push_back(new UiText(caption, rect3, UIS_CENTER)); vecOkDialog.push_back(std::make_unique<UiText>(caption, rect3, UIS_CENTER));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 335), SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 335), SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT };
vecOkDialog.push_back(new UiButton(&SmlButton, _("OK"), &DialogActionOK, rect4, 0)); vecOkDialog.push_back(std::make_unique<UiButton>(&SmlButton, _("OK"), &DialogActionOK, rect4, 0));
} }
if (!renderBehind) { if (!renderBehind) {
@ -215,13 +215,10 @@ void Deinit()
if (!fontWasLoaded) if (!fontWasLoaded)
UnloadTtfFont(); UnloadTtfFont();
for (auto *pUIItem : vecOkDialog) {
delete pUIItem;
}
vecOkDialog.clear(); vecOkDialog.clear();
} }
void DialogLoop(const std::vector<UiItemBase *> &items, const std::vector<UiItemBase *> &renderBehind) void DialogLoop(const std::vector<std::unique_ptr<UiItemBase>> &items, const std::vector<std::unique_ptr<UiItemBase>> &renderBehind)
{ {
SDL_Event event; SDL_Event event;
dialogEnd = false; dialogEnd = false;
@ -259,7 +256,7 @@ void DialogLoop(const std::vector<UiItemBase *> &items, const std::vector<UiItem
} // namespace } // namespace
void UiOkDialog(const char *text, const char *caption, bool error, const std::vector<UiItemBase *> &renderBehind) void UiOkDialog(const char *text, const char *caption, bool error, const std::vector<std::unique_ptr<UiItemBase>> &renderBehind)
{ {
static bool inDialog = false; static bool inDialog = false;
@ -289,7 +286,7 @@ void UiOkDialog(const char *text, const char *caption, bool error, const std::ve
inDialog = false; inDialog = false;
} }
void UiErrorOkDialog(const char *text, const char *caption, const std::vector<UiItemBase *> &renderBehind) void UiErrorOkDialog(const char *text, const char *caption, const std::vector<std::unique_ptr<UiItemBase>> &renderBehind)
{ {
UiOkDialog(text, caption, /*error=*/true, renderBehind); UiOkDialog(text, caption, /*error=*/true, renderBehind);
} }
@ -299,7 +296,7 @@ void UiErrorOkDialog(const char *text, const char *caption, bool error)
UiOkDialog(text, caption, error, vecNULL); UiOkDialog(text, caption, error, vecNULL);
} }
void UiErrorOkDialog(const char *text, const std::vector<UiItemBase *> &renderBehind) void UiErrorOkDialog(const char *text, const std::vector<std::unique_ptr<UiItemBase>> &renderBehind)
{ {
UiErrorOkDialog(text, nullptr, renderBehind); UiErrorOkDialog(text, nullptr, renderBehind);
} }

6
Source/DiabloUI/dialogs.h

@ -6,8 +6,8 @@
namespace devilution { namespace devilution {
void UiErrorOkDialog(const char *text, const std::vector<UiItemBase *> &renderBehind); void UiErrorOkDialog(const char *text, const std::vector<std::unique_ptr<UiItemBase> > &renderBehind);
void UiErrorOkDialog(const char *text, const char *caption, const std::vector<UiItemBase *> &renderBehind); void UiErrorOkDialog(const char *text, const char *caption, const std::vector<std::unique_ptr<UiItemBase> > &renderBehind);
void UiOkDialog(const char *text, const char *caption, bool error, const std::vector<UiItemBase *> &renderBehind); void UiOkDialog(const char *text, const char *caption, bool error, const std::vector<std::unique_ptr<UiItemBase> > &renderBehind);
} // namespace devilution } // namespace devilution

30
Source/DiabloUI/mainmenu.cpp

@ -9,8 +9,8 @@ namespace {
int mainmenu_attract_time_out; //seconds int mainmenu_attract_time_out; //seconds
DWORD dwAttractTicks; DWORD dwAttractTicks;
std::vector<UiItemBase *> vecMainMenuDialog; std::vector<std::unique_ptr<UiItemBase>> vecMainMenuDialog;
std::vector<UiListItem *> vecMenuItems; std::vector<std::unique_ptr<UiListItem>> vecMenuItems;
_mainmenu_selections MainMenuResult; _mainmenu_selections MainMenuResult;
@ -33,16 +33,16 @@ void MainmenuLoad(const char *name, void (*fnSound)(const char *file))
{ {
gfnSoundFunction = fnSound; gfnSoundFunction = fnSound;
vecMenuItems.push_back(new UiListItem(_("Single Player"), MAINMENU_SINGLE_PLAYER)); vecMenuItems.push_back(std::make_unique<UiListItem>(_("Single Player"), MAINMENU_SINGLE_PLAYER));
vecMenuItems.push_back(new UiListItem(_("Multi Player"), MAINMENU_MULTIPLAYER)); vecMenuItems.push_back(std::make_unique<UiListItem>(_("Multi Player"), MAINMENU_MULTIPLAYER));
vecMenuItems.push_back(new UiListItem(_("Replay Intro"), MAINMENU_REPLAY_INTRO)); vecMenuItems.push_back(std::make_unique<UiListItem>(_("Replay Intro"), MAINMENU_REPLAY_INTRO));
vecMenuItems.push_back(new UiListItem(_("Support"), MAINMENU_SHOW_SUPPORT)); vecMenuItems.push_back(std::make_unique<UiListItem>(_("Support"), MAINMENU_SHOW_SUPPORT));
if (gbIsHellfire) { if (gbIsHellfire) {
vecMenuItems.push_back(new UiListItem(_("Credits"), MAINMENU_SHOW_CREDITS)); vecMenuItems.push_back(std::make_unique<UiListItem>(_("Credits"), MAINMENU_SHOW_CREDITS));
vecMenuItems.push_back(new UiListItem(_("Exit Hellfire"), MAINMENU_EXIT_DIABLO)); vecMenuItems.push_back(std::make_unique<UiListItem>(_("Exit Hellfire"), MAINMENU_EXIT_DIABLO));
} else { } else {
vecMenuItems.push_back(new UiListItem(_("Show Credits"), MAINMENU_SHOW_CREDITS)); vecMenuItems.push_back(std::make_unique<UiListItem>(_("Show Credits"), MAINMENU_SHOW_CREDITS));
vecMenuItems.push_back(new UiListItem(_("Exit Diablo"), MAINMENU_EXIT_DIABLO)); vecMenuItems.push_back(std::make_unique<UiListItem>(_("Exit Diablo"), MAINMENU_EXIT_DIABLO));
} }
if (!gbSpawned || gbIsHellfire) { if (!gbSpawned || gbIsHellfire) {
@ -56,10 +56,10 @@ void MainmenuLoad(const char *name, void (*fnSound)(const char *file))
UiAddBackground(&vecMainMenuDialog); UiAddBackground(&vecMainMenuDialog);
UiAddLogo(&vecMainMenuDialog); UiAddLogo(&vecMainMenuDialog);
vecMainMenuDialog.push_back(new UiList(vecMenuItems, PANEL_LEFT + 64, (UI_OFFSET_Y + 192), 510, 43, UIS_HUGE | UIS_GOLD | UIS_CENTER)); vecMainMenuDialog.push_back(std::make_unique<UiList>(vecMenuItems, PANEL_LEFT + 64, (UI_OFFSET_Y + 192), 510, 43, UIS_HUGE | UIS_GOLD | UIS_CENTER));
SDL_Rect rect = { 17, (Sint16)(gnScreenHeight - 36), 605, 21 }; SDL_Rect rect = { 17, (Sint16)(gnScreenHeight - 36), 605, 21 };
vecMainMenuDialog.push_back(new UiArtText(name, rect, UIS_SMALL)); vecMainMenuDialog.push_back(std::make_unique<UiArtText>(name, rect, UIS_SMALL));
UiInitList(vecMenuItems.size(), nullptr, UiMainMenuSelect, MainmenuEsc, vecMainMenuDialog, true); UiInitList(vecMenuItems.size(), nullptr, UiMainMenuSelect, MainmenuEsc, vecMainMenuDialog, true);
} }
@ -69,14 +69,8 @@ void MainmenuFree()
ArtBackgroundWidescreen.Unload(); ArtBackgroundWidescreen.Unload();
ArtBackground.Unload(); ArtBackground.Unload();
for (auto *pUIItem : vecMainMenuDialog) {
delete pUIItem;
}
vecMainMenuDialog.clear(); vecMainMenuDialog.clear();
for (auto *pUIMenuItem : vecMenuItems) {
delete pUIMenuItem;
}
vecMenuItems.clear(); vecMenuItems.clear();
} }

4
Source/DiabloUI/progress.cpp

@ -19,7 +19,7 @@ Art ArtProgBG;
Art ProgFil; Art ProgFil;
SDL_Surface *msgSurface; SDL_Surface *msgSurface;
SDL_Surface *msgShadow; SDL_Surface *msgShadow;
std::vector<UiItemBase *> vecProgress; std::vector<std::unique_ptr<UiItemBase>> vecProgress;
bool endMenu; bool endMenu;
void DialogActionCancel() void DialogActionCancel()
@ -44,7 +44,7 @@ void ProgressLoad(const char *msg)
msgShadow = TTF_RenderText_Solid(font, msg, black); msgShadow = TTF_RenderText_Solid(font, msg, black);
} }
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 265), (Sint16)(UI_OFFSET_Y + 267), SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 265), (Sint16)(UI_OFFSET_Y + 267), SML_BUTTON_WIDTH, SML_BUTTON_HEIGHT };
vecProgress.push_back(new UiButton(&SmlButton, _("Cancel"), &DialogActionCancel, rect3, 0)); vecProgress.push_back(std::make_unique<UiButton>(&SmlButton, _("Cancel"), &DialogActionCancel, rect3, 0));
} }
void ProgressFree() void ProgressFree()

38
Source/DiabloUI/selconn.cpp

@ -18,8 +18,8 @@ bool selconn_ReturnValue = false;
bool selconn_EndMenu = false; bool selconn_EndMenu = false;
GameData *selconn_GameData; GameData *selconn_GameData;
std::vector<UiListItem *> vecConnItems; std::vector<std::unique_ptr<UiListItem>> vecConnItems;
std::vector<UiItemBase *> vecSelConnDlg; std::vector<std::unique_ptr<UiItemBase>> vecSelConnDlg;
#define DESCRIPTION_WIDTH 205 #define DESCRIPTION_WIDTH 205
@ -33,48 +33,48 @@ void SelconnLoad()
#ifndef NONET #ifndef NONET
#ifndef DISABLE_ZERO_TIER #ifndef DISABLE_ZERO_TIER
vecConnItems.push_back(new UiListItem("Zerotier", SELCONN_ZT)); vecConnItems.push_back(std::make_unique<UiListItem>("Zerotier", SELCONN_ZT));
#endif #endif
#ifndef DISABLE_TCP #ifndef DISABLE_TCP
vecConnItems.push_back(new UiListItem(_("Client-Server (TCP)"), SELCONN_TCP)); vecConnItems.push_back(std::make_unique<UiListItem>(_("Client-Server (TCP)"), SELCONN_TCP));
#endif #endif
#endif #endif
vecConnItems.push_back(new UiListItem(_("Loopback"), SELCONN_LOOPBACK)); vecConnItems.push_back(std::make_unique<UiListItem>(_("Loopback"), SELCONN_LOOPBACK));
UiAddBackground(&vecSelConnDlg); UiAddBackground(&vecSelConnDlg);
UiAddLogo(&vecSelConnDlg); UiAddLogo(&vecSelConnDlg);
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(Sint16)(UI_OFFSET_Y + 161), 590, 35 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelConnDlg.push_back(new UiArtText(_("Multi Player Game"), rect1, UIS_CENTER | UIS_BIG)); vecSelConnDlg.push_back(std::make_unique<UiArtText>(_("Multi Player Game"), rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 218), DESCRIPTION_WIDTH, 21 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 218), DESCRIPTION_WIDTH, 21 };
vecSelConnDlg.push_back(new UiArtText(selconn_MaxPlayers, rect2)); vecSelConnDlg.push_back(std::make_unique<UiArtText>(selconn_MaxPlayers, rect2));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 21 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 21 };
vecSelConnDlg.push_back(new UiArtText(_("Requirements:"), rect3)); vecSelConnDlg.push_back(std::make_unique<UiArtText>(_("Requirements:"), rect3));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 275), DESCRIPTION_WIDTH, 66 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 275), DESCRIPTION_WIDTH, 66 };
vecSelConnDlg.push_back(new UiArtText(selconn_Description, rect4)); vecSelConnDlg.push_back(std::make_unique<UiArtText>(selconn_Description, rect4));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 30), (Sint16)(UI_OFFSET_Y + 356), 220, 31 }; SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 30), (Sint16)(UI_OFFSET_Y + 356), 220, 31 };
vecSelConnDlg.push_back(new UiArtText(_("no gateway needed"), rect5, UIS_CENTER | UIS_MED)); vecSelConnDlg.push_back(std::make_unique<UiArtText>(_("no gateway needed"), rect5, UIS_CENTER | UIS_MED));
SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 393), DESCRIPTION_WIDTH, 21 }; SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 393), DESCRIPTION_WIDTH, 21 };
vecSelConnDlg.push_back(new UiArtText(selconn_Gateway, rect6, UIS_CENTER)); vecSelConnDlg.push_back(std::make_unique<UiArtText>(selconn_Gateway, rect6, UIS_CENTER));
SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 300), (Sint16)(UI_OFFSET_Y + 211), 295, 33 }; SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 300), (Sint16)(UI_OFFSET_Y + 211), 295, 33 };
vecSelConnDlg.push_back(new UiArtText(_("Select Connection"), rect7, UIS_CENTER | UIS_BIG)); vecSelConnDlg.push_back(std::make_unique<UiArtText>(_("Select Connection"), rect7, UIS_CENTER | UIS_BIG));
SDL_Rect rect8 = { (Sint16)(PANEL_LEFT + 16), (Sint16)(UI_OFFSET_Y + 427), 250, 35 }; SDL_Rect rect8 = { (Sint16)(PANEL_LEFT + 16), (Sint16)(UI_OFFSET_Y + 427), 250, 35 };
vecSelConnDlg.push_back(new UiArtTextButton(_("Change Gateway"), nullptr, rect8, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD | UIS_HIDDEN)); vecSelConnDlg.push_back(std::make_unique<UiArtTextButton>(_("Change Gateway"), nullptr, rect8, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD | UIS_HIDDEN));
vecSelConnDlg.push_back(new UiList(vecConnItems, PANEL_LEFT + 305, (UI_OFFSET_Y + 256), 285, 26, UIS_CENTER | UIS_VCENTER | UIS_GOLD)); vecSelConnDlg.push_back(std::make_unique<UiList>(vecConnItems, PANEL_LEFT + 305, (UI_OFFSET_Y + 256), 285, 26, UIS_CENTER | UIS_VCENTER | UIS_GOLD));
SDL_Rect rect9 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect9 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelConnDlg.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect9, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelConnDlg.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect9, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect10 = { (Sint16)(PANEL_LEFT + 454), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect10 = { (Sint16)(PANEL_LEFT + 454), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelConnDlg.push_back(new UiArtTextButton(_("Cancel"), &UiFocusNavigationEsc, rect10, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelConnDlg.push_back(std::make_unique<UiArtTextButton>(_("Cancel"), &UiFocusNavigationEsc, rect10, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
UiInitList(vecConnItems.size(), SelconnFocus, SelconnSelect, SelconnEsc, vecSelConnDlg); UiInitList(vecConnItems.size(), SelconnFocus, SelconnSelect, SelconnEsc, vecSelConnDlg);
} }
@ -83,14 +83,8 @@ void SelconnFree()
{ {
ArtBackground.Unload(); ArtBackground.Unload();
for (auto *pUIItem : vecConnItems) {
delete pUIItem;
}
vecConnItems.clear(); vecConnItems.clear();
for (auto *pUIMenuItem : vecSelConnDlg) {
delete pUIMenuItem;
}
vecSelConnDlg.clear(); vecSelConnDlg.clear();
} }

92
Source/DiabloUI/selgame.cpp

@ -37,21 +37,15 @@ namespace {
const char *title = ""; const char *title = "";
std::vector<UiListItem *> vecSelGameDlgItems; std::vector<std::unique_ptr<UiListItem>> vecSelGameDlgItems;
std::vector<UiItemBase *> vecSelGameDialog; std::vector<std::unique_ptr<UiItemBase>> vecSelGameDialog;
} // namespace } // namespace
void selgame_FreeVectors() void selgame_FreeVectors()
{ {
for (auto *pUIItem : vecSelGameDlgItems) {
delete pUIItem;
}
vecSelGameDlgItems.clear(); vecSelGameDlgItems.clear();
for (auto *pUIItem : vecSelGameDialog) {
delete pUIItem;
}
vecSelGameDialog.clear(); vecSelGameDialog.clear();
} }
@ -81,27 +75,27 @@ void selgame_GameSelection_Init()
UiAddLogo(&vecSelGameDialog); UiAddLogo(&vecSelGameDialog);
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelGameDialog.push_back(new UiArtText(_("Client-Server (TCP)"), rect1, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Client-Server (TCP)"), rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 211), 205, 192 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 211), 205, 192 };
vecSelGameDialog.push_back(new UiArtText(_("Description:"), rect2, UIS_MED)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Description:"), rect2, UIS_MED));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 };
vecSelGameDialog.push_back(new UiArtText(selgame_Description, rect3)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(selgame_Description, rect3));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 300), (Sint16)(UI_OFFSET_Y + 211), 295, 33 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 300), (Sint16)(UI_OFFSET_Y + 211), 295, 33 };
vecSelGameDialog.push_back(new UiArtText(_("Select Action"), rect4, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Select Action"), rect4, UIS_CENTER | UIS_BIG));
vecSelGameDlgItems.push_back(new UiListItem(_("Create Game"), 0)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Create Game"), 0));
vecSelGameDlgItems.push_back(new UiListItem(_("Join Game"), 1)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Join Game"), 1));
vecSelGameDialog.push_back(new UiList(vecSelGameDlgItems, PANEL_LEFT + 305, (UI_OFFSET_Y + 255), 285, 26, UIS_CENTER | UIS_MED | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiList>(vecSelGameDlgItems, PANEL_LEFT + 305, (UI_OFFSET_Y + 255), 285, 26, UIS_CENTER | UIS_MED | UIS_GOLD));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
UiInitList(vecSelGameDlgItems.size(), selgame_GameSelection_Focus, selgame_GameSelection_Select, selgame_GameSelection_Esc, vecSelGameDialog); UiInitList(vecSelGameDlgItems.size(), selgame_GameSelection_Focus, selgame_GameSelection_Select, selgame_GameSelection_Esc, vecSelGameDialog);
} }
@ -145,32 +139,32 @@ void selgame_GameSelection_Select(int value)
UiAddLogo(&vecSelGameDialog); UiAddLogo(&vecSelGameDialog);
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelGameDialog.push_back(new UiArtText(title, rect1, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(title, rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 34), (Sint16)(UI_OFFSET_Y + 211), 205, 33 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 34), (Sint16)(UI_OFFSET_Y + 211), 205, 33 };
vecSelGameDialog.push_back(new UiArtText(selgame_Label, rect2, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(selgame_Label, rect2, UIS_CENTER | UIS_BIG));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 };
vecSelGameDialog.push_back(new UiArtText(selgame_Description, rect3)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(selgame_Description, rect3));
switch (value) { switch (value) {
case 0: { case 0: {
title = _("Create Game"); title = _("Create Game");
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 211), 295, 35 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 211), 295, 35 };
vecSelGameDialog.push_back(new UiArtText(_("Select Difficulty"), rect4, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Select Difficulty"), rect4, UIS_CENTER | UIS_BIG));
vecSelGameDlgItems.push_back(new UiListItem(_("Normal"), DIFF_NORMAL)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Normal"), DIFF_NORMAL));
vecSelGameDlgItems.push_back(new UiListItem(_("Nightmare"), DIFF_NIGHTMARE)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Nightmare"), DIFF_NIGHTMARE));
vecSelGameDlgItems.push_back(new UiListItem(_("Hell"), DIFF_HELL)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Hell"), DIFF_HELL));
vecSelGameDialog.push_back(new UiList(vecSelGameDlgItems, PANEL_LEFT + 300, (UI_OFFSET_Y + 282), 295, 26, UIS_CENTER | UIS_MED | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiList>(vecSelGameDlgItems, PANEL_LEFT + 300, (UI_OFFSET_Y + 282), 295, 26, UIS_CENTER | UIS_MED | UIS_GOLD));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
UiInitList(vecSelGameDlgItems.size(), selgame_Diff_Focus, selgame_Diff_Select, selgame_Diff_Esc, vecSelGameDialog, true); UiInitList(vecSelGameDlgItems.size(), selgame_Diff_Focus, selgame_Diff_Select, selgame_Diff_Esc, vecSelGameDialog, true);
break; break;
@ -179,16 +173,16 @@ void selgame_GameSelection_Select(int value)
title = _("Join TCP Games"); title = _("Join TCP Games");
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 211), 285, 33 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 211), 285, 33 };
vecSelGameDialog.push_back(new UiArtText(_("Enter address"), rect4, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Enter address"), rect4, UIS_CENTER | UIS_BIG));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 314), 285, 33 }; SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 314), 285, 33 };
vecSelGameDialog.push_back(new UiEdit(_("Enter address"), selgame_Ip, 128, rect5, UIS_MED | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiEdit>(_("Enter address"), selgame_Ip, 128, rect5, UIS_MED | UIS_GOLD));
SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect7, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("CANCEL"), &UiFocusNavigationEsc, rect7, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
UiInitList(0, nullptr, selgame_Password_Init, selgame_GameSelection_Init, vecSelGameDialog); UiInitList(0, nullptr, selgame_Password_Init, selgame_GameSelection_Init, vecSelGameDialog);
break; break;
@ -299,29 +293,29 @@ void selgame_GameSpeedSelection()
UiAddLogo(&vecSelGameDialog); UiAddLogo(&vecSelGameDialog);
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelGameDialog.push_back(new UiArtText(_("Create Game"), rect1, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Create Game"), rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 34), (Sint16)(UI_OFFSET_Y + 211), 205, 33 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 34), (Sint16)(UI_OFFSET_Y + 211), 205, 33 };
vecSelGameDialog.push_back(new UiArtText(selgame_Label, rect2, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(selgame_Label, rect2, UIS_CENTER | UIS_BIG));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 };
vecSelGameDialog.push_back(new UiArtText(selgame_Description, rect3)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(selgame_Description, rect3));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 211), 295, 35 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 211), 295, 35 };
vecSelGameDialog.push_back(new UiArtText(_("Select Game Speed"), rect4, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Select Game Speed"), rect4, UIS_CENTER | UIS_BIG));
vecSelGameDlgItems.push_back(new UiListItem(_("Normal"), 20)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Normal"), 20));
vecSelGameDlgItems.push_back(new UiListItem(_("Fast"), 30)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Fast"), 30));
vecSelGameDlgItems.push_back(new UiListItem(_("Faster"), 40)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Faster"), 40));
vecSelGameDlgItems.push_back(new UiListItem(_("Fastest"), 50)); vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Fastest"), 50));
vecSelGameDialog.push_back(new UiList(vecSelGameDlgItems, PANEL_LEFT + 300, (UI_OFFSET_Y + 279), 295, 26, UIS_CENTER | UIS_MED | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiList>(vecSelGameDlgItems, PANEL_LEFT + 300, (UI_OFFSET_Y + 279), 295, 26, UIS_CENTER | UIS_MED | UIS_GOLD));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
UiInitList(vecSelGameDlgItems.size(), selgame_Speed_Focus, selgame_Speed_Select, selgame_Speed_Esc, vecSelGameDialog, true); UiInitList(vecSelGameDlgItems.size(), selgame_Speed_Focus, selgame_Speed_Select, selgame_Speed_Esc, vecSelGameDialog, true);
} }
@ -376,25 +370,25 @@ void selgame_Password_Init(int /*value*/)
UiAddLogo(&vecSelGameDialog); UiAddLogo(&vecSelGameDialog);
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelGameDialog.push_back(new UiArtText(_("Client-Server (TCP)"), rect1, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Client-Server (TCP)"), rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 211), 205, 192 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 211), 205, 192 };
vecSelGameDialog.push_back(new UiArtText(_("Description:"), rect2, UIS_MED)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Description:"), rect2, UIS_MED));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 35), (Sint16)(UI_OFFSET_Y + 256), DESCRIPTION_WIDTH, 192 };
vecSelGameDialog.push_back(new UiArtText(selgame_Description, rect3)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(selgame_Description, rect3));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 211), 285, 33 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 211), 285, 33 };
vecSelGameDialog.push_back(new UiArtText(_("Enter Password"), rect4, UIS_CENTER | UIS_BIG)); vecSelGameDialog.push_back(std::make_unique<UiArtText>(_("Enter Password"), rect4, UIS_CENTER | UIS_BIG));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 314), 285, 33 }; SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 305), (Sint16)(UI_OFFSET_Y + 314), 285, 33 };
vecSelGameDialog.push_back(new UiEdit(_("Enter Password"), selgame_Password, 15, rect5, UIS_MED | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiEdit>(_("Enter Password"), selgame_Password, 15, rect5, UIS_MED | UIS_GOLD));
SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 299), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 449), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect7, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelGameDialog.push_back(std::make_unique<UiArtTextButton>(_("CANCEL"), &UiFocusNavigationEsc, rect7, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
UiInitList(0, nullptr, selgame_Password_Select, selgame_Password_Esc, vecSelGameDialog); UiInitList(0, nullptr, selgame_Password_Select, selgame_Password_Esc, vecSelGameDialog);
} }

138
Source/DiabloUI/selhero.cpp

@ -38,9 +38,9 @@ _selhero_selections selhero_result;
bool selhero_navigateYesNo; bool selhero_navigateYesNo;
bool selhero_deleteEnabled; bool selhero_deleteEnabled;
std::vector<UiItemBase *> vecSelHeroDialog; std::vector<std::unique_ptr<UiItemBase>> vecSelHeroDialog;
std::vector<UiListItem *> vecSelHeroDlgItems; std::vector<std::unique_ptr<UiListItem>> vecSelHeroDlgItems;
std::vector<UiItemBase *> vecSelDlgItems; std::vector<std::unique_ptr<UiItemBase>> vecSelDlgItems;
UiImage *SELHERO_DIALOG_HERO_IMG; UiImage *SELHERO_DIALOG_HERO_IMG;
@ -62,33 +62,14 @@ void SelheroUiFocusNavigationYesNo()
UiFocusNavigationYesNo(); UiFocusNavigationYesNo();
} }
void SelheroFreeListItems()
{
for (auto *pUIItem : vecSelHeroDlgItems) {
delete pUIItem;
}
vecSelHeroDlgItems.clear();
}
void SelheroFreeDlgItems()
{
for (auto *pUIItem : vecSelDlgItems) {
delete pUIItem;
}
vecSelDlgItems.clear();
}
void SelheroFree() void SelheroFree()
{ {
ArtBackground.Unload(); ArtBackground.Unload();
for (auto *pUIItem : vecSelHeroDialog) {
delete pUIItem;
}
vecSelHeroDialog.clear(); vecSelHeroDialog.clear();
SelheroFreeDlgItems(); vecSelDlgItems.clear();
SelheroFreeListItems(); vecSelHeroDlgItems.clear();
UnloadScrollBar(); UnloadScrollBar();
} }
@ -173,35 +154,35 @@ bool SelheroListDeleteYesNo()
void SelheroListSelect(int value) void SelheroListSelect(int value)
{ {
if (static_cast<std::size_t>(value) == selhero_SaveCount) { if (static_cast<std::size_t>(value) == selhero_SaveCount) {
SelheroFreeDlgItems(); vecSelDlgItems.clear();
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 };
vecSelDlgItems.push_back(new UiArtText(_("Choose Class"), rect1, UIS_CENTER | UIS_BIG)); vecSelDlgItems.push_back(std::make_unique<UiArtText>(_("Choose Class"), rect1, UIS_CENTER | UIS_BIG));
SelheroFreeListItems(); vecSelHeroDlgItems.clear();
int itemH = 33; int itemH = 33;
vecSelHeroDlgItems.push_back(new UiListItem(_("Warrior"), static_cast<int>(HeroClass::Warrior))); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Warrior"), static_cast<int>(HeroClass::Warrior)));
vecSelHeroDlgItems.push_back(new UiListItem(_("Rogue"), static_cast<int>(HeroClass::Rogue))); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Rogue"), static_cast<int>(HeroClass::Rogue)));
vecSelHeroDlgItems.push_back(new UiListItem(_("Sorcerer"), static_cast<int>(HeroClass::Sorcerer))); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Sorcerer"), static_cast<int>(HeroClass::Sorcerer)));
if (gbIsHellfire) { if (gbIsHellfire) {
vecSelHeroDlgItems.push_back(new UiListItem(_("Monk"), static_cast<int>(HeroClass::Monk))); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Monk"), static_cast<int>(HeroClass::Monk)));
} }
if (gbBard || sgOptions.Gameplay.bTestBard) { if (gbBard || sgOptions.Gameplay.bTestBard) {
vecSelHeroDlgItems.push_back(new UiListItem(_("Bard"), static_cast<int>(HeroClass::Bard))); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Bard"), static_cast<int>(HeroClass::Bard)));
} }
if (gbBarbarian || sgOptions.Gameplay.bTestBarbarian) { if (gbBarbarian || sgOptions.Gameplay.bTestBarbarian) {
vecSelHeroDlgItems.push_back(new UiListItem(_("Barbarian"), static_cast<int>(HeroClass::Barbarian))); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Barbarian"), static_cast<int>(HeroClass::Barbarian)));
} }
if (vecSelHeroDlgItems.size() > 4) if (vecSelHeroDlgItems.size() > 4)
itemH = 26; itemH = 26;
int itemY = 246 + (176 - vecSelHeroDlgItems.size() * itemH) / 2; int itemY = 246 + (176 - vecSelHeroDlgItems.size() * itemH) / 2;
vecSelDlgItems.push_back(new UiList(vecSelHeroDlgItems, PANEL_LEFT + 264, (UI_OFFSET_Y + itemY), 320, itemH, UIS_CENTER | UIS_MED | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiList>(vecSelHeroDlgItems, PANEL_LEFT + 264, (UI_OFFSET_Y + itemY), 320, itemH, UIS_CENTER | UIS_MED | UIS_GOLD));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 429), 140, 35 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 429), 140, 35 };
vecSelDlgItems.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect2, UIS_CENTER | UIS_BIG | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect2, UIS_CENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 429), 140, 35 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 429), 140, 35 };
vecSelDlgItems.push_back(new UiArtTextButton(_("Cancel"), &UiFocusNavigationEsc, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("Cancel"), &UiFocusNavigationEsc, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD));
UiInitList(vecSelHeroDlgItems.size(), SelheroClassSelectorFocus, SelheroClassSelectorSelect, SelheroClassSelectorEsc, vecSelDlgItems); UiInitList(vecSelHeroDlgItems.size(), SelheroClassSelectorFocus, SelheroClassSelectorSelect, SelheroClassSelectorEsc, vecSelDlgItems);
memset(&selhero_heroInfo.name, 0, sizeof(selhero_heroInfo.name)); memset(&selhero_heroInfo.name, 0, sizeof(selhero_heroInfo.name));
@ -210,21 +191,21 @@ void SelheroListSelect(int value)
} }
if (selhero_heroInfo.hassaved) { if (selhero_heroInfo.hassaved) {
SelheroFreeDlgItems(); vecSelDlgItems.clear();
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 };
vecSelDlgItems.push_back(new UiArtText(_("Save File Exists"), rect1, UIS_CENTER | UIS_BIG)); vecSelDlgItems.push_back(std::make_unique<UiArtText>(_("Save File Exists"), rect1, UIS_CENTER | UIS_BIG));
SelheroFreeListItems(); vecSelHeroDlgItems.clear();
vecSelHeroDlgItems.push_back(new UiListItem(_("Load Game"), 0)); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Load Game"), 0));
vecSelHeroDlgItems.push_back(new UiListItem(_("New Game"), 1)); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("New Game"), 1));
vecSelDlgItems.push_back(new UiList(vecSelHeroDlgItems, PANEL_LEFT + 265, (UI_OFFSET_Y + 285), 320, 33, UIS_CENTER | UIS_MED | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiList>(vecSelHeroDlgItems, PANEL_LEFT + 265, (UI_OFFSET_Y + 285), 320, 33, UIS_CENTER | UIS_MED | UIS_GOLD));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelDlgItems.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect2, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect2, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 427), 140, 35 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 427), 140, 35 };
vecSelDlgItems.push_back(new UiArtTextButton(_("Cancel"), &UiFocusNavigationEsc, rect3, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("Cancel"), &UiFocusNavigationEsc, rect3, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD));
UiInitList(vecSelHeroDlgItems.size(), SelheroLoadFocus, SelheroLoadSelect, selhero_List_Init, vecSelDlgItems, true); UiInitList(vecSelHeroDlgItems.size(), SelheroLoadFocus, SelheroLoadSelect, selhero_List_Init, vecSelDlgItems, true);
title = _("Single Player Characters"); title = _("Single Player Characters");
@ -283,26 +264,26 @@ void SelheroClassSelectorSelect(int value)
memset(selhero_heroInfo.name, '\0', sizeof(selhero_heroInfo.name)); memset(selhero_heroInfo.name, '\0', sizeof(selhero_heroInfo.name));
if (ShouldPrefillHeroName()) if (ShouldPrefillHeroName())
strncpy(selhero_heroInfo.name, SelheroGenerateName(selhero_heroInfo.heroclass), sizeof(selhero_heroInfo.name) - 1); strncpy(selhero_heroInfo.name, SelheroGenerateName(selhero_heroInfo.heroclass), sizeof(selhero_heroInfo.name) - 1);
SelheroFreeDlgItems(); vecSelDlgItems.clear();
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 };
vecSelDlgItems.push_back(new UiArtText(_("Enter Name"), rect1, UIS_CENTER | UIS_BIG)); vecSelDlgItems.push_back(std::make_unique<UiArtText>(_("Enter Name"), rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 265), (Sint16)(UI_OFFSET_Y + 317), 320, 33 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 265), (Sint16)(UI_OFFSET_Y + 317), 320, 33 };
vecSelDlgItems.push_back(new UiEdit(_("Enter Name"), selhero_heroInfo.name, 15, rect2, UIS_MED | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiEdit>(_("Enter Name"), selhero_heroInfo.name, 15, rect2, UIS_MED | UIS_GOLD));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 429), 140, 35 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 279), (Sint16)(UI_OFFSET_Y + 429), 140, 35 };
vecSelDlgItems.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 429), 140, 35 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 429), (Sint16)(UI_OFFSET_Y + 429), 140, 35 };
vecSelDlgItems.push_back(new UiArtTextButton(_("Cancel"), &UiFocusNavigationEsc, rect4, UIS_CENTER | UIS_BIG | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("Cancel"), &UiFocusNavigationEsc, rect4, UIS_CENTER | UIS_BIG | UIS_GOLD));
UiInitList(0, nullptr, SelheroNameSelect, SelheroNameEsc, vecSelDlgItems); UiInitList(0, nullptr, SelheroNameSelect, SelheroNameEsc, vecSelDlgItems);
} }
void SelheroClassSelectorEsc() void SelheroClassSelectorEsc()
{ {
SelheroFreeDlgItems(); vecSelDlgItems.clear();
SelheroFreeListItems(); vecSelHeroDlgItems.clear();
if (selhero_SaveCount != 0) { if (selhero_SaveCount != 0) {
selhero_List_Init(); selhero_List_Init();
@ -483,73 +464,76 @@ void selhero_Init()
gfnHeroInfo(SelHeroGetHeroInfo); gfnHeroInfo(SelHeroGetHeroInfo);
std::reverse(selhero_heros, selhero_heros + selhero_SaveCount); std::reverse(selhero_heros, selhero_heros + selhero_SaveCount);
SelheroFreeDlgItems(); vecSelDlgItems.clear();
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelHeroDialog.push_back(new UiArtText(title, rect1, UIS_CENTER | UIS_BIG)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(title, rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 30), (Sint16)(UI_OFFSET_Y + 211), 180, 76 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 30), (Sint16)(UI_OFFSET_Y + 211), 180, 76 };
SELHERO_DIALOG_HERO_IMG = new UiImage(&ArtHero, static_cast<int>(enum_size<HeroClass>::value), rect2); auto heroImg = std::make_unique<UiImage>(&ArtHero, static_cast<int>(enum_size<HeroClass>::value), rect2);
vecSelHeroDialog.push_back(SELHERO_DIALOG_HERO_IMG); SELHERO_DIALOG_HERO_IMG = heroImg.get();
vecSelHeroDialog.push_back(std::move(heroImg));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 323), 110, 21 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 323), 110, 21 };
vecSelHeroDialog.push_back(new UiArtText(_("Level:"), rect3, UIS_RIGHT)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(_("Level:"), rect3, UIS_RIGHT));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 323), 110, 21 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 323), 110, 21 };
vecSelHeroDialog.push_back(new UiArtText(_("Level:"), rect4, UIS_RIGHT)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(_("Level:"), rect4, UIS_RIGHT));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 323), 40, 21 }; SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 323), 40, 21 };
vecSelHeroDialog.push_back(new UiArtText(textStats[0], rect5, UIS_CENTER)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(textStats[0], rect5, UIS_CENTER));
SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 358), 110, 21 }; SDL_Rect rect6 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 358), 110, 21 };
vecSelHeroDialog.push_back(new UiArtText(_("Strength:"), rect6, UIS_RIGHT)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(_("Strength:"), rect6, UIS_RIGHT));
SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 358), 40, 21 }; SDL_Rect rect7 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 358), 40, 21 };
vecSelHeroDialog.push_back(new UiArtText(textStats[1], rect7, UIS_CENTER)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(textStats[1], rect7, UIS_CENTER));
SDL_Rect rect8 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 380), 110, 21 }; SDL_Rect rect8 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 380), 110, 21 };
vecSelHeroDialog.push_back(new UiArtText(_("Magic:"), rect8, UIS_RIGHT)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(_("Magic:"), rect8, UIS_RIGHT));
SDL_Rect rect9 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 380), 40, 21 }; SDL_Rect rect9 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 380), 40, 21 };
vecSelHeroDialog.push_back(new UiArtText(textStats[2], rect9, UIS_CENTER)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(textStats[2], rect9, UIS_CENTER));
SDL_Rect rect10 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 401), 110, 21 }; SDL_Rect rect10 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 401), 110, 21 };
vecSelHeroDialog.push_back(new UiArtText(_("Dexterity:"), rect10, UIS_RIGHT)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(_("Dexterity:"), rect10, UIS_RIGHT));
SDL_Rect rect11 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 401), 40, 21 }; SDL_Rect rect11 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 401), 40, 21 };
vecSelHeroDialog.push_back(new UiArtText(textStats[3], rect11, UIS_CENTER)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(textStats[3], rect11, UIS_CENTER));
SDL_Rect rect12 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 422), 110, 21 }; SDL_Rect rect12 = { (Sint16)(PANEL_LEFT + 39), (Sint16)(UI_OFFSET_Y + 422), 110, 21 };
vecSelHeroDialog.push_back(new UiArtText(_("Vitality:"), rect12, UIS_RIGHT)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(_("Vitality:"), rect12, UIS_RIGHT));
SDL_Rect rect13 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 422), 40, 21 }; SDL_Rect rect13 = { (Sint16)(PANEL_LEFT + 159), (Sint16)(UI_OFFSET_Y + 422), 40, 21 };
vecSelHeroDialog.push_back(new UiArtText(textStats[4], rect13, UIS_CENTER)); vecSelHeroDialog.push_back(std::make_unique<UiArtText>(textStats[4], rect13, UIS_CENTER));
} }
void selhero_List_Init() void selhero_List_Init()
{ {
listOffset = 0; listOffset = 0;
SelheroFreeDlgItems(); vecSelDlgItems.clear();
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 264), (Sint16)(UI_OFFSET_Y + 211), 320, 33 };
vecSelDlgItems.push_back(new UiArtText(_("Select Hero"), rect1, UIS_CENTER | UIS_BIG)); vecSelDlgItems.push_back(std::make_unique<UiArtText>(_("Select Hero"), rect1, UIS_CENTER | UIS_BIG));
SelheroFreeListItems(); vecSelHeroDlgItems.clear();
const size_t numViewportHeroes = std::min(selhero_SaveCount + 1, MaxViewportItems); const size_t numViewportHeroes = std::min(selhero_SaveCount + 1, MaxViewportItems);
for (std::size_t i = 0; i < numViewportHeroes; i++) { for (std::size_t i = 0; i < numViewportHeroes; i++) {
vecSelHeroDlgItems.push_back(new UiListItem("", -1)); vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>("", -1));
} }
SelheroUpdateViewportItems(); SelheroUpdateViewportItems();
vecSelDlgItems.push_back(new UiList(vecSelHeroDlgItems, PANEL_LEFT + 265, (UI_OFFSET_Y + 256), 320, 26, UIS_CENTER | UIS_MED | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiList>(vecSelHeroDlgItems, PANEL_LEFT + 265, (UI_OFFSET_Y + 256), 320, 26, UIS_CENTER | UIS_MED | UIS_GOLD));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 585), (Sint16)(UI_OFFSET_Y + 244), 25, 178 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 585), (Sint16)(UI_OFFSET_Y + 244), 25, 178 };
auto *scrollBar = new UiScrollBar(&ArtScrollBarBackground, &ArtScrollBarThumb, &ArtScrollBarArrow, rect2); auto pinnedScrollBar = std::make_unique<UiScrollBar>(&ArtScrollBarBackground, &ArtScrollBarThumb, &ArtScrollBarArrow, rect2);
vecSelDlgItems.push_back(scrollBar); auto *scrollBar = pinnedScrollBar.get();
vecSelDlgItems.push_back(std::move(pinnedScrollBar));
SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 239), (Sint16)(UI_OFFSET_Y + 429), 120, 35 }; SDL_Rect rect3 = { (Sint16)(PANEL_LEFT + 239), (Sint16)(UI_OFFSET_Y + 429), 120, 35 };
vecSelDlgItems.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("OK"), &UiFocusNavigationSelect, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD));
SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 364), (Sint16)(UI_OFFSET_Y + 429), 120, 35 }; SDL_Rect rect4 = { (Sint16)(PANEL_LEFT + 364), (Sint16)(UI_OFFSET_Y + 429), 120, 35 };
SELLIST_DIALOG_DELETE_BUTTON = new UiArtTextButton(_("Delete"), &SelheroUiFocusNavigationYesNo, rect4, UIS_CENTER | UIS_BIG | UIS_DISABLED); auto setlistDialogDeleteButton = std::make_unique<UiArtTextButton>(_("Delete"), &SelheroUiFocusNavigationYesNo, rect4, UIS_CENTER | UIS_BIG | UIS_DISABLED);
vecSelDlgItems.push_back(SELLIST_DIALOG_DELETE_BUTTON); SELLIST_DIALOG_DELETE_BUTTON = setlistDialogDeleteButton.get();
vecSelDlgItems.push_back(std::move(setlistDialogDeleteButton));
SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 489), (Sint16)(UI_OFFSET_Y + 429), 120, 35 }; SDL_Rect rect5 = { (Sint16)(PANEL_LEFT + 489), (Sint16)(UI_OFFSET_Y + 429), 120, 35 };
vecSelDlgItems.push_back(new UiArtTextButton(_("Cancel"), &UiFocusNavigationEsc, rect5, UIS_CENTER | UIS_BIG | UIS_GOLD)); vecSelDlgItems.push_back(std::make_unique<UiArtTextButton>(_("Cancel"), &UiFocusNavigationEsc, rect5, UIS_CENTER | UIS_BIG | UIS_GOLD));
UiInitList(selhero_SaveCount + 1, SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, SelheroListDeleteYesNo); UiInitList(selhero_SaveCount + 1, SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, SelheroListDeleteYesNo);
UiInitScrollBar(scrollBar, MaxViewportItems, &listOffset); UiInitScrollBar(scrollBar, MaxViewportItems, &listOffset);

20
Source/DiabloUI/selok.cpp

@ -15,8 +15,8 @@ char dialogText[256];
bool selok_endMenu; bool selok_endMenu;
std::vector<UiListItem *> vecSelOkDialogItems; std::vector<std::unique_ptr<UiListItem>> vecSelOkDialogItems;
std::vector<UiItemBase *> vecSelOkDialog; std::vector<std::unique_ptr<UiItemBase>> vecSelOkDialog;
#define MESSAGE_WIDTH 280 #define MESSAGE_WIDTH 280
@ -24,14 +24,8 @@ void selok_Free()
{ {
ArtBackground.Unload(); ArtBackground.Unload();
for (auto *pUIListItem : vecSelOkDialogItems) {
delete pUIListItem;
}
vecSelOkDialogItems.clear(); vecSelOkDialogItems.clear();
for (auto *pUIItem : vecSelOkDialog) {
delete pUIItem;
}
vecSelOkDialog.clear(); vecSelOkDialog.clear();
} }
@ -62,17 +56,17 @@ void UiSelOkDialog(const char *title, const char *body, bool background)
if (title != nullptr) { if (title != nullptr) {
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelOkDialog.push_back(new UiArtText(title, rect1, UIS_CENTER | UIS_BIG)); vecSelOkDialog.push_back(std::make_unique<UiArtText>(title, rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 140), (Sint16)(UI_OFFSET_Y + 210), 560, 168 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 140), (Sint16)(UI_OFFSET_Y + 210), 560, 168 };
vecSelOkDialog.push_back(new UiArtText(dialogText, rect2, UIS_MED)); vecSelOkDialog.push_back(std::make_unique<UiArtText>(dialogText, rect2, UIS_MED));
} else { } else {
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 140), (Sint16)(UI_OFFSET_Y + 197), 560, 168 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 140), (Sint16)(UI_OFFSET_Y + 197), 560, 168 };
vecSelOkDialog.push_back(new UiArtText(dialogText, rect1, UIS_MED)); vecSelOkDialog.push_back(std::make_unique<UiArtText>(dialogText, rect1, UIS_MED));
} }
vecSelOkDialogItems.push_back(new UiListItem(_("OK"), 0)); vecSelOkDialogItems.push_back(std::make_unique<UiListItem>(_("OK"), 0));
vecSelOkDialog.push_back(new UiList(vecSelOkDialogItems, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD)); vecSelOkDialog.push_back(std::make_unique<UiList>(vecSelOkDialogItems, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD));
strncpy(dialogText, body, sizeof(dialogText) - 1); strncpy(dialogText, body, sizeof(dialogText) - 1);
WordWrapArtStr(dialogText, MESSAGE_WIDTH); WordWrapArtStr(dialogText, MESSAGE_WIDTH);

20
Source/DiabloUI/selyesno.cpp

@ -12,8 +12,8 @@ bool selyesno_endMenu;
bool selyesno_value; bool selyesno_value;
char selyesno_confirmationMessage[256]; char selyesno_confirmationMessage[256];
std::vector<UiListItem *> vecSelYesNoDialogItems; std::vector<std::unique_ptr<UiListItem>> vecSelYesNoDialogItems;
std::vector<UiItemBase *> vecSelYesNoDialog; std::vector<std::unique_ptr<UiItemBase>> vecSelYesNoDialog;
#define MESSAGE_WIDTH 280 #define MESSAGE_WIDTH 280
@ -21,14 +21,8 @@ void SelyesnoFree()
{ {
ArtBackground.Unload(); ArtBackground.Unload();
for (auto *pUIListItem : vecSelYesNoDialogItems) {
delete pUIListItem;
}
vecSelYesNoDialogItems.clear(); vecSelYesNoDialogItems.clear();
for (auto *pUIItem : vecSelYesNoDialog) {
delete pUIItem;
}
vecSelYesNoDialog.clear(); vecSelYesNoDialog.clear();
} }
@ -53,14 +47,14 @@ bool UiSelHeroYesNoDialog(const char *title, const char *body)
UiAddLogo(&vecSelYesNoDialog); UiAddLogo(&vecSelYesNoDialog);
SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 }; SDL_Rect rect1 = { (Sint16)(PANEL_LEFT + 24), (Sint16)(UI_OFFSET_Y + 161), 590, 35 };
vecSelYesNoDialog.push_back(new UiArtText(title, rect1, UIS_CENTER | UIS_BIG)); vecSelYesNoDialog.push_back(std::make_unique<UiArtText>(title, rect1, UIS_CENTER | UIS_BIG));
SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 120), (Sint16)(UI_OFFSET_Y + 236), MESSAGE_WIDTH, 168 }; SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 120), (Sint16)(UI_OFFSET_Y + 236), MESSAGE_WIDTH, 168 };
vecSelYesNoDialog.push_back(new UiArtText(selyesno_confirmationMessage, rect2, UIS_MED)); vecSelYesNoDialog.push_back(std::make_unique<UiArtText>(selyesno_confirmationMessage, rect2, UIS_MED));
vecSelYesNoDialogItems.push_back(new UiListItem(_("Yes"), 0)); vecSelYesNoDialogItems.push_back(std::make_unique<UiListItem>(_("Yes"), 0));
vecSelYesNoDialogItems.push_back(new UiListItem(_("No"), 1)); vecSelYesNoDialogItems.push_back(std::make_unique<UiListItem>(_("No"), 1));
vecSelYesNoDialog.push_back(new UiList(vecSelYesNoDialogItems, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD)); vecSelYesNoDialog.push_back(std::make_unique<UiList>(vecSelYesNoDialogItems, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD));
strncpy(selyesno_confirmationMessage, body, sizeof(selyesno_confirmationMessage) - 1); strncpy(selyesno_confirmationMessage, body, sizeof(selyesno_confirmationMessage) - 1);
WordWrapArtStr(selyesno_confirmationMessage, MESSAGE_WIDTH); WordWrapArtStr(selyesno_confirmationMessage, MESSAGE_WIDTH);

11
Source/DiabloUI/title.cpp

@ -6,7 +6,7 @@
namespace devilution { namespace devilution {
namespace { namespace {
std::vector<UiItemBase *> vecTitleScreen; std::vector<std::unique_ptr<UiItemBase>> vecTitleScreen;
void TitleLoad() void TitleLoad()
{ {
@ -25,9 +25,6 @@ void TitleFree()
ArtBackgroundWidescreen.Unload(); ArtBackgroundWidescreen.Unload();
ArtLogos[LOGO_BIG].Unload(); ArtLogos[LOGO_BIG].Unload();
for (auto *pUIItem : vecTitleScreen) {
delete pUIItem;
}
vecTitleScreen.clear(); vecTitleScreen.clear();
} }
@ -37,14 +34,14 @@ void UiTitleDialog()
{ {
if (gbIsHellfire) { if (gbIsHellfire) {
SDL_Rect rect = { 0, UI_OFFSET_Y, 0, 0 }; SDL_Rect rect = { 0, UI_OFFSET_Y, 0, 0 };
vecTitleScreen.push_back(new UiImage(&ArtBackgroundWidescreen, /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER)); vecTitleScreen.push_back(std::make_unique<UiImage>(&ArtBackgroundWidescreen, /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER));
vecTitleScreen.push_back(new UiImage(&ArtBackground, /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER)); vecTitleScreen.push_back(std::make_unique<UiImage>(&ArtBackground, /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER));
} else { } else {
UiAddBackground(&vecTitleScreen); UiAddBackground(&vecTitleScreen);
UiAddLogo(&vecTitleScreen, LOGO_BIG, 182); UiAddLogo(&vecTitleScreen, LOGO_BIG, 182);
SDL_Rect rect = { (Sint16)(PANEL_LEFT + 49), (Sint16)(UI_OFFSET_Y + 410), 550, 26 }; SDL_Rect rect = { (Sint16)(PANEL_LEFT + 49), (Sint16)(UI_OFFSET_Y + 410), 550, 26 };
vecTitleScreen.push_back(new UiArtText(_("Copyright © 1996-2001 Blizzard Entertainment"), rect, UIS_MED | UIS_CENTER)); vecTitleScreen.push_back(std::make_unique<UiArtText>(_("Copyright © 1996-2001 Blizzard Entertainment"), rect, UIS_MED | UIS_CENTER));
} }
TitleLoad(); TitleLoad();

7
Source/DiabloUI/ui_item.h

@ -293,15 +293,16 @@ public:
int m_value; int m_value;
}; };
typedef std::vector<UiListItem *> vUiListItem; typedef std::vector<std::unique_ptr<UiListItem>> vUiListItem;
class UiList : public UiItemBase { class UiList : public UiItemBase {
public: public:
UiList(vUiListItem vItems, Sint16 x, Sint16 y, Uint16 item_width, Uint16 item_height, int flags = 0) UiList(const vUiListItem &vItems, Sint16 x, Sint16 y, Uint16 item_width, Uint16 item_height, int flags = 0)
: UiItemBase(x, y, item_width, item_height * vItems.size(), flags) : UiItemBase(x, y, item_width, item_height * vItems.size(), flags)
{ {
m_type = UI_LIST; m_type = UI_LIST;
m_vecItems = vItems; for (auto &item : vItems)
m_vecItems.push_back(item.get());
m_x = x; m_x = x;
m_y = y; m_y = y;
m_width = item_width; m_width = item_width;

Loading…
Cancel
Save