Use unique_ptr for trigger_dialog

This commit is contained in:
Kp 2014-12-20 04:36:08 +00:00
parent cf1d08c1b6
commit f0c8482b8b
2 changed files with 36 additions and 38 deletions

View file

@ -33,8 +33,6 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
extern int bind_wall_to_trigger();
extern int trigger_remove();
int remove_trigger(vsegptr_t seg, short side);
extern int remove_trigger_num(int trigger_num);

View file

@ -49,6 +49,7 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#include "piggy.h"
#include "u_mem.h"
#include "compiler-make_unique.h"
#include "compiler-range_for.h"
#include "partial_range.h"
@ -262,7 +263,7 @@ int remove_trigger(const vsegptr_t seg, short side)
return remove_trigger_num(Walls[seg->sides[side].wall_num].trigger);
}
int trigger_remove()
static int trigger_remove()
{
remove_trigger(Markedsegp, Markedside);
Update_flags = UF_WORLD_CHANGED;
@ -283,9 +284,6 @@ static int trigger_dialog_handler(UI_DIALOG *dlg,const d_event &event, trigger_d
//-------------------------------------------------------------------------
int do_trigger_dialog()
{
int i;
trigger_dialog *t;
if (!Markedsegp) {
editor_status("Trigger requires Marked Segment & Side.");
return 0;
@ -294,10 +292,7 @@ int do_trigger_dialog()
// Only open 1 instance of this window...
if ( MainWindow != NULL ) return 0;
MALLOC(t, trigger_dialog, 1);
if (!t)
return 0;
auto t = make_unique<trigger_dialog>();
// Close other windows.
robot_close_window();
close_wall_window();
@ -305,36 +300,38 @@ int do_trigger_dialog()
hostage_close_window();
// 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, trigger_dialog_handler, t );
MainWindow = ui_create_dialog(TMAPBOX_X+20, TMAPBOX_Y+20, 765-TMAPBOX_X, 545-TMAPBOX_Y, DF_DIALOG, trigger_dialog_handler, std::move(t));
return 1;
}
static int trigger_dialog_created(UI_DIALOG *const w, trigger_dialog *const t)
{
// These are the checkboxes for each door flag.
i = 44;
t->triggerFlag[0] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Door Control" ); i+=22;
t->triggerFlag[1] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Shield damage" ); i+=22;
t->triggerFlag[2] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Energy drain" ); i+=22;
t->triggerFlag[3] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Exit" ); i+=22;
t->triggerFlag[4] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "One-shot" ); i+=22;
t->triggerFlag[5] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion ON" ); i+=22;
t->triggerFlag[6] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Illusion OFF" ); i+=22;
t->triggerFlag[7] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Trigger ON" ); i+=22;
t->triggerFlag[8] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Matcen Trigger" ); i+=22;
t->triggerFlag[9] = ui_add_gadget_checkbox( MainWindow, 22, i, 16, 16, 0, "Secret Exit" ); i+=22;
int i = 44;
t->triggerFlag[0] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Door Control"); i+=22;
t->triggerFlag[1] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Shield damage"); i+=22;
t->triggerFlag[2] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Energy drain"); i+=22;
t->triggerFlag[3] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Exit"); i+=22;
t->triggerFlag[4] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "One-shot"); i+=22;
t->triggerFlag[5] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Illusion ON"); i+=22;
t->triggerFlag[6] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Illusion OFF"); i+=22;
t->triggerFlag[7] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Trigger ON"); i+=22;
t->triggerFlag[8] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Matcen Trigger"); i+=22;
t->triggerFlag[9] = ui_add_gadget_checkbox(w, 22, i, 16, 16, 0, "Secret Exit"); i+=22;
t->quitButton = ui_add_gadget_button( MainWindow, 20, i, 48, 40, "Done", NULL );
t->quitButton = ui_add_gadget_button( w, 20, i, 48, 40, "Done", NULL );
// The little box the wall will appear in.
t->wallViewBox = ui_add_gadget_userbox( MainWindow, 155, 5, 64, 64 );
t->wallViewBox = ui_add_gadget_userbox( w, 155, 5, 64, 64 );
// A bunch of buttons...
i = 80;
// ui_add_gadget_button( MainWindow,155,i,140, 26, "Add Door Control", add_trigger_control ); i += 29;
ui_add_gadget_button( MainWindow,155,i,140, 26, "Remove Trigger", trigger_remove ); i += 29;
ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Wall", bind_wall_to_trigger ); i += 29;
ui_add_gadget_button( MainWindow,155,i,140, 26, "Bind Matcen", bind_matcen_to_trigger ); i += 29;
ui_add_gadget_button( MainWindow,155,i,140, 26, "All Triggers ON", trigger_turn_all_ON ); i += 29;
ui_add_gadget_button(w, 155, i, 140, 26, "Remove Trigger", trigger_remove); i += 29;
ui_add_gadget_button(w, 155, i, 140, 26, "Bind Wall", bind_wall_to_trigger); i += 29;
ui_add_gadget_button(w, 155, i, 140, 26, "Bind Matcen", bind_matcen_to_trigger); i += 29;
ui_add_gadget_button(w, 155, i, 140, 26, "All Triggers ON", trigger_turn_all_ON); i += 29;
t->old_trigger_num = -2; // Set to some dummy value so everything works ok on the first frame.
return 1;
}
@ -348,6 +345,17 @@ void close_trigger_window()
int trigger_dialog_handler(UI_DIALOG *dlg,const d_event &event, trigger_dialog *t)
{
switch(event.type)
{
case EVENT_WINDOW_CREATED:
return trigger_dialog_created(dlg, t);
case EVENT_WINDOW_CLOSE:
std::default_delete<trigger_dialog>()(t);
MainWindow = NULL;
return 0;
default:
break;
}
short Markedwall, trigger_num;
int keypress = 0;
int rval = 0;
@ -466,14 +474,6 @@ int trigger_dialog_handler(UI_DIALOG *dlg,const d_event &event, trigger_dialog *
if (ui_button_any_drawn || (t->old_trigger_num != trigger_num) )
Update_flags |= UF_WORLD_CHANGED;
if (event.type == EVENT_WINDOW_CLOSE)
{
d_free(t);
MainWindow = NULL;
return 0;
}
if ( GADGET_PRESSED(t->quitButton) || (keypress==KEY_ESC))
{
close_trigger_window();