diff --git a/similar/editor/medwall.cpp b/similar/editor/medwall.cpp index 864da0744..4441e0153 100644 --- a/similar/editor/medwall.cpp +++ b/similar/editor/medwall.cpp @@ -49,6 +49,7 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "kdefs.h" #include "u_mem.h" +#include "compiler-make_unique.h" #include "compiler-range_for.h" #include "highest_valid.h" #include "partial_range.h" @@ -357,56 +358,48 @@ static int NextWall() { //------------------------------------------------------------------------- int do_wall_dialog() { - int i; - wall_dialog *wd; - // Only open 1 instance of this window... if ( MainWindow != NULL ) return 0; - MALLOC(wd, wall_dialog, 1); - if (!wd) - return 0; - + auto wd = make_unique(); wd->framenum = 0; // Close other windows. close_all_windows(); // Open a window with a quit button - MainWindow = ui_create_dialog( TMAPBOX_X+20, TMAPBOX_Y+20, 765-TMAPBOX_X, 545-TMAPBOX_Y, DF_DIALOG, wall_dialog_handler, wd ); - wd->quitButton = ui_add_gadget_button( MainWindow, 20, 252, 48, 40, "Done", NULL ); + MainWindow = ui_create_dialog(TMAPBOX_X+20, TMAPBOX_Y+20, 765-TMAPBOX_X, 545-TMAPBOX_Y, DF_DIALOG, wall_dialog_handler, std::move(wd)); + return 1; +} +static int wall_dialog_created(UI_DIALOG *const w, wall_dialog *const wd) +{ + wd->quitButton = ui_add_gadget_button(w, 20, 252, 48, 40, "Done", NULL); // These are the checkboxes for each door flag. - i = 80; - wd->doorFlag[0] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Locked" ); i += 24; - wd->doorFlag[1] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Auto" ); i += 24; - wd->doorFlag[2] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion OFF" ); i += 24; - - wd->keyFlag[0] = ui_add_gadget_radio( MainWindow, 22, i, 16, 16, 0, "NONE" ); i += 24; - wd->keyFlag[1] = ui_add_gadget_radio( MainWindow, 22, i, 16, 16, 0, "Blue" ); i += 24; - wd->keyFlag[2] = ui_add_gadget_radio( MainWindow, 22, i, 16, 16, 0, "Red" ); i += 24; - wd->keyFlag[3] = ui_add_gadget_radio( MainWindow, 22, i, 16, 16, 0, "Yellow" ); i += 24; - + int i = 80; + wd->doorFlag[0] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Locked"); i += 24; + wd->doorFlag[1] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Auto"); i += 24; + wd->doorFlag[2] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Illusion OFF"); i += 24; + wd->keyFlag[0] = ui_add_gadget_radio(w, 22, i, 16, 16, 0, "NONE"); i += 24; + wd->keyFlag[1] = ui_add_gadget_radio(w, 22, i, 16, 16, 0, "Blue"); i += 24; + wd->keyFlag[2] = ui_add_gadget_radio(w, 22, i, 16, 16, 0, "Red"); i += 24; + wd->keyFlag[3] = ui_add_gadget_radio(w, 22, i, 16, 16, 0, "Yellow"); i += 24; // The little box the wall will appear in. - wd->wallViewBox = ui_add_gadget_userbox( MainWindow, 155, 5, 64, 64 ); - + wd->wallViewBox = ui_add_gadget_userbox(w, 155, 5, 64, 64); // A bunch of buttons... i = 80; - ui_add_gadget_button( MainWindow,155,i,70, 22, "<< Clip", PrevWall ); - ui_add_gadget_button( MainWindow,155+70,i,70, 22, "Clip >>", NextWall );i += 25; - ui_add_gadget_button( MainWindow,155,i,140, 22, "Add Blastable", wall_add_blastable ); i += 25; - ui_add_gadget_button( MainWindow,155,i,140, 22, "Add Door", wall_add_door ); i += 25; - ui_add_gadget_button( MainWindow,155,i,140, 22, "Add Illusory", wall_add_illusion); i += 25; - ui_add_gadget_button( MainWindow,155,i,140, 22, "Add Closed Wall", wall_add_closed_wall ); i+=25; -// ui_add_gadget_button( MainWindow,155,i,140, 22, "Restore All Walls", wall_restore_all ); i += 25; - ui_add_gadget_button( MainWindow,155,i,70, 22, "<< Prev", GotoPrevWall ); - ui_add_gadget_button( MainWindow,155+70,i,70, 22, "Next >>", GotoNextWall );i += 25; - ui_add_gadget_button( MainWindow,155,i,140, 22, "Remove Wall", wall_remove ); i += 25; - ui_add_gadget_button( MainWindow,155,i,140, 22, "Bind to Trigger", bind_wall_to_trigger ); i += 25; - ui_add_gadget_button( MainWindow,155,i,140, 22, "Bind to Control", bind_wall_to_control_center ); i+=25; - + ui_add_gadget_button(w, 155, i, 70, 22, "<< Clip", PrevWall); + ui_add_gadget_button(w, 155+70, i, 70, 22, "Clip >>", NextWall);i += 25; + ui_add_gadget_button(w, 155, i, 140, 22, "Add Blastable", wall_add_blastable); i += 25; + ui_add_gadget_button(w, 155, i, 140, 22, "Add Door", wall_add_door ); i += 25; + ui_add_gadget_button(w, 155, i, 140, 22, "Add Illusory", wall_add_illusion); i += 25; + ui_add_gadget_button(w, 155, i, 140, 22, "Add Closed Wall", wall_add_closed_wall); i+=25; + ui_add_gadget_button(w, 155, i, 70, 22, "<< Prev", GotoPrevWall); + ui_add_gadget_button(w, 155+70, i, 70, 22, "Next >>", GotoNextWall);i += 25; + ui_add_gadget_button(w, 155, i, 140, 22, "Remove Wall", wall_remove); i += 25; + ui_add_gadget_button(w, 155, i, 140, 22, "Bind to Trigger", bind_wall_to_trigger); i += 25; + ui_add_gadget_button(w, 155, i, 140, 22, "Bind to Control", bind_wall_to_control_center); i+=25; wd->old_wall_num = -2; // Set to some dummy value so everything works ok on the first frame. - return 1; } @@ -420,6 +413,17 @@ void close_wall_window() int wall_dialog_handler(UI_DIALOG *dlg,const d_event &event, wall_dialog *wd) { + switch(event.type) + { + case EVENT_WINDOW_CREATED: + return wall_dialog_created(dlg, wd); + case EVENT_WINDOW_CLOSE: + std::default_delete()(wd); + MainWindow = NULL; + return 0; + default: + break; + } sbyte type; fix DeltaTime; fix64 Temp; @@ -598,14 +602,6 @@ int wall_dialog_handler(UI_DIALOG *dlg,const d_event &event, wall_dialog *wd) if (ui_button_any_drawn || (wd->old_wall_num != Cursegp->sides[Curside].wall_num) ) Update_flags |= UF_WORLD_CHANGED; - - if (event.type == EVENT_WINDOW_CLOSE) - { - d_free(wd); - MainWindow = NULL; - return 0; - } - if ( GADGET_PRESSED(wd->quitButton) || (keypress==KEY_ESC) ) { close_wall_window();