mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-08-19 09:53:08 +02:00
ViewTask: Handle negative overage by decreasing size of the largest columns
This commit is contained in:
parent
04e84cb06f
commit
a8d4ce52c3
1 changed files with 44 additions and 2 deletions
|
@ -202,11 +202,53 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
|
||||||
widths = ideal;
|
widths = ideal;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not enough for minimum.
|
// Not enough for minimum. Decrease certain columns.
|
||||||
else if (overage < 0)
|
else if (overage < 0)
|
||||||
{
|
{
|
||||||
Context::getContext ().error (format ("The report has a minimum width of {1} and does not fit in the available width of {2}.", sum_minimal + all_extra, _width));
|
// Determine which columns are the longest.
|
||||||
|
unsigned int longest = 0;
|
||||||
|
unsigned int second_longest = 0;
|
||||||
|
for (unsigned int j = 0; j < minimal.size(); j++)
|
||||||
|
{
|
||||||
|
if (minimal[j] > minimal[longest])
|
||||||
|
{
|
||||||
|
second_longest = longest;
|
||||||
|
longest = j;
|
||||||
|
}
|
||||||
|
else if (minimal[j] > minimal[second_longest])
|
||||||
|
{
|
||||||
|
second_longest = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Case 1: Shortening longest column still keeps it longest. Let it bear
|
||||||
|
// all the shortening.
|
||||||
widths = minimal;
|
widths = minimal;
|
||||||
|
if (minimal[longest] + overage >= minimal[second_longest])
|
||||||
|
widths[longest] += overage;
|
||||||
|
|
||||||
|
// Case 2: Shorten the longest column to second longest length. Try to
|
||||||
|
// split shortening them evenly.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int decrease = minimal[second_longest] - minimal[longest];
|
||||||
|
widths[longest] += decrease;
|
||||||
|
overage = overage - decrease;
|
||||||
|
|
||||||
|
// Attempt to decrease the two longest columns (at most to two characters)
|
||||||
|
if (-overage <= widths[longest] + widths[second_longest] - 4)
|
||||||
|
{
|
||||||
|
// Compute half of the overage, rounding up
|
||||||
|
int half_overage = overage / 2 + overage % 2;
|
||||||
|
|
||||||
|
// Decrease both larges columns by this amount
|
||||||
|
widths[longest] += half_overage;
|
||||||
|
widths[second_longest] += half_overage;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
// If reducing two of the longest solumns to 2 characters is not sufficient, then give up.
|
||||||
|
Context::getContext ().error (format ("The report has a minimum width of {1} and does not fit in the available width of {2}.", sum_minimal + all_extra, _width));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perfect minimal width.
|
// Perfect minimal width.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue