"""
Demonstrate the use of the BboxPatch, BboxConnector.

Note that the example does not work correctly if the figure size changes interactively.
"""

import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.transforms import blended_transform_factory, TransformedBbox
from mpl_toolkits.axes_grid.inset_locator import BboxPatch, BboxConnector




class BboxConnectorPatch(BboxConnector):

    def __init__(self, bbox1, bbox2, loc1a, loc2a, loc1b, loc2b, **kwargs):
        if "transform" in kwargs:
            raise ValueError("trnasform should nt be set")

        BboxConnector.__init__(self, bbox1, bbox2, loc1a, loc2a, **kwargs)
        self.loc1b = loc1b
        self.loc2b = loc2b


    def get_path(self):
        path1 = self.connect_bbox(self.bbox1, self.bbox2,
                                  self.loc1, self.loc2)

        path2 = self.connect_bbox(self.bbox2, self.bbox1,
                                  self.loc2b, self.loc1b)

        path_merged = list(path1.vertices) + list (path2.vertices) + [path1.vertices[0]]

        return Path(path_merged)
    

if 1:

    ax1 = plt.subplot(211)
    ax2 = plt.subplot(212)


    #def update_transform(fig):

    # add bbox in upper axes (ax1)
    tt = ax2.transScale + ax2.transLimits + ax1.transAxes
    trans = blended_transform_factory(ax1.transData, tt)

    mybbox = TransformedBbox(ax2.viewLim, trans)
    bbox_patch = BboxPatch(mybbox, alpha=0.2)
    ax1.add_patch(bbox_patch)


    # add connecting lines in lower axes (ax2)

    patch_props=dict(ec="b", alpha=0.5)


    # connect lower-left corner (loc1=3) of mybbox to upper-left
    # corner (loc2=2) of ax2.bbox
    c1 = BboxConnector(mybbox, ax2.bbox, loc1=3, loc2=2, **patch_props)
    c1.set_clip_on(False)
    ax2.add_patch(c1)

    # connect lower-right corner (loc1=4) of mybbox to upper-right
    # corner (loc2=1) of ax2.bbox
    c2 = BboxConnector(mybbox, ax2.bbox, loc1=4, loc2=1, **patch_props)
    c2.set_clip_on(False)
    ax2.add_patch(c2)

    # a polygon patch.
    p = BboxConnectorPatch(mybbox, ax2.bbox,
                           loc1a=3, loc2a=2,
                           loc1b=4, loc2b=1,
                           fc="b", ec="none", alpha=0.1)
    p.set_clip_on(False)
    ax2.add_patch(p)

    # adjust the xlim
    ax2.set_xlim(0.3, 0.5)

    ax1.set_title("try pan/zoom each axes")
    plt.show()
