Several cosmetic fixes for off-by-one in padding and display issues when resetting lists

This commit is contained in:
Nathan Byrd 2023-02-20 13:29:03 -06:00
commit 7a189b238f
8 changed files with 55 additions and 21 deletions

View File

@ -97,7 +97,7 @@
mci: {
VM1: {
height: 10
width: 20
width: 71
itemFormat: "|00|11{userName:<12}|08: |03{oneliner:<59.59}"
}
TM2: {
@ -229,6 +229,7 @@
VM1: {
height: 10
itemFormat: "|00|11{userName:<12}|08: |03{oneliner:<59.59}"
width: 71
}
TM2: {
focusTextStyle: first lower
@ -486,7 +487,7 @@
activityPubFollowingManager: {
config: {
selectedActorInfoFormat: "|00|15{preferredUsername}\n|02{name}\n{plainTextSummary}"
selectedActorInfoFormat: "|00|15{preferredUsername} |08(|02{name}|08)\n|07following|08: {statusIndicator}\n\n|06{plainTextSummary}"
statusIndicatorEnabled: "|00|10√"
staticIndicatorDisabled: "|00|12X"
}
@ -494,13 +495,13 @@
mci: {
VM1: {
height: 15
width: 30
width: 35
itemFormat: "|00{statusIndicator} |00|03{subject}"
focusItemFormat: "|00{statusIndicator} |00|19|15{subject}"
}
MT2: {
height: 15
width: 38
width: 34
}
TM3: {
focusTextStyle: first upper

View File

@ -254,12 +254,11 @@ function FullMenuView(options) {
if (relativeColumn + renderLength > this.dimens.width) {
const overflow = this.hasTextOverflow() ? this.textOverflow : '';
text =
strUtil.renderSubstr(
text,
0,
this.dimens.width - (relativeColumn + overflow.length)
) + overflow;
text = strUtil.renderTruncate(text, {
length: this.dimens.width - (relativeColumn + overflow.length),
omission: overflow,
});
}
let padLength = Math.min(item.fixedLength + 1, this.dimens.width);

View File

@ -72,10 +72,12 @@ exports.getModule = class NodeInfo2WebHadnler extends WebHandlerModule {
},
// :TODO: Only list what's enabled
protocols: ['telnet', 'ssh', 'gopher', 'nntp', 'ws', 'activitypub'],
services: {
inbound: [],
outbound: [''],
},
// :TODO: what should we really be doing here???
// services: {
// inbound: [],
// outbound: [],
// },
openRegistrations: !config.general.closedSystem,
usage: {
users: {

View File

@ -19,6 +19,7 @@ exports.debugEscapedString = debugEscapedString;
exports.stringFromNullTermBuffer = stringFromNullTermBuffer;
exports.stringToNullTermBuffer = stringToNullTermBuffer;
exports.renderSubstr = renderSubstr;
exports.renderTruncate = renderTruncate;
exports.renderStringLength = renderStringLength;
exports.ansiRenderStringLength = ansiRenderStringLength;
exports.formatByteSizeAbbr = formatByteSizeAbbr;
@ -136,13 +137,12 @@ function stylizeString(s, style) {
return s;
}
function pad(s, len, padChar, justify, stringSGR, padSGR, useRenderLen) {
function pad(s, len, padChar, justify, stringSGR, padSGR, useRenderLen = true) {
len = len || 0;
padChar = padChar || ' ';
justify = justify || 'left';
stringSGR = stringSGR || '';
padSGR = padSGR || '';
useRenderLen = _.isUndefined(useRenderLen) ? true : useRenderLen;
const renderLen = useRenderLen ? renderStringLength(s) : s.length;
const padLen = len > renderLen ? len - renderLen : 0;
@ -290,6 +290,29 @@ function renderSubstr(str, start, length) {
return out;
}
const DefaultTruncateLen = 30;
const DefaultTruncateOmission = '...';
function renderTruncate(str, options) {
// shortcut for empty strings
if (0 === str.length) {
return str;
}
options = options || {};
options.length = options.length || DefaultTruncateLen;
options.omission = _.isString(options.omission)
? options.omission
: DefaultTruncateOmission;
let out = renderSubstr(str, 0, options.length - options.omission.length);
if (out.length < str.length) {
out += options.omission;
}
return out;
}
//
// Method to return the "rendered" length taking into account Pipe and ANSI color codes.
//
@ -464,7 +487,7 @@ function isAnsiLine(line) {
// * Pipe codes
// * Extended (CP437) ASCII - https://www.ascii-codes.com/
// * Tabs
// * Contigous 3+ spaces before the end of the line
// * Contiguous 3+ spaces before the end of the line
//
function isFormattedLine(line) {
if (renderStringLength(line) < line.length) {

View File

@ -98,10 +98,10 @@ function VerticalMenuView(options) {
sgr = index === self.focusedItemIndex ? self.getFocusSGR() : self.getSGR();
}
const renderLength = strUtil.renderStringLength(text);
if (renderLength > this.dimens.width) {
text = strUtil.renderSubstr(text, 0, this.dimens.width);
}
text = strUtil.renderTruncate(text, {
length: this.dimens.width,
omission: this.textOverflow,
});
text = `${sgr}${strUtil.pad(
`${text}${this.styleSGR1}`,
@ -109,6 +109,7 @@ function VerticalMenuView(options) {
this.fillChar,
this.justify
)}`;
self.client.term.write(`${ansi.goto(item.row, self.position.col)}${text}`);
this.setRenderCacheItem(index, text, item.focused);
};

View File

@ -50,6 +50,7 @@ function View(options) {
this.textStyle = options.textStyle || 'normal';
this.focusTextStyle = options.focusTextStyle || this.textStyle;
this.offsetsApplied = false;
this.truncateOmission = options.truncateOmission || '';
if (options.id) {
this.setId(options.id);
@ -273,6 +274,12 @@ View.prototype.setPropertyValue = function (propName, value) {
this.validate = value;
}
break;
case 'truncateOmission':
if (_.isString(value)) {
this.truncateOmission = value;
}
break;
}
if (/styleSGR[0-9]{1,2}/.test(propName)) {

View File

@ -31,6 +31,7 @@ Items can be selected on a menu via the cursor keys, Page Up, Page Down, Home, a
| `fillChar` | Specifies a character to fill extra space in the menu with. Defaults to an empty space |
| `items` | List of items to show in the menu. See **Items** below.
| `focusItemFormat` | Sets the format for a focused list entry. See **Entry Formatting** in [MCI](../mci.md) |
| `truncateOmission` | Sets the omission characters for truncated text if used. Defaults to an empty string. Commonly set to "..." |
### Hot Keys