Skip to content

Commit

Permalink
create derived bar options for each instance
Browse files Browse the repository at this point in the history
  • Loading branch information
AndiDittrich committed Feb 19, 2023
1 parent f4dc172 commit 6c75740
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 10 deletions.
5 changes: 5 additions & 0 deletions CHANGES.md
@@ -1,5 +1,10 @@
## Branch 3.x ##

### 3.12.0 ###

* Added: option to override bar characters via instance options on `multibar.create()` - thanks to [ Araxeus on GitHub](https://github.com/npkgz/cli-progress/pull/136)
* Added: example howto use multibars with different bar styles

### 3.11.2 ###

* Bugfix: disabled `gracefulExit` by default, because the default SIGINT/SIGTERM handlers of nodejs are removed
Expand Down
80 changes: 80 additions & 0 deletions examples/example-multibar-styling.js
@@ -0,0 +1,80 @@
const _progress = require('../cli-progress');

const files = {
'eta.js ': 187,
'generic-bar.js': 589,
'multi-bar.js ': 5342,
'options.txt ': 42,
'single-bar.js ': 2123,
'terminal.txt ': 4123
};
const bars = [];

// create new container
const multibar = new _progress.MultiBar({
format: ' {bar} | "{file}" | {value}/{total}',
hideCursor: true,
clearOnComplete: true,
stopOnComplete: true,
noTTYOutput: true
});

console.log("Downloading files..\n");

// total progress
const masterProgress = multibar.create(Object.keys(files).length, 0, {}, {
format: ' {bar} | {value} of {total} files',
barCompleteChar: '>',
barIncompleteChar: ' ',
align: 'center',
autopadding: true
});

// add bars
for (const filename in files){
const size = files[filename];

// txt file ?
if (filename.match(/\.txt\s*$/g) !== null){
// override the format option
bars.push(multibar.create(size, 0, {file: filename}, {
format: ' {bar} | "{file}" | {value}/{total} | textfile',
barCompleteChar: '\u2588',
barIncompleteChar: '\u2591'
}));
}else{
bars.push(multibar.create(size, 0, {file: filename}, {
barIncompleteChar: '\u2591'
}));
}
}

const timer = setInterval(function(){

// master status
let completedTasks = 0;

// increment
for (let i=0; i<bars.length;i++){
const bar = bars[i];

// download complete ?
if (bar.value < bar.total){
bar.increment();
}else{
completedTasks++;
}
}

// update master progress
masterProgress.update(completedTasks);

// progress bar running ?
// check "isActive" property in case you've enabled "stopOnComplete" !
if (multibar.isActive === false){
clearInterval(timer);

//multibar.stop();
console.log('Download complete!')
}
}, 3);
5 changes: 3 additions & 2 deletions lib/generic-bar.js
@@ -1,6 +1,7 @@
const _ETA = require('./eta');
const _Terminal = require('./terminal');
const _formatter = require('./formatter');
const _options = require('./options');
const _EventEmitter = require('events');

// Progress-Bar constructor
Expand All @@ -9,8 +10,8 @@ module.exports = class GenericBar extends _EventEmitter{
constructor(options){
super();

// store options
this.options = options;
// store options and assign derived ones (instance specific)
this.options = _options.assignDerivedOptions(options);

// store terminal instance
this.terminal = (this.options.terminal) ? this.options.terminal : new _Terminal(this.options.stream);
Expand Down
23 changes: 16 additions & 7 deletions lib/options.js
Expand Up @@ -44,13 +44,13 @@ module.exports = {
// disable linewrapping ?
options.linewrap = mergeOption(opt.linewrap, false);

// pre-render bar strings (performance)
options.barCompleteString = (new Array(options.barsize + 1 ).join(opt.barCompleteChar || '='));
options.barIncompleteString = (new Array(options.barsize + 1 ).join(opt.barIncompleteChar || '-'));

// glue sequence (control chars) between bar elements ?
options.barGlue = mergeOption(opt.barGlue, '');

// bar chars
options.barCompleteChar = mergeOption(opt.barCompleteChar, '=');
options.barIncompleteChar = mergeOption(opt.barIncompleteChar, '-');

// the bar format
options.format = mergeOption(opt.format, 'progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}');

Expand Down Expand Up @@ -90,12 +90,21 @@ module.exports = {
// automated padding to fixed width ?
options.autopadding = mergeOption(opt.autopadding, false);

// autopadding character - empty in case autopadding is disabled
options.autopaddingChar = options.autopadding ? mergeOption(opt.autopaddingChar, ' ') : '';

// stop bar on SIGINT/SIGTERM to restore cursor settings ?
options.gracefulExit = mergeOption(opt.gracefulExit, false);

return options;
},

// derived options: instance specific, has to be created for every bar element
assignDerivedOptions: function assignDerivedOptions(options){
// pre-render bar strings (performance)
options.barCompleteString = options.barCompleteChar.repeat(options.barsize + 1);
options.barIncompleteString = options.barIncompleteChar.repeat(options.barsize + 1);

// autopadding character - empty in case autopadding is disabled
options.autopaddingChar = options.autopadding ? mergeOption(options.autopaddingChar, ' ') : '';

return options;
}
};
2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "cli-progress",
"version": "3.11.2",
"version": "3.12.0",
"description": "easy to use progress-bar for command-line/terminal applications",
"keywords": [
"cli",
Expand Down

0 comments on commit 6c75740

Please sign in to comment.