Skip to content
This repository has been archived by the owner on Feb 9, 2022. It is now read-only.

Commit

Permalink
Setup settings template framework.
Browse files Browse the repository at this point in the history
  • Loading branch information
ggirelli committed Jun 10, 2019
1 parent 5b04225 commit 2cac598
Show file tree
Hide file tree
Showing 16 changed files with 271 additions and 39,439 deletions.
6 changes: 5 additions & 1 deletion spectrascope-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,13 @@
}
},
"dependencies": {
"bootbox": "^5.1.3",
"d3": "^5.9.2",
"electron-prompt": "^1.3.1",
"electron-settings": "^3.2.0",
"electron-squirrel-startup": "^1.0.0",
"jquery": "^3.4.1"
"jquery": "^3.4.1",
"toastr": "^2.1.4"
},
"devDependencies": {
"@electron-forge/cli": "^6.0.0-beta.39",
Expand Down
1 change: 1 addition & 0 deletions spectrascope-app/src/css/vendor/toastr.v2.1.3.min.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 21 additions & 9 deletions spectrascope-app/src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@
<link rel="stylesheet" href="./css/vendor/bootstrap.v4.3.1.min.css" rel="stylesheet" />
<script src="./js/vendor/popper.v1.14.7.min.js"></script>
<script src="./js/vendor/bootstrap.v4.3.1.min.js"></script>
<script defer src="./js/vendor/fontawesome.v5.8.2.js"></script>
<script src="./js/vendor/bootbox.v5.1.3.min.js"></script>
<script src="./js/vendor/fontawesome.v5.8.2.js"></script>
<link href="./css/vendor/google-fonts.css" rel="stylesheet" />
<link href="./css/main.css" rel="stylesheet">
<script src="./js/get_color.js"></script>
<script src="./js/settings.fn.js"></script>
<script src="./js/settings.js"></script>
<link rel="stylesheet" href="./css/vendor/toastr.v2.1.3.min.css" />
<script src="./js/home.js"></script>
<script src="./js/main.js"></script>
</head>
Expand All @@ -19,7 +23,7 @@
<h1 class="text-center"><i class="fas fa-ghost"></i> SpectraScope <i class="fas fa-microscope" onClick="javascript:wave=prompt('Insert wavelength (in nm) or \'reset\' to reset.');color = wave == 'reset' ? 'white' : get_color(wave); $('body').css('background-color', color);"></i></h1>

<ul class="nav justify-content-end">
<li class="nav-item"><a class="nav-link disabled" href=""><i class="fas fa-home"></i> Home</a></li>
<li class="nav-item"><a class="nav-link disabled"><i class="fas fa-home"></i> Home</a></li>
<!--<li class="nav-item"><a class="nav-link" href="./index-model.html"><i class="fas fa-wave-square"></i> Model</a></li>-->
<li class="nav-item"><a class="nav-link" href="#" data-toggle="modal" data-target="#settingsModal" data-backdrop="static"><i class="fas fa-cog"></i> Settings</a></li>
</ul>
Expand Down Expand Up @@ -205,18 +209,30 @@ <h5 class="modal-title" id="settingsModalTitle"><i class="fas fa-cog"></i> Setti

<ul class="nav nav-tabs mb-3" id="myTab" role="tablist">
<li class="nav-item"><a class="nav-link active" id="settings-general-tab" data-toggle="tab" href="#settings-general" role="tab" aria-controls="settings-general" aria-selected="true"><i class="fas fa-user"></i> General</a></li>
<li class="nav-item"><a class="nav-link" id="settings-scope-tab" data-toggle="tab" href="#settings-scope" role="tab" aria-controls="settings-scope" aria-selected="false"><i class="fas fa-microscope"></i> Microscopes</a></li>
<li class="nav-item"><a class="nav-link" id="settings-sources-tab" data-toggle="tab" href="#settings-sources" role="tab" aria-controls="settings-sources" aria-selected="true"><i class="far fa-lightbulb"></i> Sources</a></li>
<li class="nav-item"><a class="nav-link" id="settings-exf-tab" data-toggle="tab" href="#settings-exf" role="tab" aria-controls="settings-exf" aria-selected="false"><i class="fas fa-sign-in-alt"></i> Excitation Filters</a></li>
<li class="nav-item"><a class="nav-link" id="settings-dm-tab" data-toggle="tab" href="#settings-dm" role="tab" aria-controls="settings-dm" aria-selected="false"><i class="fas fa-divide"></i> Dicroic Mirrors</a></li>
<li class="nav-item"><a class="nav-link" id="settings-emf-tab" data-toggle="tab" href="#settings-emf" role="tab" aria-controls="settings-emf" aria-selected="false"><i class="fas fa-sign-out-alt"></i>Emission Filters</a></li>
<li class="nav-item"><a class="nav-link" id="settings-fluo-tab" data-toggle="tab" href="#settings-fluo" role="tab" aria-controls="settings-fluo" aria-selected="false"><i class="fas fa-tint"></i> Fluorophores</a></li>
<li class="nav-item"><a class="nav-link" id="settings-scope-tab" data-toggle="tab" href="#settings-scope" role="tab" aria-controls="settings-scope" aria-selected="false"><i class="fas fa-microscope"></i> Microscopes</a></li>
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="settings-general" role="tabpanel" aria-labelledby="settings-general-tab">
General. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam corrupti aliquam reiciendis corporis fugiat animi repellat, quas obcaecati exercitationem placeat quidem, tenetur eligendi quasi expedita debitis molestias eum dicta, doloribus.
<h5>
Settings template
<button id="settings-reset-template-btn" class="btn btn-warning btn-sm float-right mr-1 mb-1" data-toggle="tooltip" data-placement="bottom" title="Reset all settings"><i class="fas fa-history"></i></button>
<button id="settings-ul-template-btn" class="btn btn-primary btn-sm float-right mr-1 mb-1" data-toggle="tooltip" data-placement="bottom" title="Upload a template"><i class="fas fa-upload"></i></button>
<button id="settings-dl-template-btn" class="btn btn-primary btn-sm float-right mr-1 mb-1" data-toggle="tooltip" data-placement="bottom" title="Download current template"><i class="fas fa-download"></i></button>
<button id="settings-cp-template-btn" class="btn btn-info btn-sm float-right mr-1 mb-1" data-toggle="tooltip" data-placement="bottom" title="Copy current template"><i class="far fa-copy"></i></button>
<button id="settings-rm-template-btn" class="btn btn-danger btn-sm float-right mr-1 mb-1" data-toggle="tooltip" data-placement="bottom" title="Remove current template"><i class="fas fa-minus"></i></button>
<button id="settings-add-template-btn" class="btn btn-success btn-sm float-right mr-1 mb-1" data-toggle="tooltip" data-placement="bottom" title="Add empty template"><i class="fas fa-plus"></i></button>
</h5>
<select class="form-control mt-1 mb-1" name="settings-template" id="settings-template"></select>
</div>
<div class="tab-pane fade" id="settings-scope" role="tabpanel" aria-labelledby="settings-scope-tab">
Microscope. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut iusto qui ex rerum maxime nulla vel aliquam repudiandae pariatur cum alias nisi a laborum sapiente accusamus, excepturi placeat impedit! Aliquam!
</div>
<div class="tab-pane fade show active" id="settings-sources" role="tabpanel" aria-labelledby="settings-sources-tab">
<div class="tab-pane fade show" id="settings-sources" role="tabpanel" aria-labelledby="settings-sources-tab">
Sources. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Laboriosam corrupti aliquam reiciendis corporis fugiat animi repellat, quas obcaecati exercitationem placeat quidem, tenetur eligendi quasi expedita debitis molestias eum dicta, doloribus.
</div>
<div class="tab-pane fade" id="settings-exf" role="tabpanel" aria-labelledby="settings-exf-tab">
Expand All @@ -231,15 +247,11 @@ <h5 class="modal-title" id="settingsModalTitle"><i class="fas fa-cog"></i> Setti
<div class="tab-pane fade" id="settings-fluo" role="tabpanel" aria-labelledby="settings-fluo-tab">
Fluorophore. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut iusto qui ex rerum maxime nulla vel aliquam repudiandae pariatur cum alias nisi a laborum sapiente accusamus, excepturi placeat impedit! Aliquam!
</div>
<div class="tab-pane fade" id="settings-scope" role="tabpanel" aria-labelledby="settings-scope-tab">
Microscope. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut iusto qui ex rerum maxime nulla vel aliquam repudiandae pariatur cum alias nisi a laborum sapiente accusamus, excepturi placeat impedit! Aliquam!
</div>
</div>

</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
Expand Down
9 changes: 8 additions & 1 deletion spectrascope-app/src/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
const { app, BrowserWindow, shell } = require('electron')
const { app, BrowserWindow, shell } = require('electron');
const eset = require('electron-settings');
require('./js/settings.fn.js');

// Handle creating/removing shortcuts on Windows when installing/uninstalling.
if (require('electron-squirrel-startup')) { // eslint-disable-line global-require
Expand Down Expand Up @@ -32,6 +34,11 @@ const createWindow = () => {
// when you should delete the corresponding element.
mainWindow = null;
});

if ( !eset.has("templates") ) {
mk_default_settings();
};

};

