diff --git a/src/views/CameraConfiguration.vue b/src/views/CameraConfiguration.vue index 0b77be1..bd395db 100644 --- a/src/views/CameraConfiguration.vue +++ b/src/views/CameraConfiguration.vue @@ -2,6 +2,34 @@
+ + + + + mdi-fullscreen + Go fullscreen + + +

+ Please run calibration in fullscreen so the app can measure screen borders correctly. +

+

+ {{ fullscreenError }} +

+
+ + + mdi-fullscreen + Enter Fullscreen + + +
+
+ @@ -174,7 +202,7 @@ color="#FF425A" dark :disabled="!isCameraOn" - @click="goToCalibRecord()" + @click="startCalibration" > mdi-play Start Calibration @@ -213,6 +241,8 @@ export default { selectedMediaDevice: null, setupStep: 1, showCameraModal: false, + showFullscreenModal: false, + fullscreenError: "", }; }, computed: { @@ -253,6 +283,44 @@ export default { } }, methods: { + isFullscreen() { + return !!( + document.fullscreenElement || + document.webkitFullscreenElement || + document.mozFullScreenElement || + document.msFullscreenElement + ); + }, + requestFullscreen(element) { + const el = element || document.documentElement; + if (el.requestFullscreen) return el.requestFullscreen(); + if (el.mozRequestFullScreen) return el.mozRequestFullScreen(); + if (el.webkitRequestFullscreen) return el.webkitRequestFullscreen(); + if (el.msRequestFullscreen) return el.msRequestFullscreen(); + return Promise.reject(new Error("Fullscreen API not supported")); + }, + async tryEnterFullscreen() { + this.fullscreenError = ""; + try { + if (!this.isFullscreen()) { + await this.requestFullscreen(document.documentElement); + } + } catch (e) { + this.fullscreenError = + "Your browser blocked fullscreen. Please allow fullscreen and try again."; + } + if (this.isFullscreen()) { + this.showFullscreenModal = false; + } + }, + async startCalibration() { + await this.tryEnterFullscreen(); + if (!this.isFullscreen()) { + this.showFullscreenModal = true; + return; + } + this.goToCalibRecord(); + }, startCameraSetup() { this.setupStep = 2; this.setupCamera(); @@ -433,45 +501,6 @@ export default { ); ctx.stroke(); }, - fullScreen() { - var element = document.documentElement; - if (element.requestFullscreen) { - if (!document.fullscreenElement) { - element.requestFullscreen().catch((err) => { - console.error("Erro ao entrar em tela cheia:", err); - }); - } else { - document.exitFullscreen(); - } - } else if (element.mozRequestFullScreen) { - // Para o Firefox - if (!document.mozFullScreenElement) { - element.mozRequestFullScreen().catch((err) => { - console.error("Erro ao entrar em tela cheia:", err); - }); - } else { - document.mozCancelFullScreen(); - } - } else if (element.webkitRequestFullscreen) { - // Para o Chrome, Safari e Opera - if (!document.webkitFullscreenElement) { - element.webkitRequestFullscreen().catch((err) => { - console.error("Erro ao entrar em tela cheia:", err); - }); - } else { - document.webkitExitFullscreen(); - } - } else if (element.msRequestFullscreen) { - // Para o Internet Explorer e Microsoft Edge - if (!document.msFullscreenElement) { - element.msRequestFullscreen().catch((err) => { - console.error("Erro ao entrar em tela cheia:", err); - }); - } else { - document.msExitFullscreen(); - } - } - }, goToCalibRecord() { this.webcamStream.getTracks().forEach((track) => { track.stop(); diff --git a/src/views/DoubleCalibrationRecord.vue b/src/views/DoubleCalibrationRecord.vue index 0885bba..c665dcb 100644 --- a/src/views/DoubleCalibrationRecord.vue +++ b/src/views/DoubleCalibrationRecord.vue @@ -1,5 +1,42 @@