# -*- coding: utf-8 -*-
"""
Simple example showing the creation of a Qt application with the NodeWidget as
the one and only widget in the application. This example also uses the default
Node library.
"""

# append the path to allow usage of nodeworks outside of python's sitepackages
import sys
sys.path.append('../')

# import qt, qtpy is a PySide/PyQt4/PyQt5 interface that uses Qt5 syntax
# > pip install qtpy
from qtpy import QtWidgets, QtCore

# Import nodeworks
from nodeworks import NodeWidget


class MainWindow(QtWidgets.QMainWindow):
    def closeEvent(self, *args, **kwargs):
        QtWidgets.qApp.quit()
        QtWidgets.QMainWindow.closeEvent(self, *args, **kwargs)


def openTab():
    nodechart = NodeWidget(showtoolbar=True, threaded=True)

    # Build default node library
    nodechart.nodeLibrary.buildDefaultLibrary()
    if nodechart.open() != 0:
        tabWidget.addTab(nodechart, nodechart.getName())


def newTab():
    nodechart = NodeWidget(showtoolbar=True)
    # Build default node library
    nodechart.nodeLibrary.buildDefaultLibrary()
    tabWidget.addTab(nodechart, "Untitled")


def removeCurrentTab():
    tabWidget.currentWidget().deleteAllNodes()
    tabWidget.currentWidget().deleteLater()
    tabWidget.removeTab(tabWidget.currentIndex())


def saveCurrentTab():
    tabWidget.currentWidget().save()
    tabWidget.setTabText(
        tabWidget.currentIndex(), tabWidget.currentWidget().getName())


def clearCurrentTab():
    tabWidget.currentWidget().deleteAllNodes()


def reloadLibrary():
    tabWidget.currentWidget().reloadLibrary()


def fitInView(self):
    tabWidget.currentWidget().preview.fitInView(
        tabWidget.currentWidget().scene.itemsBoundingRect(),
        QtCore.Qt.KeepAspectRatio)


def showPreviewDialog():

    # if the preview is not created - create one
    if not tabWidget.currentWidget().isPreviewCreated():
        tabWidget.currentWidget().createPreviewView()

    # add the preview to the layout
    previewLayout.addWidget(tabWidget.currentWidget().preview)

    # show/hide the dialog
    if previewDialog.isVisible():
        previewDialog.hide()
    else:
        previewDialog.show()

    tabWidget.currentWidget().previewFitInView()


def toggleLines():
    tabWidget.currentWidget().toggleLines()


def centerSheet():
    tabWidget.currentWidget().centerSheet()


def tabChanged(index):

    # remove existing preview
    item = previewLayout.takeAt(0)
    if item:
        item.widget().hide()
        previewLayout.removeWidget(item.widget())

    # add the selected tabs preview
    if not tabWidget.widget(index).isPreviewCreated():
        tabWidget.widget(index).createPreviewView()
    item = tabWidget.widget(index).preview
    previewLayout.addWidget(item)
    item.show()

    debugAction.setChecked(tabWidget.currentWidget().getDebugMode())


def toggleSnapToGrid():
    snapAction.setChecked(False)
    if tabWidget.currentWidget().snapToGrid:
        tabWidget.currentWidget().toggleSnapToGrid()
    else:
        gridSize = QtWidgets.QInputDialog.getInt(
            tabWidget, 'Grid Size', 'Grid Size', 10, 0)
        if gridSize[1]:
            tabWidget.currentWidget().toggleSnapToGrid()
            tabWidget.currentWidget().setGridSize(gridSize[0])
            snapAction.setChecked(True)


def toggleDebugMode():
    tabWidget.currentWidget().setDebugMode(debugAction.isChecked())


