in src/core/main.ts [2234:2413]
function changeScene(scene_index) {
// Assume we are waiting for transitions if there is already one going.
var waitForTransitions = instance._prevTransitioning;
updateNavigationStepper();
var scene_found = false,
i = 0,
scene = globals.scenes[0];
while (!scene_found && i < globals.scenes.length) {
if (globals.scenes[i].s_order === scene_index) {
scene_found = true;
scene = globals.scenes[i];
}
i++;
}
selectWithParent("#timecurve").style("visibility", "hidden");
if (scene.s_representation === "Curve") {
selectWithParent("#timecurve").attr("d", globals.scenes[scene_index].s_timecurve);
timeline_vis.render_path(globals.scenes[scene_index].s_timecurve);
timeline_vis.reproduceCurve();
}
// is the new scene a segmented grid or calendar? if so, re-segment the events
if (scene.s_layout === "Segmented") {
if (scene.s_representation === "Grid") {
globals.segment_granularity = "centuries";
} else if (scene.s_representation === "Calendar") {
globals.segment_granularity = "weeks";
} else {
globals.segment_granularity = getSegmentGranularity(globals.global_min_start_date, globals.global_max_end_date);
}
}
// set a delay for annotations and captions based on whether the scale, layout, or representation changes
if (timeline_vis.tl_scale() !== scene.s_scale || timeline_vis.tl_layout() !== scene.s_layout || timeline_vis.tl_representation() !== scene.s_representation) {
waitForTransitions = true;
instance._prevTransitioning = true;
// how big is the new scene?
determineSize(globals.active_data, scene.s_scale, scene.s_layout, scene.s_representation);
// resize the main svg to accommodate the scene
adjustSvgSize();
// set the scene's scale, layout, representation
timeline_vis.tl_scale(scene.s_scale)
.tl_layout(scene.s_layout)
.tl_representation(scene.s_representation)
// Uses EFFECTIVE_HEIGHT
.height(d3.max([globals.height, scene.s_height, (instance._render_height - globals.margin.top - globals.margin.bottom - getScrollbarWidth())]))
.width(d3.max([globals.width, scene.s_width]));
}
updateRadioBttns(timeline_vis.tl_scale(), timeline_vis.tl_layout(), timeline_vis.tl_representation());
// initilaize scene filter settings
var scene_category_values = [],
scene_facet_values = [],
scene_segment_values = [];
// which categories are shown in the scene?
scene.s_categories[0].forEach(function (item) {
scene_category_values.push(item.__data__);
});
// update the category picker
selectWithParent("#category_picker")
.selectAll("option")
.property("selected", function (d) {
return scene_category_values.indexOf(d) !== -1;
});
// which facets are shown in the scene?
scene.s_facets[0].forEach(function (item) {
scene_facet_values.push(item.__data__);
});
// update the facet picker
selectWithParent("#facet_picker")
.selectAll("option")
.property("selected", function (d) {
return scene_facet_values.indexOf(d) !== -1;
});
// which segments are shown in the scene?
scene.s_segments[0].forEach(function (item) {
scene_segment_values.push(item.__data__);
});
// update the segment picker
selectWithParent("#segment_picker")
.selectAll("option")
.property("selected", function (d) {
return scene_segment_values.indexOf(d) !== -1;
});
// if filters change in "remove" mode, delay annoations and captions until after transition
var scene_filter_set_length = scene_category_values.length + scene_facet_values.length + scene_segment_values.length;
if (scene.s_filter_type === "Hide") {
scene_filter_set_length += 1;
}
if (scene_filter_set_length !== globals.filter_set_length) {
globals.filter_set_length = scene_filter_set_length;
waitForTransitions = true;
instance._prevTransitioning = true;
}
globals.selected_categories = scene.s_categories;
globals.selected_facets = scene.s_facets;
globals.selected_segments = scene.s_segments;
// what type of filtering is used in the scene?
if (scene.s_filter_type === "Hide") {
selectAllWithParent("#filter_type_picker input[name=filter_type_rb]")
.property("checked", function (d) {
return d === "Hide";
});
if (globals.filter_type === "Emphasize") {
globals.dispatch.Emphasize(selectWithParent("#category_picker").select("option"), selectWithParent("#facet_picker").select("option"), selectWithParent("#segment_picker").select("option"));
}
globals.filter_type = "Hide";
globals.dispatch.remove(globals.selected_categories, globals.selected_facets, globals.selected_segments);
} else if (scene.s_filter_type === "Emphasize") {
selectAllWithParent("#filter_type_picker input[name=filter_type_rb]")
.property("checked", function (d) {
return d === "Emphasize";
});
if (globals.filter_type === "Hide") {
globals.active_data = globals.all_data;
globals.dispatch.remove(selectWithParent("#category_picker").select("option"), selectWithParent("#facet_picker").select("option"), selectWithParent("#segment_picker").select("option"));
}
globals.filter_type = "Emphasize";
globals.dispatch.Emphasize(globals.selected_categories, globals.selected_facets, globals.selected_segments);
}
// where is the legend in the scene?
selectWithParent(".legend")
.transition()
.duration(instance._getAnimationStepDuration())
.style("z-index", 1)
.attr("x", scene.s_legend_x)
.attr("y", scene.s_legend_y);
globals.legend_x = scene.s_legend_x;
globals.legend_y = scene.s_legend_y;
main_svg.selectAll(".timeline_caption").remove();
main_svg.selectAll(".timeline_image").remove();
main_svg.selectAll(".event_annotation").remove();
selectAllWithParent(".timeline_event_g").each(function () {
this.__data__.selected = false;
});
selectAllWithParent(".event_span")
.attr("filter", "none")
.style("stroke", "#fff")
.style("stroke-width", "0.25px");
selectAllWithParent(".event_span_component")
.style("stroke", "#fff")
.style("stroke-width", "0.25px");
// delay the appearance of captions and annotations if the scale, layout, or representation changes relative to the previous scene
if (waitForTransitions && timeline_vis.renderComplete) {
//log("Waiting for transitions");
timeline_vis.renderComplete.then(() => instance._loadAnnotations(scene, scene_index));
} else {
instance._loadAnnotations(scene, scene_index);
}
}