#pragma once #include #include #include #include #include namespace ks { // Scan each time the menu opens, relative to the resident executable, not its working directory. inline std::vector discoverUtilities(const std::filesystem::path &folder, std::error_code &error) { error.clear(); std::vector result; std::filesystem::directory_iterator it(folder, error), end; if (error == std::errc::no_such_file_or_directory) error.clear(); while (!error && it != end) { std::error_code entryError; if (_wcsicmp(it->path().extension().c_str(), L".exe") == 0 && it->is_regular_file(entryError)) result.push_back(it->path()); it.increment(error); } if (error) result.clear(); std::sort(result.begin(), result.end(), [](const auto &a, const auto &b) { return _wcsicmp(a.filename().c_str(), b.filename().c_str()) < 0; }); return result; } inline std::wstring utilityMenuLabel(const std::filesystem::path &path) { std::wstring label; for (wchar_t ch : path.stem().wstring()) { label += ch; if (ch == L'&') label += ch; // Win32 uses ampersands for access keys. } return label; } }