// This method will be called when Electron has finished
Expand Down
208 changes: 208 additions & 0 deletions spectrascope-app/src/js/settings.fn.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
const { dialog } = require('electron').remote;
const fs = require('fs');
const path = require('path');

const toastr = require("toastr");
toastr.options.timeOut = 3000;
toastr.options.extendedTimeOut = 3000;
toastr.options.progressBar = true;

var empty_settings = {
sources : {},
filters: {
em : {},
ex : {}
},
mirrors : {},
fluorophores : {},
microscopes : []
};
var default_settings = {
sources : {},
filters: {
em : {},
ex : {}
},
mirrors : {},
fluorophores : {},
microscopes : ["BiCroScope 1", "BiCroScope 2"]
};

mk_default_settings = function() {
// Build factory default settings template
eset.set('templates.default', default_settings);
eset.set("selected-template", "default");
}

reset_settings = function() {
// Reset setting templates to default
eset.deleteAll();
mk_default_settings();
}

load_template_list = function() {
// Load template list
var selectedTemplate = "default";
if ( eset.has("selected-template") ) {
var selectedTemplate = eset.get("selected-template");
if ( -1 == Object.keys(eset.getAll()['templates']).indexOf(selectedTemplate) ) {
selectedTemplate = "default";
}
}
$("select#settings-template").children().remove();
$.each(eset.getAll()['templates'], function(k, v) {
var optElement = $("<option></option>").text(k);
if ( k == selectedTemplate ) {
optElement.attr("selected", true);
}
$("select#settings-template").append(optElement);
})
}

