import sys
from PyQt5 import Qt
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from vedo import Plotter, Mesh, BoxCutter, dataurl

class MainWindow(Qt.QMainWindow):

    def __init__(self, parent=None):

        Qt.QMainWindow.__init__(self, parent)
        self.frame = Qt.QFrame()
        self.layout = Qt.QVBoxLayout()
        self.vtkWidget = QVTKRenderWindowInteractor(self.frame)

        # Create renderer and add the vedo objects and callbacks
        self.plt = Plotter(qt_widget=self.vtkWidget)
        mesh = Mesh(dataurl+'cow.vtk')
        self.cutter = BoxCutter(mesh)
        self.plt += [mesh, self.cutter]
        self.plt.show()

        box_cutter_button_on = Qt.QPushButton("Start the box cutter")
        box_cutter_button_on.clicked.connect(self.ctool_start)

        box_cutter_button_off = Qt.QPushButton("Stop the box cutter")
        box_cutter_button_off.clicked.connect(self.ctool_stop)

        # Set-up the rest of the Qt window
        self.layout.addWidget(self.vtkWidget)
        self.layout.addWidget(box_cutter_button_on)
        self.layout.addWidget(box_cutter_button_off)
        self.frame.setLayout(self.layout)
        self.setCentralWidget(self.frame)
        self.show()

    def ctool_start(self):
        self.cutter.on()

    def ctool_stop(self):
        self.cutter.off()

    def on_close(self):
        #Disable the interactor before closing to prevent it
        #from trying to act on already deleted items
        self.vtkWidget.close()

if __name__ == "__main__":
    app = Qt.QApplication(sys.argv)
    window = MainWindow()
    app.aboutToQuit.connect(window.on_close) # <-- connect the onClose event
    app.exec_()
