Skip to content

Commit 4f17523

Browse files
committed
more refactoring/cleaning and disable cache for now
1 parent c2e0759 commit 4f17523

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
@@ -350,6 +350,19 @@ def upload_requested_slice(slice_index):
350350
slice = img_array_to_uri(self._slice(slice_index))
351351
return {"index": slice_index, "slice": slice}
352352

353+
def _clientside_callback(self, code, *args):
354+
"""Helper function to define a clientside callback."""
355+
356+
slicer_state = """
357+
if (!window._slicer_{{ID}}) window._slicer_{{ID}} = {};
358+
let slicer_state = window._slicer_{{ID}};
359+
""".replace(
360+
"{{ID}}", self._context_id
361+
)
362+
code = code.replace("let slicer_state;", slicer_state)
363+
364+
return self._app.clientside_callback(code, *args)
365+
353366
def _create_client_callbacks(self):
354367
"""Create the callbacks that run client-side."""
355368

@@ -367,12 +380,10 @@ def _create_client_callbacks(self):
367380
# /
368381
# pos (external)
369382

370-
app = self._app
371-
372383
# ----------------------------------------------------------------------
373384
# Callback to trigger fellow slicers to go to a specific position on click.
374385

375-
app.clientside_callback(
386+
self._clientside_callback(
376387
"""
377388
function update_setpos_from_click(data, index, info) {
378389
if (data && data.points && data.points.length) {
@@ -393,7 +404,7 @@ def _create_client_callbacks(self):
393404
# ----------------------------------------------------------------------
394405
# Callback to update slider based on external setpos signals.
395406

396-
app.clientside_callback(
407+
self._clientside_callback(
397408
"""
398409
function update_slider_value(positions, cur_index, info) {
399410
for (let trigger of dash_clientside.callback_context.triggered) {
@@ -424,11 +435,11 @@ def _create_client_callbacks(self):
424435
# ----------------------------------------------------------------------
425436
# Callback to rate-limit the index (using a timer/interval).
426437

427-
app.clientside_callback(
438+
self._clientside_callback(
428439
"""
429440
function update_index_by_rate_limiting_the_slider_value(index, n_intervals, interval) {
430-
if (!window._slicer_{{ID}}) window._slicer_{{ID}} = {};
431-
let slicer_info = window._slicer_{{ID}};
441+
442+
let slicer_state; // filled in
432443
let now = window.performance.now();
433444
434445
// Get whether the slider was moved
@@ -442,10 +453,10 @@ def _create_client_callbacks(self):
442453
let disable_timer = false;
443454
444455
// If the slider moved, remember the time when this happened
445-
slicer_info.new_time = slicer_info.new_time || 0;
456+
slicer_state.new_time = slicer_state.new_time || 0;
446457
447458
if (slider_was_moved) {
448-
slicer_info.new_time = now;
459+
slicer_state.new_time = now;
449460
} else if (!n_intervals) {
450461
disable_timer = true; // start disabled
451462
}
@@ -455,28 +466,20 @@ def _create_client_callbacks(self):
455466
// changing. The former makes the indicators come along while
456467
// dragging the slider, the latter is better for a smooth
457468
// experience, and the interval can be set much lower.
458-
if (index != slicer_info.req_index) {
459-
if (now - slicer_info.new_time >= interval * 2) {
460-
req_index = slicer_info.req_index = index;
469+
if (index != slicer_state.req_index) {
470+
if (now - slicer_state.new_time >= interval * 2) {
471+
req_index = slicer_state.req_index = index;
461472
disable_timer = true;
462-
463-
// Get cache
464-
// todo: _index is now our rate-limited index, so we need to always apply
465-
//if (!window.slicecache_for_{{ID}}) { window.slicecache_for_{{ID}} = {}; }
466-
//let slice_cache = window.slicecache_for_{{ID}};
467-
//if (slice_cache[req_index]) {
468-
// req_index = dash_clientside.no_update;
469-
//} else {
470-
console.log('requesting slice ' + req_index);
471-
//}
473+
console.log('requesting slice ' + req_index);
474+
// If we want to re-enable the cache, we'd need an extra store
475+
// that we set here too, and which we do *not* set if req_index
476+
// is already in thec cache.
472477
}
473478
}
474479
475480
return [req_index, disable_timer];
476481
}
477-
""".replace(
478-
"{{ID}}", self._context_id
479-
),
482+
""",
480483
[
481484
Output(self._index.id, "data"),
482485
Output(self._timer.id, "disabled"),
@@ -488,14 +491,12 @@ def _create_client_callbacks(self):
488491
# ----------------------------------------------------------------------
489492
# Callback to update position (in scene coordinates) from the index.
490493

491-
app.clientside_callback(
494+
self._clientside_callback(
492495
"""
493496
function update_pos(index, info) {
494497
return info.origin[2] + index * info.spacing[2];
495498
}
496-
""".replace(
497-
"{{ID}}", self._context_id
498-
),
499+
""",
499500
Output(self._pos.id, "data"),
500501
[Input(self._index.id, "data")],
501502
[State(self._info.id, "data")],
@@ -504,19 +505,21 @@ def _create_client_callbacks(self):
504505
# ----------------------------------------------------------------------
505506
# Callback that creates a list of image traces (slice and overlay).
506507

507-
app.clientside_callback(
508+
self._clientside_callback(
508509
"""
509510
function update_image_traces(index, server_data, overlays, lowres, info, current_traces) {
510511
512+
511513
// Add data to the cache if the data is indeed new
512-
if (!window.slicecache_for_{{ID}}) { window.slicecache_for_{{ID}} = {}; }
513-
let slice_cache = window.slicecache_for_{{ID}};
514-
for (let trigger of dash_clientside.callback_context.triggered) {
515-
if (trigger.prop_id.indexOf('server-data') >= 0) {
516-
slice_cache[server_data.index] = server_data;
517-
break;
518-
}
519-
}
514+
let slicer_state; // filled in
515+
slicer_state.cache = slicer_state.cache || {};
516+
// Cache is disabled for now ...
517+
//for (let trigger of dash_clientside.callback_context.triggered) {
518+
// if (trigger.prop_id.indexOf('server-data') >= 0) {
519+
// slicer_state.cache[server_data.index] = server_data;
520+
// break;
521+
// }
522+
//}
520523
521524
// Prepare traces
522525
let slice_trace = {
@@ -534,9 +537,11 @@ def _create_client_callbacks(self):
534537
let new_traces = [slice_trace, overlay_trace];
535538
536539
// Depending on the state of the cache, use full data, or use lowres and request slice
537-
if (slice_cache[index]) {
538-
let cached = slice_cache[index];
540+
if (slicer_state.cache[index]) {
541+
let cached = slicer_state.cache[index];
539542
slice_trace.source = cached.slice;
543+
} else if (index == server_data.index) {
544+
slice_trace.source = server_data.slice;
540545
} else {
541546
slice_trace.source = lowres[index];
542547
// Scale the image to take the exact same space as the full-res
@@ -578,7 +583,7 @@ def _create_client_callbacks(self):
578583
# * corresponding to the same volume data
579584
# * match any of the selected axii
580585

581-
app.clientside_callback(
586+
self._clientside_callback(
582587
"""
583588
function update_indicator_traces(positions1, positions2, info, current) {
584589
let x0 = info.origin[0], y0 = info.origin[1];
@@ -630,7 +635,7 @@ def _create_client_callbacks(self):
630635
# ----------------------------------------------------------------------
631636
# Callback that composes a figure from multiple trace sources.
632637

633-
app.clientside_callback(
638+
self._clientside_callback(
634639
"""
635640
function update_figure(img_traces, indicators, ori_figure) {
636641

0 commit comments

Comments
 (0)