def main():
    # Create a Qt App
    app = QtWidgets.QApplication(sys.argv)

    # initialize the node widget
    global tabWidget
    tabWidget = QtWidgets.QTabWidget()
    newTab()

    # Create preview dialog
    global previewDialog
    previewDialog = QtWidgets.QDialog(
        tabWidget, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint)
    previewDialog.setFixedSize(200, 200)
    previewDialog.setWindowTitle('Preview')
    global previewLayout
    previewLayout = QtWidgets.QVBoxLayout(previewDialog)
    previewLayout.setContentsMargins(0, 0, 0, 0)

    tabWidget.currentChanged.connect(tabChanged)

    # Create a menu bar
    global menu
    menu = QtWidgets.QMenuBar()
    fileMenu = menu.addMenu('&File')
    viewMenu = menu.addMenu('&View')

    # Open Action
    openAction = QtWidgets.QAction('&Open', menu)
    openAction.setShortcut('Ctrl+O')
    openAction.setStatusTip('Open a Node Chart')
    openAction.triggered.connect(openTab)
    fileMenu.addAction(openAction)

    # New Action
    newAction = QtWidgets.QAction('&New', menu)
    newAction.setShortcut('Ctrl+N')
    newAction.setStatusTip('Create a new Node Chart')
    newAction.triggered.connect(newTab)
    fileMenu.addAction(newAction)

    # Save Action
    saveAction = QtWidgets.QAction('&Save', menu)
    saveAction.setShortcut('Ctrl+S')
    saveAction.setStatusTip('Save a Node Chart')
    saveAction.triggered.connect(saveCurrentTab)
    fileMenu.addAction(saveAction)

    # Close Action
    closeAction = QtWidgets.QAction('&Close', menu)
    closeAction.setStatusTip('Close Current Node Chart')
    closeAction.triggered.connect(removeCurrentTab)
    fileMenu.addAction(closeAction)

    # Clear Action
    clearAction = QtWidgets.QAction('&Clear', menu)
    clearAction.setStatusTip('Clear a Node Chart')
    clearAction.triggered.connect(clearCurrentTab)
    fileMenu.addAction(clearAction)

    # Reload Action
    reloadAction = QtWidgets.QAction('&Reload Libraries', menu)
    reloadAction.setStatusTip('Reload the libraries')
    reloadAction.triggered.connect(reloadLibrary)
    fileMenu.addAction(reloadAction)

    # Preview Dialog
    previewAction = QtWidgets.QAction('&Show/Hide Preview', menu)
    previewAction.setStatusTip('Show preview dialog')
    previewAction.triggered.connect(showPreviewDialog)
    viewMenu.addAction(previewAction)

    # Toggle Connection Action
    toggleAction = QtWidgets.QAction('&Toggle Lines/Splines', menu)
    toggleAction.setStatusTip('Toggle line or spline connections')
    toggleAction.triggered.connect(toggleLines)
    viewMenu.addAction(toggleAction)

    # Center Sheet Action
    centerAction = QtWidgets.QAction('&Fit to View', menu)
    centerAction.setStatusTip('Fit flow sheet to view')
    centerAction.triggered.connect(centerSheet)
    viewMenu.addAction(centerAction)

    # Snap to Grid Action
    global snapAction
    snapAction = QtWidgets.QAction('&Snap to Grid', menu)
    snapAction.setStatusTip('Snap to Grid')
    snapAction.setCheckable(True)
    snapAction.triggered.connect(toggleSnapToGrid)
    viewMenu.addAction(snapAction)

    # Toggle debug mode
    global debugAction
    debugAction = QtWidgets.QAction('&Debug Mode', menu)
    debugAction.setStatusTip('Debug Mode')
    debugAction.setCheckable(True)
    debugAction.triggered.connect(toggleDebugMode)
    viewMenu.addAction(debugAction)

    # add separator
    fileMenu.addSeparator()

    # Exit Action
    exitAction = QtWidgets.QAction('&Exit', menu)
    exitAction.setShortcut('Ctrl+Q')
    exitAction.setStatusTip('Exit application')
    exitAction.triggered.connect(QtWidgets.qApp.quit)
    fileMenu.addAction(exitAction)

    # create the main window
    mainwindow = MainWindow()
    mainwindow.setCentralWidget(tabWidget)
    mainwindow.setMenuBar(menu)
    mainwindow.setGeometry(200, 200, 800, 500)
    mainwindow.setWindowTitle('Nodeworks')
    mainwindow.show()

    # Start Qt Event Loop
    app.exec_()
    app.deleteLater()
    sys.exit()

if __name__ == '__main__':
    main()
