mirror of
https://github.com/letscontrolit/ESPEasy.git
synced 2026-03-13 10:10:27 +08:00
277 lines
6.6 KiB
JavaScript
277 lines
6.6 KiB
JavaScript
function p113_main() {
|
|
function elId(e) {
|
|
return document.getElementById(e);
|
|
}
|
|
function elVal(e) {
|
|
return elId(e).value;
|
|
}
|
|
function getCel() {
|
|
return vi.querySelectorAll('.cel');
|
|
}
|
|
function cntr(e) {
|
|
if (elVal('roix') > 10 || elVal('roiy') > 10) return;
|
|
let sc = [];
|
|
getCel().forEach((c) => {
|
|
const b = c.getBoundingClientRect();
|
|
if (
|
|
e.x >= b.left &&
|
|
e.y >= b.top &&
|
|
e.x - scx <= b.right &&
|
|
e.y - scy <= b.bottom
|
|
) sc.push(c);
|
|
});
|
|
if (sc.length === 1) { elId('optc').value = parseInt(sc[0].textContent); upDsp(); }
|
|
}
|
|
const vi = elId('vi');
|
|
const sl = elId('sL');
|
|
let imd = 0;
|
|
let ims = 0;
|
|
let st = {},
|
|
se = {};
|
|
let sr = {};
|
|
let oC = 199;
|
|
let xr = 16;
|
|
let yr = 16;
|
|
let ptg = 0;
|
|
let scx = vi.offsetWidth - vi.clientWidth;
|
|
let scy = vi.offsetHeight - vi.clientHeight;
|
|
let lck = 0;
|
|
let sm = {
|
|
w: 96,
|
|
h: 96,
|
|
};
|
|
// console.log('p113_main', vi, sl);
|
|
|
|
function clr() {
|
|
getCel()
|
|
.forEach((c) => {
|
|
c.classList.remove('sel');
|
|
c.classList.remove('oc');
|
|
});
|
|
}
|
|
vi.addEventListener('mousedown', (e) => {
|
|
if (e.altKey) {
|
|
cntr(e);
|
|
} else {
|
|
lck = elId('lck').checked;
|
|
if (imd && lck) {
|
|
lck = 0;
|
|
return;
|
|
}
|
|
imd = 1;
|
|
if (!ims) {
|
|
se = {
|
|
x: null,
|
|
y: null
|
|
};
|
|
clr();
|
|
}
|
|
st = {
|
|
x: e.x + window.scrollX - vi.offsetLeft,
|
|
y: e.y + window.scrollY - vi.offsetTop
|
|
};
|
|
// console.log('mousedown', e.x, e.y, st);
|
|
}
|
|
});
|
|
vi.addEventListener('mouseup', (e) => {
|
|
if (lck || !imd) return;
|
|
imd = 0;
|
|
const vc = vi.getBoundingClientRect();
|
|
se = {
|
|
x: e.x + window.scrollX - vi.offsetLeft,
|
|
y: e.y + window.scrollY - vi.offsetTop
|
|
};
|
|
// console.log('mouseup', sr, se, vc.left, vc.top, window.scrollY);
|
|
slt = sl.style;
|
|
slt.top = `0px`;
|
|
slt.left = `0px`;
|
|
slt.bottom = 'unset';
|
|
slt.right = 'unset';
|
|
slt.visibility = 'hidden';
|
|
if (
|
|
Math.abs(se.x - st.x) < sm.w ||
|
|
Math.abs(se.y - st.y) < sm.h
|
|
) { upDsp(); return; }
|
|
gSelCls();
|
|
pntSel(xr, yr, oC);
|
|
});
|
|
vi.addEventListener('dblclick', (e) => {
|
|
lck = 0;
|
|
imd = 0;
|
|
cntr(e);
|
|
// console.log('dblclick', e.x, e.y);
|
|
});
|
|
vi.addEventListener('mousemove', (e) => {
|
|
if (!imd) return;
|
|
se = {
|
|
x: e.x + window.scrollX,
|
|
y: e.y + window.scrollY
|
|
};
|
|
sr = {
|
|
x1: Math.min(st.x, se.x),
|
|
y1: Math.min(st.y, se.y),
|
|
x2: Math.max(st.x, se.x) + scx,
|
|
y2: Math.max(st.y, se.y) + scy
|
|
};
|
|
slt = sl.style;
|
|
slt.top = `${scx + Math.min(
|
|
sr.y1,
|
|
sr.y2
|
|
)}px`;
|
|
slt.left = `${scy + Math.min(
|
|
sr.x1,
|
|
sr.x2
|
|
)}px`;
|
|
slt.bottom = `${vi.offsetHeight +
|
|
vi.offsetTop -
|
|
Math.max(sr.y1, sr.y2)
|
|
}px`;
|
|
slt.right = `${vi.offsetWidth +
|
|
vi.offsetLeft -
|
|
Math.max(sr.x1, sr.x2)
|
|
}px`;
|
|
slt.visibility = 'visible';
|
|
if (!ims)
|
|
clr();
|
|
});
|
|
function gSelCls() {
|
|
let sc = [];
|
|
sl.style.visibility = 'visible';
|
|
getCel().forEach((c) => {
|
|
const b = c.getBoundingClientRect();
|
|
wx = window.scrollX;
|
|
wy = window.scrollY;
|
|
if (
|
|
sr.x1 - wx <= ((b.left) - vi.offsetLeft + 16) &&
|
|
sr.y1 - wy <= ((b.top) - vi.offsetTop + 16) &&
|
|
(sr.x2 - wx - scx + 16) >= (b.right) &&
|
|
(sr.y2 - wy - scy + 16) >= b.bottom
|
|
) sc.push(c);
|
|
});
|
|
if (sc.length > 0) {
|
|
[ly, lx] = oiToXy(sc[0].textContent);
|
|
[ry, rx] = oiToXy(sc[sc.length - 1].textContent);
|
|
nx = lx + Math.floor((rx - lx) / 2 + 0.5);
|
|
ny = ly + Math.floor((ry - ly) / 2);
|
|
oC = gSP(ny, nx);
|
|
xr = 1 + rx - lx;
|
|
yr = 1 + ry - ly;
|
|
// console.log('getSelectedCells', sc[0], sc[sc.length - 1], lx, ly, rx, ry, nx, ny, 'optc:', oC);
|
|
ptg = 1;
|
|
elId('roix').value = xr;
|
|
elId('roiy').value = yr;
|
|
elId('optc').value = oC;
|
|
ptg = 0;
|
|
}
|
|
return sc;
|
|
}
|
|
function oiToXy(oidx) {
|
|
x = 0;
|
|
y = 0;
|
|
o = parseInt(oidx);
|
|
if (o < 128) {
|
|
y += 8;
|
|
o = 127 - o;
|
|
} else {
|
|
o -= 128;
|
|
}
|
|
x = o >> 3;
|
|
y += o & 7;
|
|
return [y, x];
|
|
}
|
|
function pntSel(roix, roiy, oCen) {
|
|
if (!ptg) {
|
|
lx = 0;
|
|
ly = 0;
|
|
rx = 15;
|
|
ry = 15;
|
|
oo = oCen;
|
|
if (roix > 10 || roiy > 10) { oCen = 199; }
|
|
[ocy, ocx] = oiToXy(oCen);
|
|
hx = Math.floor(roix / 2);
|
|
hy = Math.floor(roiy / 2);
|
|
dx = roix % 2 != 0 ? 0 : 1;
|
|
dy = roiy % 2 != 0 ? 0 : 1;
|
|
if ((roix < 16) || (roiy < 16)) {
|
|
lx = ocx - hx;
|
|
rx = ocx + hx - dx;
|
|
ly = ocy - hy + dy;
|
|
ry = ocy + hy;
|
|
if ((rx + 1) - (lx + 1) < 4) {
|
|
d = 3 - ((rx + 1) - (lx + 1));
|
|
if (rx < (15 - d)) {
|
|
rx += d;
|
|
} else {
|
|
lx -= d;
|
|
ocx -= d / 2;
|
|
}
|
|
}
|
|
if (rx > 15 || lx < 0) {
|
|
d = lx < 0 ? lx : rx - 15;
|
|
rx -= d;
|
|
lx -= d;
|
|
ocx -= d;
|
|
}
|
|
if ((ry + 1) - (ly + 1) < 4) {
|
|
d = 3 - ((ry + 1) - (ly + 1));
|
|
if (ry < ((15 - d))) {
|
|
ry += d;
|
|
} else {
|
|
ly -= d;
|
|
ocy -= d / 2;
|
|
}
|
|
}
|
|
if (ry > 15 || ly < 0) {
|
|
d = ly < 0 ? ly : ry - 15;
|
|
ry -= d;
|
|
ly -= d;
|
|
ocy -= d;
|
|
}
|
|
}
|
|
// console.log('dsp oCen:', getSPAD(ocy, ocx), oCen);
|
|
cs = getCel();
|
|
for (y = 0; y < 16; ++y) {
|
|
for (x = 0; x < 16; ++x) {
|
|
cc = cs[y * 16 + x].classList;
|
|
if (x >= lx && x <= rx && y >= ly && y <= ry)
|
|
cc.add('sel');
|
|
else
|
|
cc.remove('sel');
|
|
if (x == ocx && y == ocy)
|
|
cc.add('oc');
|
|
else
|
|
cc.remove('oc');
|
|
}
|
|
}
|
|
oc = gSP(ocy, ocx);
|
|
if (oc != oo) {
|
|
ptg = 1;
|
|
elId('optc').value = oc;
|
|
ptg = 0;
|
|
}
|
|
}
|
|
}
|
|
function upDsp() {
|
|
xr = elVal('roix');
|
|
yr = elVal('roiy');
|
|
optc = elVal('optc');
|
|
pntSel(xr, yr, optc);
|
|
}
|
|
p113_main.upDsp = upDsp;
|
|
function gSP(y, x) {
|
|
o = ((x & 15) << 3) + (y & 7);
|
|
return (y > 7) ? 127 - o : 128 + o;
|
|
}
|
|
// Needed for multi-select
|
|
// document.addEventListener('keydown', (e) => {
|
|
// if (e.ctrlKey) isMultiSelectionOn = true;
|
|
// });
|
|
// document.addEventListener('keyup', (e) => {
|
|
// if (!e.ctrlKey) isMultiSelectionOn = false;
|
|
// });
|
|
document.addEventListener('resize', () => {
|
|
scx = vi.offsetWidth - vi.clientWidth;
|
|
scy = vi.offsetHeight - vi.clientHeight;
|
|
});
|
|
}
|