add_settings_template = function() {
// Add empty settings template
bootbox.prompt({
title: "How should we call the new template?",
callback: function(result) {
if ( result == null || 0 == result.length ) {
toastr.error("No template added.");
} else if ( eset.has("templates." + result) ) {
toastr.error("The provided name is already in use. Try again.");
} else {
eset.set("templates." + result, empty_settings);
load_template_list();
toastr.success("Added template '" + result + "'!");
}
}
});
}

rm_settings_template = function() {
// Remove a setting template. Requires confirmation.
var selectedTemplate = eset.get("selected-template");

if ( "default" == selectedTemplate ) {
toastr.error("The default template cannot be removed.");
return;
}

var msg = "Are you sure you want to cancel the '" + selectedTemplate + "' template?<br/>";
msg = msg + "<small class='text-danger'>This cannot be undone!</small>";
bootbox.confirm({
message: msg,
callback: function(result){
if ( result ) {
eset.delete("templates." + selectedTemplate);
eset.set("selected-template", "default");
load_template_list();
toastr.success("The template '" + selectedTemplate + "' has been removed.");
} else {
toastr.info("Nothing done.");
}
}
});
}

copy_settings_template = function() {
// Copy a setting template.
var selectedTemplate = eset.get("selected-template");
var msg = "How should we call the new template?<br/>"
msg = msg + "<small>This will be a copy of '" + selectedTemplate + "'.";
bootbox.prompt({
title: msg,
callback: function(result) {
if ( result == null || 0 == result.length ) {
toastr.error("No template added.");
} else if ( eset.has("templates." + result) ) {
toastr.error("The provided name is already in use. Try again.");
} else {
eset.set("templates." + result, eset.get("templates." + selectedTemplate));
load_template_list();
toastr.success("Added template '" + result + "' as a copy of '" + selectedTemplate + "'!");
}
}
});
}

