def loadTemp(self):
     if self.savedFlag == False:
         self.warningDialog = WarningDialog('Any unsaved data will be lost.'\
                             +'Do you wish to proceed?', self.loadApproved)
         self.warningDialog.show()
     else:
         self.loadApproved()
 def saveTemp(self):
     if self.saveEnable == True:
         if self.openPath == None:
             self.saveTempAs()
         else:
             self.saveFile(self.openPath)
     else:
         self.warningDialog = WarningDialog('Make sure no sequences are'\
                             +' less than 20 bp in length', None)
         self.warningDialog.show()
 def saveTempAs(self):
     if self.saveEnable == True:
         self.openPath = QFileDialog.getSaveFileName(self, \
                             "Save File As", _root_dir + '/templateSchemes/' , \
                             QString("Schemes (*.cfg)"))
         try:
             self.saveFile(self.openPath)
         except:
             pass
     else:
         self.warningDialog = WarningDialog('Make sure no sequences are'\
                             +' less than 20 bp in length', None)
         self.warningDialog.show()
class TDController(QMainWindow, ui_tempDesign.Ui_Dialog):
    def __init__(self, parent=None):
        super(TDController, self).__init__(parent)
        self.setupUi(self)
        self.openPath = None
        self.warningDialog = None
        self.tempDesignTable.setColumnWidth(2, 290)
        self.setWindowTitle('Template Design')
