Merge pull request #3934 from IgorA100/patch-54

Feat: Mouse moving an enlarged video frame during live viewing
pull/3932/head
Isaac Connor 2024-04-03 12:52:46 -04:00 committed by GitHub
commit 8c875a1cce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 117 additions and 15 deletions

View File

@ -339,6 +339,10 @@ function MonitorStream(monitorData) {
console.log('onclick'); console.log('onclick');
}; };
this.onmove = function(evt) {
console.log('onmove');
};
this.setup_onclick = function(func) { this.setup_onclick = function(func) {
if (func) { if (func) {
this.onclick = func; this.onclick = func;
@ -350,6 +354,17 @@ function MonitorStream(monitorData) {
} }
}; };
this.setup_onmove = function(func) {
if (func) {
this.onmove = func;
}
if (this.onmove) {
const el = this.getFrame();
if (!el) return;
el.addEventListener('mousemove', this.onmove, false);
}
};
this.disable_onclick = function() { this.disable_onclick = function() {
const el = this.getElement(); const el = this.getElement();
if (!el) return; if (!el) return;

View File

@ -16,6 +16,14 @@ var classMonitorW_SB_L = 'col-sm-9'; /* id="wrapperMonitor" ONLY WITH LEFT */
var classMonitorW_SB_R = 'col-sm-10'; /* id="wrapperMonitor" ONLY WITH RIGHT */ var classMonitorW_SB_R = 'col-sm-10'; /* id="wrapperMonitor" ONLY WITH RIGHT */
var classMonitorWO_SB = 'col-sm-12'; /* id="wrapperMonitor" MAXIMUM width */ var classMonitorWO_SB = 'col-sm-12'; /* id="wrapperMonitor" MAXIMUM width */
var PrevCoordinatFrame = {x: null, y: null};
var coordinateMouse = {
start_x: null, start_y: null,
shiftMouse_x: null, shiftMouse_y: null,
shiftMouseForTrigger_x: null, shiftMouseForTrigger_y: null
};
var leftBtnStatus = {Down: false, UpAfterDown: false};
/* /*
This is the format of the json object sent by bootstrap-table This is the format of the json object sent by bootstrap-table
@ -593,6 +601,7 @@ function fetchImage(streamImage) {
} }
function handleClick(event) { function handleClick(event) {
if (!(event.ctrlKey && (event.shift || event.shiftKey))) {
// target should be the img tag // target should be the img tag
const target = $j(event.target); const target = $j(event.target);
const width = target.width(); const width = target.width();
@ -605,16 +614,93 @@ function handleClick(event) {
const y = parseInt((event.pageY - pos.top) * scaleY); const y = parseInt((event.pageY - pos.top) * scaleY);
if (showMode == 'events' || !imageControlMode) { if (showMode == 'events' || !imageControlMode) {
if ( event.shift || event.shiftKey ) { if (event.shift || event.shiftKey) {
streamCmdPan(x, y); streamCmdPan(x, y);
updatePrevCoordinatFrame(x, y); //Fixing current coordinates after scaling or shifting
} else if (event.ctrlKey) { } else if (event.ctrlKey) {
streamCmdZoomOut(); streamCmdZoomOut();
} else { } else {
streamCmdZoomIn(x, y); streamCmdZoomIn(x, y);
updatePrevCoordinatFrame(x, y); //Fixing current coordinates after scaling or shifting
} }
} else { } else {
controlCmdImage(x, y); controlCmdImage(x, y);
} }
}
}
function shiftImgFrame() { //We calculate the coordinates of the image displacement and shift the image
let newPosX = parseInt(PrevCoordinatFrame.x - coordinateMouse.shiftMouse_x);
let newPosY = parseInt(PrevCoordinatFrame.y - coordinateMouse.shiftMouse_y);
if (newPosX < 0) newPosX = 0;
if (newPosX > monitorWidth) newPosX = monitorWidth;
if (newPosY < 0) newPosY = 0;
if (newPosY > monitorHeight) newPosY = monitorHeight;
streamCmdPan(newPosX, newPosY);
updatePrevCoordinatFrame(newPosX, newPosY);
coordinateMouse.shiftMouseForTrigger_x = coordinateMouse.shiftMouseForTrigger_y = 0;
}
function updateCoordinateMouse(x, y) { //We fix the coordinates when pressing the left mouse button
coordinateMouse.start_x = x;
coordinateMouse.start_y = y;
}
function updatePrevCoordinatFrame(x, y) { //Update the Frame's current coordinates
PrevCoordinatFrame.x = x;
PrevCoordinatFrame.y = y;
}
function getCoordinateMouse(event) { //We get the current cursor coordinates taking into account the scale relative to the frame size.
const target = $j(event.target);
const scaleX = parseFloat(monitorWidth / target.width());
const scaleY = parseFloat(monitorHeight / target.height());
const pos = target.offset();
return {x: parseInt((event.pageX - pos.left) * scaleX), y: parseInt((event.pageY - pos.top) * scaleY)}; //The point of the mouse click relative to the dimensions of the real frame.
}
function handleMove(event) {
if (event.ctrlKey && event.shiftKey) {
document.ondragstart = function() {
return false;
}; //Allow drag and drop
} else {
document.ondragstart = function() {}; //Prevent drag and drop
return false;
}
if (leftBtnStatus.Down) { //The left button was previously pressed and is now being held. Processing movement with a pressed button.
var {x, y} = getCoordinateMouse(event);
const k = Math.log(2.72) / Math.log(parseFloat($j('#zoomValue'+monitorId).html())) - 0.3; //Necessary for correctly shifting the image in accordance with the scaling proportions
coordinateMouse.shiftMouse_x = parseInt((x - coordinateMouse.start_x) * k);
coordinateMouse.shiftMouse_y = parseInt((y - coordinateMouse.start_y) * k);
coordinateMouse.shiftMouseForTrigger_x = Math.abs(parseInt(x - coordinateMouse.start_x));
coordinateMouse.shiftMouseForTrigger_y = Math.abs(parseInt(y - coordinateMouse.start_y));
}
if (event.buttons == 1 && leftBtnStatus.Down != true) { //Start of pressing left button
const {x, y} = getCoordinateMouse(event);
updateCoordinateMouse(x, y);
leftBtnStatus.Down = true;
} else if (event.buttons == 0 && leftBtnStatus.Down == true) { //Up left button after pressed
leftBtnStatus.Down = false;
leftBtnStatus.UpAfterDown = true;
}
if ((leftBtnStatus.UpAfterDown) || //The left button was raised or the cursor was moved more than 30 pixels relative to the actual size of the image
((coordinateMouse.shiftMouseForTrigger_x > 30) && leftBtnStatus.Down) ||
((coordinateMouse.shiftMouseForTrigger_y > 30) && leftBtnStatus.Down)) {
//We perform frame shift
shiftImgFrame();
updateCoordinateMouse(x, y);
leftBtnStatus.UpAfterDown = false;
}
} }
function zoomOutClick(event) { function zoomOutClick(event) {
@ -800,6 +886,7 @@ function initPage() {
monitorStream.setup_onclick(fetchImage); monitorStream.setup_onclick(fetchImage);
} else { } else {
monitorStream.setup_onclick(handleClick); monitorStream.setup_onclick(handleClick);
monitorStream.setup_onmove(handleMove);
} }
monitorStream.setup_onpause(onPause); monitorStream.setup_onpause(onPause);
monitorStream.setup_onplay(onPlay); monitorStream.setup_onplay(onPlay);