diff --git a/common/include/ui.h b/common/include/ui.h index fd9bc6e3d..02583c7db 100644 --- a/common/include/ui.h +++ b/common/include/ui.h @@ -320,7 +320,7 @@ window_event_result ui_radio_do( UI_DIALOG *dlg, UI_GADGET_RADIO * radio, const extern void ui_radio_set_value(UI_GADGET_RADIO *radio, int value); extern void ui_draw_checkbox( UI_DIALOG *dlg, UI_GADGET_CHECKBOX * checkbox ); -extern UI_GADGET_CHECKBOX * ui_add_gadget_checkbox( UI_DIALOG * dlg, short x, short y, short w, short h, short group, const char * text ); +std::unique_ptr ui_add_gadget_checkbox(UI_DIALOG * dlg, short x, short y, short w, short h, short group, const char * text); window_event_result ui_checkbox_do( UI_DIALOG *dlg, UI_GADGET_CHECKBOX * checkbox, const d_event &event ); extern void ui_checkbox_check(UI_GADGET_CHECKBOX * checkbox, int check); diff --git a/common/ui/checkbox.cpp b/common/ui/checkbox.cpp index e9973bf23..516201c44 100644 --- a/common/ui/checkbox.cpp +++ b/common/ui/checkbox.cpp @@ -68,10 +68,9 @@ void ui_draw_checkbox( UI_DIALOG *dlg, UI_GADGET_CHECKBOX * checkbox ) } -UI_GADGET_CHECKBOX * ui_add_gadget_checkbox( UI_DIALOG * dlg, short x, short y, short w, short h, short group, const char * text ) +std::unique_ptr ui_add_gadget_checkbox(UI_DIALOG * dlg, short x, short y, short w, short h, short group, const char * text) { - auto checkbox = ui_gadget_add( dlg, x, y, x+w-1, y+h-1 ); - + std::unique_ptr checkbox{ui_gadget_add(dlg, x, y, x+w-1, y+h-1)}; MALLOC(checkbox->text, char, strlen(text) + 5); strcpy(checkbox->text,text); checkbox->width = w; @@ -81,12 +80,9 @@ UI_GADGET_CHECKBOX * ui_add_gadget_checkbox( UI_DIALOG * dlg, short x, short y, checkbox->pressed = 0; checkbox->flag = 0; checkbox->group = group; - return checkbox; - } - window_event_result ui_checkbox_do( UI_DIALOG *dlg, UI_GADGET_CHECKBOX * checkbox,const d_event &event ) { checkbox->oldposition = checkbox->position; diff --git a/common/ui/gadget.cpp b/common/ui/gadget.cpp index 4a8ead50a..d11adf880 100644 --- a/common/ui/gadget.cpp +++ b/common/ui/gadget.cpp @@ -105,8 +105,6 @@ void ui_gadget_delete_all( UI_DIALOG * dlg ) delete static_cast(tmp); break; case UI_GADGET_CHECKBOX::s_kind: - delete static_cast(tmp); - break; case UI_GADGET_INPUTBOX::s_kind: case UI_GADGET_USERBOX::s_kind: case UI_GADGET_ICON::s_kind: diff --git a/similar/editor/centers.cpp b/similar/editor/centers.cpp index 039e5bc93..df33696ab 100644 --- a/similar/editor/centers.cpp +++ b/similar/editor/centers.cpp @@ -66,7 +66,7 @@ struct centers_dialog { UI_GADGET_BUTTON *quitButton; UI_GADGET_RADIO *centerFlag[MAX_CENTER_TYPES]; - UI_GADGET_CHECKBOX *robotMatFlag[MAX_ROBOT_TYPES]; + array, MAX_ROBOT_TYPES> robotMatFlag; int old_seg_num; }; @@ -179,7 +179,7 @@ int centers_dialog_handler(UI_DIALOG *dlg,const d_event &event, centers_dialog * // Read materialization center robot bit flags for (i = 0; i < N_robot_types; i++) - ui_checkbox_check(c->robotMatFlag[i], RobotCenters[Cursegp->matcen_num].robot_flags[i / 32] & (1 << (i % 32))); + ui_checkbox_check(c->robotMatFlag[i].get(), RobotCenters[Cursegp->matcen_num].robot_flags[i / 32] & (1 << (i % 32))); } //------------------------------------------------------------ @@ -205,7 +205,7 @@ int centers_dialog_handler(UI_DIALOG *dlg,const d_event &event, centers_dialog * for (i = 0; i < N_robot_types; i++) { - if ( GADGET_PRESSED(c->robotMatFlag[i]) ) + if (GADGET_PRESSED(c->robotMatFlag[i].get())) { if (c->robotMatFlag[i]->flag) RobotCenters[Cursegp->matcen_num].robot_flags[i / 32] |= (1 << (i % 32)); diff --git a/similar/editor/eswitch.cpp b/similar/editor/eswitch.cpp index 3e2eedf5e..4ede9dbdd 100644 --- a/similar/editor/eswitch.cpp +++ b/similar/editor/eswitch.cpp @@ -64,7 +64,7 @@ struct trigger_dialog { std::unique_ptr wallViewBox; UI_GADGET_BUTTON *quitButton; - UI_GADGET_CHECKBOX *triggerFlag[NUM_TRIGGER_FLAGS]; + array, NUM_TRIGGER_FLAGS> triggerFlag; int old_trigger_num; }; @@ -389,16 +389,16 @@ int trigger_dialog_handler(UI_DIALOG *dlg,const d_event &event, trigger_dialog * { trigger *trig = &Triggers[trigger_num]; - ui_checkbox_check(t->triggerFlag[0], trig->flags & TRIGGER_CONTROL_DOORS); - ui_checkbox_check(t->triggerFlag[1], trig->flags & TRIGGER_SHIELD_DAMAGE); - ui_checkbox_check(t->triggerFlag[2], trig->flags & TRIGGER_ENERGY_DRAIN); - ui_checkbox_check(t->triggerFlag[3], trig->flags & TRIGGER_EXIT); - ui_checkbox_check(t->triggerFlag[4], trig->flags & TRIGGER_ONE_SHOT); - ui_checkbox_check(t->triggerFlag[5], trig->flags & TRIGGER_ILLUSION_ON); - ui_checkbox_check(t->triggerFlag[6], trig->flags & TRIGGER_ILLUSION_OFF); - ui_checkbox_check(t->triggerFlag[7], trig->flags & TRIGGER_ON); - ui_checkbox_check(t->triggerFlag[8], trig->flags & TRIGGER_MATCEN); - ui_checkbox_check(t->triggerFlag[9], trig->flags & TRIGGER_SECRET_EXIT); + ui_checkbox_check(t->triggerFlag[0].get(), trig->flags & TRIGGER_CONTROL_DOORS); + ui_checkbox_check(t->triggerFlag[1].get(), trig->flags & TRIGGER_SHIELD_DAMAGE); + ui_checkbox_check(t->triggerFlag[2].get(), trig->flags & TRIGGER_ENERGY_DRAIN); + ui_checkbox_check(t->triggerFlag[3].get(), trig->flags & TRIGGER_EXIT); + ui_checkbox_check(t->triggerFlag[4].get(), trig->flags & TRIGGER_ONE_SHOT); + ui_checkbox_check(t->triggerFlag[5].get(), trig->flags & TRIGGER_ILLUSION_ON); + ui_checkbox_check(t->triggerFlag[6].get(), trig->flags & TRIGGER_ILLUSION_OFF); + ui_checkbox_check(t->triggerFlag[7].get(), trig->flags & TRIGGER_ON); + ui_checkbox_check(t->triggerFlag[8].get(), trig->flags & TRIGGER_MATCEN); + ui_checkbox_check(t->triggerFlag[9].get(), trig->flags & TRIGGER_SECRET_EXIT); } } @@ -410,32 +410,32 @@ int trigger_dialog_handler(UI_DIALOG *dlg,const d_event &event, trigger_dialog * { rval = 1; - if (GADGET_PRESSED(t->triggerFlag[0])) + if (GADGET_PRESSED(t->triggerFlag[0].get())) trigger_flag_Markedside(TRIGGER_CONTROL_DOORS, t->triggerFlag[0]->flag); - else if (GADGET_PRESSED(t->triggerFlag[1])) + else if (GADGET_PRESSED(t->triggerFlag[1].get())) trigger_flag_Markedside(TRIGGER_SHIELD_DAMAGE, t->triggerFlag[1]->flag); - else if (GADGET_PRESSED(t->triggerFlag[2])) + else if (GADGET_PRESSED(t->triggerFlag[2].get())) trigger_flag_Markedside(TRIGGER_ENERGY_DRAIN, t->triggerFlag[2]->flag); - else if (GADGET_PRESSED(t->triggerFlag[3])) + else if (GADGET_PRESSED(t->triggerFlag[3].get())) trigger_flag_Markedside(TRIGGER_EXIT, t->triggerFlag[3]->flag); - else if (GADGET_PRESSED(t->triggerFlag[4])) + else if (GADGET_PRESSED(t->triggerFlag[4].get())) trigger_flag_Markedside(TRIGGER_ONE_SHOT, t->triggerFlag[4]->flag); - else if (GADGET_PRESSED(t->triggerFlag[5])) + else if (GADGET_PRESSED(t->triggerFlag[5].get())) trigger_flag_Markedside(TRIGGER_ILLUSION_ON, t->triggerFlag[5]->flag); - else if (GADGET_PRESSED(t->triggerFlag[6])) + else if (GADGET_PRESSED(t->triggerFlag[6].get())) trigger_flag_Markedside(TRIGGER_ILLUSION_OFF, t->triggerFlag[6]->flag); - else if (GADGET_PRESSED(t->triggerFlag[7])) + else if (GADGET_PRESSED(t->triggerFlag[7].get())) trigger_flag_Markedside(TRIGGER_ON, t->triggerFlag[7]->flag); - else if (GADGET_PRESSED(t->triggerFlag[8])) + else if (GADGET_PRESSED(t->triggerFlag[8].get())) trigger_flag_Markedside(TRIGGER_MATCEN, t->triggerFlag[8]->flag); - else if (GADGET_PRESSED(t->triggerFlag[9])) + else if (GADGET_PRESSED(t->triggerFlag[9].get())) trigger_flag_Markedside(TRIGGER_SECRET_EXIT, t->triggerFlag[9]->flag); else rval = 0; } else - for (int i = 0; i < NUM_TRIGGER_FLAGS; i++ ) - ui_checkbox_check(t->triggerFlag[i], 0); + range_for (auto &i, t->triggerFlag) + ui_checkbox_check(i.get(), 0); //------------------------------------------------------------ // Draw the wall in the little 64x64 box diff --git a/similar/editor/medwall.cpp b/similar/editor/medwall.cpp index 7ff4991d7..60ab6bae6 100644 --- a/similar/editor/medwall.cpp +++ b/similar/editor/medwall.cpp @@ -67,7 +67,7 @@ struct wall_dialog { std::unique_ptr wallViewBox; UI_GADGET_BUTTON *quitButton; - UI_GADGET_CHECKBOX *doorFlag[4]; + array, 3> doorFlag; UI_GADGET_RADIO *keyFlag[4]; int old_wall_num; fix64 time; @@ -450,9 +450,9 @@ int wall_dialog_handler(UI_DIALOG *dlg,const d_event &event, wall_dialog *wd) { wall *w = &Walls[Cursegp->sides[Curside].wall_num]; - ui_checkbox_check(wd->doorFlag[0], w->flags & WALL_DOOR_LOCKED); - ui_checkbox_check(wd->doorFlag[1], w->flags & WALL_DOOR_AUTO); - ui_checkbox_check(wd->doorFlag[2], w->flags & WALL_ILLUSION_OFF); + ui_checkbox_check(wd->doorFlag[0].get(), w->flags & WALL_DOOR_LOCKED); + ui_checkbox_check(wd->doorFlag[1].get(), w->flags & WALL_DOOR_AUTO); + ui_checkbox_check(wd->doorFlag[2].get(), w->flags & WALL_ILLUSION_OFF); ui_radio_set_value(wd->keyFlag[0], w->keys & KEY_NONE); ui_radio_set_value(wd->keyFlag[1], w->keys & KEY_BLUE); @@ -467,7 +467,7 @@ int wall_dialog_handler(UI_DIALOG *dlg,const d_event &event, wall_dialog *wd) //------------------------------------------------------------ if (Walls[Cursegp->sides[Curside].wall_num].type == WALL_DOOR) { - if (GADGET_PRESSED(wd->doorFlag[0])) + if (GADGET_PRESSED(wd->doorFlag[0].get())) { if ( wd->doorFlag[0]->flag == 1 ) Walls[Cursegp->sides[Curside].wall_num].flags |= WALL_DOOR_LOCKED; @@ -475,7 +475,7 @@ int wall_dialog_handler(UI_DIALOG *dlg,const d_event &event, wall_dialog *wd) Walls[Cursegp->sides[Curside].wall_num].flags &= ~WALL_DOOR_LOCKED; rval = 1; } - else if (GADGET_PRESSED(wd->doorFlag[1])) + else if (GADGET_PRESSED(wd->doorFlag[1].get())) { if ( wd->doorFlag[1]->flag == 1 ) Walls[Cursegp->sides[Curside].wall_num].flags |= WALL_DOOR_AUTO; @@ -496,14 +496,14 @@ int wall_dialog_handler(UI_DIALOG *dlg,const d_event &event, wall_dialog *wd) } } } else { - for (int i = 0; i < 2; i++) - ui_checkbox_check(wd->doorFlag[i], 0); - for ( int i=0; i < 4; i++ ) - ui_radio_set_value(wd->keyFlag[i], 0); + range_for (auto &i, partial_range(wd->doorFlag, 2u)) + ui_checkbox_check(i.get(), 0); + range_for (auto &i, wd->keyFlag) + ui_radio_set_value(i, 0); } if (Walls[Cursegp->sides[Curside].wall_num].type == WALL_ILLUSION) { - if (GADGET_PRESSED(wd->doorFlag[2])) + if (GADGET_PRESSED(wd->doorFlag[2].get())) { if ( wd->doorFlag[2]->flag == 1 ) Walls[Cursegp->sides[Curside].wall_num].flags |= WALL_ILLUSION_OFF;