from PyQt5 import QtCore, QtWidgets
from . import TrackWidget
import os
from xml.etree import ElementTree as ET


class Analysis(QtWidgets.QWidget):
    """
    - This class create Analysis Tab in KicadtoNgspice Window. 4 sections -
      - Select Analysis Type
      - AC Analysis
      - DC Analysis
      - Transient Analysis
    - Set various track widget options here, for tracking purposes across \
      different functions and modules -
      - AC_entry_var
      - AC_Parameter
      - DC_entry_var
      - DC_Parameter
      - TRAN_entry_var
      - TRAN_Parameter
      - set_Checkbox
      - AC_type
      - op_check
    """

    def __init__(self, clarg1):
        self.clarg1 = clarg1
        QtWidgets.QWidget.__init__(self)
        self.track_obj = TrackWidget.TrackWidget()
        self.count = 0
        self.parameter_cnt = 0
        self.ac_entry_var = {}
        self.dc_entry_var = {}
        self.tran_entry_var = {}
        self.ac_parameter = {}
        self.dc_parameter = {}
        self.tran_parameter = {}
        self.createAnalysisWidget()

    def createAnalysisWidget(self):
        """
        - Create the main anaylsis widget overwiew:
          - Checkbox for analysis type
          - Place, `AC`, `DC` and `TRANSIENT` analysis tab
          - `self.acbox`, `self.dcbox`, `self.trbox`...
        - Check for `analysis` file, if any in projDir, extract data from it
        - Else set the default checkbox to `TRAN`
        - Accordingly set state for track widget options, as `TRAN`, `AC` ...
        """
        self.grid = QtWidgets.QGridLayout()
        self.setLayout(self.grid)

        self.grid.addWidget(self.createCheckBox(), 0, 0, QtCore.Qt.AlignTop)
        self.grid.addWidget(self.createACgroup(), 1, 0, 5, 0)
        self.grid.addWidget(self.createDCgroup(), 1, 0, 5, 0)
        self.grid.addWidget(self.createTRANgroup(), 1, 0, 5, 0)

        try:
            kicadFile = self.clarg1
            (projpath, filename) = os.path.split(kicadFile)
            if os.path.isfile(os.path.join(projpath, 'analysis')):
                print("Analysis file is present")

            analysisfile = open(os.path.join(projpath, 'analysis'))
            content = analysisfile.readline()
            print("=========================================================")
            print("Content of Analysis file :", content)
            print("=========================================================")
            contentlist = content.split()

            if contentlist[0] == '.ac':
                self.checkAC.setChecked(True)
                self.acbox.setDisabled(False)
                self.dcbox.setDisabled(True)
                self.trbox.setDisabled(True)

                self.acbox.setVisible(True)
                self.dcbox.setVisible(False)
                self.trbox.setVisible(False)
                self.track_obj.set_CheckBox["ITEMS"] = "AC"
                if contentlist[1] == 'lin':
                    self.Lin.setChecked(True)
                    self.track_obj.AC_type["ITEMS"] = "lin"
                elif contentlist[1] == 'dec':
                    self.Dec.setChecked(True)
                    self.track_obj.AC_type["ITEMS"] = "dec"
                elif contentlist[1] == 'oct':
                    self.Oct.setChecked(True)
                    self.track_obj.AC_type["ITEMS"] = "oct"

            elif contentlist[0] == '.dc':
                self.checkDC.setChecked(True)
                self.dcbox.setDisabled(False)
                self.acbox.setDisabled(True)
                self.trbox.setDisabled(True)

                self.dcbox.setVisible(True)
                self.acbox.setVisible(False)
                self.trbox.setVisible(False)
                self.track_obj.set_CheckBox["ITEMS"] = "DC"

            elif contentlist[0] == '.tran':
                self.checkTRAN.setChecked(True)
                self.trbox.setDisabled(False)
                self.acbox.setDisabled(True)
                self.dcbox.setDisabled(True)

                self.trbox.setVisible(True)
                self.dcbox.setVisible(False)
                self.acbox.setVisible(False)
                self.track_obj.set_CheckBox["ITEMS"] = "TRAN"

            elif contentlist[0] == '.op':
                self.checkDC.setChecked(True)
                self.dcbox.setDisabled(False)
                self.acbox.setDisabled(True)
                self.trbox.setDisabled(True)

                self.dcbox.setVisible(True)
                self.acbox.setVisible(False)
                self.trbox.setVisible(False)
                self.check.setChecked(True)
                self.track_obj.set_CheckBox["ITEMS"] = "DC"

        except BaseException:
            self.checkTRAN.setChecked(True)
            self.track_obj.set_CheckBox["ITEMS"] = "TRAN"

        self.show()

    def createCheckBox(self):
        """
        - Create the checkboxes for analysis type, under analysis tab
        - checkbox > checkgrid > checkgroupbtn > checkAC | checkDC | checkTRAN
        - Trigger enableBox on clicking
        """
        self.checkbox = QtWidgets.QGroupBox()
        self.checkbox.setTitle("Select Analysis Type")
        self.checkgrid = QtWidgets.QGridLayout()

        self.checkgroupbtn = QtWidgets.QButtonGroup()
        self.checkAC = QtWidgets.QCheckBox("AC")
        self.checkDC = QtWidgets.QCheckBox("DC")
        self.checkTRAN = QtWidgets.QCheckBox("TRANSIENT")

        self.checkgroupbtn.addButton(self.checkAC)
        self.checkgroupbtn.addButton(self.checkDC)
        self.checkgroupbtn.addButton(self.checkTRAN)
        self.checkgroupbtn.setExclusive(True)
        self.checkgroupbtn.buttonClicked.connect(self.enableBox)

        self.checkgrid.addWidget(self.checkAC, 0, 0)
        self.checkgrid.addWidget(self.checkDC, 0, 1)
        self.checkgrid.addWidget(self.checkTRAN, 0, 2)
        self.checkbox.setLayout(self.checkgrid)

        return self.checkbox

    def enableBox(self):
        """
        - Activate analysis areas according to checkBox marked
        - Add analysis data to track_obj from TrackWidget
        """
        if self.checkAC.isChecked():
            self.acbox.setDisabled(False)
            self.dcbox.setDisabled(True)
            self.trbox.setDisabled(True)

            self.acbox.setVisible(True)
            self.dcbox.setVisible(False)
            self.trbox.setVisible(False)
            self.track_obj.set_CheckBox["ITEMS"] = "AC"

        elif self.checkDC.isChecked():
            self.dcbox.setDisabled(False)
            self.acbox.setDisabled(True)
            self.trbox.setDisabled(True)

            self.dcbox.setVisible(True)
            self.acbox.setVisible(False)
            self.trbox.setVisible(False)
            self.track_obj.set_CheckBox["ITEMS"] = "DC"

        elif self.checkTRAN.isChecked():
            self.trbox.setDisabled(False)
            self.acbox.setDisabled(True)
            self.dcbox.setDisabled(True)

            self.trbox.setVisible(True)
            self.acbox.setVisible(False)
            self.dcbox.setVisible(False)
            self.track_obj.set_CheckBox["ITEMS"] = "TRAN"

    def createACgroup(self):
        """
        - Designing of AC group in analysis tab
        - 3 radio buttons - Lin | Dec | Oct
        - 3 input boxes, with top 2 combos
        - If previous values exist then fill default values from
          previous value xml file
        """
        kicadFile = self.clarg1
        (projpath, filename) = os.path.split(kicadFile)
        project_name = os.path.basename(projpath)
        check = 1

        try:
            f = open(
                os.path.join(
                    projpath,
                    project_name +
                    "_Previous_Values.xml"),
                'r')
            tree = ET.parse(f)
            parent_root = tree.getroot()
            for child in parent_root:
                if child.tag == "analysis":
                    root = child
        except BaseException:
            check = 0
            print("AC Previous Values XML is Empty")

        self.acbox = QtWidgets.QGroupBox()
        self.acbox.setTitle("AC Analysis")
        self.acbox.setDisabled(True)
        self.acbox.setVisible(False)
        self.acgrid = QtWidgets.QGridLayout()
        self.radiobuttongroup = QtWidgets.QButtonGroup()
        self.Lin = QtWidgets.QRadioButton("Lin")
        self.Dec = QtWidgets.QRadioButton("Dec")
        self.Oct = QtWidgets.QRadioButton("Oct")
        self.radiobuttongroup.addButton(self.Lin)
        self.radiobuttongroup.addButton(self.Dec)
        self.radiobuttongroup.addButton(self.Oct)
        self.radiobuttongroup.setExclusive(True)
        self.Lin.setChecked(True)
        self.track_obj.AC_type["ITEMS"] = "lin"
        self.radiobuttongroup.buttonClicked.connect(self.set_ac_type)
        self.acgrid.addWidget(self.Lin, 1, 1)
        self.acgrid.addWidget(self.Dec, 1, 2)
        self.acgrid.addWidget(self.Oct, 1, 3)
        self.acbox.setLayout(self.acgrid)

        self.scale = QtWidgets.QLabel("Scale")
        self.start_fre_lable = QtWidgets.QLabel("Start Frequency")
        self.stop_fre_lable = QtWidgets.QLabel("Stop Frequency")
        self.no_of_points = QtWidgets.QLabel("No.of Points")
        self.acgrid.addWidget(self.scale, 1, 0)
        self.acgrid.addWidget(self.start_fre_lable, 2, 0)
        self.acgrid.addWidget(self.stop_fre_lable, 3, 0)
        self.acgrid.addWidget(self.no_of_points, 4, 0)

        self.count = 0
        self.ac_entry_var[self.count] = QtWidgets.QLineEdit()  # start
        self.acgrid.addWidget(self.ac_entry_var[self.count], 2, 1)
        self.ac_entry_var[self.count].setMaximumWidth(150)
        self.count = self.count + 1
        self.ac_entry_var[self.count] = QtWidgets.QLineEdit()  # stop
        self.acgrid.addWidget(self.ac_entry_var[self.count], 3, 1)
        self.ac_entry_var[self.count].setMaximumWidth(150)
        self.count = self.count + 1
        self.ac_entry_var[self.count] = QtWidgets.QLineEdit()  # no of pts
        self.acgrid.addWidget(self.ac_entry_var[self.count], 4, 1)
        self.ac_entry_var[self.count].setMaximumWidth(150)

        self.parameter_cnt = 0
        self.start_fre_combo = QtWidgets.QComboBox()
        self.start_fre_combo.addItem("Hz",)
        self.start_fre_combo.addItem("KHz")
        self.start_fre_combo.addItem("Meg")
        self.start_fre_combo.addItem("GHz")
        self.start_fre_combo.addItem("THz")
        self.start_fre_combo.setMaximumWidth(150)
        self.acgrid.addWidget(self.start_fre_combo, 2, 2)
        self.ac_parameter[0] = "Hz"

        # Try setting to default value from anaylsis file
        try:
            self.ac_parameter[self.parameter_cnt] = str(root[0][6].text)
        except BaseException:
            self.ac_parameter[self.parameter_cnt] = "Hz"

        # Event listener for combo action
        self.start_fre_combo.activated[str].connect(self.start_combovalue)

        self.parameter_cnt = self.parameter_cnt + 1
        self.stop_fre_combo = QtWidgets.QComboBox()
        self.stop_fre_combo.addItem("Hz")
        self.stop_fre_combo.addItem("KHz")
        self.stop_fre_combo.addItem("Meg")
        self.stop_fre_combo.addItem("GHz")
        self.stop_fre_combo.addItem("THz")
        self.stop_fre_combo.setMaximumWidth(150)
        self.acgrid.addWidget(self.stop_fre_combo, 3, 2)
        self.ac_parameter[1] = "Hz"

        try:
            self.ac_parameter[self.parameter_cnt] = str(root[0][7].text)
        except BaseException:
            self.ac_parameter[self.parameter_cnt] = "Hz"

        self.stop_fre_combo.activated[str].connect(self.stop_combovalue)

        self.track_obj.AC_entry_var["ITEMS"] = self.ac_entry_var
        self.track_obj.AC_Parameter["ITEMS"] = self.ac_parameter

        # CSS
        self.acbox.setStyleSheet(" \
        QGroupBox { border: 1px solid gray; border-radius: 9px; margin-top: \
        0.5em; } \
        QGroupBox::title { subcontrol-origin: margin; left: 10px; padding: \
        0 3px 0 3px; } \
        ")
        if check:
            try:
                if root[0][0].text == "true":
                    self.Lin.setChecked(True)
                    self.Dec.setChecked(False)
                    self.Oct.setChecked(False)
                elif root[0][1].text == "true":
                    self.Lin.setChecked(False)
                    self.Dec.setChecked(True)
                    self.Oct.setChecked(False)
                elif root[0][2].text == "true":
                    self.Lin.setChecked(False)
                    self.Dec.setChecked(False)
                    self.Oct.setChecked(True)

                self.ac_entry_var[0].setText(root[0][3].text)
                self.ac_entry_var[1].setText(root[0][4].text)
                self.ac_entry_var[2].setText(root[0][5].text)
                index = self.start_fre_combo.findText(root[0][6].text)
                self.start_fre_combo.setCurrentIndex(index)
                index = self.stop_fre_combo.findText(root[0][7].text)
                self.stop_fre_combo.setCurrentIndex(index)

            except BaseException:
                print("AC Analysis XML Parse Error")

        return self.acbox

    '''
    - Below 2 functions handle combo value event listeners for
        - start frequency for ac
        - stop frequency for ac
    - And accordingly set the ac_parameters
    '''
    def start_combovalue(self, text):
        """
        - Handle start_fre_combo box event
        - Check where it is Hz, MHz, etc.
        - Accordingly set ac_parameter
        """
        self.ac_parameter[0] = str(text)

    def stop_combovalue(self, text):
        """
        - Handle stop_fre_combo box event
        - Check where it is Hz, MHz, etc.
        - Accordingly set ac_parameter
        """
        self.ac_parameter[1] = str(text)

    def set_ac_type(self):
        """
        Sets track object for AC, according to the type of radio box selected.
        """
        self.parameter_cnt = 0

        if self.Lin.isChecked():
            self.track_obj.AC_type["ITEMS"] = "lin"
        elif self.Dec.isChecked():
            self.track_obj.AC_type["ITEMS"] = "dec"
        elif self.Oct.isChecked():
            self.track_obj.AC_type["ITEMS"] = "oct"

    def createDCgroup(self):
        """
        - Create DC area under analysis tab
        - Source 1 and 2, each having 4 input boxes as follows
            - Source
            - Start
            - Increment
            - Stop
        - The last 3 have combo box pertaining to their unit as well
        - Also in the end a checkbox, for operating system point analysis
        """
        kicadFile = self.clarg1
        (projpath, filename) = os.path.split(kicadFile)
        project_name = os.path.basename(projpath)
        check = 1

        try:
            f = open(
                os.path.join(
                    projpath,
                    project_name +
                    "_Previous_Values.xml"),
                'r')
            tree = ET.parse(f)
            parent_root = tree.getroot()
            for child in parent_root:
                if child.tag == "analysis":
                    root = child
        except BaseException:
            check = 0
            print("DC Previous Values XML is empty")

        self.dcbox = QtWidgets.QGroupBox()
        self.dcbox.setTitle("DC Analysis")
        self.dcbox.setDisabled(True)
        self.dcbox.setVisible(False)
        self.dcgrid = QtWidgets.QGridLayout()
        self.dcbox.setLayout(self.dcgrid)

        self.source_name = QtWidgets.QLabel('Enter Source 1', self)
        self.source_name.setMaximumWidth(150)
        self.start = QtWidgets.QLabel('Start', self)
        self.start.setMaximumWidth(150)
        self.increment = QtWidgets.QLabel('Increment', self)
        self.increment.setMaximumWidth(150)
        self.stop = QtWidgets.QLabel('Stop', self)
        self.stop.setMaximumWidth(150)

        self.source_name2 = QtWidgets.QLabel('Enter Source 2', self)
        self.source_name2.setMaximumWidth(150)
        self.start2 = QtWidgets.QLabel('Start', self)
        self.start2.setMaximumWidth(150)
        self.increment2 = QtWidgets.QLabel('Increment', self)
        self.increment2.setMaximumWidth(150)
        self.stop2 = QtWidgets.QLabel('Stop', self)
        self.stop2.setMaximumWidth(150)

        self.dcgrid.addWidget(self.source_name, 1, 0)
        self.dcgrid.addWidget(self.start, 2, 0)
        self.dcgrid.addWidget(self.increment, 3, 0)
        self.dcgrid.addWidget(self.stop, 4, 0)

        self.dcgrid.addWidget(self.source_name2, 5, 0)
        self.dcgrid.addWidget(self.start2, 6, 0)
        self.dcgrid.addWidget(self.increment2, 7, 0)
        self.dcgrid.addWidget(self.stop2, 8, 0)

        self.count = 0

        self.dc_entry_var[self.count] = QtWidgets.QLineEdit()  # source
        self.dcgrid.addWidget(self.dc_entry_var[self.count], 1, 1)
        self.dc_entry_var[self.count].setMaximumWidth(150)
        self.count += 1

        self.dc_entry_var[self.count] = QtWidgets.QLineEdit()  # start
        self.dcgrid.addWidget(self.dc_entry_var[self.count], 2, 1)
        self.dc_entry_var[self.count].setMaximumWidth(150)
        self.count += 1

        self.dc_entry_var[self.count] = QtWidgets.QLineEdit()  # increment
        self.dcgrid.addWidget(self.dc_entry_var[self.count], 3, 1)
        self.dc_entry_var[self.count].setMaximumWidth(150)
        self.count += 1

        self.dc_entry_var[self.count] = QtWidgets.QLineEdit()  # stop
        self.dcgrid.addWidget(self.dc_entry_var[self.count], 4, 1)
        self.dc_entry_var[self.count].setMaximumWidth(150)
        self.count += 1

        self.dc_entry_var[self.count] = QtWidgets.QLineEdit()  # source
        self.dcgrid.addWidget(self.dc_entry_var[self.count], 5, 1)
        self.dc_entry_var[self.count].setMaximumWidth(150)
        self.count += 1

        self.dc_entry_var[self.count] = QtWidgets.QLineEdit()  # start
        self.dcgrid.addWidget(self.dc_entry_var[self.count], 6, 1)
        self.dc_entry_var[self.count].setMaximumWidth(150)
        self.count += 1

        self.dc_entry_var[self.count] = QtWidgets.QLineEdit()  # increment
        self.dcgrid.addWidget(self.dc_entry_var[self.count], 7, 1)
        self.dc_entry_var[self.count].setMaximumWidth(150)
        self.count += 1

        self.dc_entry_var[self.count] = QtWidgets.QLineEdit()  # stop
        self.dcgrid.addWidget(self.dc_entry_var[self.count], 8, 1)
        self.dc_entry_var[self.count].setMaximumWidth(150)

        self.parameter_cnt = 0
        self.start_combo = QtWidgets.QComboBox(self)
        self.start_combo.setMaximumWidth(150)
        self.start_combo.addItem('Volts or Amperes')
        self.start_combo.addItem('mV or mA')
        self.start_combo.addItem('uV or uA')
        self.start_combo.addItem("nV or nA")
        self.start_combo.addItem("pV or pA")
        self.dcgrid.addWidget(self.start_combo, 2, 2)

        try:
            self.dc_parameter[self.parameter_cnt] = str(root[1][5].text)
        except BaseException:
            self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"

        self.start_combo.activated[str].connect(self.start_changecombo)
        self.parameter_cnt += 1

        self.increment_combo = QtWidgets.QComboBox(self)
        self.increment_combo.setMaximumWidth(150)
        self.increment_combo.addItem("Volts or Amperes")
        self.increment_combo.addItem("mV or mA")
        self.increment_combo.addItem("uV or uA")
        self.increment_combo.addItem("nV or nA")
        self.increment_combo.addItem("pV or pA")
        self.dcgrid.addWidget(self.increment_combo, 3, 2)

        try:
            self.dc_parameter[self.parameter_cnt] = str(root[1][6].text)
        except BaseException:
            self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"

        self.increment_combo.activated[str].connect(self.increment_changecombo)
        self.parameter_cnt += 1

        self.stop_combo = QtWidgets.QComboBox(self)
        self.stop_combo.setMaximumWidth(150)
        self.stop_combo.addItem("Volts or Amperes")
        self.stop_combo.addItem("mV or mA")
        self.stop_combo.addItem("uV or uA")
        self.stop_combo.addItem("nV or nA")
        self.stop_combo.addItem("pV or pA")
        self.dcgrid.addWidget(self.stop_combo, 4, 2)

        try:
            self.dc_parameter[self.parameter_cnt] = str(root[1][7].text)
        except BaseException:
            self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"

        self.stop_combo.activated[str].connect(self.stop_changecombo)
        self.parameter_cnt += 1

        self.start_combo2 = QtWidgets.QComboBox(self)
        self.start_combo2.setMaximumWidth(150)
        self.start_combo2.addItem('Volts or Amperes')
        self.start_combo2.addItem('mV or mA')
        self.start_combo2.addItem('uV or uA')
        self.start_combo2.addItem("nV or nA")
        self.start_combo2.addItem("pV or pA")
        self.dcgrid.addWidget(self.start_combo2, 6, 2)

        try:
            self.dc_parameter[self.parameter_cnt] = str(root[1][12].text)
        except BaseException:
            self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"

        self.start_combo2.activated[str].connect(self.start_changecombo2)
        self.parameter_cnt += 1

        self.increment_combo2 = QtWidgets.QComboBox(self)
        self.increment_combo2.setMaximumWidth(150)
        self.increment_combo2.addItem("Volts or Amperes")
        self.increment_combo2.addItem("mV or mA")
        self.increment_combo2.addItem("uV or uA")
        self.increment_combo2.addItem("nV or nA")
        self.increment_combo2.addItem("pV or pA")
        self.dcgrid.addWidget(self.increment_combo2, 7, 2)

        try:
            self.dc_parameter[self.parameter_cnt] = str(root[1][13].text)
        except BaseException:
            self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"

        self.increment_combo2.activated[str].connect(
            self.increment_changecombo2)
        self.parameter_cnt += 1

        self.stop_combo2 = QtWidgets.QComboBox(self)
        self.stop_combo2.setMaximumWidth(150)
        self.stop_combo2.addItem("Volts or Amperes")
        self.stop_combo2.addItem("mV or mA")
        self.stop_combo2.addItem("uV or uA")
        self.stop_combo2.addItem("nV or nA")
        self.stop_combo2.addItem("pV or pA")
        self.dcgrid.addWidget(self.stop_combo2, 8, 2)

        try:
            self.dc_parameter[self.parameter_cnt] = str(root[1][14].text)
        except BaseException:
            self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"

        self.stop_combo2.activated[str].connect(self.stop_changecombo2)
        self.parameter_cnt += 1

        self.check = QtWidgets.QCheckBox('Operating Point Analysis', self)
        try:
            self.track_obj.op_check.append(
                str(root[1][4].text()))
        except BaseException:
            self.track_obj.op_check.append('0')

        self.check.stateChanged.connect(self.setflag)

        self.dcgrid.addWidget(self.check, 9, 1, 9, 2)
        self.track_obj.DC_entry_var["ITEMS"] = self.dc_entry_var
        self.track_obj.DC_Parameter["ITEMS"] = self.dc_parameter

        # CSS
        self.dcbox.setStyleSheet(" \
        QGroupBox { border: 1px solid gray; border-radius: 9px; margin-top: \
        0.5em; } \
        QGroupBox::title { subcontrol-origin: margin; left: \
        10px; padding: 0 3px 0 3px; } \
        ")
        if check:
            try:
                self.dc_entry_var[0].setText(root[1][0].text)
                self.dc_entry_var[1].setText(root[1][1].text)
                self.dc_entry_var[2].setText(root[1][2].text)
                self.dc_entry_var[3].setText(root[1][3].text)
                index = self.start_combo.findText(root[1][5].text)
                self.start_combo.setCurrentIndex(index)
                index = self.increment_combo.findText(root[1][6].text)
                self.increment_combo.setCurrentIndex(index)
                index = self.stop_combo.findText(root[1][7].text)
                self.stop_combo.setCurrentIndex(index)
                self.dc_entry_var[4].setText(root[1][8].text)
                self.dc_entry_var[5].setText(root[1][9].text)
                self.dc_entry_var[6].setText(root[1][10].text)
                self.dc_entry_var[7].setText(root[1][11].text)
                index = self.start_combo2.findText(root[1][12].text)
                self.start_combo2.setCurrentIndex(index)
                index = self.increment_combo2.findText(root[1][13].text)
                self.increment_combo2.setCurrentIndex(index)
                index = self.stop_combo2.findText(root[1][14].text)
                self.stop_combo2.setCurrentIndex(index)

                if root[1][4].text == 1:
                    self.check.setChecked(True)
                else:
                    self.check.setChecked(False)
            except BaseException:
                print("DC Analysis XML Parse Error")

        return self.dcbox

    # Below 6 functions to handle combo boxes for the DC group
    def start_changecombo(self, text):
        """Handle start combo box, ie. units, as mV, V..."""
        self.dc_parameter[0] = str(text)

    def increment_changecombo(self, text):
        """Handle increment combo box, ie. units, as mV, V..."""
        self.dc_parameter[1] = str(text)

    def stop_changecombo(self, text):
        """Handle stop combo box, ie. units, as mV, V..."""
        self.dc_parameter[2] = str(text)

    def start_changecombo2(self, text):
        """Handle second start combo box, ie. units, as mV, V..."""
        self.dc_parameter[3] = str(text)

    def increment_changecombo2(self, text):
        """Handle second increment combo box, ie. units, as mV, V..."""
        self.dc_parameter[4] = str(text)

    def stop_changecombo2(self, text):
        """Handle second stop combo box, ie. units, as mV, V..."""
        self.dc_parameter[5] = str(text)

    def setflag(self):
        """
        - Handles the Operating point analysis checkbox
        """
        if self.check.isChecked():
            self.track_obj.op_check.append(1)
        else:
            self.track_obj.op_check.append(0)

    def createTRANgroup(self):
        """
        - Creating transient group under analysis and creating it's components
        - Contains 3 inout and combo boxes for -
        - - Start time
        - - Step time
        - - Stop time
        - Input boxes for values, combo boxes for unit
        - Accordingly also event handlers for combo boxes, creates 3 functions
        """
        kicadFile = self.clarg1
        (projpath, filename) = os.path.split(kicadFile)
        project_name = os.path .basename(projpath)
        check = 1

        try:
            f = open(
                os.path.join(
                    projpath,
                    project_name +
                    "_Previous_Values.xml"),
                'r')
            tree = ET.parse(f)
            parent_root = tree.getroot()
            for child in parent_root:
                if child.tag == "analysis":
                    root = child
        except BaseException:
            check = 0
            print("Transient Previous Values XML is Empty")

        self.trbox = QtWidgets.QGroupBox()
        self.trbox.setTitle("Transient Analysis")
        # self.trbox.setDisabled(True)
        # self.trbox.setVisible(False)
        self.trgrid = QtWidgets.QGridLayout()
        self.trbox.setLayout(self.trgrid)

        self.start = QtWidgets.QLabel("Start Time")
        self.step = QtWidgets.QLabel("Step Time")
        self.stop = QtWidgets.QLabel("Stop Time")
        self.trgrid.addWidget(self.start, 1, 0)
        self.trgrid.addWidget(self.step, 2, 0)
        self.trgrid.addWidget(self.stop, 3, 0)
        self.count = 0

        self.tran_entry_var[self.count] = QtWidgets.QLineEdit()
        self.trgrid.addWidget(self.tran_entry_var[self.count], 1, 1)
        self.tran_entry_var[self.count].setMaximumWidth(150)
        self.count += 1
        self.tran_entry_var[self.count] = QtWidgets.QLineEdit()
        self.trgrid.addWidget(self.tran_entry_var[self.count], 2, 1)
        self.tran_entry_var[self.count].setMaximumWidth(150)
        self.count += 1
        self.tran_entry_var[self.count] = QtWidgets.QLineEdit()
        self.trgrid.addWidget(self.tran_entry_var[self.count], 3, 1)
        self.tran_entry_var[self.count].setMaximumWidth(150)
        self.count += 1

        self.parameter_cnt = 0
        self.start_combobox = QtWidgets.QComboBox()
        self.start_combobox.addItem("Sec")
        self.start_combobox.addItem("ms")
        self.start_combobox.addItem("us")
        self.start_combobox.addItem("ns")
        self.start_combobox.addItem("ps")
        self.trgrid.addWidget(self.start_combobox, 1, 3)

        try:
            self.tran_parameter[self.parameter_cnt] = str(root[2][3].text)
        except BaseException:
            self.tran_parameter[self.parameter_cnt] = "Sec"

        self.start_combobox.activated[str].connect(self.start_combo_change)
        self.parameter_cnt += 1

        self.step_combobox = QtWidgets.QComboBox()
        self.step_combobox.addItem("Sec")
        self.step_combobox.addItem("ms")
        self.step_combobox.addItem("us")
        self.step_combobox.addItem("ns")
        self.step_combobox.addItem("ps")
        self.trgrid.addWidget(self.step_combobox, 2, 3)
        try:
            self.tran_parameter[self.parameter_cnt] = str(root[2][4].text)
        except BaseException:
            self.tran_parameter[self.parameter_cnt] = "Sec"

        self.step_combobox.activated[str].connect(self.step_combo_change)
        self.parameter_cnt += 1

        self.stop_combobox = QtWidgets.QComboBox()
        self.stop_combobox.addItem("Sec")
        self.stop_combobox.addItem("ms")
        self.stop_combobox.addItem("us")
        self.stop_combobox.addItem("ns")
        self.stop_combobox.addItem("ps")
        self.trgrid.addWidget(self.stop_combobox, 3, 3)
        try:
            self.tran_parameter[self.parameter_cnt] = str(root[2][5].text)
        except BaseException:
            self.tran_parameter[self.parameter_cnt] = "Sec"

        self.stop_combobox.activated[str].connect(self.stop_combo_change)
        self.parameter_cnt += 1

        self.track_obj.TRAN_entry_var["ITEMS"] = self.tran_entry_var
        self.track_obj.TRAN_Parameter["ITEMS"] = self.tran_parameter

        # CSS
        self.trbox.setStyleSheet(" \
        QGroupBox { border: 1px solid gray; border-radius: \
        9px; margin-top: 0.5em; } \
        QGroupBox::title { subcontrol-origin: margin; left: \
         10px; padding: 0 3px 0 3px; } \
        ")
        if check:
            try:
                self.tran_entry_var[0].setText(root[2][0].text)
                self.tran_entry_var[1].setText(root[2][1].text)
                self.tran_entry_var[2].setText(root[2][2].text)
                index = self.start_combobox.findText(root[2][3].text)
                self.start_combobox.setCurrentIndex(index)
                index = self.step_combobox.findText(root[2][4].text)
                self.step_combobox.setCurrentIndex(index)
                index = self.stop_combobox.findText(root[2][5].text)
                self.stop_combobox.setCurrentIndex(index)
            except BaseException:
                print("Transient Analysis XML Parse Error")

        return self.trbox

    '''
    - Below 3 functions handle event for the combo box in transient group
    '''
    def start_combo_change(self, text):
        """Handle start combo box, ie. units, as second, ms"""
        self.tran_parameter[0] = str(text)

    def step_combo_change(self, text):
        """Handle step combo box, ie. units, as second, ms..."""
        self.tran_parameter[1] = str(text)

    def stop_combo_change(self, text):
        """Handle stop combo box, ie. units, as second, ms..."""
        self.tran_parameter[2] = str(text)