#        self.tempDesignTable.setDragEnabled(True)
#        self.tempDesignTable.setDragDropOverwriteMode(False)
#        self.tempDesignTable.DropIndicatorPosition(QAbstractItemView.BelowItem)
#        self.tempDesignTable.setDragDropMode(QAbstractItemView.DragDrop)
#        self.tempDesignTable.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.establishConnections()

        self.addNewSequence('NNNNNNNNNNNNNNNNNNNN', 'S')
        self.savedFlag = True
        self.saveEnable = True
        self.editPosCB.setCurrentIndex(self.editPosCB.currentIndex() + 1)

    def establishConnections(self):
        self.addSeqPB.pressed.connect(self.addSeq)
        self.rmSeqPB.pressed.connect(self.rmSeq)
        self.newTempPB.pressed.connect(self.newTemp)
        self.loadTempPB.pressed.connect(self.loadTemp)
        self.saveTempPB.pressed.connect(self.saveTemp)
        self.saveTempAsPB.pressed.connect(self.saveTempAs)

        self.tempDesignTable.cellChanged.connect(self.cellChangeEvent)

    def cellChangeEvent(self, row, column):
        self.savedFlag = False
        self.saveEnable = True
        if column == 2 and \
            len(self.tempDesignTable.item(row, column).text()) < 20:
            self.tempDesignTable.item(row, column).setBackground(QBrush(QColor(200, 35, 35)))
            self.saveEnable = False
        else:
            self.tempDesignTable.item(row, column).setBackground(QBrush(QColor(255, 255, 255)))



    def primerLabelUpdate(self):
        index = 65
        for row in range(self.tempDesignTable.rowCount()):
            if index >= 65 + 26:
                self.tempDesignTable.cellWidget(row, 0).setCurrentIndex(0)
            if self.tempDesignTable.cellWidget(row, 0).currentIndex() == 1:
                self.tempDesignTable.item(row, 1).setText(chr(index))
                index = index + 1
        self.savedFlag = False

    def addSeq(self):
        self.addNewSequence('NNNNNNNNNNNNNNNNNNNN', 'S')

    def addNewSequence(self, sequence, seqType):
        row = self.editPosCB.currentIndex() + 1

        self.tempDesignTable.insertRow(row)
        self.editPosCB.addItem(QString(str(self.tempDesignTable.rowCount())))
        self.editPosCB.setCurrentIndex(self.editPosCB.currentIndex() + 1)

        setattr(self, str(row)+'1', QTableWidgetItem(QString(''), QTableWidgetItem.Type))
        setattr(self, str(row)+'2', QTableWidgetItem(QString(sequence), QTableWidgetItem.Type))
        getattr(self, str(row)+'1').setFlags(Qt.NoItemFlags)
        self.tempDesignTable.setItem(row, 1, getattr(self, str(row)+'1'))
        self.tempDesignTable.setItem(row, 2, getattr(self, str(row)+'2'))
        self.tempDesignTable.setCellWidget(row , 0, typeCB(row, self))

        #Reassign Class Names to reflect rearrangement
        if row + 1 < self.tempDesignTable.rowCount():
            for missRow in range(self.tempDesignTable.rowCount() - row):
                newRow = self.tempDesignTable.rowCount() - missRow - 1
                setattr(self, str(newRow) + '1', getattr(self, str(newRow - 1)+'1'))
                setattr(self, str(newRow) +'2', getattr(self, str(newRow - 1)+'2'))
                self.tempDesignTable.cellWidget(newRow, 0).row = newRow

        if seqType == 'P':
            self.tempDesignTable.cellWidget(row, 0).setCurrentIndex(1)
        self.savedFlag = False

    def rmSeq(self):
        row = self.editPosCB.currentIndex()
        if self.tempDesignTable.rowCount() > 1:

            self.tempDesignTable.removeRow(row)
            self.editPosCB.removeItem(self.editPosCB.count()-1)

        #Reassign Class Names to reflect rearrangement
        if row + 1 < self.tempDesignTable.rowCount():
            for missRow in range(self.tempDesignTable.rowCount() - row):
                newRow = self.tempDesignTable.rowCount() - missRow - 1
                setattr(self, str(newRow) + '1', getattr(self, str(newRow - 1)+'1'))
                setattr(self, str(newRow) +'2', getattr(self, str(newRow - 1)+'2'))
                self.tempDesignTable.cellWidget(newRow, 0).row = newRow

        self.primerLabelUpdate()
        self.savedFlag = False


    def newTemp(self):
        if self.savedFlag == False:
            self.warningDialog = WarningDialog('Any unsaved data will be lost.'\
                                +'Do you wish to proceed?', self.newTempApproved)
            self.warningDialog.show()
        else:
            self.newTempApproved()

    def newTempApproved(self):
        self.tempDesignTable.setRowCount(0)
        self.addSeq()
        self.savedFlag = True

    def loadTemp(self):
        if self.savedFlag == False:
            self.warningDialog = WarningDialog('Any unsaved data will be lost.'\
                                +'Do you wish to proceed?', self.loadApproved)
            self.warningDialog.show()
        else:
            self.loadApproved()

    def loadApproved(self):
        self.openPath = QFileDialog.getOpenFileName(self, \
                            "Open File", _root_dir + '/templateSchemes/' , \
                            QString("Schemes (*.cfg)"))
        self.tempDesignTable.setRowCount(0)
        f = file(self.openPath, 'r')
        seqList = json.load(f)[1]
        for row in range(len(seqList)):
            self.addNewSequence(seqList[row][1:], seqList[row][0])
        self.primerLabelUpdate()
        self.savedFlag = True

    def saveTemp(self):
        if self.saveEnable == True:
            if self.openPath == None:
                self.saveTempAs()
            else:
                self.saveFile(self.openPath)
        else:
            self.warningDialog = WarningDialog('Make sure no sequences are'\
                                +' less than 20 bp in length', None)
            self.warningDialog.show()

    def saveTempAs(self):
        if self.saveEnable == True:
            self.openPath = QFileDialog.getSaveFileName(self, \
                                "Save File As", _root_dir + '/templateSchemes/' , \
                                QString("Schemes (*.cfg)"))
            try:
                self.saveFile(self.openPath)
            except:
                pass
        else:
            self.warningDialog = WarningDialog('Make sure no sequences are'\
                                +' less than 20 bp in length', None)
            self.warningDialog.show()

    def saveFile(self, path):
        seqList = []
        for row in range(self.tempDesignTable.rowCount()):
            seq = ''
            if self.tempDesignTable.cellWidget(row, 0).currentIndex() == 1:
                seq = 'P'
            else:
                seq = 'S'
            seq = seq + str(self.tempDesignTable.item(row, 2).text())
            seqList.append(seq)
        f = file(path, 'w')
        json.dump(('None', seqList), f)
        self.savedFlag = True
