diff --git a/openlp/core/display/html/display.js b/openlp/core/display/html/display.js
index 914439fd5..4d7aff0f5 100644
--- a/openlp/core/display/html/display.js
+++ b/openlp/core/display/html/display.js
@@ -55,11 +55,10 @@ var AudioState = {
/**
* Transition state enumeration
*/
-
var TransitionState = {
- EntranceTransition: "entranceTransition",
- NoTransition: "noTransition",
- ExitTransition: "exitTransition"
+ EntranceTransition: "entranceTransition",
+ NoTransition: "noTransition",
+ ExitTransition: "exitTransition"
};
/**
@@ -69,6 +68,7 @@ var AnimationState = {
NoAnimation: "noAnimation",
ScrollingAnimation: "scrollingAnimation"
};
+
/**
* Alert location enumeration
*/
@@ -78,10 +78,10 @@ var AlertLocation = {
Bottom: 2
};
-/**
- *
- * @param {Location} selector
- */
+var AlertState = {
+ Displaying: "displaying",
+ NotDisplaying: "notDisplaying"
+}
/**
* Return an array of elements based on the selector query
@@ -283,7 +283,9 @@ AudioPlayer.prototype.stop = function () {
* The Display object is what we use from OpenLP
*/
var Display = {
+ _alerts: [],
_slides: {},
+ _alertState: AlertState.NotDisplaying,
_transitionState: TransitionState.NoTransition,
_animationState: AnimationState.NoAnimation,
_revealConfig: {
@@ -404,6 +406,23 @@ var Display = {
Display._slides['0'] = 0;
Display.reinit();
},
+ /**
+ * Display the next alert in the queue
+ */
+ getNextAlert: function () {
+
+ console.debug("Checking queue for alerts");
+ if (Display._alerts.length > 0) {
+ var alertObject = JSON.parse(this._alerts.shift());
+ setTimeout(function() {
+ Display.alert(alertObject.text, alertObject.settings);
+ },1000);
+
+ }
+ else {
+ console.debug("No alerts found");
+ }
+ },
/**
* Display an alert
* @param {string} text - The alert text
@@ -415,18 +434,26 @@ var Display = {
if (text == "") {
return null;
}
-
+ else {
+ if (this._alertState === AlertState.Displaying) {
+ var alertObject = {};
+ alertObject.text = text;
+ alertObject.settings = alert_settings;
+ this._alerts.push(JSON.stringify(alertObject));
+ return null;
+ }
+ }
var settings = JSON.parse(alert_settings);
-
var alertBackground = $("#alert-background")[0];
var alertText = $("#alert")[0];
-
- alertText.innerHTML = text;
+ alertText.innerHTML = text;
/* Start the entrance transition */
- Display._transitionState = Display.doEntranceTransition(settings);
- // TODO: Add functinoality for no scroll and queue if not all alerts have been displayed
- alertBackground.addEventListener('transitionend', function (e) {
+ this._alertState = AlertState.Displaying;
+ this._transitionState = Display.doEntranceTransition(settings);
+
+ // TODO: Add functionality for no scroll and queue if not all alerts have been displayed
+ alertBackground.addEventListener('transitionend', function (e) {
e.stopPropagation();
if (Display._transitionState === TransitionState.EntranceTransition) {
alertText.style.visibility = "visible";
@@ -436,9 +463,11 @@ var Display = {
}
else if (Display._transitionState === TransitionState.ExitTransition) {
Display._transitionState = TransitionState.NoTransition;
+ Display._alertState = AlertState.NotDisplaying;
alertText.style.visibility = "hidden";
alertBackground.classList = "";
alertBackground.classList.add("normal");
+ Display.getNextAlert();
}
});
@@ -447,16 +476,10 @@ var Display = {
if (Display._animationState === AnimationState.ScrollingAnimation) {
alertText.classList.remove("horizontal-scroll-animation");
alertText.style.visibility = "hidden";
- Display._animationState = AnimationState.NoAnimation;
- Display._transitionState = Display.doExitTransition();
+ Display._animationState = AnimationState.NoAnimation;
+ Display.doExitTransition();
}
});
-
- /*
- * The implementation should show an alert.
- * It should be able to handle receiving a new alert before a previous one is "finished", basically queueing it.
- */
- return settings.location;
},
/**
@@ -471,7 +494,6 @@ var Display = {
alertBackground.classList.add("top");
break;
case AlertLocation.Middle:
- // alertBackground.style.top = ((window.innerHeight - alertBackground.clientHeight) / 2) + 'px';
alertBackground.classList.add("middle");
break;
case AlertLocation.Bottom:
@@ -486,7 +508,7 @@ var Display = {
// Wait for styles to be set first before starting transitions
setTimeout( function() {
alertBackground.style.height = "25%";
- alertBackground.style.transition = "2s linear";
+ alertBackground.style.transition = "1s linear";
alertBackground.style.visibility = "visible";
}, 50);
return TransitionState.EntranceTransition;
@@ -499,8 +521,8 @@ var Display = {
doExitTransition: function () {
var alertBackground = $("#alert-background")[0];
alertBackground.style.height = "0%";
- alertBackground.style.transition = "2s linear";
- return TransitionState.ExitTransition;
+ alertBackground.style.transition = "1s linear";
+ this._transitionState = TransitionState.ExitTransition;
},
/**
* Add a slides. If the slide exists but the HTML is different, update the slide.
diff --git a/openlp/core/display/window.py b/openlp/core/display/window.py
index e1b67f34e..754c78f07 100644
--- a/openlp/core/display/window.py
+++ b/openlp/core/display/window.py
@@ -402,4 +402,4 @@ class DisplayWindow(QtWidgets.QWidget):
Set an alert
"""
self.run_javascript('Display.alert("{text}", \'{settings}\');'.format(text=text, settings=settings))
- # TODO: Add option scrolling option
\ No newline at end of file
+ # TODO: Add option to prevent scrolling
diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py
index c996d8996..4a673f865 100644
--- a/openlp/plugins/alerts/lib/alertsmanager.py
+++ b/openlp/plugins/alerts/lib/alertsmanager.py
@@ -101,7 +101,7 @@ class AlertsManager(QtCore.QObject, RegistryBase, LogMixin, RegistryProperties):
}
self.live_controller.displays[0].alert(text, json.dumps(alert_settings))
# Check to see if we have a timer running.
- #if self.timer_id == 0:
+ # if self.timer_id == 0:
# self.timer_id = self.startTimer(int(alert_tab.timeout) * 1000)
def timerEvent(self, event):
@@ -125,4 +125,4 @@ class AlertsManager(QtCore.QObject, RegistryBase, LogMixin, RegistryProperties):
:return: rgb color string
:rtype: string
"""
- return "rgb(" + rgb_values.red() + ", " + rgb_values.green() + ", " + rgb_values.blue() + ")"
\ No newline at end of file
+ return "rgb(" + str(rgb_values.red()) + ", " + str(rgb_values.green()) + ", " + str(rgb_values.blue()) + ")"
diff --git a/tests/js/test_display.js b/tests/js/test_display.js
index a8599e16b..d6bef21e5 100644
--- a/tests/js/test_display.js
+++ b/tests/js/test_display.js
@@ -155,6 +155,7 @@ describe("The Display object", function () {
describe("Display.alert", function () {
var alertBackground, alert, settings;
+ var alerts = [];
beforeEach(function () {
document.body.innerHTML = "";
@@ -182,6 +183,10 @@ describe("Display.alert", function () {
it("should set the correct alert position", function () {
expect(Display.alert("Alert Location Test", settings)).toEqual(1);
});
+
+ it("should add the alert to the alert queue", function() {
+ //Uses the alerts array
+ });
});
describe("The doEntranceTransition", function () {
@@ -222,7 +227,7 @@ describe("The doEntranceTransition", function () {
expect(alertBackground.style.backgroundColor).toEqual(settings.background_color);
expect(alertBackground.classList.contains("bottom")).toBe(true);
expect(alertBackground.style.height).toEqual("25%");
- expect(alertBackground.style.transition).toEqual("2s linear");
+ expect(alertBackground.style.transition).toEqual("1s linear");
expect(alertBackground.style.visibility).toEqual("visible");
done();
}, 60);
@@ -267,7 +272,7 @@ describe("The doExitTransition", function () {
Display.doExitTransition();
expect(alertBackground.style.height).toEqual('0%');
- expect(alertBackground.style.transition).toEqual("2s linear");
+ expect(alertBackground.style.transition).toEqual("1s linear");
});
});