"""
Dieses Skript ist das Hauptskript, in das alle Module importiert werden.


"""

import sys
import os
import math
import time

from PyQt5 import QtWidgets
from Classes import Verschneidung, Werkzeug
import json
import numpy as np
import pandas as pd

from PyQt5.QtGui import QIcon, QKeySequence, QFont, QFontMetrics

from PyQt5.QtCore import (
QObject,
QRunnable,
QThreadPool,
QTimer,
pyqtSignal,
pyqtSlot,

)

from PyQt5.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QVBoxLayout,
    QLabel,
    QMainWindow,
    QWidget,
    QPushButton,
    QAction,
    QFileDialog,
    QPlainTextEdit,
    QTextEdit,
    QTabWidget,
)
from LayoutElements.gcodeEditor import gcodeEditor
from LayoutElements.menubar import menubar
from LayoutElements.plotErstellung import plotErstellung


from LayoutElements.setupTabmenu import setupTabmenu, test_class           #Tabmenü, in dem die Parameter eingegeben werden können
test_class1 = test_class()
#tabdemo1=tabdemo()                             #hier habe ich versucht die Klasse tabdemo(QTabWidget) aus settings_tabmenu.py zu generieren. Aktuell noch Schwierigkeiten
from plot_tabmenu import secondtabdemo          # Tabmenü, das den G-Code und die Plots enthält
from matplotlib_settings import MplCanvas
from matplotlib_settings import TwoDim_MplCanvas

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
import matplotlib.backends
from matplotlib.backends import *
import matplotlib.backends.backend_pdf
import matplotlib.backends.backend_svg

from stl import mesh
from mpl_toolkits import mplot3d
#tabtest = tabdemo()


matplotlib.use('Qt5Agg')
#neues Kommentar zum Test für gitlab




class MainWindow(QMainWindow):
    """
    Diese Klasse definiert die Benutzeroberfläche. Hier wird angegeben, wie die GUI dargestellt werden soll.

    """

    def __init__(self):
        super().__init__()

        self.threadpool = QThreadPool()


        self.thisPlots = plotErstellung(self,namePlot=None)
        self.thisGcodeEditor = gcodeEditor()  
        self.thisMenuBar = menubar(self)  
        self.thisSettings = tabdemo()                         #GCode Editor ist als eigene Klasse implementiert

        self.setWindowTitle("My App")   #Titel der Anwendung


        """
        Im Folgenden wird das Layout definiert. Die nachfolgenden Zeilen sind schwer verständlich. Daher wird empfohlen, die Präsentation Layoutgestaltung_GUI.pptx
        zu studieren. Hier erhält man einen wunderbaren Überblick, wie die Layouts miteinander verschachtelt werden
        """
        layout1 = QVBoxLayout()         #layout 1 ist gesamtes Layout
        
        
        layout = QHBoxLayout()          #layout enthält links Tabmenü (G_Code, Plots), Plots in Mitte und Layout2 rechts

        #layout.addWidget(secondtabdemo()) # optionales tabmenü links angeordnet
        layout.addWidget(self.thisGcodeEditor)
        layout.addWidget(self.thisPlots.sc)      # matplotlib canvas 3D
        #layout.addWidget(self.sc2)     # matplotlib canvas 2D

        
        layout2 = QVBoxLayout()         #layout2 ist rechts
        layout2.addWidget(self.thisSettings)    #tabdemo = Settings Tabmenü, in dem die Parameter definiert werden


        layout3 = QHBoxLayout()         #Layout 3 ist rechts in Layout 2 integriert und enthält die horizontalen Buttons
        
        self.set_settings_button = QPushButton("Erzeuge Plots")
        #self.set_settings_button.clicked.connect(self.plot_settings)
        self.set_settings_button.clicked.connect(lambda: self.thisPlots.plot_kantenvektoren)
        self.set_settings_button.clicked.connect(lambda: self.thisPlots.update_canvas)        #notwendig, damit der Plot automatisch angezeigt wird
        
        layout3.addWidget(self.set_settings_button)
        layout3.addWidget(QPushButton("Abbrechen"))
        
        layout2.addLayout(layout3)

        layout.addLayout(layout2)
        
        layout1.addWidget(self.thisPlots.toolbar)      #Toolbar für Matplotlib
        layout1.addLayout(layout)

        layout1.addWidget(QPushButton("QVButton3"))     #unterer Button

        #Die GUI wird in einem QWidget definiert, das als Layout das layout1 hat
        widget = QWidget()
        widget.setLayout(layout1)
        self.setCentralWidget(widget)

        #Diesen Teil vorerst ignorieren. Die Funktionen sollen mehrere STLs gleichzeitig importieren, um eine Hüllkurve zu erzeugen

        #src = ('C:/Users/felix/PycharmProjects/PTW_PyQt5/Matplotlib/STL/Sweep')
        #os.chdir(src)

        #for dirpath, dirnames, filenames in os.walk(src):
        #    # print(filenames)
        #    for file in filenames:
        #        file_num = (os.path.splitext(file)[0][-3:])   #Nummern separat ausgeben: 000, ..., 089
        #        #print(file_num)
        #    for i in range(verschneidung.n_points):
        #        i_num = f'0{i}'
        #        #print(i_num)

        #        if str(i_num) == str(file_num):
        #            print(file)
                    #  self.sc.axes.add_collection3d(mplot3d.art3d.Poly3DCollection(mesh.Mesh.from_file(file).vectors))


app = QApplication(sys.argv)
#app.setFont("Times")
window = MainWindow()
window.show()

app.exec_()
