code: def on_mouse_move(self, event):
      if event.is_dragging and not event.modifiers:
          dx = (event.pos - event.last_event.pos) * [1, -1]
          i, j = event.press_event.pos / self.size
          m, n = len(self.cells), len(self.cells[0])
          cell = self.cells[int(i * m)][n - 1 - int(j * n)]
          if event.press_event.button == 1:
              offset = np.array(cell.offset) + (
                  dx / (np.array(self.size) / [m, n])
              ) * (2 / np.array(cell.scale))
              cell.set_transform(offset, cell.scale)
  
          else:
              cell.set_transform(cell.offset, cell.scale * 1.05**dx)
          self.update()
  
imports: from __future__ import division
  import numpy
  from vispy import gloo, app, scene, visuals
  from vispy.util.profiler import Profiler
label_desc: Use image node_id 3 for calling the GridCanvas obj's underlying member method code with example usage: obj.on_mouse_move(event) without return types