react-photo-layout-editor
Version:
Photo layout editor for react
114 lines (102 loc) • 1.85 kB
JavaScript
let firstSelectIdx = null;
/**
* Change active
*
* @param {Number} key
* @param {Object} item
* @param {Number} start
* @param {Number} end
* @param {String} type press key name and select type
* @return {Object}
*/
function changeActive(key, item, start, end, type)
{
switch(type)
{
case 'add':
return {
key: key,
active: (key === end) ? !item.active : item.active
};
case 'range':
start = start || 0;
if (start < end)
{
return {
key: key,
active: key >= start && key <= end
};
}
else
{
return {
key: key,
active: key <= start && key >= end
};
}
return item;
}
// not found type
if (key === end)
{
return { key: key, active: !item.active };
}
else
{
return { key: key, active: false };
}
}
/**
* select items
*
* @param {Object} props
* @param {Number} key
* @return {Object}
*/
function selectItems(props, key)
{
const { keyName } = props.keyboard;
const { files } = props.tree.side;
let type = null;
let selected = false;
let items = {};
if (keyName !== 'SHIFT')
{
let currentItem = null;
Object.keys(props.tree.side.files).forEach(k => {
let obj = props.tree.side.files[k];
if (parseInt(k) === key)
{
currentItem = obj;
return false;
}
});
firstSelectIdx = (currentItem.active === true) ? null : key;
if (!firstSelectIdx && currentItem.active === true)
{
firstSelectIdx = currentItem.key;
}
}
switch (keyName) {
case 'CTRL':
case 'CMD':
type = 'add';
break;
case 'SHIFT':
type = 'range';
}
Object.keys(files).forEach(k => {
let obj = changeActive(parseInt(k), files[k], firstSelectIdx, key, type);
if (obj.active)
{
selected = true;
}
items[k] = obj;
});
if (!selected)
{
firstSelectIdx = null;
}
return items;
}
export default selectItems;