diff --git a/common/include/window.h b/common/include/window.h index 67fd8c85b..2d31bd916 100644 --- a/common/include/window.h +++ b/common/include/window.h @@ -117,9 +117,9 @@ static inline window_event_result (WINDOW_SEND_EVENT)(window &w, const d_event & void menu_destroy_hook(window *w); template -T1 *window_create(const short x, const short y, const short w, const short h, ConstructionArgs &&... args) +T1 *window_create(ConstructionArgs &&... args) { - auto r = std::make_unique(x, y, w, h, std::forward(args)...); + auto r = std::make_unique(std::forward(args)...); r->send_creation_events(); return r.release(); } diff --git a/common/main/newmenu.h b/common/main/newmenu.h index 9c9119c3b..5d5a9d49f 100644 --- a/common/main/newmenu.h +++ b/common/main/newmenu.h @@ -27,7 +27,6 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "fwd-event.h" -#ifdef __cplusplus #include #include #include @@ -44,7 +43,8 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #ifdef dsx #include "gamefont.h" #include "window.h" -#endif + +namespace dcx { struct listbox; @@ -154,11 +154,8 @@ public: ntstring saved_text; }; -namespace dcx { - extern const char *Newmenu_allowed_chars; -#ifdef dsx enum class tab_processing_flag : uint8_t { ignore, @@ -281,11 +278,9 @@ int newmenu_do2(const menu_title title, const menu_subtitle subtitle, partial_ra { return newmenu_do2(title, subtitle, std::move(items), reinterpret_cast(subfunction), static_cast(const_cast(userdata)), citem, filename); } -#endif } -#ifdef dsx namespace dsx { newmenu *newmenu_do4(menu_title title, menu_subtitle subtitle, partial_range_t items, newmenu_subfunction subfunction, void *userdata, int citem, menu_filename filename, tiny_mode_flag TinyMode = tiny_mode_flag::normal, tab_processing_flag TabsFlag = tab_processing_flag::ignore); @@ -360,7 +355,6 @@ typedef cstring_tie<5> nm_messagebox_tie; int nm_messagebox_str(menu_title title, const nm_messagebox_tie &tie, menu_subtitle str); int vnm_messagebox_aN(menu_title title, const nm_messagebox_tie &tie, const char *format, ...) __attribute_format_printf(3, 4); -#endif void nm_draw_background(grs_canvas &, int x1, int y1, int x2, int y2); void nm_restore_background(int x, int y, int w, int h); @@ -386,12 +380,12 @@ void nm_restore_background(int x, int y, int w, int h); // return 0; // } +namespace dcx { window *listbox_get_window(listbox &lb); const char **listbox_get_items(listbox &lb); int listbox_get_citem(listbox &lb); void listbox_delete_item(listbox &lb, int item); -namespace dcx { template using listbox_subfunction_t = window_event_result (*)(listbox *menu,const d_event &event, T *userdata); @@ -656,5 +650,4 @@ static constexpr menu_number_bias_wrapper_t menu_number_bias_wrapper(T &t) { return t; } - #endif diff --git a/similar/main/menu.cpp b/similar/main/menu.cpp index a449c92b9..7476fa043 100644 --- a/similar/main/menu.cpp +++ b/similar/main/menu.cpp @@ -131,10 +131,10 @@ enum class main_menu_item_index end, }; -struct main_menu +struct main_menu_items { enumerated_array(main_menu_item_index::end), main_menu_item_index> m; - main_menu(); + main_menu_items(); }; #if DXX_USE_UDP @@ -167,7 +167,7 @@ netgame_menu::netgame_menu() static std::array menus; -main_menu::main_menu() +main_menu_items::main_menu_items() { nm_set_item_menu(m[main_menu_item_index::start_new_singleplayer_game], TXT_NEW_GAME); nm_set_item_menu(m[main_menu_item_index::load_existing_singleplayer_game], TXT_LOAD_GAME); @@ -276,6 +276,15 @@ namespace dsx { namespace { +struct main_menu : main_menu_items, newmenu +{ + main_menu(grs_canvas &src) : + newmenu(menu_title{""}, menu_subtitle{nullptr}, menu_filename{Menu_pcx_name}, tiny_mode_flag::normal, tab_processing_flag::ignore, adjusted_citem::create(m, 0), src) + { + } + virtual int subfunction_handler(const d_event &event) override; +}; + static window_event_result do_new_game_menu(); #ifndef RELEASE void do_sandbox_menu(); @@ -687,7 +696,7 @@ int dispatch_menu_option(const netgame_menu_item_index select) #endif // ------------------------------------------------------------------------ -static int main_menu_handler(newmenu *, const d_event &event, main_menu *mm) +int main_menu::subfunction_handler(const d_event &event) { switch (event.type) { @@ -758,7 +767,6 @@ static int main_menu_handler(newmenu *, const d_event &event, main_menu *mm) } case EVENT_WINDOW_CLOSE: - std::default_delete()(mm); break; default: @@ -775,9 +783,8 @@ static int main_menu_handler(newmenu *, const d_event &event, main_menu *mm) //returns number of item chosen int DoMenu() { - main_menu *mm = new main_menu; - newmenu_do3(menu_title{""}, menu_subtitle{nullptr}, mm->m, main_menu_handler, mm, 0, menu_filename{Menu_pcx_name}); - + auto menu = window_create(grd_curscreen->sc_canvas); + (void)menu; return 0; } diff --git a/similar/main/newmenu.cpp b/similar/main/newmenu.cpp index 481be6f44..c15d818ad 100644 --- a/similar/main/newmenu.cpp +++ b/similar/main/newmenu.cpp @@ -1747,6 +1747,8 @@ int nm_messagebox_str(const menu_title title, const nm_messagebox_tie &tie, cons #define LB_ITEMS_ON_SCREEN 8 +namespace dcx { + struct listbox : listbox_layout, window { listbox(grs_canvas &canvas, listbox_layout &&ll) : @@ -1793,6 +1795,8 @@ void listbox_delete_item(listbox &lb, int item) lb.citem = lb.nitems ? lb.nitems - 1 : 0; } +} + namespace { static void update_scroll_position(listbox_layout &lb)