blessed-tab-container
Version:
A CLI Multi-Tab Container Utilizing Labels For Blessed
49 lines (39 loc) • 1.32 kB
JavaScript
/**
* Handles tab switching on click, calculating hit based on element size and
* position.
*
* @private
* @param {object} args - arguments
* @param {object} args.elm - clicked element
* @param {BlessedTabContainerState} args.state - tabbed container state object
* @param {number} args.x - mouse x position (chars)
* @param {number} args.y - mosue y position (chars)
*/
const onElementClick = ({ elm, state, x, y } = {}) => {
const { config, setVisibleTab, tabs = [] } = state
const { tabSeperator, tabPadding, tabPaddingChar } = config
const { left, top } = elm
const tx = x - left
const ty = y - top
const labelOffset = 2 // depends on position, for now only left supported
if (ty !== 0) {
return
}
const labels = (tabs || []).map(({ label }) => label)
let labelLength = 0
// TODO: Handle alternate label positioning, not just left
for (let i = 0; i < labels.length; i += 1) {
const start = labelOffset + labelLength
const label = labels[i]
if (tx >= start && tx < (start + label.length)) {
setVisibleTab(label).setDirty(false)
return
}
labelLength += label.length
if (i < labels.length - 1) {
labelLength += tabSeperator.length + ((tabPadding * tabPaddingChar.length) * 2)
}
}
}
module.exports = onElementClick