# Add the igl library to the modules search path
import sys, os
sys.path.insert(0, os.getcwd() + "/../")

import pyigl as igl
import nanogui

V1 = igl.eigen.MatrixXd()
F1 = igl.eigen.MatrixXi()

V2 = igl.eigen.MatrixXd()
F2 = igl.eigen.MatrixXi()

float_variable = 0.1
bool_variable = True
dir = 0


def make_accessors(name):
    def setter(value):
        globals()[name] = value

    def getter():
        return globals()[name]
    return setter, getter


def viewer_init(viewer):
    # add new group
    viewer.ngui.addGroup("New Group")

    # Expose the using general callback
    viewer.ngui.addDoubleVariable("double", *make_accessors("float_variable"))

    def setter(val):
        global bool_variable
        bool_variable = val

    def getter():
        global bool_variable
        return bool_variable

    # ... or using a custom callback
    viewer.ngui.addBoolVariable("bool", setter, getter)

    viewer.ngui.addEnumVariable("Direction", *make_accessors("dir")) \
        .setItems(["Up", "Down", "Left", "Right"])

    # Add a button
    def cb():
        print("Hello")
    viewer.ngui.addButton("Print Hello", cb)

    #Add an additional menu window
    viewer.ngui.addWindow(nanogui.Vector2i(220, 10), "New Window")

    # add accessor
    viewer.ngui.addDoubleVariable("double", *make_accessors("float_variable"))

    #Generate menu
    viewer.screen.performLayout()

    return False



def main():
    # Load a mesh in OFF format
    igl.readOFF("../../tutorial/shared/bunny.off", V1, F1)

    # Init the viewer
    viewer = igl.viewer.Viewer()

    # Extend viewer menu
    viewer.callback_init = viewer_init

    # Plot the mesh
    viewer.data.set_mesh(V1, F1)
    viewer.launch()


if __name__ == "__main__":
    main()