From 2560ce1acb0ecb910cc8f9045b0019f04cbf63d8 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Mon, 6 Apr 2015 17:50:54 +0300 Subject: client: return zoom buttons, make zoom conserve center point --- src/client/buttons.js | 34 ++++++++++++++++++++++++++++++++++ src/client/view/graph_view.js | 10 ++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/client/buttons.js b/src/client/buttons.js index 8a0b6b7d..00554c8b 100644 --- a/src/client/buttons.js +++ b/src/client/buttons.js @@ -214,5 +214,39 @@ $('#btn_rzdoc__open').click(function() { cmd_bar.fadeToggle(400); }); +function log_scale(max_in, min_out, max_out) { + var t = (min_out * max_out - 1) / (min_out + max_out - 2), + k = 1 / max_in * Math.log((max_out - t) / (1 - t)); + + return function (x) { return (1 - t) * Math.exp(x * k) + t; }; +} + +function exp_scale(max_in, min_out, max_out) { + var t = (min_out * max_out - 1) / (min_out + max_out - 2), + k = 1 / max_in * Math.log((max_out - t) / (1 - t)); + + return function (y) { return (1 / k) * Math.log((y - t) / (1 - t)); }; +} + +function clip(min, max, v) { + return Math.max(min, Math.min(max, v)); +} + +var zoom_range = 10, + zoom_min = 0.1, + zoom_max = 3, + zoom_exp_to_linear = exp_scale(zoom_range, zoom_min, zoom_max); + +$('#btn_zoom_in').asEventStream('click') + .map(1) + .merge($('#btn_zoom_out').asEventStream('click').map(-1)) + .map(function (change) { + return clip(-zoom_range, zoom_range, zoom_exp_to_linear(rz_core.main_graph_view.zoom_obj.scale()) + change); + }) + .map(log_scale(zoom_range, zoom_min, zoom_max)) + .onValue(function (val) { + rz_core.main_graph_view.scale__absolute(val); + }); + return {'buttons': 'nothing here'}; }); // define diff --git a/src/client/view/graph_view.js b/src/client/view/graph_view.js index 9bafc620..f6be8ebf 100644 --- a/src/client/view/graph_view.js +++ b/src/client/view/graph_view.js @@ -828,8 +828,14 @@ function GraphView(spec) { } gv.__set_scale_translate = set_scale_translate; - var scale__absolute = function (scale) { - set_scale_translate(scale, zoom_obj.translate()); + var scale__absolute = function (new_scale) { + var t = zoom_obj.translate(), + s = zoom_obj.scale(), + ds = new_scale - s, + w = window.innerWidth, + h = window.innerHeight; + + set_scale_translate(new_scale, [t[0] - ds * w / 2, t[1] - ds * h / 2]); } gv.scale__absolute = scale__absolute; -- cgit v1.3.1