code: def on_mouse_move(self, event):
      if event.is_dragging and not event.modifiers:
          dx = np.array(event.pos - event.last_event.pos)
          x, y = event.press_event.pos / self.size
          m, n = self.grid_size
          i, j = int(x * m), n - 1 - int(y * n)
          v = self.visuals[i][j]
          tr = v.transform
          if event.press_event.button == 1:
              tr.translate = np.array(tr.translate)[
                  :2
              ] + dx * scales * (1, -1)
  
          else:
              tr.scale = tr.scale[:2] * 1.05 ** (dx * (1, -1))
          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 VisualCanvas obj's underlying member method code with example usage: obj.on_mouse_move(event) without return types