Files
aladin-lite/src/js/DefaultActionsForContextMenu.js
2024-10-11 13:45:04 +02:00

245 lines
9.3 KiB
JavaScript

// Copyright 2023 - UDS/CNRS
// The Aladin Lite program is distributed under the terms
// of the GNU General Public License version 3.
//
// This file is part of Aladin Lite.
//
// Aladin Lite is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3 of the License.
//
// Aladin Lite 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 General Public License for more details.
//
// The GNU General Public License is available in COPYING file
// along with Aladin Lite.
//
/******************************************************************************
* Aladin Lite project
*
* File DefaultActionsForContextMenu
*
* Author: Thomas Boch[CDS]
*
*****************************************************************************/
import { GenericPointer } from "./GenericPointer.js";
import A from "./A.js";
import { CatalogQueryBox } from "./gui/Box/CatalogQueryBox.js";
import cameraIconUrl from '../../assets/icons/camera.svg'
import targetIconUrl from '../../assets/icons/target.svg';
import uploadIconUrl from '../../assets/icons/upload.svg';
import selectIconUrl from '../../assets/icons/select.svg';
export let DefaultActionsForContextMenu = (function () {
let DefaultActionsForContextMenu = {};
DefaultActionsForContextMenu.getDefaultActions = function (aladinInstance) {
const a = aladinInstance;
const selectObjects = (selection) => {
a.view.selectObjects(selection);
};
return [
{
label: "Copy position", action(o) {
let msg;
let text = o.target.innerText;
if (!text) {
return false;
}
navigator.clipboard.writeText(text)
.then(() => {
msg = 'successful'
if (aladinInstance.statusBar) {
aladinInstance.statusBar.appendMessage({
message: 'Reticle location saved!',
duration: 2000,
type: 'info'
})
}
})
.catch((e) => {
msg = 'unsuccessful'
console.info('Oops, unable to copy', e);
})
.finally(() => {
console.info('Copying text command was ' + msg);
})
}
},
{
label: {
icon: {
tooltip: {content: 'Download a PNG image file of the view', position: {direction: 'top'}},
monochrome: true,
url: cameraIconUrl,
size: 'small',
},
content: 'Take a snapshot'
},
action(o) { a.exportAsPNG(); }
},
{
label: "Add",
subMenu: [
{
label: 'New image layer', action(o) {
a.addNewImageLayer();
if (a.menu) {
a.menu.open('stack')
}
}
},
{
label: 'New catalogue layer', action(o) {
let catBox = new CatalogQueryBox(a)
catBox._show({
position: {
anchor :'center center'
},
});
}
},
]
},
{
label: {
icon: {
monochrome: true,
url: uploadIconUrl,
cssStyle: {
cursor: 'help',
}
},
content: "Load a local file"
},
subMenu: [
{
label: 'FITS image', action(o) {
let input = document.createElement('input');
input.type = 'file';
input.onchange = _ => {
let files = Array.from(input.files);
files.forEach(file => {
const url = URL.createObjectURL(file);
const name = file.name;
// Consider other cases
const image = a.createImageFITS(
url,
{name},
(ra, dec, fov, _) => {
// Center the view around the new fits object
a.gotoRaDec(ra, dec);
a.setFoV(fov * 1.1);
}
);
a.setOverlayImageLayer(image, name)
});
};
input.click();
}
},
{
label: 'FITS MOC', action(o) {
let input = document.createElement('input');
input.type = 'file';
input.onchange = _ => {
let files = Array.from(input.files);
files.forEach(file => {
const url = URL.createObjectURL(file);
let moc = A.MOCFromURL(url, { name: file.name });
a.addMOC(moc);
});
};
input.click();
}
},
{
label: 'VOTable', action(o) {
let input = document.createElement('input');
input.type = 'file';
input.onchange = _ => {
let files = Array.from(input.files);
files.forEach(file => {
const url = URL.createObjectURL(file);
A.catalogFromURL(url, { name: file.name, hoverColor: 'yellow', onClick: 'showTable'}, (catalog) => {
a.addCatalog(catalog);
}, false);
});
};
input.click();
}
}
]
},
{
label: {
icon: {
monochrome: true,
url: selectIconUrl,
size: 'small',
},
content: "Select sources"
},
subMenu: [
{
label: 'Circular',
action(o) {
a.select('circle', selectObjects)
}
},
{
label: 'Rectangular',
action(o) {
a.select('rect', selectObjects)
}
}
]
},
{
label: {
icon: {
tooltip: {content: 'Use Sesame, our name resolver!', position: {direction: 'top'}},
monochrome: true,
url: targetIconUrl,
size: 'small',
},
content: 'What is this?'
},
action(o, ctxMenu) {
GenericPointer(a.view, {
x: parseInt(ctxMenu.element().style.left),
y: parseInt(ctxMenu.element().style.top)
});
}
},
{
label: "HiPS2FITS cutout", action(o) {
let hips2fitsUrl = 'https://alasky.cds.unistra.fr/hips-image-services/hips2fits?';
let hipsId = a.getBaseImageLayer().id;
let wcs = JSON.stringify(a.getViewWCS());
hips2fitsUrl += 'wcs=' + encodeURIComponent(wcs) + '&hips=' + encodeURIComponent(hipsId);
window.open(hips2fitsUrl, '_blank');
}
},
]
}
return DefaultActionsForContextMenu;
})();