the 'menu' commands now takes an optional -auto-single option
-auto-single tell the 'menu' command not to prompt when there is only a single choice, and to automatically execute it's command.
This commit is contained in:
parent
d96427b831
commit
1257d432b4
|
@ -188,6 +188,19 @@ struct ParametersParser
|
||||||
return iterator(*this, m_params.size());
|
return iterator(*this, m_params.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// access positional parameter by index
|
||||||
|
const String& operator[] (size_t index) const
|
||||||
|
{
|
||||||
|
assert(index < positional_count());
|
||||||
|
iterator it = begin();
|
||||||
|
while (index)
|
||||||
|
{
|
||||||
|
++it;
|
||||||
|
--index;
|
||||||
|
}
|
||||||
|
return *it;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const CommandParameters& m_params;
|
const CommandParameters& m_params;
|
||||||
std::vector<bool> m_positional;
|
std::vector<bool> m_positional;
|
||||||
|
@ -674,21 +687,30 @@ void eval_string(const CommandParameters& params,
|
||||||
void menu(const CommandParameters& params,
|
void menu(const CommandParameters& params,
|
||||||
const Context& context)
|
const Context& context)
|
||||||
{
|
{
|
||||||
if (params.size() == 0 or (params.size() % 2) != 0)
|
ParametersParser parser(params, { { "auto-single", false } });
|
||||||
|
|
||||||
|
size_t count = parser.positional_count();
|
||||||
|
if (count == 0 or (count % 2) != 0)
|
||||||
throw wrong_argument_count();
|
throw wrong_argument_count();
|
||||||
|
|
||||||
std::ostringstream oss;
|
if (count == 2 and parser.has_option("auto-single"))
|
||||||
for (int i = 0; i < params.size(); i += 2)
|
|
||||||
{
|
{
|
||||||
oss << i/2 + 1 << "[" << params[i] << "] ";
|
CommandManager::instance().execute(parser[1], context);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostringstream oss;
|
||||||
|
for (int i = 0; i < count; i += 2)
|
||||||
|
{
|
||||||
|
oss << i/2 + 1 << "[" << parser[i] << "] ";
|
||||||
}
|
}
|
||||||
oss << "(empty cancels): ";
|
oss << "(empty cancels): ";
|
||||||
|
|
||||||
String choice = prompt_func(oss.str(), complete_nothing);
|
String choice = prompt_func(oss.str(), complete_nothing);
|
||||||
int i = atoi(choice.c_str());
|
int i = atoi(choice.c_str());
|
||||||
|
|
||||||
if (i > 0 and i < (params.size() / 2) + 1)
|
if (i > 0 and i < (count / 2) + 1)
|
||||||
CommandManager::instance().execute(params[(i-1)*2+1], context);
|
CommandManager::instance().execute(parser[(i-1)*2+1], context);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user