class seqTab:
    def __init__(self, mainWin, parent=None):

        self.mainWin = mainWin
        self.functions = SeqTabFunctions(self)


        self.seqStartPB = self.mainWin.seqStartPB
        self.seqStartPB.setEnabled(False)
        self.includeHomeAxisRB = self.mainWin.includeHomeAxisRB
        self.cycleEntryValidatePB = self.mainWin.cycleEntryValidatePB
        self.clearSelectionPB = self.mainWin.clearSelectionPB
        self.applyPB = self.mainWin.applyPB
        self.applyRepeatPB = self.mainWin.applyRepeatPB

        self.applyPB.setEnabled(False)
        self.applyRepeatPB.setEnabled(False)

        self.warningDialog = None

        self.touchFlagCB = self.mainWin.touchFlagCB
        self.cycleTable = self.mainWin.cycleTable
        self.sequenceGraphicsView = self.mainWin.sequenceGraphicsView
        
        self.baseClassL = []
        self.sortBaseL = []
        self.sortedCyclesL = []
        self.sortCycleD = {}
        self.seqList = []
        self.polonatorCycleListVector = self.mainWin.polonatorCycleListVector

        self.seqScene = QGraphicsScene()
        self.seqScene.setSceneRect(QRectF(0, 0, self.sequenceGraphicsView.width(), self.sequenceGraphicsView.height()))

        self.sequenceGraphicsView.setDragMode(QGraphicsView.RubberBandDrag)
        self.sequenceGraphicsView.setScene(self.seqScene)
        self.sequenceGraphicsView.mouseReleaseEvent = self.graphicsViewMouseRelease
        self.sequenceGraphicsView.setRubberBandSelectionMode(Qt.ContainsItemBoundingRect)

        #load most recent template
        f = file(_root_dir + "/.config/.polGV.cfg", 'r')
        path = json.load(f)
        if path != 'None':
            try:    
                self.functions.addSequence(path)
            except:
                f = file(_root_dir + "/.config/.polGV.cfg", 'w')
                json.dump('None', f)

        #initialize table widget
        self.functions.updateCycleList(True)

        self.establishConnections()


    def establishConnections(self):
        self.seqStartPB.pressed.connect(self.start)
        self.cycleEntryValidatePB.pressed.connect(self.validate)
        self.clearSelectionPB.pressed.connect(self.clear)
        self.applyPB.pressed.connect(self.applySeq)
        self.applyRepeatPB.pressed.connect(self.applyRepeatSeq)
        #prevent user from starting invalid cycle
        self.cycleTable.cellChanged.connect(self.disableStart)

    def disableStart(self):
        self.seqStartPB.setEnabled(False)

    def start(self):
        print 'start'
        touchFlag = "0"
        for i in range(self.cycleTable.rowCount()):
            if self.cycleTable.item(i,0).text() != '':
                print self.cycleTable.item(i,0).text() + \
                        self.cycleTable.item(i,1).text() + \
                        self.cycleTable.item(i,2).text()

        cmd = 'python ' + _root_dir + '/pol_API/G.007_fluidics/src/polonator_main.py ' + touchFlag
