fix opacity restore in UI, and screen size shrinking

This commit is contained in:
Matthieu Baumann
2025-12-12 11:27:03 +01:00
parent da8eb6f76e
commit 28869645cd
11 changed files with 5341 additions and 5387 deletions

View File

@@ -7,7 +7,7 @@
<script type="module">
import A from '../src/js/A.js';
A.init.then(() => {
let aladin = A.aladin('#aladin-lite-div', {fov: 70,projection: "AIT"});
let aladin = A.aladin('#aladin-lite-div', {target: "23 28 32.46 -00 10 38.9", fov: 4, projection: "AIT"});
let hsc = aladin.newImageSurvey("P/HSC/DR2/deep/g", {colormap:"Purples", imgFormat: "fits"});
aladin.setBaseImageLayer(hsc);

View File

@@ -1115,10 +1115,6 @@ impl App {
Ok(())
}
pub(crate) fn rename_layer(&mut self, layer: &str, new_layer: &str) -> Result<(), JsValue> {
self.layers.rename_layer(layer, new_layer)
}
pub(crate) fn swap_layers(
&mut self,
first_layer: &str,

View File

@@ -315,11 +315,7 @@ impl CameraViewPort {
}
pub fn compute_ndc_to_clip_factor(&mut self, proj: &ProjectionType) {
self.ndc_to_clip = if self.height < self.width {
Vector2::new(1.0, (self.height as f64) / (self.width as f64))
} else {
Vector2::new((self.width as f64) / (self.height as f64), 1.0)
};
self.ndc_to_clip = Vector2::new(1.0, (self.height as f64) / (self.width as f64));
let bounds_size_ratio = proj.bounds_size_ratio();
self.ndc_to_clip.y *= bounds_size_ratio;

View File

@@ -372,12 +372,6 @@ impl WebClient {
Ok(())
}
#[wasm_bindgen(js_name = renameLayer)]
pub fn rename_layer(&mut self, layer: String, new_layer: String) -> Result<(), JsValue> {
// Deserialize the hips objects that compose the hips
self.app.rename_layer(&layer, &new_layer)
}
#[wasm_bindgen(js_name = swapLayers)]
pub fn swap_layers(
&mut self,

View File

@@ -351,29 +351,6 @@ impl Layers {
}
}
pub fn rename_layer(&mut self, layer: &str, new_layer: &str) -> Result<(), JsValue> {
let err_layer_not_found =
JsValue::from_str(&format!("Layer {layer:?} not found, so cannot be removed."));
// layer from layers does also need to be removed
let id_layer = self
.layers
.iter()
.position(|l| layer == l)
.ok_or(err_layer_not_found.clone())?;
self.layers[id_layer] = new_layer.to_string();
let meta = self.meta.remove(layer).ok_or(err_layer_not_found.clone())?;
let id = self.ids.remove(layer).ok_or(err_layer_not_found)?;
// Add the new
self.meta.insert(new_layer.to_string(), meta);
self.ids.insert(new_layer.to_string(), id);
Ok(())
}
pub fn swap_layers(&mut self, first_layer: &str, second_layer: &str) -> Result<(), JsValue> {
let id_first_layer =
self.layers
@@ -392,16 +369,6 @@ impl Layers {
self.layers.swap(id_first_layer, id_second_layer);
/*if let (Some(k1), Some(k2)) = (self.ids.get(first_layer), self.ids.get(second_layer)) {
if let (Some(v1), Some(v2)) = (self.hipses.remove(k1), self.hipses.remove(k2)) {
self.hipses.insert(k2.to_string(), v1);
self.hipses.insert(k1.to_string(), v2);
} else if let (Some(v1), Some(v2)) = (self.images.remove(k1), self.images.remove(k2)) {
self.images.insert(k2.to_string(), v1);
self.images.insert(k1.to_string(), v2);
}
}*/
Ok(())
}

File diff suppressed because it is too large Load Diff

View File

@@ -1784,6 +1784,27 @@ export let View = (function () {
// register its promise
this.imageLayersBeingQueried.set(layer, imageLayer);
// Check whether this layer already exist
const idxOverlayLayer = this.overlayLayers.findIndex(overlayLayer => overlayLayer == layer);
let alreadyPresentImageLayer;
if (idxOverlayLayer == -1) {
// it does not exist so we add it to the stack
this.overlayLayers.push(layer);
} else {
// it exists
alreadyPresentImageLayer = this.imageLayers.get(layer);
if (alreadyPresentImageLayer) {
if (alreadyPresentImageLayer.added === true) {
ALEvent.HIPS_LAYER_REMOVED.dispatchedTo(this.aladinDiv, { layer: alreadyPresentImageLayer });
}
alreadyPresentImageLayer.added = false;
}
// Notify that this image layer has been replaced by the wasm part
this.imageLayers.delete(layer);
}
this.addImageLayer(imageLayer, layer);
return imageLayer;
@@ -1793,33 +1814,13 @@ export let View = (function () {
View.prototype._addLayer = function(imageLayer) {
// Keep the JS frontend in-line with the wasm state
const layerName = imageLayer.layer;
// Check whether this layer already exist
const idxOverlayLayer = this.overlayLayers.findIndex(overlayLayer => overlayLayer == layerName);
let alreadyPresentImageLayer;
if (idxOverlayLayer == -1) {
// it does not exist so we add it to the stack
this.overlayLayers.push(layerName);
} else {
// it exists
alreadyPresentImageLayer = this.imageLayers.get(layerName);
// Notify that this image layer has been replaced by the wasm part
if (alreadyPresentImageLayer && alreadyPresentImageLayer.added === true) {
ALEvent.HIPS_LAYER_REMOVED.dispatchedTo(this.aladinDiv, { layer: alreadyPresentImageLayer });
}
alreadyPresentImageLayer.added = false;
this.imageLayers.delete(layerName);
}
imageLayer.added = true;
this.imageLayers.set(layerName, imageLayer);
// select the layer if he is on top
//if (idxOverlayLayer == -1) {
this.selectLayer(layerName);
//}
this.selectLayer(layerName);
ALEvent.HIPS_LAYER_ADDED.dispatchedTo(this.aladinDiv, { layer: imageLayer });
}
@@ -1893,33 +1894,6 @@ export let View = (function () {
})
}
// The survey at layer must have been added to the view!
View.prototype.renameLayer = function(layer, newLayer) {
if (layer === newLayer) {
return;
}
// Throw an exception if either the first or the second layers are not in the stack
this.wasm.renameLayer(layer, newLayer);
let imageLayer = this.imageLayers.get(layer);
imageLayer.layer = newLayer;
// Change in overlaylayers
const idx = this.overlayLayers.findIndex(overlayLayer => overlayLayer == layer);
this.overlayLayers[idx] = newLayer;
// Change in imageLayers
this.imageLayers.delete(layer);
this.imageLayers.set(newLayer, imageLayer);
if (this.selectedLayer === layer) {
this.selectedLayer = newLayer;
}
// Tell the layer hierarchy has changed
ALEvent.HIPS_LAYER_RENAMED.dispatchedTo(this.aladinDiv, { layer, newLayer });
}
View.prototype.swapLayers = function(firstLayer, secondLayer) {
// Throw an exception if either the first or the second layers are not in the stack
this.wasm.swapLayers(firstLayer, secondLayer);

View File

@@ -517,6 +517,8 @@ export class HiPSBrowserBox extends Box {
}
_show(options) {
this._requestMOCServer();
// Regenerate a new layer name
this.layer = (options && options.layer) || Utils.uuidv4();
super._show(options)

View File

@@ -295,13 +295,16 @@ import { TogglerActionButton } from "../Button/Toggler.js";
this.pixelSettingsContent.set('maxcut', +maxCut.toFixed(4))
this.pixelSettingsContent.set('stretch', stretch)
let fmtInput = this.pixelSettingsContent.getInput('fmt')
fmtInput.innerHTML = '';
for (const option of layer.getAvailableFormats()) {
fmtInput.innerHTML += "<option>" + option + "</option>";
if (layer.getAvailableFormats()) {
for (const option of layer.getAvailableFormats()) {
fmtInput.innerHTML += "<option>" + option + "</option>";
}
fmtInput.value = layer.imgFormat;
}
fmtInput.value = layer.imgFormat;
this.colorSettingsContent.set('cmap', colormap);
this.colorSettingsContent.set('reverse', reversed);

View File

@@ -964,6 +964,7 @@ export class OverlayStackBox extends Box {
},
});
let prevOpacity = null;
let showBtn = ActionButton.createSmallSizedIconBtn({
icon: {
url: layer.getOpacity() === 0.0 ? hideIconUrl : showIconUrl,
@@ -979,12 +980,15 @@ export class OverlayStackBox extends Box {
let opacity = layer.getOpacity();
if (opacity === 0.0) {
layer.setOpacity(1.0);
let newOpacity = prevOpacity || 1.0;
prevOpacity = null;
layer.setOpacity(newOpacity);
btn.update({
icon: { monochrome: true, url: showIconUrl },
tooltip: { content: "Hide" },
});
} else {
prevOpacity = opacity;
layer.setOpacity(0.0);
btn.update({
icon: { monochrome: true, url: hideIconUrl },

View File

@@ -137,10 +137,17 @@ export class Tree extends DOMElement {
let numFilteringMatching = this.numChildMatchingFilter(child, true);
let numTotal = this.numChildMatchingFilter(child, false);
elt.innerHTML = label + ` (${numFilteringMatching}/${numTotal})`
let name = label;
elt.innerHTML = name + ` (${numFilteringMatching}/${numTotal})`
if (numFilteringMatching == 0) {
elt.style.display = "none";
} else {
elt.style.display = "block";
}
}
elt.style.color = this.hasChildLocatedInFov(child) ? 'green' : 'orange';
elt.style.color = this.hasChildLocatedInFov(child) ? 'yellowgreen' : 'orange';
child.label = label;
child.parent = node;
@@ -194,13 +201,13 @@ export class Tree extends DOMElement {
if (isLeaf) {
// Check if its ID is found in the view
if (this.highlight) {
elt.style.color = this.highlight.includes(child.ID) ? 'green' : 'orange';
elt.style.color = this.highlight.includes(child.ID) ? 'yellowgreen' : 'orange';
}
} else {
// we see a parent, we must determine:
// * its color: he has at least 1 child inside the FoV => green
// * the number of children matching the filter params
elt.style.color = this.hasChildLocatedInFov(child) ? 'green' : 'orange';
elt.style.color = this.hasChildLocatedInFov(child) ? 'yellowgreen' : 'orange';
// we see a parent, we must determine:
// * its color: he has at least 1 child inside the FoV => green
@@ -210,6 +217,12 @@ export class Tree extends DOMElement {
let name = elt.innerText.split('(');
elt.innerHTML = name[0] + ` (${numFilteringMatching}/${numTotal})`
if (numFilteringMatching == 0) {
elt.style.display = "none";
} else {
elt.style.display = "block";
}
}
}
}
@@ -248,6 +261,11 @@ export class Tree extends DOMElement {
let name = elt.innerText.split('(');
elt.innerHTML = name[0] + ` (${numFilteringMatching}/${numTotal})`
if (numFilteringMatching == 0) {
elt.style.display = "none";
} else {
elt.style.display = "block";
}
}
}
}