Skip to content

Commit 893e610

Browse files
committed
fix(toolbars): sliders and drop down for data selection and animation toolbars
1 parent f0601c3 commit 893e610

File tree

3 files changed

+69
-29
lines changed

3 files changed

+69
-29
lines changed

src/e3sm_quickview/app.py

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import asyncio
22
import datetime
33
import json
4+
import math
45
import os
6+
from functools import partial
57
from pathlib import Path
68

79
from trame.app import TrameApp, asynchronous, file_upload
@@ -420,22 +422,18 @@ async def data_loading_open(self, simulation, connectivity):
420422
if values is not None
421423
else []
422424
)
425+
423426
if values is not None and len(values) > 1:
424427
n_cols += 1
425-
available_tracks.append({"title": name, "value": name})
428+
available_tracks.append(name)
426429
self.state.toolbar_slider_cols = 12 / n_cols if n_cols else 12
427430
self.state.animation_tracks = available_tracks
428431
self.state.animation_track = (
429-
self.state.animation_tracks[0]["value"]
430-
if available_tracks
431-
else None
432+
self.state.animation_tracks[0] if available_tracks else None
432433
)
433434

434-
from functools import partial
435-
436435
# Initialize dynamic index variables for each dimension
437-
for track in available_tracks:
438-
dim_name = track["value"]
436+
for dim_name in available_tracks:
439437
index_var = f"{dim_name}_idx"
440438
if "time" in index_var:
441439
self.state[index_var] = 50
@@ -461,6 +459,19 @@ async def _data_load_variables(self):
461459
# Flatten the list of lists
462460
flattened_vars = [var for var_list in vars_to_show.values() for var in var_list]
463461

462+
# Compute used dimensions
463+
used_dims = set()
464+
for dims in self.selected_variables.keys():
465+
used_dims.update(dims)
466+
self.state.available_animation_tracks = [
467+
n for n in self.state.animation_tracks if n in used_dims
468+
]
469+
self.state.animation_track = (
470+
self.state.available_animation_tracks[0]
471+
if self.state.available_animation_tracks
472+
else None
473+
)
474+
464475
self.source.LoadVariables(flattened_vars)
465476

466477
# Trigger source update + compute avg
@@ -498,13 +509,21 @@ async def _on_projection(self, projection, **_):
498509
await asyncio.sleep(0.1)
499510
self.view_manager.reset_camera()
500511

501-
@change("active_tools", "animation_tracks")
512+
@change("active_tools", "available_animation_tracks")
502513
def _on_toolbar_change(self, active_tools, **_):
503514
top_padding = 0
504515
for name in active_tools:
505516
if name == "select-slice-time":
506-
track_count = len(self.state.animation_tracks or [])
507-
rows_needed = max(1, (track_count + 2) // 3) # 3 sliders per row
517+
track_count = len(self.state.available_animation_tracks or [])
518+
rows_needed = 1
519+
if track_count > 3:
520+
if track_count % 3 == 0 or (track_count + 1) % 3 == 0:
521+
rows_needed = math.ceil(track_count / 3)
522+
elif track_count % 2 == 0:
523+
rows_needed = track_count / 2
524+
else:
525+
rows_needed = math.ceil(track_count / 3)
526+
508527
top_padding += 70 * rows_needed
509528
else:
510529
top_padding += toolbars.SIZES.get(name, 0)

src/e3sm_quickview/components/toolbars.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -322,21 +322,24 @@ def __init__(self):
322322

323323
with v3.VRow(classes="ma-0 pr-2 flex-wrap flex-grow-1", dense=True):
324324
# Debug: Show animation_tracks array
325-
# html.Div("Animation Tracks: {{ JSON.stringify(animation_tracks) }}", classes="col-12")
325+
# html.Div(
326+
# "Animation Tracks: {{ JSON.stringify(available_animation_tracks) }}",
327+
# classes="col-12",
328+
# )
326329
# Each track gets a column (3 per row)
327330
with v3.VCol(
328-
cols=4,
329-
v_for="(track, idx) in animation_tracks",
331+
cols=("utils.quickview.cols(available_animation_tracks.length)",),
332+
v_for="(track, idx) in available_animation_tracks",
330333
key="idx",
331334
classes="pa-2",
332335
):
333-
with client.Getter(name=("track.value",), value_name="t_values"):
336+
with client.Getter(name=("track",), value_name="t_values"):
334337
with client.Getter(
335-
name=("track.value + '_idx'",), value_name="t_idx"
338+
name=("track + '_idx'",), value_name="t_idx"
336339
):
337340
with v3.VRow(classes="ma-0 align-center", dense=True):
338341
v3.VLabel(
339-
"{{track.title}}",
342+
"{{track}}",
340343
classes="text-subtitle-2",
341344
)
342345
v3.VSpacer()
@@ -348,7 +351,7 @@ def __init__(self):
348351
model_value=("t_idx",),
349352
update_modelValue=(
350353
self.on_update_slider,
351-
"[track.value, $event]",
354+
"[track, $event]",
352355
),
353356
min=0,
354357
# max=100,#("get(track.value).length - 1",),
@@ -375,7 +378,7 @@ def __init__(self):
375378
with v3.VRow(classes="ma-0 px-2 align-center"):
376379
v3.VSelect(
377380
v_model=("animation_track", "timestamps"),
378-
items=("animation_tracks", []),
381+
items=("available_animation_tracks", []),
379382
flat=True,
380383
variant="plain",
381384
hide_details=True,
Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
11
window.trame.utils.quickview = {
2-
formatRange(value, useLog) {
3-
if (value === null || value === undefined || isNaN(value)) {
4-
return 'Auto';
5-
}
6-
if (useLog && value > 0) {
7-
return `10^(${Math.log10(value).toFixed(1)})`;
8-
}
9-
return value.toExponential(1);
10-
}
11-
}
2+
formatRange(value, useLog) {
3+
if (value === null || value === undefined || isNaN(value)) {
4+
return "Auto";
5+
}
6+
if (useLog && value > 0) {
7+
return `10^(${Math.log10(value).toFixed(1)})`;
8+
}
9+
return value.toExponential(1);
10+
},
11+
cols(size) {
12+
if (size === 1) {
13+
return 12;
14+
}
15+
if (size === 2) {
16+
return 6;
17+
}
18+
if (size === 3) {
19+
return 4;
20+
}
21+
if (size % 3 === 0 || (size + 1) % 3 === 0) {
22+
return 4;
23+
}
24+
if (size % 2 === 0) {
25+
return 6;
26+
}
27+
return 4;
28+
},
29+
};

0 commit comments

Comments
 (0)