{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Custom controls example\n\nPlugging new conrols / actions in Anatomist views\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import anatomist.direct.api as anatomist\nfrom soma import aims\nfrom soma.aims import colormaphints\nimport sys\nimport os\nimport math\nsys.path.insert(0, '.')\n\n\n# use the right version of Qt and of its python bindings (PyQt4/5/PySide)\nfrom soma.qt_gui.qt_backend import QtCore, QtGui, loadUi\n\n# do we have to run QApplication ?\nif QtGui.qApp.startingUp() and 'IPython' not in sys.modules:\n    runqt = True\nelse:\n    runqt = False\n\nimport sphere\n\nselmesh = None\nselanamesh = None\n\n\nclass MyAction(anatomist.cpp.Action):\n\n    def name(self):\n        return 'MyAction'\n\n    def resetRadius(self):\n        print('reset radius to 1')\n        s.setRadius(1.)\n\n    def startMoveRadius(self, x, y, globx, globy):\n        print('start move radius', x, y)\n        self._initial = (x, y)\n        self._radius = s.radius()\n\n    def endMoveRadius(self, x, y, globx, globy):\n        print('end move radius', x, y)\n\n    def moveRadius(self, x, y, globx, globy):\n        print('move radius', x, y)\n        s.setRadius(math.exp(0.01 * (self._initial[1] - y)) * self._radius)\n\n    def takePolygon(self, x, y, globx, globy):\n        # print('takePolygon', x, y)\n\n        print('coucou', x, y)\n\n        w = self.view().aWindow()\n        obj = w.objectAtCursorPosition(x, y)\n        # print('object:', obj)\n        if obj is not None:\n            print('object:', obj, obj.name())\n            poly = w.polygonAtCursorPosition(x, y, obj)\n            # print('polygon:', poly)\n            mesh = anatomist.cpp.AObjectConverter.aims(obj)\n            # print('mesh:', mesh)\n            ppoly = mesh.polygon()[poly]\n            vert = mesh.vertex()\n            # print(ppoly[0], ppoly[1], ppoly[2])\n            # print(vert[ppoly[0]], vert[ppoly[1]], vert[ppoly[2]])\n            global selmesh, selanamesh\n            if selmesh is None:\n                selmesh = aims.AimsSurfaceTriangle()\n            selmesh.vertex().assign(\n                [vert[ppoly[0]], vert[ppoly[1]], vert[ppoly[2]]])\n            selmesh.polygon().assign([aims.AimsVector_U32_3(0, 1, 2)])\n            if selanamesh is None:\n                selanamesh = anatomist.cpp.AObjectConverter.anatomist(selmesh)\n                a = anatomist.Anatomist()\n                a.execute('SetMaterial', objects=[\n                          selanamesh], diffuse=[0, 0, 1., 1.])\n                a.execute('AddObject', objects=[selanamesh], windows=[w])\n            selanamesh.setChanged()\n            selanamesh.notifyObservers()\n\n\nclass MyControl(anatomist.cpp.Control):\n\n    def __init__(self, prio=25):\n        anatomist.cpp.Control.__init__(self, prio, 'MyControl')\n\n    def eventAutoSubscription(self, pool):\n\n        key = QtCore.Qt\n        NoModifier = key.NoModifier\n        ShiftModifier = key.ShiftModifier\n        ControlModifier = key.ControlModifier\n        AltModifier = key.AltModifier\n\n        self.keyPressEventSubscribe(key.Key_C, NoModifier,\n                                    pool.action('MyAction').resetRadius)\n        self.mouseLongEventSubscribe(key.LeftButton, NoModifier,\n                                     pool.action('MyAction').startMoveRadius,\n                                     pool.action('MyAction').moveRadius,\n                                     pool.action('MyAction').endMoveRadius,\n                                     False)\n        self.mousePressButtonEventSubscribe(key.RightButton, NoModifier,\n                                            pool.action('MyAction').takePolygon)\n\n\na = anatomist.Anatomist()\nqapp = QtGui.QApplication.instance()\npix = QtGui.QPixmap('control.xpm')\nanatomist.cpp.IconDictionary.instance().addIcon('MyControl', pix)\nad = anatomist.cpp.ActionDictionary.instance()\nad.addAction('MyAction', lambda: MyAction())\ncd = anatomist.cpp.ControlDictionary.instance()\ncd.addControl('MyControl', lambda: MyControl(), 25)\ncm = anatomist.cpp.ControlManager.instance()\ncm.addControl('QAGLWidget3D', '', 'MyControl')\n\ns = sphere.ASphere()\na.registerObject(s)\naw = a.createWindow('3D')\na.addObjects([s], [aw])\n\nif 'sphinx_gallery' in sys.modules:\n    # display in matplotlib for sphinx_gallery\n    import matplotlib\n    matplotlib.use('agg', force=True)  # force agg\n    aw.imshow(show=True)\n    runqt = False\n# run Qt\nif runqt:\n    qapp.exec_()\nif runqt or 'sphinx_gallery' in sys.modules:\n    del aw, selanamesh, selmesh, s, ad, cd, cm, pix"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.11.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}