matplotlib / ipympl

Matplotlib Jupyter Integration
https://matplotlib.org/ipympl/
BSD 3-Clause "New" or "Revised" License
1.57k stars 227 forks source link

Resizing extends outside the bounds of the notebook #242

Open ianhi opened 4 years ago

ianhi commented 4 years ago

Describe the issue

If you drag the resize handle outside the limits of the notebook and release the mouse you lose the ability to resize as the handle will be hidden: wonky-resize

This is a consequence of using a window mouse move listener: https://github.com/matplotlib/ipympl/blob/6b44a6f90cf74b12cfcf930b440010984d8a9b4d/js/src/mpl_widget.js#L272

Maybe there could be a check that it won't be resized to be larger the layout (this.model.get('layout'))?

Versions

 3.7.6 (default, Jan  8 2020, 19:59:22) 
[GCC 7.3.0]
ipympl version: 0.5.6
jupyter core     : 4.6.1
jupyter-notebook : 6.0.3
qtconsole        : 4.6.0
ipython          : 7.12.0
ipykernel        : 5.1.4
jupyter client   : 5.3.4
jupyter lab      : 2.1.5
nbconvert        : 5.6.1
ipywidgets       : 7.5.1
nbformat         : 5.0.4
traitlets        : 4.3.3
Known nbextensions:
  config dir: /home/ian/anaconda3/etc/jupyter/nbconfig
    notebook section
      jupyter-matplotlib/extension  enabled 
      - Validating: OK
      nbdime/index  enabled 
      - Validating: OK
      voila/extension  enabled 
      - Validating: OK
      jupyter-js-widgets/extension  enabled 
      - Validating: OK
JupyterLab v2.1.5
Known labextensions:
   app dir: /home/ian/anaconda3/share/jupyter/lab
        @axlair/jupyterlab_vim v0.12.2  enabled  OK
        @jupyter-widgets/jupyterlab-manager v2.0.0  enabled  OK
        @jupyter-widgets/jupyterlab-sidecar v0.5.0  enabled  OK
        @jupyterlab/git v0.20.0-rc.0  enabled  OK
        jupyter-matplotlib v0.7.2  enabled  OK
        jupyterlab_vim-system-clipboard-support v0.1.0  enabled  OK
        nbdime-jupyterlab v2.0.0  enabled  OK
martinRenou commented 4 years ago

Thanks for reporting this! That's indeed not very convenient.

Maybe there could be a check that it won't be resized to be larger the layout (this.model.get('layout'))?

That might not do it, because if this.model.get('layout').get('width') is 50%, you need to know what it represents in terms of pixels. So we might need to look at its container size as well.