Skip to content

Commit d1d723e

Browse files
committed
more refactoring/cleaning and disable cache for now
1 parent c1a8679 commit d1d723e

File tree

1 file changed

+47
-42
lines changed

1 file changed

+47
-42
lines changed

dash_slicer/slicer.py

Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,19 @@ def upload_requested_slice(slice_index):
346346
slice = img_array_to_uri(self._slice(slice_index))
347347
return {"index": slice_index, "slice": slice}
348348

349+
def _clientside_callback(self, code, *args):
350+
"""Helper function to define a clientside callback."""
351+
352+
slicer_state = """
353+
if (!window._slicer_{{ID}}) window._slicer_{{ID}} = {};
354+
let slicer_state = window._slicer_{{ID}};
355+
""".replace(
356+
"{{ID}}", self._context_id
357+
)
358+
code = code.replace("let slicer_state;", slicer_state)
359+
360+
return self._app.clientside_callback(code, *args)
361+
349362
def _create_client_callbacks(self):
350363
"""Create the callbacks that run client-side."""
351364

@@ -363,12 +376,10 @@ def _create_client_callbacks(self):
363376
# /
364377
# pos (external)
365378

366-
app = self._app
367-
368379
# ----------------------------------------------------------------------
369380
# Callback to trigger fellow slicers to go to a specific position on click.
370381

