'Mouse moving
button-1 rotates by default.  Can be set explicitly in mouse_init().
button-3 zooms by default.  Can be set explicitly in mouse_init().'

def _on_move(self, event):

    if (not self.button_pressed):
        return
    if (self.M is None):
        return
    (x, y) = (event.xdata, event.ydata)
    if (x is None):
        return
    (dx, dy) = ((x - self.sx), (y - self.sy))
    w = self._pseudo_w
    h = self._pseudo_h
    (self.sx, self.sy) = (x, y)
    if (self.button_pressed in self._rotate_btn):
        if ((dx == 0) and (dy == 0)):
            return
        self.elev = art3d.norm_angle((self.elev - ((dy / h) * 180)))
        self.azim = art3d.norm_angle((self.azim - ((dx / w) * 180)))
        self.get_proj()
        self.figure.canvas.draw_idle()
    elif (self.button_pressed in self._zoom_btn):
        (minx, maxx, miny, maxy, minz, maxz) = self.get_w_lims()
        df = (1 - ((h - dy) / h))
        dx = ((maxx - minx) * df)
        dy = ((maxy - miny) * df)
        dz = ((maxz - minz) * df)
        self.set_xlim3d((minx - dx), (maxx + dx))
        self.set_ylim3d((miny - dy), (maxy + dy))
        self.set_zlim3d((minz - dz), (maxz + dz))
        self.get_proj()
        self.figure.canvas.draw_idle()
