diff --git a/similar/main/menu.cpp b/similar/main/menu.cpp index dbd020169..00a1ec30f 100644 --- a/similar/main/menu.cpp +++ b/similar/main/menu.cpp @@ -252,8 +252,14 @@ std::pair parse_human_readable_time(const char *cons } #if DXX_USE_SDLMIXER +enum class select_dir_flag : uint8_t +{ + files_only, + directories_or_files, +}; + __attribute_nonnull() -static int select_file_recursive(const menu_title title, const std::array &orig_path, const partial_range_t &ext_list, uint8_t select_dir, ntstring &userdata); +static int select_file_recursive(const menu_title title, const std::array &orig_path, const partial_range_t &ext_list, select_dir_flag select_dir, ntstring &userdata); static window_event_result get_absolute_path(ntstring &full_path, const char *rel_path) { @@ -261,7 +267,7 @@ static window_event_result get_absolute_path(ntstring &full_path, return window_event_result::close; } -#define SELECT_SONG(t, s) select_file_recursive(t, CGameCfg.CMMiscMusic[s], jukebox_exts, 0, CGameCfg.CMMiscMusic[s]) +#define SELECT_SONG(t, s) select_file_recursive(t, CGameCfg.CMMiscMusic[s], jukebox_exts, select_dir_flag::files_only, CGameCfg.CMMiscMusic[s]) #endif } @@ -1968,9 +1974,10 @@ void graphics_config() namespace dcx { namespace { +#if DXX_USE_SDLMIXER struct browser { - browser(menu_title title, ntstring &userdata, const partial_range_t &r, const uint8_t select_dir, const uint8_t new_path) : + browser(menu_title title, ntstring &userdata, const partial_range_t &r, const select_dir_flag select_dir, const uint8_t new_path) : title(title), userdata(userdata), ext_range(r), select_dir(select_dir), new_path(new_path) { } @@ -1979,12 +1986,11 @@ struct browser string_array_t list; // List of file extensions we're looking for (if looking for a music file many types are possible) const partial_range_t ext_range; - const uint8_t select_dir; // Allow selecting the current directory (e.g. for Jukebox level song directory) + const select_dir_flag select_dir; // Allow selecting the current directory (e.g. for Jukebox level song directory) uint8_t new_path; // Whether the view_path is a new searchpath, if so, remove it when finished std::array view_path; // The absolute path we're currently looking at }; -#if DXX_USE_SDLMIXER static void list_dir_el(void *vb, const char *, const char *fname) { browser *b = reinterpret_cast(vb); @@ -2004,7 +2010,7 @@ static int list_directory(browser *b) b->list.clear(); b->list.add(".."); // go to parent directory std::size_t tidy_offset = 1; - if (b->select_dir) + if (b->select_dir != select_dir_flag::files_only) { ++tidy_offset; b->list.add(""); // choose the directory being viewed @@ -2084,7 +2090,7 @@ static window_event_result select_file_handler(listbox *menu,const d_event &even else *p = '\0'; } - else if (citem == 1 && b->select_dir) + else if (citem == 1 && b->select_dir != select_dir_flag::files_only) return get_absolute_path(b->userdata, ""); else { @@ -2117,7 +2123,7 @@ static window_event_result select_file_handler(listbox *menu,const d_event &even return window_event_result::ignored; } -static int select_file_recursive(const menu_title title, const std::array &orig_path_storage, const partial_range_t &ext_range, const uint8_t select_dir, ntstring &userdata) +static int select_file_recursive(const menu_title title, const std::array &orig_path_storage, const partial_range_t &ext_range, const select_dir_flag select_dir, ntstring &userdata) { auto orig_path = orig_path_storage.data(); const char *sep = PHYSFS_getDirSeparator(); @@ -2413,7 +2419,7 @@ int sound_menu::subfunction_handler(const d_event &event) static const std::array ext_list{{"m3u"}}; // select a directory or M3U playlist select_file_recursive( menu_title{"Select directory or\nM3U playlist to\n play level music from" WINDOWS_DRIVE_CHANGE_TEXT}, - CGameCfg.CMLevelMusicPath, ext_list, 1, // look in current music path for ext_list files and allow directory selection + CGameCfg.CMLevelMusicPath, ext_list, select_dir_flag::directories_or_files, // look in current music path for ext_list files and allow directory selection CGameCfg.CMLevelMusicPath); // just copy the absolute path } else if (citem == opt_sm_cm_mtype3_file1_b)