42 lines
1.3 KiB
C++
42 lines
1.3 KiB
C++
#pragma once
|
|
#include <algorithm>
|
|
#include <cwchar>
|
|
#include <filesystem>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace ks
|
|
{
|
|
// Scan each time the menu opens, relative to the resident executable, not its working directory.
|
|
inline std::vector<std::filesystem::path> discoverUtilities(const std::filesystem::path &folder,
|
|
std::error_code &error)
|
|
{
|
|
error.clear();
|
|
std::vector<std::filesystem::path> 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;
|
|
}
|
|
}
|