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
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;
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<UiEdit *>(item);
auto *pItemUIEdit = static_cast<UiEdit *>(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<UiItemBase *> *vecDialog)
void UiAddBackground(std::vector<std::unique_ptr<UiItemBase>> *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<UiImage>(&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<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 };
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()
@ -933,6 +935,12 @@ void UiRenderItems(const std::vector<UiItemBase *> &items)
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)
{
if (items.empty()) {
@ -963,6 +971,36 @@ bool UiItemMouseEvents(SDL_Event *event, const std::vector<UiItemBase *> &items)
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()
{
if (IsHardwareCursor() || sgbControllerActive)

8
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<UiItemBase *> &items);
bool UiItemMouseEvents(SDL_Event *event, const std::vector<std::unique_ptr<UiItemBase>> &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<UiItemBase *> *vecDialog);
void UiAddLogo(std::vector<UiItemBase *> *vecDialog, int size = LOGO_MED, int y = 0);
void UiAddBackground(std::vector<std::unique_ptr<UiItemBase> > *vecDialog);
void UiAddLogo(std::vector<std::unique_ptr<UiItemBase>> *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<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 UiClearScreen();
void UiPollAndRender();
void UiRenderItems(const std::vector<UiItemBase *> &items);
void UiRenderItems(const std::vector<std::unique_ptr<UiItemBase>> &items);
void UiInitList_clear();
void mainmenu_restart_repintro();

29
Source/DiabloUI/dialogs.cpp

@ -29,8 +29,8 @@ void DialogActionOK()
dialogEnd = true;
}
std::vector<UiItemBase *> vecNULL;
std::vector<UiItemBase *> vecOkDialog;
std::vector<std::unique_ptr<UiItemBase>> vecNULL;
std::vector<std::unique_ptr<UiItemBase>> 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<UiImage>(&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<UiText>(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<UiButton>(&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<UiImage>(&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<UiText>(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<UiText>(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<UiButton>(&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<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;
dialogEnd = false;
@ -259,7 +256,7 @@ void DialogLoop(const std::vector<UiItemBase *> &items, const std::vector<UiItem
} // 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;
@ -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<UiItemBase *> &renderBehind)
void UiErrorOkDialog(const char *text, const char *caption, const std::vector<std::unique_ptr<UiItemBase>> &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<UiItemBase *> &renderBehind)
void UiErrorOkDialog(const char *text, const std::vector<std::unique_ptr<UiItemBase>> &renderBehind)
{
UiErrorOkDialog(text, nullptr, renderBehind);
}

6
Source/DiabloUI/dialogs.h

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

30
Source/DiabloUI/mainmenu.cpp

@ -9,8 +9,8 @@ namespace {
int mainmenu_attract_time_out; //seconds
DWORD dwAttractTicks;
std::vector<UiItemBase *> vecMainMenuDialog;
std::vector<UiListItem *> vecMenuItems;
std::vector<std::unique_ptr<UiItemBase>> vecMainMenuDialog;
std::vector<std::unique_ptr<UiListItem>> 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<UiListItem>(_("Single Player"), MAINMENU_SINGLE_PLAYER));
vecMenuItems.push_back(std::make_unique<UiListItem>(_("Multi Player"), MAINMENU_MULTIPLAYER));
vecMenuItems.push_back(std::make_unique<UiListItem>(_("Replay Intro"), MAINMENU_REPLAY_INTRO));
vecMenuItems.push_back(std::make_unique<UiListItem>(_("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<UiListItem>(_("Credits"), MAINMENU_SHOW_CREDITS));
vecMenuItems.push_back(std::make_unique<UiListItem>(_("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<UiListItem>(_("Show Credits"), MAINMENU_SHOW_CREDITS));
vecMenuItems.push_back(std::make_unique<UiListItem>(_("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<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 };
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);
}
@ -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();
}

4
Source/DiabloUI/progress.cpp

@ -19,7 +19,7 @@ Art ArtProgBG;
Art ProgFil;
SDL_Surface *msgSurface;
SDL_Surface *msgShadow;
std::vector<UiItemBase *> vecProgress;
std::vector<std::unique_ptr<UiItemBase>> 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<UiButton>(&SmlButton, _("Cancel"), &DialogActionCancel, rect3, 0));
}
void ProgressFree()

38
Source/DiabloUI/selconn.cpp

@ -18,8 +18,8 @@ bool selconn_ReturnValue = false;
bool selconn_EndMenu = false;
GameData *selconn_GameData;
std::vector<UiListItem *> vecConnItems;
std::vector<UiItemBase *> vecSelConnDlg;
std::vector<std::unique_ptr<UiListItem>> vecConnItems;
std::vector<std::unique_ptr<UiItemBase>> 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<UiListItem>("Zerotier", SELCONN_ZT));
#endif
#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
vecConnItems.push_back(new UiListItem(_("Loopback"), SELCONN_LOOPBACK));
vecConnItems.push_back(std::make_unique<UiListItem>(_("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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<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 };
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 };
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);
}
@ -83,14 +83,8 @@ void SelconnFree()
{
ArtBackground.Unload();
for (auto *pUIItem : vecConnItems) {
delete pUIItem;
}
vecConnItems.clear();
for (auto *pUIMenuItem : vecSelConnDlg) {
delete pUIMenuItem;
}
vecSelConnDlg.clear();
}

92
Source/DiabloUI/selgame.cpp

@ -37,21 +37,15 @@ namespace {
const char *title = "";
std::vector<UiListItem *> vecSelGameDlgItems;
std::vector<UiItemBase *> vecSelGameDialog;
std::vector<std::unique_ptr<UiListItem>> vecSelGameDlgItems;
std::vector<std::unique_ptr<UiItemBase>> 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<UiArtText>(_("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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<UiListItem>(_("Create Game"), 0));
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 };
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 };
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);
}
@ -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<UiArtText>(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<UiArtText>(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<UiArtText>(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<UiArtText>(_("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<UiListItem>(_("Normal"), DIFF_NORMAL));
vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Nightmare"), DIFF_NIGHTMARE));
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 };
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 };
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);
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<UiArtText>(_("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<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 };
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 };
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);
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<UiArtText>(_("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<UiArtText>(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<UiArtText>(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<UiArtText>(_("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<UiListItem>(_("Normal"), 20));
vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Fast"), 30));
vecSelGameDlgItems.push_back(std::make_unique<UiListItem>(_("Faster"), 40));
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 };
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 };
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);
}
@ -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<UiArtText>(_("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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<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 };
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 };
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);
}

138
Source/DiabloUI/selhero.cpp

@ -38,9 +38,9 @@ _selhero_selections selhero_result;
bool selhero_navigateYesNo;
bool selhero_deleteEnabled;
std::vector<UiItemBase *> vecSelHeroDialog;
std::vector<UiListItem *> vecSelHeroDlgItems;
std::vector<UiItemBase *> vecSelDlgItems;
std::vector<std::unique_ptr<UiItemBase>> vecSelHeroDialog;
std::vector<std::unique_ptr<UiListItem>> vecSelHeroDlgItems;
std::vector<std::unique_ptr<UiItemBase>> 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<std::size_t>(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<UiArtText>(_("Choose Class"), rect1, UIS_CENTER | UIS_BIG));
SelheroFreeListItems();
vecSelHeroDlgItems.clear();
int itemH = 33;
vecSelHeroDlgItems.push_back(new UiListItem(_("Warrior"), static_cast<int>(HeroClass::Warrior)));
vecSelHeroDlgItems.push_back(new 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>(_("Warrior"), static_cast<int>(HeroClass::Warrior)));
vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Rogue"), static_cast<int>(HeroClass::Rogue)));
vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("Sorcerer"), static_cast<int>(HeroClass::Sorcerer)));
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) {
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) {
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)
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<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 };
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 };
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);
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<UiArtText>(_("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<UiListItem>(_("Load Game"), 0));
vecSelHeroDlgItems.push_back(std::make_unique<UiListItem>(_("New Game"), 1));
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 };
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 };
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);
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<UiArtText>(_("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<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 };
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 };
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);
}
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<UiArtText>(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<int>(enum_size<HeroClass>::value), rect2);
vecSelHeroDialog.push_back(SELHERO_DIALOG_HERO_IMG);
auto heroImg = std::make_unique<UiImage>(&ArtHero, static_cast<int>(enum_size<HeroClass>::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<UiArtText>(_("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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<UiArtText>(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<UiArtText>(_("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<UiListItem>("", -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<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 };
auto *scrollBar = new UiScrollBar(&ArtScrollBarBackground, &ArtScrollBarThumb, &ArtScrollBarArrow, rect2);
vecSelDlgItems.push_back(scrollBar);
auto pinnedScrollBar = std::make_unique<UiScrollBar>(&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<UiArtTextButton>(_("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<UiArtTextButton>(_("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<UiArtTextButton>(_("Cancel"), &UiFocusNavigationEsc, rect5, UIS_CENTER | UIS_BIG | UIS_GOLD));
UiInitList(selhero_SaveCount + 1, SelheroListFocus, SelheroListSelect, SelheroListEsc, vecSelDlgItems, false, SelheroListDeleteYesNo);
UiInitScrollBar(scrollBar, MaxViewportItems, &listOffset);

20
Source/DiabloUI/selok.cpp

@ -15,8 +15,8 @@ char dialogText[256];
bool selok_endMenu;
std::vector<UiListItem *> vecSelOkDialogItems;
std::vector<UiItemBase *> vecSelOkDialog;
std::vector<std::unique_ptr<UiListItem>> vecSelOkDialogItems;
std::vector<std::unique_ptr<UiItemBase>> 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<UiArtText>(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<UiArtText>(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<UiArtText>(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<UiListItem>(_("OK"), 0));
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);
WordWrapArtStr(dialogText, MESSAGE_WIDTH);

20
Source/DiabloUI/selyesno.cpp

@ -12,8 +12,8 @@ bool selyesno_endMenu;
bool selyesno_value;
char selyesno_confirmationMessage[256];
std::vector<UiListItem *> vecSelYesNoDialogItems;
std::vector<UiItemBase *> vecSelYesNoDialog;
std::vector<std::unique_ptr<UiListItem>> vecSelYesNoDialogItems;
std::vector<std::unique_ptr<UiItemBase>> 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<UiArtText>(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<UiArtText>(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<UiListItem>(_("Yes"), 0));
vecSelYesNoDialogItems.push_back(std::make_unique<UiListItem>(_("No"), 1));
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);
WordWrapArtStr(selyesno_confirmationMessage, MESSAGE_WIDTH);

11
Source/DiabloUI/title.cpp

@ -6,7 +6,7 @@
namespace devilution {
namespace {
std::vector<UiItemBase *> vecTitleScreen;
std::vector<std::unique_ptr<UiItemBase>> 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<UiImage>(&ArtBackgroundWidescreen, /*bAnimated=*/true, /*iFrame=*/0, rect, UIS_CENTER));
vecTitleScreen.push_back(std::make_unique<UiImage>(&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<UiArtText>(_("Copyright © 1996-2001 Blizzard Entertainment"), rect, UIS_MED | UIS_CENTER));
}
TitleLoad();

7
Source/DiabloUI/ui_item.h

@ -293,15 +293,16 @@ public:
int m_value;
};
typedef std::vector<UiListItem *> vUiListItem;
typedef std::vector<std::unique_ptr<UiListItem>> 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;

Loading…
Cancel
Save