#        os.system(cmd)
        print cmd
  
        '''
        try:
            with open("/home/polonator/G.007/G.007_fluidics/src/cycle_list", "w") as outfile:
                for i in range(len(entry)):
                    outfile.write(str(self.polonatorCycleListVector[i][0]+self.polonatorCycleListVector[i][1]+self.polonatorCycleListVector[i][2]))
                    outfile.write('\n')
                if self.touchFlagCB.currentIndex() == 1:
                    touchFlag = "1"

            cmd = "python /home/polonator/G.007/G.007_fluidics/src/polonator_main.py "+ touchFlag 
            #os.system(cmd)

        except IOError: #as (errno, strerror):
            print "Error writing to cycle_list file, I/O error" #: ({0}): {1}".format(errno, strerror)        
        #  self.process_start(cmd, ['pass'], "self.process_pass()")   
        '''
    def validate(self):
        self.seqStartPB.setEnabled(True)
        self.functions.executeValidation()

    def clear(self):
        self.warningDialog = WarningDialog('Are you sure that you want to'+\
                                        ' clear the cycle list?', self.okClear)
        self.warningDialog.show()

    def okClear(self):
        self.cycleTable.clearContents()
        while len(self.baseClassL) != 0:
            #Make sure to remove all repeats, base select turns bases purple
            self.baseClassL[0].fill = self.baseClassL[0].red
            self.baseClassL[0].baseSelect()
        self.functions.updateCycleList(True)
        self.applyPB.setEnabled(False)
        self.applyRepeatPB.setEnabled(False)
        self.warningDialog = None

    def applySeq(self):
        self.functions.updateCycleList(True)
        self.applyPB.setEnabled(False)
        self.applyRepeatPB.setEnabled(True)

    def applyRepeatSeq(self):
        baseClassLPreserve = []
        for base in self.baseClassL:
            if baseClassLPreserve.count(base) == 0:
                baseClassLPreserve.append(base)
        for base in baseClassLPreserve:
            self.baseClassL.append(base)
        self.functions.updateCycleList(True)

    def graphicsViewMouseRelease(self, event):
        #Create cycle name from base
        if len(self.sortBaseL) != 0:
            sortCycleL = []
            for base in self.sortBaseL:
                cycle = base.primer.primerLetter
                if base.parentItem().pos().x() > base.primer.pos().x():
                    cycle = cycle + 'P'
                else:
                    cycle = cycle + 'M'
                cycle = cycle + base.position

                self.sortCycleD.update({cycle : base})
                sortCycleL.append(cycle)

            #Create a plus list and a minus list
            plusL = []
            minusL = []
            maxPos = 1

            cycleCount = 0
            for cycle in sortCycleL:
                if cycle[1] == 'P':
                    plusL.append(cycle)
                if cycle[1] == 'M':
                    minusL.append(cycle)

            #Sort Plus
            sortL = []
            for cycle in plusL:
                pos = int(cycle[2:])
                if sortL.count(pos) == 0:
                    sortL.append(pos)
            sortL.sort()
            sortL.reverse()
            for num in sortL:
                for cycle in plusL:
                    pos = int(cycle[2:])
                    if pos == num:
                        self.sortedCyclesL.append(cycle)
            
            #Sort Minus
            sortL = []
            for cycle in minusL:
                pos = int(cycle[2:])
                if sortL.count(pos) == 0:
                    sortL.append(pos)
            sortL.sort()
            sortL.reverse()
            for num in sortL:
                for cycle in minusL:
                    pos = int(cycle[2:])
                    if pos == num:
                        self.sortedCyclesL.append(cycle)

            for cycle in self.sortedCyclesL:
                self.baseClassL.append(self.sortCycleD[cycle])

            #Reinitialize data structures
            self.sortedCyclesL = []
            self.sortCycleD = {}

            #Empty list without jeapordizing data structure location
            while len(self.sortBaseL) != 0:
                self.sortBaseL.pop()
            self.applyPB.setEnabled(True)
 def clear(self):
     self.warningDialog = WarningDialog('Are you sure that you want to'+\
                                     ' clear the cycle list?', self.okClear)
     self.warningDialog.show()