download_settings_template = function() {
// Download a setting template.
var selectedTemplate = eset.get("selected-template");
var filename = dialog.showSaveDialog(null, {
title: "Export settings template",
defaultPath: selectedTemplate + ".json"
});

try {
var content = JSON.stringify(eset.get("templates." + selectedTemplate));
fs.writeFileSync(filename, content, 'utf-8');
toastr.success("'" + selectedTemplate + "' exported to '" + filename + "'");
} catch(e) {
toastr.error('Failed to save the file !');
}
}

check_settings_template = function(data) {
// Check a setting template for standard conformity
if ( ! "sources" in data ) return false;
if ( data.sources.constructor != {}.constructor ) return false;
if ( ! "filters" in data ) return false;
if ( ! "em" in data.filters ) return false;
if ( data.filters.em.constructor != {}.constructor ) return false;
if ( ! "ex" in data.filters ) return false;
if ( data.filters.ex.constructor != {}.constructor ) return false;
if ( ! "mirrors" in data ) return false;
if ( data.mirrors.constructor != {}.constructor ) return false;
if ( ! "fluorophores" in data ) return false;
if ( data.fluorophores.constructor != {}.constructor ) return false;
if ( ! "microscopes" in data ) return false;
if ( data.microscopes.constructor != [].constructor ) return false;
return true;
}

upload_settings_template = function() {
// Upload a setting template.
var selectedTemplate = eset.get("selected-template");
var filename = dialog.showOpenDialog(null, {
title: "Import settings template",
properties: ["openFile", "showHiddenFiles"],
filters: [
{name: "SpectraScope Templates", extensions: ['json']}
]
})[0];
var templateName = path.basename(filename, ".json");

fs.readFile(filename, 'utf-8', (error, data) => {
if ( error ) {
toastr.error("Could not open the file. More info in the console.");
console.log(error);
} else if ( eset.has("templates." + templateName) ) {
toastr.error("Template '" + templateName + "' already exist. Import failed.");
} else {
data = JSON.parse(data)


eset.set("templates." + templateName, data);
load_template_list();
toastr.success("Template '" + templateName + "' imported.");
}
});
}

reset_settings_template = function() {
// Remove all setting templates and regenerate default one. Requires confirmation.
var selectedTemplate = eset.get("selected-template");
var msg = "Beware! This will remove all templates and regenerate the factory default template only. Are you sure you want to continue?<br/>";
msg = msg + "<small class='text-danger'>This cannot be undone!</small>";
bootbox.confirm({
message: msg,
callback: function(result){
if ( result ) {
reset_settings();
load_template_list();
toastr.success("Setting templates reset.");
} else {
toastr.info("Nothing done.");
}
}
});
}
16 changes: 16 additions & 0 deletions spectrascope-app/src/js/settings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
$(function() {

// Settings template select
$("select#settings-template").change(function(e) {
eset.set("selected-template", $(this).val())
e.preventDefault();
});
load_template_list();

$("#settings-add-template-btn").click(function(e) { add_settings_template(); });
$("#settings-rm-template-btn").click(function(e) { rm_settings_template(); });
$("#settings-cp-template-btn").click(function(e) { copy_settings_template(); });
$("#settings-dl-template-btn").click(function(e) { download_settings_template(); });
$("#settings-ul-template-btn").click(function(e) { upload_settings_template(); });
$("#settings-reset-template-btn").click(function(e) { reset_settings_template(); });
});
7 changes: 6 additions & 1 deletion spectrascope-app/src/js/startup.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
window.$ = window.jQuery = require('jquery');
window.d3 = require('d3');
window.d3 = require('d3');
window.eset = require('electron-settings');

$(function () {
$('[data-toggle="tooltip"]').tooltip()
})
Loading

0 comments on commit 2cac598

Please sign in to comment.