371-
app.clientside_callback(
382+
self._clientside_callback(
372383
"""
373384
function update_setpos_from_click(data, index, info) {
374385
if (data && data.points && data.points.length) {
@@ -389,7 +400,7 @@ def _create_client_callbacks(self):
389400
# ----------------------------------------------------------------------
390401
# Callback to update slider based on external setpos signals.
391402

392-
app.clientside_callback(
403+
self._clientside_callback(
393404
"""
394405
function update_slider_value(positions, cur_index, info) {
395406
for (let trigger of dash_clientside.callback_context.triggered) {
@@ -420,11 +431,11 @@ def _create_client_callbacks(self):
420431
# ----------------------------------------------------------------------
421432
# Callback to rate-limit the index (using a timer/interval).
422433

423-
app.clientside_callback(
434+
self._clientside_callback(
424435
"""
425436
function update_index_by_rate_limiting_the_slider_value(index, n_intervals, interval) {
426-
if (!window._slicer_{{ID}}) window._slicer_{{ID}} = {};
427-
let slicer_info = window._slicer_{{ID}};
437+
438+
let slicer_state; // filled in
428439
let now = window.performance.now();
429440
430441
// Get whether the slider was moved
@@ -438,10 +449,10 @@ def _create_client_callbacks(self):
438449
let disable_timer = false;
439450
440451
// If the slider moved, remember the time when this happened
441-
slicer_info.new_time = slicer_info.new_time || 0;
452+
slicer_state.new_time = slicer_state.new_time || 0;
442453
443454
if (slider_was_moved) {
444-
slicer_info.new_time = now;
455+
slicer_state.new_time = now;
445456
} else if (!n_intervals) {
446457
disable_timer = true; // start disabled
447458
}
@@ -451,28 +462,20 @@ def _create_client_callbacks(self):
451462
// changing. The former makes the indicators come along while
452463
// dragging the slider, the latter is better for a smooth
453464
// experience, and the interval can be set much lower.
454-
if (index != slicer_info.req_index) {
455-
if (now - slicer_info.new_time >= interval * 2) {
456-
req_index = slicer_info.req_index = index;
465+
if (index != slicer_state.req_index) {
466+
if (now - slicer_state.new_time >= interval * 2) {
467+
req_index = slicer_state.req_index = index;
457468
disable_timer = true;
458-
459-
// Get cache
460-
// todo: _index is now our rate-limited index, so we need to always apply
461-
//if (!window.slicecache_for_{{ID}}) { window.slicecache_for_{{ID}} = {}; }
462-
//let slice_cache = window.slicecache_for_{{ID}};
463-
//if (slice_cache[req_index]) {
464-
// req_index = dash_clientside.no_update;
465-
//} else {
466-
console.log('requesting slice ' + req_index);
467-
//}
469+
console.log('requesting slice ' + req_index);
470+
// If we want to re-enable the cache, we'd need an extra store
471+
// that we set here too, and which we do *not* set if req_index
472+
// is already in thec cache.
468473
}
469474
}
470475
471476
return [req_index, disable_timer];
472477
}
473-
""".replace(
474-
"{{ID}}", self._context_id
475-
),
478+
""",
476479
[
477480
Output(self._index.id, "data"),
478481
Output(self._timer.id, "disabled"),
@@ -484,14 +487,12 @@ def _create_client_callbacks(self):
484487
# ----------------------------------------------------------------------
485488
# Callback to update position (in scene coordinates) from the index.
486489

487-
app.clientside_callback(
490+
self._clientside_callback(
488491
"""
489492
function update_pos(index, info) {
490493
return info.origin[2] + index * info.spacing[2];
491494
}
492-
""".replace(
493-
"{{ID}}", self._context_id
494-
),
495+
""",
495496
Output(self._pos.id, "data"),
496497
[Input(self._index.id, "data")],
497498
[State(self._info.id, "data")],
@@ -500,19 +501,21 @@ def _create_client_callbacks(self):
500501
# ----------------------------------------------------------------------
501502
# Callback that creates a list of image traces (slice and overlay).
502503

503-
app.clientside_callback(
504+
self._clientside_callback(
504505
"""
505506
function update_image_traces(index, server_data, overlays, lowres, info, current_traces) {
506507
508+
507509
// Add data to the cache if the data is indeed new
508-
if (!window.slicecache_for_{{ID}}) { window.slicecache_for_{{ID}} = {}; }
509-
let slice_cache = window.slicecache_for_{{ID}};
510-
for (let trigger of dash_clientside.callback_context.triggered) {
511-
if (trigger.prop_id.indexOf('server-data') >= 0) {
512-
slice_cache[server_data.index] = server_data;
513-
break;
514-
}
515-
}
510+
let slicer_state; // filled in
511+
slicer_state.cache = slicer_state.cache || {};
512+
// Cache is disabled for now ...
513+
//for (let trigger of dash_clientside.callback_context.triggered) {
514+
// if (trigger.prop_id.indexOf('server-data') >= 0) {
515+
// slicer_state.cache[server_data.index] = server_data;
516+
// break;
517+
// }
518+
//}
516519
517520
// Prepare traces
518521
let slice_trace = {
@@ -530,9 +533,11 @@ def _create_client_callbacks(self):
530533
let new_traces = [slice_trace, overlay_trace];
531534
532535
// Depending on the state of the cache, use full data, or use lowres and request slice
533-
if (slice_cache[index]) {
534-
let cached = slice_cache[index];
536+
if (slicer_state.cache[index]) {
537+
let cached = slicer_state.cache[index];
535538
slice_trace.source = cached.slice;
539+
} else if (index == server_data.index) {
540+
slice_trace.source = server_data.slice;
536541
} else {
537542
slice_trace.source = lowres[index];
538543
// Scale the image to take the exact same space as the full-res
@@ -574,7 +579,7 @@ def _create_client_callbacks(self):
574579
# * corresponding to the same volume data
575580
# * match any of the selected axii
576581

577-
app.clientside_callback(
582+
self._clientside_callback(
578583
"""
579584
function update_indicator_traces(positions1, positions2, info, current) {
580585
let x0 = info.origin[0], y0 = info.origin[1];
@@ -626,7 +631,7 @@ def _create_client_callbacks(self):
626631
# ----------------------------------------------------------------------
627632
# Callback that composes a figure from multiple trace sources.
628633

629-
app.clientside_callback(
634+
self._clientside_callback(
630635
"""
631636
function update_figure(img_traces, indicators, ori_figure) {
632637

0 commit comments

Comments
 (0)