Skip to content

Commit

Permalink
Implement snackbar for displaying messages.
Browse files Browse the repository at this point in the history
  • Loading branch information
alan-wu committed May 15, 2019
1 parent ceeac3e commit f30d1d2
Show file tree
Hide file tree
Showing 8 changed files with 171 additions and 30 deletions.
17 changes: 14 additions & 3 deletions src/modules/ScaffoldViewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ var ScaffoldViewer = function(typeAtStartUp) {
//Data include meshtype, options and landmark
var importData = function(data) {
if (data && data.meshtype && data.options) {
_this.alertFunction("Importing data");
currentMeshType = data.meshtype;
currentOptions = data.options;
currentLandmarks = data.landmarks;
Expand Down Expand Up @@ -280,7 +281,7 @@ var ScaffoldViewer = function(typeAtStartUp) {

var parseWorkspaceResponse = function(options) {
if (options.status === 'error')
modal.alert(options.message);
_this.alertFunction(options.message);
else if (options.status === 'success') {
if (options.VerifyURL)
verificationCodePrompt(options.VerifyURL);
Expand All @@ -294,8 +295,12 @@ var ScaffoldViewer = function(typeAtStartUp) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var options = JSON.parse(xmlhttp.responseText);
parseWorkspaceResponse(options);
if (xmlhttp.status == 200) {
var options = JSON.parse(xmlhttp.responseText);
parseWorkspaceResponse(options);
} else {
_this.alertFunction("Error reading workspace");
}
}
}
var requestString = "./getWorkspaceResponse" + "?url=" + url + "&filename="+filename;
Expand Down Expand Up @@ -565,6 +570,12 @@ var ScaffoldViewer = function(typeAtStartUp) {
csg.addDatGui(parent);
}

this.setAlertFunction = function(alertFunction) {
this.alertFunction = alertFunction;
if (csg)
csg.setAlertFunction(alertFunction);
}

/**
* Initialise the {@link PJP.BodyViewer}, it will create a detached renderer until
* a display area is passed in as an argument on intialiseRenderer.
Expand Down
61 changes: 38 additions & 23 deletions src/modules/bodyRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,13 @@ var BodyViewer = function(ModelsLoaderIn) {
"Endocrine", "Female Reproductive", "Male Reproductive", "Special sense organs"];
var systemMeta = undefined;
var _this = this;
var alertFunction = undefined;
_this.typeName = "Body Viewer";

this.setAlertFunction = function(alertFunctionIn) {
alertFunction = alertFunctionIn;
}

/**
* This callback is triggered when a body part is clicked.
* @callback
Expand All @@ -43,6 +48,8 @@ var BodyViewer = function(ModelsLoaderIn) {
if (intersects[i] !== undefined && (intersects[ i ].object.name !== undefined)) {
if (!intersects[ i ].object.name.includes("Body")) {
_this.setSelectedByObjects([intersects[ i ].object], true);
if (alertFunction)
alertFunction(intersects[ i ].object.name + " selected.");
return;
} else {
bodyClicked = true;
Expand All @@ -65,7 +72,7 @@ var BodyViewer = function(ModelsLoaderIn) {
_this.displayArea.style.cursor = "pointer";
_this.toolTip.setText(intersects[ i ].object.name);
_this.toolTip.show(window_x, window_y);
_this.setHighlightedByObjects([intersects[ i ].object], true);
_this.setHighlightedByObjects([intersects[ i ].object], true);
return;
} else {
bodyHovered = true;
Expand Down Expand Up @@ -102,7 +109,7 @@ var BodyViewer = function(ModelsLoaderIn) {
* @callback
*/
this.changeBodyPartsVisibility = function(name, systemName, value) {
var speciesMeta = systemMeta[currentSpecies];
var speciesMeta = systemMeta[currentSpecies];
if (speciesMeta[systemName].hasOwnProperty(name) && speciesMeta[systemName][name].geometry) {
speciesMeta[systemName][name].geometry.setVisibility(value);
}
Expand All @@ -118,10 +125,10 @@ var BodyViewer = function(ModelsLoaderIn) {
item["loaded"] = ITEM_LOADED.TRUE;
item.geometry = geometry;
if (startup) {
for (var i = 0; i < systemPartAddedCallbacks.length;i++) {
systemPartAddedCallbacks[i](systemName, partName,
(item["loaded"] == ITEM_LOADED.TRUE));
}
for (var i = 0; i < systemPartAddedCallbacks.length;i++) {
systemPartAddedCallbacks[i](systemName, partName,
(item["loaded"] == ITEM_LOADED.TRUE));
}
}
if (scaling == true) {
geometry.morph.scale.x = 1.00;
Expand All @@ -136,6 +143,12 @@ var BodyViewer = function(ModelsLoaderIn) {
geometry.setAlpha(0.5);
geometry.morph.material.side = THREE.FrontSide;
}
if (alertFunction) {
if (partName)
alertFunction(partName + " loaded.");
else
alertFunction("Resource loaded.");
}
var annotation = new (require('../utilities/annotation').annotation)();
annotation.data = {species:currentSpecies, system:systemName, part:partName};
geometry.userData = [annotation];
Expand All @@ -162,20 +175,20 @@ var BodyViewer = function(ModelsLoaderIn) {
}

this.forEachPartInBody = function(callback) {
var speciesMeta = systemMeta[currentSpecies];
for (var systemName in speciesMeta) {
var partMap = speciesMeta[systemName];
for (var partName in partMap) {
if (partMap.hasOwnProperty(partName)) {
var item = partMap[partName];
var visibility = false;
if (item && (item["loaded"] === ITEM_LOADED.TRUE) && item.geometry) {
visibility = item.geometry.morph.visible;
}
callback(systemName, partName, visibility);
}
}
}
var speciesMeta = systemMeta[currentSpecies];
for (var systemName in speciesMeta) {
var partMap = speciesMeta[systemName];
for (var partName in partMap) {
if (partMap.hasOwnProperty(partName)) {
var item = partMap[partName];
var visibility = false;
if (item && (item["loaded"] === ITEM_LOADED.TRUE) && item.geometry) {
visibility = item.geometry.morph.visible;
}
callback(systemName, partName, visibility);
}
}
}
}

/**
Expand Down Expand Up @@ -205,6 +218,8 @@ var BodyViewer = function(ModelsLoaderIn) {
var downloadPath = item["BodyURL"];
var scaling = false;
item["loaded"] = ITEM_LOADED.DOWNLOADING;
if (alertFunction)
alertFunction("Downloading data.");
if (item["FileFormat"] == "JSON") {
if (systemName == "Musculo-skeletal" || systemName == "Skin (integument)")
scaling = true;
Expand All @@ -226,9 +241,9 @@ var BodyViewer = function(ModelsLoaderIn) {
if (item["loadAtStartup"] == true) {
readModel(systemName, partName, true);
} else {
for (var i = 0; i < systemPartAddedCallbacks.length;i++) {
systemPartAddedCallbacks[i](systemName, partName, false);
}
for (var i = 0; i < systemPartAddedCallbacks.length;i++) {
systemPartAddedCallbacks[i](systemName, partName, false);
}
}
}
}
Expand Down
55 changes: 55 additions & 0 deletions src/styles/Snackbar.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/* The snackbar - position it at the bottom and in the middle of the screen */
.snackbar {
min-width: 250px; /* Set a default minimum width */
margin-left: -125px; /* Divide value of min-width by 2 */
background-color: #333; /* Black background color */
color: #fff; /* White text color */
text-align: center; /* Centered text */
border-radius: 2px; /* Rounded borders */
padding: 16px; /* Padding */
position: absolute; /* Sit on top of the screen */
z-index: 100; /* Add a z-index if needed */
left: 50%; /* Center the snackbar */
bottom: 30px; /* 30px from the bottom */
opacity: 0;
visibility: hidden; /* Show the snackbar */
}

/* Show the snackbar when clicking on a button (class added with JavaScript) */
.snackbar.show {
opacity: 1;
visibility: visible; /* Show the snackbar */
/* Add animation: Take 0.5 seconds to fade in and out the snackbar.
However, delay the fade out process for 2.5 seconds */
-webkit-animation: fadein 0.5s;
animation: fadein 0.5s;
}

/* Show the snackbar when clicking on a button (class added with JavaScript) */
.snackbar.fadeHide {
/* Add animation: Take 0.5 seconds to fade in and out the snackbar.
However, delay the fade out process for 2.5 seconds */
-webkit-animation: fadeout 0.5s;
animation: fadeout 0.5s;
}

/* Animations to fade the snackbar in and out */
@-webkit-keyframes fadein {
from {bottom: 0; opacity: 0;}
to {bottom: 30px; opacity: 1;}
}

@keyframes fadein {
from {bottom: 0; opacity: 0;}
to {bottom: 30px; opacity: 1;}
}

@-webkit-keyframes fadeout {
from {bottom: 30px; opacity: 1;visibility:visible;}
to {bottom: 0; opacity: 0;visibility:hidden;}
}

@keyframes fadeout {
from {bottom: 30px; opacity: 1;;visibility: visible;}
to {bottom: 0; opacity: 0;visibility: hidden;}
}
7 changes: 7 additions & 0 deletions src/ui/BaseDialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ var BaseDialog = function() {
this.beforeCloseCallbacks = [];
this.onCloseCallbacks = [];
this.resizeStopCallbacks = [];
this.snackbar = undefined;
this.title = "Default";
}

Expand Down Expand Up @@ -124,6 +125,12 @@ BaseDialog.prototype.getHeight = function() {
return this.container.dialog( "option", "height" );
};

BaseDialog.prototype.getSnackbar = function() {
if (this.snackbar === undefined)
this.snackbar = new (require("./Snackbar").Snackbar)(this.container[0]);
return this.snackbar;
}

BaseDialog.prototype.setHeight = function(heightIn) {
if (typeof(heightIn) == "string") {
if (/^\d+(\.\d+)?%$/.test(heightIn)) {
Expand Down
2 changes: 2 additions & 0 deletions src/ui/BodyViewerDialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ var BodyViewerDialog = function(bodyViewerIn, parentIn) {
var displayArea = _myInstance.container.find("#bodyDisplayArea")[0];
_myInstance.module.initialiseRenderer(displayArea);
_myInstance.module.addChangedCallback(bodyViewerChangedCallback());
var snackbar = _myInstance.getSnackbar();
_myInstance.module.setAlertFunction(snackbar.showMessage);
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/ui/ScaffoldDialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,14 @@ var ScaffoldDialog = function(scaffoldViewerIn, parentIn) {
if (_myInstance.module) {
_myInstance.create(require("../snippets/ScaffoldDialog.html"));
modal = new (require('./Modal').PortalModal)(
_myInstance.container.find(".portalmodal")[0]);
_myInstance.container.find(".portalmodal")[0]);
var snackbar = _myInstance.getSnackbar();
var name = _myInstance.module.getName();
_myInstance.setTitle(name);
var displayArea = _myInstance.container.find("#scaffoldDisplayArea")[0];
_myInstance.module.initialiseRenderer(displayArea);
initialiseScaffoldControlUI();
_myInstance.module.alertFunction = modal.alert;
_myInstance.module.setAlertFunction(snackbar.showMessage);
_myInstance.module.promptFunction = modal.prompt;
_myInstance.module.confirmFunction = modal.confirm;
var meshTypes = _myInstance.module.getAvailableMeshTypes();
Expand Down
40 changes: 40 additions & 0 deletions src/ui/Snackbar.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
require("../styles/Snackbar.css");

exports.Snackbar = function(containerIn) {
var element = undefined;
var container = containerIn;
var parent = undefined;
var template = '<div class="snackbar fadeHide"></div>';
var _this = this;
var myTimeout = undefined;

var close = function() {
element.className = element.className.replace(" show", " fadeHide");
}

/**
* Change the tooltip text.
* @param {String} text - Text to update the tooltip to.
*/
this.showMessage = function(text) {
if (element.className.indexOf("show") >= 0) {
if (myTimeout) {
clearTimeout(myTimeout);
myTimeout = undefined;
}
} else {
element.className = element.className.replace(" fadeHide", " show");
}
element.innerHTML = text;
myTimeout = setTimeout(close, 4000);
}

var setupSnackbar = function() {
parent = $(template);
element = parent[0];
container.appendChild(parent[0]);
}

setupSnackbar();
}

14 changes: 12 additions & 2 deletions src/utilities/csg.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ exports.csg = function(sceneIn, zincRendererIn) {
var reverseController = undefined;
var plane = undefined;
var planeHelper = undefined;
var alertFunction = undefined;
var guiControls = new function() {
this.distance = 1.0;
this.continuous = false;
Expand Down Expand Up @@ -190,6 +191,8 @@ exports.csg = function(sceneIn, zincRendererIn) {
if (mergedGlyphGeometry === undefined && currentGlyphs) {
mergedGlyphGeometry = csgScene.addZincGeometry(currentGlyphs, 45121, 0xffffff, 1.0);
}
if (alertFunction)
alertFunction("Cutting the surfaces. This may take a few seconds.");
zincCSG.intersect(boxGeometry).then((csg1) => {
var intersect = undefined;
if (glyphsetCSG) {
Expand Down Expand Up @@ -218,14 +221,16 @@ exports.csg = function(sceneIn, zincRendererIn) {
resultCSG.terminateWorker();
}).catch(
(reason) => {
console.log(reason);
if (alertFunction)
alertFunction(reason);
}
);
}
csg1.terminateWorker();
}).catch(
(reason) => {
console.log(reason);
if (alertFunction)
alertFunction(reason);
}
);
}
Expand Down Expand Up @@ -418,6 +423,11 @@ exports.csg = function(sceneIn, zincRendererIn) {
this.updatePlane = function() {
updatePlane();
}

this.setAlertFunction = function(alertFunctionIn) {
alertFunction = alertFunctionIn;
}


this.addDatGui = function(parent) {
datGui = new dat.GUI({autoPlace: false});
Expand Down

0 comments on commit f30d1d2

Please sign in to comment.