|
8 | 8 | "source": [ |
9 | 9 | "from math import pow, cos, pi, radians, degrees, atan, tan, sinh, log\n", |
10 | 10 | "from ipywidgets import Image, Output, IntSlider\n", |
11 | | - "from ipycanvas import Canvas, MultiCanvas" |
| 11 | + "from ipycanvas import Canvas, MultiCanvas\n", |
| 12 | + "from ipyevents import Event\n", |
| 13 | + "import asyncio" |
| 14 | + ] |
| 15 | + }, |
| 16 | + { |
| 17 | + "cell_type": "code", |
| 18 | + "execution_count": null, |
| 19 | + "metadata": {}, |
| 20 | + "outputs": [], |
| 21 | + "source": [ |
| 22 | + "class Timer:\n", |
| 23 | + " def __init__(self, timeout, callback):\n", |
| 24 | + " self._timeout = timeout\n", |
| 25 | + " self._callback = callback\n", |
| 26 | + " self._task = asyncio.ensure_future(self._job())\n", |
| 27 | + "\n", |
| 28 | + " async def _job(self):\n", |
| 29 | + " await asyncio.sleep(self._timeout)\n", |
| 30 | + " self._callback()\n", |
| 31 | + "\n", |
| 32 | + " def cancel(self):\n", |
| 33 | + " self._task.cancel()\n", |
| 34 | + "\n", |
| 35 | + "def debounce(wait):\n", |
| 36 | + " \"\"\" Decorator that will postpone a function's\n", |
| 37 | + " execution until after wait seconds\n", |
| 38 | + " have elapsed since the last time it was invoked. \"\"\"\n", |
| 39 | + " def decorator(fn):\n", |
| 40 | + " def debounced(*args, **kwargs):\n", |
| 41 | + " def call_it():\n", |
| 42 | + " fn(*args, **kwargs)\n", |
| 43 | + " try:\n", |
| 44 | + " debounced.t.cancel()\n", |
| 45 | + " except(AttributeError):\n", |
| 46 | + " pass\n", |
| 47 | + " debounced.t = Timer(wait, call_it)\n", |
| 48 | + " return debounced\n", |
| 49 | + " return decorator" |
12 | 50 | ] |
13 | 51 | }, |
14 | 52 | { |
|
166 | 204 | " self.dragging = True\n", |
167 | 205 | " self.x_mouse = pixel_x\n", |
168 | 206 | " self.y_mouse = pixel_y\n", |
169 | | - " \n", |
| 207 | + " \n", |
| 208 | + " @debounce(0.01)\n", |
170 | 209 | " def mouse_move_handler(self, pixel_x, pixel_y):\n", |
171 | 210 | " if self.dragging:\n", |
172 | 211 | " x, y, lat, lon = self.delta(pixel_x, pixel_y)\n", |
|
205 | 244 | "metadata": {}, |
206 | 245 | "outputs": [], |
207 | 246 | "source": [ |
208 | | - "slider = IntSlider(description='Zoom:', value=m.z, min=3, max=10, step=1)\n", |
| 247 | + "d = Event(source=m, watched_events=['wheel'])\n", |
209 | 248 | "\n", |
210 | | - "def on_slider_change(change):\n", |
211 | | - " m.z = slider.value\n", |
| 249 | + "@out.capture()\n", |
| 250 | + "def zoom(event):\n", |
| 251 | + " m.z -= event['deltaY'] // 3\n", |
| 252 | + " m.z = max(m.z, 1)\n", |
| 253 | + " m.z = min(m.z, 19)\n", |
| 254 | + " print(m.z)\n", |
212 | 255 | " m.tile_nb = numTiles(m.z)\n", |
213 | 256 | " m.x, m.y = latlon2xy(m.lat, m.lon, m.z)\n", |
214 | 257 | " m.show()\n", |
215 | 258 | "\n", |
216 | | - "slider.observe(on_slider_change, 'value')\n", |
217 | | - "slider" |
| 259 | + "d.on_dom_event(zoom)" |
218 | 260 | ] |
219 | 261 | }, |
220 | 262 | { |
|
243 | 285 | "name": "python", |
244 | 286 | "nbconvert_exporter": "python", |
245 | 287 | "pygments_lexer": "ipython3", |
246 | | - "version": "3.7.3" |
| 288 | + "version": "3.8.1" |
247 | 289 | } |
248 | 290 | }, |
249 | 291 | "nbformat": 4, |
250 | | - "nbformat_minor": 2 |
| 292 | + "nbformat_minor": 4 |
251 | 293 | } |
0 commit comments