mirror of
https://github.com/boostorg/program_options.git
synced 2026-01-19 04:22:15 +00:00
Align columns across groups in --help output.
Patch from Leo Goodstadt. Fixes #6114. [SVN r86571]
This commit is contained in:
@@ -199,6 +199,10 @@ namespace program_options {
|
||||
*/
|
||||
options_description& add(const options_description& desc);
|
||||
|
||||
/** Find the maximum width of the option column, including options
|
||||
in groups. */
|
||||
unsigned get_option_column_width() const;
|
||||
|
||||
public:
|
||||
/** Returns an object of implementation-defined type suitable for adding
|
||||
options to options_description. The returned object will
|
||||
@@ -229,7 +233,7 @@ namespace program_options {
|
||||
|
||||
/** Outputs 'desc' to the specified stream, calling 'f' to output each
|
||||
option_description element. */
|
||||
void print(std::ostream& os) const;
|
||||
void print(std::ostream& os, unsigned width = 0) const;
|
||||
|
||||
private:
|
||||
typedef std::map<std::string, int>::const_iterator name2index_iterator;
|
||||
|
||||
@@ -604,12 +604,9 @@ namespace boost { namespace program_options {
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
options_description::print(std::ostream& os) const
|
||||
unsigned
|
||||
options_description::get_option_column_width() const
|
||||
{
|
||||
if (!m_caption.empty())
|
||||
os << m_caption << ":\n";
|
||||
|
||||
/* Find the maximum width of the option column */
|
||||
unsigned width(23);
|
||||
unsigned i; // vc6 has broken for loop scoping
|
||||
@@ -620,6 +617,11 @@ namespace boost { namespace program_options {
|
||||
ss << " " << opt.format_name() << ' ' << opt.format_parameter();
|
||||
width = (max)(width, static_cast<unsigned>(ss.str().size()));
|
||||
}
|
||||
|
||||
/* Get width of groups as well*/
|
||||
for (unsigned j = 0; j < groups.size(); ++j)
|
||||
width = max(width, groups[j]->get_option_column_width());
|
||||
|
||||
/* this is the column were description should start, if first
|
||||
column is longer, we go to a new line */
|
||||
const unsigned start_of_description_column = m_line_length - m_min_description_length;
|
||||
@@ -628,9 +630,20 @@ namespace boost { namespace program_options {
|
||||
|
||||
/* add an additional space to improve readability */
|
||||
++width;
|
||||
|
||||
return width;
|
||||
}
|
||||
|
||||
void
|
||||
options_description::print(std::ostream& os, unsigned width) const
|
||||
{
|
||||
if (!m_caption.empty())
|
||||
os << m_caption << ":\n";
|
||||
|
||||
if (!width)
|
||||
width = get_option_column_width();
|
||||
|
||||
/* The options formatting style is stolen from Subversion. */
|
||||
for (i = 0; i < m_options.size(); ++i)
|
||||
for (unsigned i = 0; i < m_options.size(); ++i)
|
||||
{
|
||||
if (belong_to_group[i])
|
||||
continue;
|
||||
@@ -643,7 +656,8 @@ namespace boost { namespace program_options {
|
||||
}
|
||||
|
||||
for (unsigned j = 0; j < groups.size(); ++j) {
|
||||
os << "\n" << *groups[j];
|
||||
os << "\n";
|
||||
groups[j]->print(os, width);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user