From 4ac79e422129e654e48909017a50b066b2f587d1 Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 24 Aug 2018 01:39:40 +0200 Subject: Handle click and touch events --- pointless/viewer/stage/stage.js | 76 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 pointless/viewer/stage/stage.js (limited to 'pointless/viewer/stage/stage.js') diff --git a/pointless/viewer/stage/stage.js b/pointless/viewer/stage/stage.js new file mode 100644 index 0000000..e9a2d38 --- /dev/null +++ b/pointless/viewer/stage/stage.js @@ -0,0 +1,76 @@ +/* + * Pointless Viewer, a web-based Beamer presentation viewer + * Copyright (C) 2018 Pacien TRAN-GIRARD + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +"use strict"; + +class Stage { + constructor(onReady, onNext, onPrevious) { + this.audienceScreen = null; + this.presenterScreen = null; + + this.projector = window.open(window.location.href, "_blank", "toolbar=0,location=0,menubar=0"); + if (this.projector == null) + alert("Please allow pop-ups, then refresh this page."); + + const self = this; + this.projector.addEventListener("load", function() { + self.audienceScreen = new Screen(self.projector, false, false); + self.presenterScreen = new Screen(window, true, true); + self._watchDetach(); + onReady(); + }); + + this.eventHandlers = [ + new KeyboardEventHandler(onNext, onPrevious), + new MouseClickEventHandler(onNext, onPrevious), + new TouchSwipeEventHandler(onNext, onPrevious) + ]; + + this._registerEventHandler(window); + this._registerEventHandler(this.projector); + } + + setPage(page) { + this.audienceScreen.setPage(page); + this.presenterScreen.setPage(page); + } + + _registerEventHandler(window) { + if (window == null) return; + + this.eventHandlers.forEach(function(eventHandler) { + eventHandler.register(window); + }); + } + + _watchDetach() { + const self = this; + window.addEventListener("beforeunload", function() { + self._setMessage(self.projector, "Controller detached"); + }); + + this.projector.addEventListener("beforeunload", function() { + self._setMessage(window, "Viewer detached"); + }); + } + + _setMessage(window, message) { + const messageBar = window.document.getElementById("message"); + messageBar.textContent = message; + } +} -- cgit v1.2.3