diff --git a/Source/DiabloUI/diabloui.cpp b/Source/DiabloUI/diabloui.cpp index bec178d6a..58f0e4ef6 100644 --- a/Source/DiabloUI/diabloui.cpp +++ b/Source/DiabloUI/diabloui.cpp @@ -80,7 +80,7 @@ struct ScrollBarState { } // namespace -void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector &items, bool itemsWraps, bool (*fnYesNo)()) +void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector> &items, bool itemsWraps, bool (*fnYesNo)()) { SelectedItem = 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; gfnListEsc = fnEsc; gfnListYesNo = fnYesNo; - gUiItems = items; + gUiItems.clear(); + for (auto &item : items) + gUiItems.push_back(item.get()); UiItemsWraps = itemsWraps; ListOffset = nullptr; if (fnFocus != nullptr) @@ -101,7 +103,7 @@ void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int valu textInputActive = false; for (const auto &item : items) { if (item->m_type == UI_EDIT) { - auto *pItemUIEdit = static_cast(item); + auto *pItemUIEdit = static_cast(item.get()); SDL_SetTextInputRect(&item->m_rect); textInputActive = true; #ifdef __SWITCH__ @@ -623,21 +625,21 @@ void LoadBackgroundArt(const char *pszFile, int frames) RenderPresent(); } -void UiAddBackground(std::vector *vecDialog) +void UiAddBackground(std::vector> *vecDialog) { if (ArtBackgroundWidescreen.surface != nullptr) { 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(&ArtBackgroundWidescreen, /*bAnimated=*/false, /*iFrame=*/0, rectw, UIS_CENTER)); } 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(&ArtBackground, /*bAnimated=*/false, /*iFrame=*/0, rect, UIS_CENTER)); } -void UiAddLogo(std::vector *vecDialog, int size, int y) +void UiAddLogo(std::vector> *vecDialog, int size, int y) { 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(&ArtLogos[size], /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER)); } void UiFadeIn() @@ -933,6 +935,12 @@ void UiRenderItems(const std::vector &items) RenderItem(item); } +void UiRenderItems(const std::vector> &items) +{ + for (const auto &item : items) + RenderItem(item.get()); +} + bool UiItemMouseEvents(SDL_Event *event, const std::vector &items) { if (items.empty()) { @@ -963,6 +971,36 @@ bool UiItemMouseEvents(SDL_Event *event, const std::vector &items) return handled; } +bool UiItemMouseEvents(SDL_Event *event, const std::vector> &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(item.get())); + } + } + + return handled; +} + void DrawMouse() { if (IsHardwareCursor() || sgbControllerActive) diff --git a/Source/DiabloUI/diabloui.h b/Source/DiabloUI/diabloui.h index 917f2b2b0..844eb72e8 100644 --- a/Source/DiabloUI/diabloui.h +++ b/Source/DiabloUI/diabloui.h @@ -108,20 +108,22 @@ bool UiSelectProvider(GameData *gameData); void UiFadeIn(); void UiHandleEvents(SDL_Event *event); bool UiItemMouseEvents(SDL_Event *event, const std::vector &items); +bool UiItemMouseEvents(SDL_Event *event, const std::vector> &items); Sint16 GetCenterOffset(Sint16 w, Sint16 bw = 0); void LoadPalInMem(const SDL_Color *pPal); void DrawMouse(); void LoadBackgroundArt(const char *pszFile, int frames = 1); -void UiAddBackground(std::vector *vecDialog); -void UiAddLogo(std::vector *vecDialog, int size = LOGO_MED, int y = 0); +void UiAddBackground(std::vector > *vecDialog); +void UiAddLogo(std::vector> *vecDialog, int size = LOGO_MED, int y = 0); void UiFocusNavigationSelect(); void UiFocusNavigationEsc(); void UiFocusNavigationYesNo(); -void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector &items, bool wraps = false, bool (*fnYesNo)() = NULL); +void UiInitList(int count, void (*fnFocus)(int value), void (*fnSelect)(int value), void (*fnEsc)(), const std::vector> &items, bool wraps = false, bool (*fnYesNo)() = NULL); void UiInitScrollBar(UiScrollBar *uiSb, std::size_t viewportSize, const std::size_t *currentOffset); void UiClearScreen(); void UiPollAndRender(); void UiRenderItems(const std::vector &items); +void UiRenderItems(const std::vector> &items); void UiInitList_clear(); void mainmenu_restart_repintro(); diff --git a/Source/DiabloUI/dialogs.cpp b/Source/DiabloUI/dialogs.cpp index cc27d0291..342a01483 100644 --- a/Source/DiabloUI/dialogs.cpp +++ b/Source/DiabloUI/dialogs.cpp @@ -29,8 +29,8 @@ void DialogActionOK() dialogEnd = true; } -std::vector vecNULL; -std::vector vecOkDialog; +std::vector> vecNULL; +std::vector> vecOkDialog; // clang-format off #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) { 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(&dialogArt, rect1)); 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(text, rect2, UIS_CENTER)); 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(&SmlButton, _("OK"), &DialogActionOK, rect3, 0)); } else { 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(&dialogArt, rect1)); SDL_Color color = { 255, 255, 0, 0 }; 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(text, color, rect2, UIS_CENTER)); 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(caption, rect3, UIS_CENTER)); 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(&SmlButton, _("OK"), &DialogActionOK, rect4, 0)); } if (!renderBehind) { @@ -215,13 +215,10 @@ void Deinit() if (!fontWasLoaded) UnloadTtfFont(); - for (auto *pUIItem : vecOkDialog) { - delete pUIItem; - } vecOkDialog.clear(); } -void DialogLoop(const std::vector &items, const std::vector &renderBehind) +void DialogLoop(const std::vector> &items, const std::vector> &renderBehind) { SDL_Event event; dialogEnd = false; @@ -259,7 +256,7 @@ void DialogLoop(const std::vector &items, const std::vector &renderBehind) +void UiOkDialog(const char *text, const char *caption, bool error, const std::vector> &renderBehind) { static bool inDialog = false; @@ -289,7 +286,7 @@ void UiOkDialog(const char *text, const char *caption, bool error, const std::ve inDialog = false; } -void UiErrorOkDialog(const char *text, const char *caption, const std::vector &renderBehind) +void UiErrorOkDialog(const char *text, const char *caption, const std::vector> &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); } -void UiErrorOkDialog(const char *text, const std::vector &renderBehind) +void UiErrorOkDialog(const char *text, const std::vector> &renderBehind) { UiErrorOkDialog(text, nullptr, renderBehind); } diff --git a/Source/DiabloUI/dialogs.h b/Source/DiabloUI/dialogs.h index 2d0c53127..78d9e0530 100644 --- a/Source/DiabloUI/dialogs.h +++ b/Source/DiabloUI/dialogs.h @@ -6,8 +6,8 @@ namespace devilution { -void UiErrorOkDialog(const char *text, const std::vector &renderBehind); -void UiErrorOkDialog(const char *text, const char *caption, const std::vector &renderBehind); -void UiOkDialog(const char *text, const char *caption, bool error, const std::vector &renderBehind); +void UiErrorOkDialog(const char *text, const std::vector > &renderBehind); +void UiErrorOkDialog(const char *text, const char *caption, const std::vector > &renderBehind); +void UiOkDialog(const char *text, const char *caption, bool error, const std::vector > &renderBehind); } // namespace devilution diff --git a/Source/DiabloUI/mainmenu.cpp b/Source/DiabloUI/mainmenu.cpp index 458ba8bea..0f4b77560 100644 --- a/Source/DiabloUI/mainmenu.cpp +++ b/Source/DiabloUI/mainmenu.cpp @@ -9,8 +9,8 @@ namespace { int mainmenu_attract_time_out; //seconds DWORD dwAttractTicks; -std::vector vecMainMenuDialog; -std::vector vecMenuItems; +std::vector> vecMainMenuDialog; +std::vector> vecMenuItems; _mainmenu_selections MainMenuResult; @@ -33,16 +33,16 @@ void MainmenuLoad(const char *name, void (*fnSound)(const char *file)) { gfnSoundFunction = fnSound; - vecMenuItems.push_back(new UiListItem(_("Single Player"), MAINMENU_SINGLE_PLAYER)); - vecMenuItems.push_back(new UiListItem(_("Multi Player"), MAINMENU_MULTIPLAYER)); - vecMenuItems.push_back(new UiListItem(_("Replay Intro"), MAINMENU_REPLAY_INTRO)); - vecMenuItems.push_back(new UiListItem(_("Support"), MAINMENU_SHOW_SUPPORT)); + vecMenuItems.push_back(std::make_unique(_("Single Player"), MAINMENU_SINGLE_PLAYER)); + vecMenuItems.push_back(std::make_unique(_("Multi Player"), MAINMENU_MULTIPLAYER)); + vecMenuItems.push_back(std::make_unique(_("Replay Intro"), MAINMENU_REPLAY_INTRO)); + vecMenuItems.push_back(std::make_unique(_("Support"), MAINMENU_SHOW_SUPPORT)); if (gbIsHellfire) { - vecMenuItems.push_back(new UiListItem(_("Credits"), MAINMENU_SHOW_CREDITS)); - vecMenuItems.push_back(new UiListItem(_("Exit Hellfire"), MAINMENU_EXIT_DIABLO)); + vecMenuItems.push_back(std::make_unique(_("Credits"), MAINMENU_SHOW_CREDITS)); + vecMenuItems.push_back(std::make_unique(_("Exit Hellfire"), MAINMENU_EXIT_DIABLO)); } else { - vecMenuItems.push_back(new UiListItem(_("Show Credits"), MAINMENU_SHOW_CREDITS)); - vecMenuItems.push_back(new UiListItem(_("Exit Diablo"), MAINMENU_EXIT_DIABLO)); + vecMenuItems.push_back(std::make_unique(_("Show Credits"), MAINMENU_SHOW_CREDITS)); + vecMenuItems.push_back(std::make_unique(_("Exit Diablo"), MAINMENU_EXIT_DIABLO)); } if (!gbSpawned || gbIsHellfire) { @@ -56,10 +56,10 @@ void MainmenuLoad(const char *name, void (*fnSound)(const char *file)) UiAddBackground(&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(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 }; - vecMainMenuDialog.push_back(new UiArtText(name, rect, UIS_SMALL)); + vecMainMenuDialog.push_back(std::make_unique(name, rect, UIS_SMALL)); UiInitList(vecMenuItems.size(), nullptr, UiMainMenuSelect, MainmenuEsc, vecMainMenuDialog, true); } @@ -69,14 +69,8 @@ void MainmenuFree() ArtBackgroundWidescreen.Unload(); ArtBackground.Unload(); - for (auto *pUIItem : vecMainMenuDialog) { - delete pUIItem; - } vecMainMenuDialog.clear(); - for (auto *pUIMenuItem : vecMenuItems) { - delete pUIMenuItem; - } vecMenuItems.clear(); } diff --git a/Source/DiabloUI/progress.cpp b/Source/DiabloUI/progress.cpp index 983ee350b..6a4a4120b 100644 --- a/Source/DiabloUI/progress.cpp +++ b/Source/DiabloUI/progress.cpp @@ -19,7 +19,7 @@ Art ArtProgBG; Art ProgFil; SDL_Surface *msgSurface; SDL_Surface *msgShadow; -std::vector vecProgress; +std::vector> vecProgress; bool endMenu; void DialogActionCancel() @@ -44,7 +44,7 @@ void ProgressLoad(const char *msg) 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 }; - vecProgress.push_back(new UiButton(&SmlButton, _("Cancel"), &DialogActionCancel, rect3, 0)); + vecProgress.push_back(std::make_unique(&SmlButton, _("Cancel"), &DialogActionCancel, rect3, 0)); } void ProgressFree() diff --git a/Source/DiabloUI/selconn.cpp b/Source/DiabloUI/selconn.cpp index 7d9879437..9749113bb 100644 --- a/Source/DiabloUI/selconn.cpp +++ b/Source/DiabloUI/selconn.cpp @@ -18,8 +18,8 @@ bool selconn_ReturnValue = false; bool selconn_EndMenu = false; GameData *selconn_GameData; -std::vector vecConnItems; -std::vector vecSelConnDlg; +std::vector> vecConnItems; +std::vector> vecSelConnDlg; #define DESCRIPTION_WIDTH 205 @@ -33,48 +33,48 @@ void SelconnLoad() #ifndef NONET #ifndef DISABLE_ZERO_TIER - vecConnItems.push_back(new UiListItem("Zerotier", SELCONN_ZT)); + vecConnItems.push_back(std::make_unique("Zerotier", SELCONN_ZT)); #endif #ifndef DISABLE_TCP - vecConnItems.push_back(new UiListItem(_("Client-Server (TCP)"), SELCONN_TCP)); + vecConnItems.push_back(std::make_unique(_("Client-Server (TCP)"), SELCONN_TCP)); #endif #endif - vecConnItems.push_back(new UiListItem(_("Loopback"), SELCONN_LOOPBACK)); + vecConnItems.push_back(std::make_unique(_("Loopback"), SELCONN_LOOPBACK)); UiAddBackground(&vecSelConnDlg); UiAddLogo(&vecSelConnDlg); 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(_("Multi Player Game"), rect1, UIS_CENTER | UIS_BIG)); 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(selconn_MaxPlayers, rect2)); 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(_("Requirements:"), rect3)); 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(selconn_Description, rect4)); 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(_("no gateway needed"), rect5, UIS_CENTER | UIS_MED)); 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(selconn_Gateway, rect6, UIS_CENTER)); 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(_("Select Connection"), rect7, UIS_CENTER | UIS_BIG)); 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(_("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(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 }; - vecSelConnDlg.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect9, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelConnDlg.push_back(std::make_unique(_("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 }; - vecSelConnDlg.push_back(new UiArtTextButton(_("Cancel"), &UiFocusNavigationEsc, rect10, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelConnDlg.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect10, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); UiInitList(vecConnItems.size(), SelconnFocus, SelconnSelect, SelconnEsc, vecSelConnDlg); } @@ -83,14 +83,8 @@ void SelconnFree() { ArtBackground.Unload(); - for (auto *pUIItem : vecConnItems) { - delete pUIItem; - } vecConnItems.clear(); - for (auto *pUIMenuItem : vecSelConnDlg) { - delete pUIMenuItem; - } vecSelConnDlg.clear(); } diff --git a/Source/DiabloUI/selgame.cpp b/Source/DiabloUI/selgame.cpp index f5e1db45a..eecd9e184 100644 --- a/Source/DiabloUI/selgame.cpp +++ b/Source/DiabloUI/selgame.cpp @@ -37,21 +37,15 @@ namespace { const char *title = ""; -std::vector vecSelGameDlgItems; -std::vector vecSelGameDialog; +std::vector> vecSelGameDlgItems; +std::vector> vecSelGameDialog; } // namespace void selgame_FreeVectors() { - for (auto *pUIItem : vecSelGameDlgItems) { - delete pUIItem; - } vecSelGameDlgItems.clear(); - for (auto *pUIItem : vecSelGameDialog) { - delete pUIItem; - } vecSelGameDialog.clear(); } @@ -81,27 +75,27 @@ void selgame_GameSelection_Init() UiAddLogo(&vecSelGameDialog); 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(_("Client-Server (TCP)"), rect1, UIS_CENTER | UIS_BIG)); 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(_("Description:"), rect2, UIS_MED)); 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(selgame_Description, rect3)); 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(_("Select Action"), rect4, UIS_CENTER | UIS_BIG)); - vecSelGameDlgItems.push_back(new UiListItem(_("Create Game"), 0)); - vecSelGameDlgItems.push_back(new UiListItem(_("Join Game"), 1)); + vecSelGameDlgItems.push_back(std::make_unique(_("Create Game"), 0)); + vecSelGameDlgItems.push_back(std::make_unique(_("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(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 }; - vecSelGameDialog.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelGameDialog.push_back(std::make_unique(_("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 }; - vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelGameDialog.push_back(std::make_unique(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); 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); 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(title, rect1, UIS_CENTER | UIS_BIG)); 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(selgame_Label, rect2, UIS_CENTER | UIS_BIG)); 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(selgame_Description, rect3)); switch (value) { case 0: { title = _("Create Game"); 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(_("Select Difficulty"), rect4, UIS_CENTER | UIS_BIG)); - vecSelGameDlgItems.push_back(new UiListItem(_("Normal"), DIFF_NORMAL)); - vecSelGameDlgItems.push_back(new UiListItem(_("Nightmare"), DIFF_NIGHTMARE)); - vecSelGameDlgItems.push_back(new UiListItem(_("Hell"), DIFF_HELL)); + vecSelGameDlgItems.push_back(std::make_unique(_("Normal"), DIFF_NORMAL)); + vecSelGameDlgItems.push_back(std::make_unique(_("Nightmare"), DIFF_NIGHTMARE)); + vecSelGameDlgItems.push_back(std::make_unique(_("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(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 }; - vecSelGameDialog.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelGameDialog.push_back(std::make_unique(_("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 }; - vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelGameDialog.push_back(std::make_unique(_("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); break; @@ -179,16 +173,16 @@ void selgame_GameSelection_Select(int value) title = _("Join TCP Games"); 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(_("Enter address"), rect4, UIS_CENTER | UIS_BIG)); 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(_("Enter address"), selgame_Ip, 128, rect5, UIS_MED | UIS_GOLD)); 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(_("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 }; - vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect7, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelGameDialog.push_back(std::make_unique(_("CANCEL"), &UiFocusNavigationEsc, rect7, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); UiInitList(0, nullptr, selgame_Password_Init, selgame_GameSelection_Init, vecSelGameDialog); break; @@ -299,29 +293,29 @@ void selgame_GameSpeedSelection() UiAddLogo(&vecSelGameDialog); 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(_("Create Game"), rect1, UIS_CENTER | UIS_BIG)); 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(selgame_Label, rect2, UIS_CENTER | UIS_BIG)); 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(selgame_Description, rect3)); 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(_("Select Game Speed"), rect4, UIS_CENTER | UIS_BIG)); - vecSelGameDlgItems.push_back(new UiListItem(_("Normal"), 20)); - vecSelGameDlgItems.push_back(new UiListItem(_("Fast"), 30)); - vecSelGameDlgItems.push_back(new UiListItem(_("Faster"), 40)); - vecSelGameDlgItems.push_back(new UiListItem(_("Fastest"), 50)); + vecSelGameDlgItems.push_back(std::make_unique(_("Normal"), 20)); + vecSelGameDlgItems.push_back(std::make_unique(_("Fast"), 30)); + vecSelGameDlgItems.push_back(std::make_unique(_("Faster"), 40)); + vecSelGameDlgItems.push_back(std::make_unique(_("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(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 }; - vecSelGameDialog.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect5, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelGameDialog.push_back(std::make_unique(_("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 }; - vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect6, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelGameDialog.push_back(std::make_unique(_("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); } @@ -376,25 +370,25 @@ void selgame_Password_Init(int /*value*/) UiAddLogo(&vecSelGameDialog); 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(_("Client-Server (TCP)"), rect1, UIS_CENTER | UIS_BIG)); 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(_("Description:"), rect2, UIS_MED)); 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(selgame_Description, rect3)); 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(_("Enter Password"), rect4, UIS_CENTER | UIS_BIG)); 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(_("Enter Password"), selgame_Password, 15, rect5, UIS_MED | UIS_GOLD)); 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(_("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 }; - vecSelGameDialog.push_back(new UiArtTextButton(_("CANCEL"), &UiFocusNavigationEsc, rect7, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelGameDialog.push_back(std::make_unique(_("CANCEL"), &UiFocusNavigationEsc, rect7, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); UiInitList(0, nullptr, selgame_Password_Select, selgame_Password_Esc, vecSelGameDialog); } diff --git a/Source/DiabloUI/selhero.cpp b/Source/DiabloUI/selhero.cpp index 8f563fcae..27cb89150 100644 --- a/Source/DiabloUI/selhero.cpp +++ b/Source/DiabloUI/selhero.cpp @@ -38,9 +38,9 @@ _selhero_selections selhero_result; bool selhero_navigateYesNo; bool selhero_deleteEnabled; -std::vector vecSelHeroDialog; -std::vector vecSelHeroDlgItems; -std::vector vecSelDlgItems; +std::vector> vecSelHeroDialog; +std::vector> vecSelHeroDlgItems; +std::vector> vecSelDlgItems; UiImage *SELHERO_DIALOG_HERO_IMG; @@ -62,33 +62,14 @@ void SelheroUiFocusNavigationYesNo() UiFocusNavigationYesNo(); } -void SelheroFreeListItems() -{ - for (auto *pUIItem : vecSelHeroDlgItems) { - delete pUIItem; - } - vecSelHeroDlgItems.clear(); -} - -void SelheroFreeDlgItems() -{ - for (auto *pUIItem : vecSelDlgItems) { - delete pUIItem; - } - vecSelDlgItems.clear(); -} - void SelheroFree() { ArtBackground.Unload(); - for (auto *pUIItem : vecSelHeroDialog) { - delete pUIItem; - } vecSelHeroDialog.clear(); - SelheroFreeDlgItems(); - SelheroFreeListItems(); + vecSelDlgItems.clear(); + vecSelHeroDlgItems.clear(); UnloadScrollBar(); } @@ -173,35 +154,35 @@ bool SelheroListDeleteYesNo() void SelheroListSelect(int value) { if (static_cast(value) == selhero_SaveCount) { - SelheroFreeDlgItems(); + vecSelDlgItems.clear(); 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(_("Choose Class"), rect1, UIS_CENTER | UIS_BIG)); - SelheroFreeListItems(); + vecSelHeroDlgItems.clear(); int itemH = 33; - vecSelHeroDlgItems.push_back(new UiListItem(_("Warrior"), static_cast(HeroClass::Warrior))); - vecSelHeroDlgItems.push_back(new UiListItem(_("Rogue"), static_cast(HeroClass::Rogue))); - vecSelHeroDlgItems.push_back(new UiListItem(_("Sorcerer"), static_cast(HeroClass::Sorcerer))); + vecSelHeroDlgItems.push_back(std::make_unique(_("Warrior"), static_cast(HeroClass::Warrior))); + vecSelHeroDlgItems.push_back(std::make_unique(_("Rogue"), static_cast(HeroClass::Rogue))); + vecSelHeroDlgItems.push_back(std::make_unique(_("Sorcerer"), static_cast(HeroClass::Sorcerer))); if (gbIsHellfire) { - vecSelHeroDlgItems.push_back(new UiListItem(_("Monk"), static_cast(HeroClass::Monk))); + vecSelHeroDlgItems.push_back(std::make_unique(_("Monk"), static_cast(HeroClass::Monk))); } if (gbBard || sgOptions.Gameplay.bTestBard) { - vecSelHeroDlgItems.push_back(new UiListItem(_("Bard"), static_cast(HeroClass::Bard))); + vecSelHeroDlgItems.push_back(std::make_unique(_("Bard"), static_cast(HeroClass::Bard))); } if (gbBarbarian || sgOptions.Gameplay.bTestBarbarian) { - vecSelHeroDlgItems.push_back(new UiListItem(_("Barbarian"), static_cast(HeroClass::Barbarian))); + vecSelHeroDlgItems.push_back(std::make_unique(_("Barbarian"), static_cast(HeroClass::Barbarian))); } if (vecSelHeroDlgItems.size() > 4) itemH = 26; 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(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 }; - vecSelDlgItems.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect2, UIS_CENTER | UIS_BIG | UIS_GOLD)); + vecSelDlgItems.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect2, UIS_CENTER | UIS_BIG | UIS_GOLD)); 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(_("Cancel"), &UiFocusNavigationEsc, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD)); UiInitList(vecSelHeroDlgItems.size(), SelheroClassSelectorFocus, SelheroClassSelectorSelect, SelheroClassSelectorEsc, vecSelDlgItems); memset(&selhero_heroInfo.name, 0, sizeof(selhero_heroInfo.name)); @@ -210,21 +191,21 @@ void SelheroListSelect(int value) } if (selhero_heroInfo.hassaved) { - SelheroFreeDlgItems(); + vecSelDlgItems.clear(); 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(_("Save File Exists"), rect1, UIS_CENTER | UIS_BIG)); - SelheroFreeListItems(); - vecSelHeroDlgItems.push_back(new UiListItem(_("Load Game"), 0)); - vecSelHeroDlgItems.push_back(new 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)); + vecSelHeroDlgItems.clear(); + vecSelHeroDlgItems.push_back(std::make_unique(_("Load Game"), 0)); + vecSelHeroDlgItems.push_back(std::make_unique(_("New Game"), 1)); + vecSelDlgItems.push_back(std::make_unique(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 }; - vecSelDlgItems.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect2, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelDlgItems.push_back(std::make_unique(_("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 }; - vecSelDlgItems.push_back(new UiArtTextButton(_("Cancel"), &UiFocusNavigationEsc, rect3, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); + vecSelDlgItems.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect3, UIS_CENTER | UIS_VCENTER | UIS_BIG | UIS_GOLD)); UiInitList(vecSelHeroDlgItems.size(), SelheroLoadFocus, SelheroLoadSelect, selhero_List_Init, vecSelDlgItems, true); title = _("Single Player Characters"); @@ -283,26 +264,26 @@ void SelheroClassSelectorSelect(int value) memset(selhero_heroInfo.name, '\0', sizeof(selhero_heroInfo.name)); if (ShouldPrefillHeroName()) 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 }; - vecSelDlgItems.push_back(new UiArtText(_("Enter Name"), rect1, UIS_CENTER | UIS_BIG)); + vecSelDlgItems.push_back(std::make_unique(_("Enter Name"), rect1, UIS_CENTER | UIS_BIG)); 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(_("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 }; - vecSelDlgItems.push_back(new UiArtTextButton(_("OK"), &UiFocusNavigationSelect, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD)); + vecSelDlgItems.push_back(std::make_unique(_("OK"), &UiFocusNavigationSelect, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD)); 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(_("Cancel"), &UiFocusNavigationEsc, rect4, UIS_CENTER | UIS_BIG | UIS_GOLD)); UiInitList(0, nullptr, SelheroNameSelect, SelheroNameEsc, vecSelDlgItems); } void SelheroClassSelectorEsc() { - SelheroFreeDlgItems(); - SelheroFreeListItems(); + vecSelDlgItems.clear(); + vecSelHeroDlgItems.clear(); if (selhero_SaveCount != 0) { selhero_List_Init(); @@ -483,73 +464,76 @@ void selhero_Init() gfnHeroInfo(SelHeroGetHeroInfo); 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 }; - vecSelHeroDialog.push_back(new UiArtText(title, rect1, UIS_CENTER | UIS_BIG)); + vecSelHeroDialog.push_back(std::make_unique(title, rect1, UIS_CENTER | UIS_BIG)); SDL_Rect rect2 = { (Sint16)(PANEL_LEFT + 30), (Sint16)(UI_OFFSET_Y + 211), 180, 76 }; - SELHERO_DIALOG_HERO_IMG = new UiImage(&ArtHero, static_cast(enum_size::value), rect2); - vecSelHeroDialog.push_back(SELHERO_DIALOG_HERO_IMG); + auto heroImg = std::make_unique(&ArtHero, static_cast(enum_size::value), rect2); + 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 }; - vecSelHeroDialog.push_back(new UiArtText(_("Level:"), rect3, UIS_RIGHT)); + vecSelHeroDialog.push_back(std::make_unique(_("Level:"), rect3, UIS_RIGHT)); 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(_("Level:"), rect4, UIS_RIGHT)); 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(textStats[0], rect5, UIS_CENTER)); 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(_("Strength:"), rect6, UIS_RIGHT)); 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(textStats[1], rect7, UIS_CENTER)); 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(_("Magic:"), rect8, UIS_RIGHT)); 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(textStats[2], rect9, UIS_CENTER)); 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(_("Dexterity:"), rect10, UIS_RIGHT)); 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(textStats[3], rect11, UIS_CENTER)); 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(_("Vitality:"), rect12, UIS_RIGHT)); 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(textStats[4], rect13, UIS_CENTER)); } void selhero_List_Init() { listOffset = 0; - SelheroFreeDlgItems(); + vecSelDlgItems.clear(); 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(_("Select Hero"), rect1, UIS_CENTER | UIS_BIG)); - SelheroFreeListItems(); + vecSelHeroDlgItems.clear(); const size_t numViewportHeroes = std::min(selhero_SaveCount + 1, MaxViewportItems); for (std::size_t i = 0; i < numViewportHeroes; i++) { - vecSelHeroDlgItems.push_back(new UiListItem("", -1)); + vecSelHeroDlgItems.push_back(std::make_unique("", -1)); } 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(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 }; - auto *scrollBar = new UiScrollBar(&ArtScrollBarBackground, &ArtScrollBarThumb, &ArtScrollBarArrow, rect2); - vecSelDlgItems.push_back(scrollBar); + auto pinnedScrollBar = std::make_unique(&ArtScrollBarBackground, &ArtScrollBarThumb, &ArtScrollBarArrow, rect2); + auto *scrollBar = pinnedScrollBar.get(); + vecSelDlgItems.push_back(std::move(pinnedScrollBar)); 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(_("OK"), &UiFocusNavigationSelect, rect3, UIS_CENTER | UIS_BIG | UIS_GOLD)); 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); - vecSelDlgItems.push_back(SELLIST_DIALOG_DELETE_BUTTON); + auto setlistDialogDeleteButton = std::make_unique(_("Delete"), &SelheroUiFocusNavigationYesNo, rect4, UIS_CENTER | UIS_BIG | UIS_DISABLED); + 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 }; - vecSelDlgItems.push_back(new UiArtTextButton(_("Cancel"), &UiFocusNavigationEsc, rect5, UIS_CENTER | UIS_BIG | UIS_GOLD)); + vecSelDlgItems.push_back(std::make_unique(_("Cancel"), &UiFocusNavigationEsc, rect5, UIS_CENTER | UIS_BIG | UIS_GOLD)); UiInitList(selhero_SaveCount + 1, SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, SelheroListDeleteYesNo); UiInitScrollBar(scrollBar, MaxViewportItems, &listOffset); diff --git a/Source/DiabloUI/selok.cpp b/Source/DiabloUI/selok.cpp index e9583b2dc..c552a5136 100644 --- a/Source/DiabloUI/selok.cpp +++ b/Source/DiabloUI/selok.cpp @@ -15,8 +15,8 @@ char dialogText[256]; bool selok_endMenu; -std::vector vecSelOkDialogItems; -std::vector vecSelOkDialog; +std::vector> vecSelOkDialogItems; +std::vector> vecSelOkDialog; #define MESSAGE_WIDTH 280 @@ -24,14 +24,8 @@ void selok_Free() { ArtBackground.Unload(); - for (auto *pUIListItem : vecSelOkDialogItems) { - delete pUIListItem; - } vecSelOkDialogItems.clear(); - for (auto *pUIItem : vecSelOkDialog) { - delete pUIItem; - } vecSelOkDialog.clear(); } @@ -62,17 +56,17 @@ void UiSelOkDialog(const char *title, const char *body, bool background) if (title != nullptr) { 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(title, rect1, UIS_CENTER | UIS_BIG)); 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(dialogText, rect2, UIS_MED)); } else { 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(dialogText, rect1, UIS_MED)); } - vecSelOkDialogItems.push_back(new UiListItem(_("OK"), 0)); - vecSelOkDialog.push_back(new UiList(vecSelOkDialogItems, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD)); + vecSelOkDialogItems.push_back(std::make_unique(_("OK"), 0)); + vecSelOkDialog.push_back(std::make_unique(vecSelOkDialogItems, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD)); strncpy(dialogText, body, sizeof(dialogText) - 1); WordWrapArtStr(dialogText, MESSAGE_WIDTH); diff --git a/Source/DiabloUI/selyesno.cpp b/Source/DiabloUI/selyesno.cpp index 42e6c2052..92c15ab18 100644 --- a/Source/DiabloUI/selyesno.cpp +++ b/Source/DiabloUI/selyesno.cpp @@ -12,8 +12,8 @@ bool selyesno_endMenu; bool selyesno_value; char selyesno_confirmationMessage[256]; -std::vector vecSelYesNoDialogItems; -std::vector vecSelYesNoDialog; +std::vector> vecSelYesNoDialogItems; +std::vector> vecSelYesNoDialog; #define MESSAGE_WIDTH 280 @@ -21,14 +21,8 @@ void SelyesnoFree() { ArtBackground.Unload(); - for (auto *pUIListItem : vecSelYesNoDialogItems) { - delete pUIListItem; - } vecSelYesNoDialogItems.clear(); - for (auto *pUIItem : vecSelYesNoDialog) { - delete pUIItem; - } vecSelYesNoDialog.clear(); } @@ -53,14 +47,14 @@ bool UiSelHeroYesNoDialog(const char *title, const char *body) UiAddLogo(&vecSelYesNoDialog); 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(title, rect1, UIS_CENTER | UIS_BIG)); 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(selyesno_confirmationMessage, rect2, UIS_MED)); - vecSelYesNoDialogItems.push_back(new UiListItem(_("Yes"), 0)); - vecSelYesNoDialogItems.push_back(new UiListItem(_("No"), 1)); - vecSelYesNoDialog.push_back(new UiList(vecSelYesNoDialogItems, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD)); + vecSelYesNoDialogItems.push_back(std::make_unique(_("Yes"), 0)); + vecSelYesNoDialogItems.push_back(std::make_unique(_("No"), 1)); + vecSelYesNoDialog.push_back(std::make_unique(vecSelYesNoDialogItems, PANEL_LEFT + 230, (UI_OFFSET_Y + 390), 180, 35, UIS_CENTER | UIS_BIG | UIS_GOLD)); strncpy(selyesno_confirmationMessage, body, sizeof(selyesno_confirmationMessage) - 1); WordWrapArtStr(selyesno_confirmationMessage, MESSAGE_WIDTH); diff --git a/Source/DiabloUI/title.cpp b/Source/DiabloUI/title.cpp index b00b50ab3..43fba3f48 100644 --- a/Source/DiabloUI/title.cpp +++ b/Source/DiabloUI/title.cpp @@ -6,7 +6,7 @@ namespace devilution { namespace { -std::vector vecTitleScreen; +std::vector> vecTitleScreen; void TitleLoad() { @@ -25,9 +25,6 @@ void TitleFree() ArtBackgroundWidescreen.Unload(); ArtLogos[LOGO_BIG].Unload(); - for (auto *pUIItem : vecTitleScreen) { - delete pUIItem; - } vecTitleScreen.clear(); } @@ -37,14 +34,14 @@ void UiTitleDialog() { if (gbIsHellfire) { 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(new UiImage(&ArtBackground, /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER)); + vecTitleScreen.push_back(std::make_unique(&ArtBackgroundWidescreen, /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER)); + vecTitleScreen.push_back(std::make_unique(&ArtBackground, /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER)); } else { UiAddBackground(&vecTitleScreen); UiAddLogo(&vecTitleScreen, LOGO_BIG, 182); 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(_("Copyright © 1996-2001 Blizzard Entertainment"), rect, UIS_MED | UIS_CENTER)); } TitleLoad(); diff --git a/Source/DiabloUI/ui_item.h b/Source/DiabloUI/ui_item.h index 1b029f2f8..60fa26a13 100644 --- a/Source/DiabloUI/ui_item.h +++ b/Source/DiabloUI/ui_item.h @@ -293,15 +293,16 @@ public: int m_value; }; -typedef std::vector vUiListItem; +typedef std::vector> vUiListItem; class UiList : public UiItemBase { 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) { m_type = UI_LIST; - m_vecItems = vItems; + for (auto &item : vItems) + m_vecItems.push_back(item.get()); m_x = x; m_y = y; m_width = item_width;