Пример #1
0
    def create_main_frame(self):
        '''Creates main frame.'''
        self.main_frame = QtGui.QWidget()

        #Creating short title A, B, C
        self.shortTitles = []
        for t in ['A', 'B', 'C']:
            self.shortTitles.append(t)

        #Creating Plot panel
        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)
        self.TernaryPlot = TernaryPlot(self.fig, short_labels=self.shortTitles)

        #Creating Toolbox for groups
        self.tab = QtGui.QToolBox()
        self.tab.setMaximumWidth(300)
        self.groups = []
        self.groups_brief = []
        self.maxGroupNumber = 0
        self.addGroupTab()

        #Creating buttons for groups
        bbox = QtGui.QHBoxLayout()
        self.btn_addGroup = QtGui.QPushButton('+')
        self.btn_removeGroup = QtGui.QPushButton('-')
        self.btn_editGroups = QtGui.QPushButton('*')

        #Setting buttons shape and tooltip
        self.btn_addGroup.setMaximumWidth(30)
        self.btn_removeGroup.setMaximumWidth(30)
        self.btn_editGroups.setMaximumWidth(30)
        self.btn_addGroup.setToolTip('Add a group')
        self.btn_removeGroup.setToolTip('Remove the current group')
        self.btn_editGroups.setToolTip('Edit the panel labels')

        #Creating layout for buttons
        bbox.addWidget(self.btn_addGroup)
        bbox.addWidget(self.btn_removeGroup)
        bbox.addStretch(1)
        bbox.addWidget(self.btn_editGroups)
        bbox.setSpacing(2)

        #Conecting buttons
        self.connect(self.btn_addGroup, QtCore.SIGNAL('clicked()'),
                     self.addGroupTab)
        self.connect(self.btn_removeGroup, QtCore.SIGNAL('clicked()'),
                     self.removeCurrentGroupTab)
        self.connect(self.btn_editGroups, QtCore.SIGNAL('clicked()'),
                     lambda: PlotSettingsWindow(self, self.TernaryPlot,
                                                self.canvas).exec_())

        #Creating Dock Panel
        pbox = QtGui.QVBoxLayout()
        pbox.addLayout(bbox)
        pbox.addWidget(self.tab)
        pbox.setSpacing(10)
        dock_w = QtGui.QWidget()
        dock_w.setLayout(pbox)
        dock_w.setMaximumWidth(270)
        dock_w.setMinimumWidth(270)
        self.dock = QtGui.QDockWidget(self)
        self.dock.setWidget(dock_w)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dock)

        #Creating main_frame
        mbox = QtGui.QHBoxLayout()
        mbox.addWidget(self.canvas)
        self.main_frame.setLayout(mbox)
        self.setCentralWidget(self.main_frame)
Пример #2
0
    def create_main_frame(self):
        '''Creates main frame.'''
        self.main_frame = QtGui.QWidget()

        #Creating short title A, B, C
        self.shortTitles = []
        for t in ['A', 'B', 'C']:
            self.shortTitles.append(t)

        #Creating Plot panel
        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)
        self.TernaryPlot = TernaryPlot(self.fig, short_labels=self.shortTitles)

        #Creating Toolbox for groups
        self.tab = QtGui.QToolBox()
        self.tab.setMaximumWidth(300)
        self.groups = []
        self.groups_brief = []
        self.maxGroupNumber = 0
        self.addGroupTab()

        #Creating buttons for groups
        bbox = QtGui.QHBoxLayout()
        self.btn_addGroup = QtGui.QPushButton('+')
        self.btn_removeGroup = QtGui.QPushButton('-')
        self.btn_editGroups = QtGui.QPushButton('*')

        #Setting buttons shape and tooltip
        self.btn_addGroup.setMaximumWidth(30)
        self.btn_removeGroup.setMaximumWidth(30)
        self.btn_editGroups.setMaximumWidth(30)
        self.btn_addGroup.setToolTip('Add a group')
        self.btn_removeGroup.setToolTip('Remove the current group')
        self.btn_editGroups.setToolTip('Edit the panel labels')

        #Creating layout for buttons
        bbox.addWidget(self.btn_addGroup)
        bbox.addWidget(self.btn_removeGroup)
        bbox.addStretch(1)
        bbox.addWidget(self.btn_editGroups)
        bbox.setSpacing(2)

        #Conecting buttons
        self.connect(self.btn_addGroup, QtCore.SIGNAL('clicked()'),
                     self.addGroupTab)
        self.connect(self.btn_removeGroup, QtCore.SIGNAL('clicked()'),
                     self.removeCurrentGroupTab)
        self.connect(
            self.btn_editGroups,
            QtCore.SIGNAL('clicked()'), lambda: PlotSettingsWindow(
                self, self.TernaryPlot, self.canvas).exec_())

        #Creating Dock Panel
        pbox = QtGui.QVBoxLayout()
        pbox.addLayout(bbox)
        pbox.addWidget(self.tab)
        pbox.setSpacing(10)
        dock_w = QtGui.QWidget()
        dock_w.setLayout(pbox)
        dock_w.setMaximumWidth(270)
        dock_w.setMinimumWidth(270)
        self.dock = QtGui.QDockWidget(self)
        self.dock.setWidget(dock_w)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dock)

        #Creating main_frame
        mbox = QtGui.QHBoxLayout()
        mbox.addWidget(self.canvas)
        self.main_frame.setLayout(mbox)
        self.setCentralWidget(self.main_frame)
Пример #3
0
class PyTernary(QtGui.QMainWindow):
    FORMATFILE = '.dat'

    def __init__(self, parent=None):
        '''Constructor.'''
        super(PyTernary, self).__init__(parent)
        self.setWindowTitle('TernaryPlot')

        self.plots = {'view': {'groups': []}}

        #Creating main frame
        self.create_main_frame()

    def create_main_frame(self):
        '''Creates main frame.'''
        self.main_frame = QtGui.QWidget()

        #Creating short title A, B, C
        self.shortTitles = []
        for t in ['A', 'B', 'C']:
            self.shortTitles.append(t)

        #Creating Plot panel
        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)
        self.TernaryPlot = TernaryPlot(self.fig, short_labels=self.shortTitles)

        #Creating Toolbox for groups
        self.tab = QtGui.QToolBox()
        self.tab.setMaximumWidth(300)
        self.groups = []
        self.groups_brief = []
        self.maxGroupNumber = 0
        self.addGroupTab()

        #Creating buttons for groups
        bbox = QtGui.QHBoxLayout()
        self.btn_addGroup = QtGui.QPushButton('+')
        self.btn_removeGroup = QtGui.QPushButton('-')
        self.btn_editGroups = QtGui.QPushButton('*')

        #Setting buttons shape and tooltip
        self.btn_addGroup.setMaximumWidth(30)
        self.btn_removeGroup.setMaximumWidth(30)
        self.btn_editGroups.setMaximumWidth(30)
        self.btn_addGroup.setToolTip('Add a group')
        self.btn_removeGroup.setToolTip('Remove the current group')
        self.btn_editGroups.setToolTip('Edit the panel labels')

        #Creating layout for buttons
        bbox.addWidget(self.btn_addGroup)
        bbox.addWidget(self.btn_removeGroup)
        bbox.addStretch(1)
        bbox.addWidget(self.btn_editGroups)
        bbox.setSpacing(2)

        #Conecting buttons
        self.connect(self.btn_addGroup, QtCore.SIGNAL('clicked()'),
                     self.addGroupTab)
        self.connect(self.btn_removeGroup, QtCore.SIGNAL('clicked()'),
                     self.removeCurrentGroupTab)
        self.connect(self.btn_editGroups, QtCore.SIGNAL('clicked()'),
                     lambda: PlotSettingsWindow(self, self.TernaryPlot,
                                                self.canvas).exec_())

        #Creating Dock Panel
        pbox = QtGui.QVBoxLayout()
        pbox.addLayout(bbox)
        pbox.addWidget(self.tab)
        pbox.setSpacing(10)
        dock_w = QtGui.QWidget()
        dock_w.setLayout(pbox)
        dock_w.setMaximumWidth(270)
        dock_w.setMinimumWidth(270)
        self.dock = QtGui.QDockWidget(self)
        self.dock.setWidget(dock_w)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dock)

        #Creating main_frame
        mbox = QtGui.QHBoxLayout()
        mbox.addWidget(self.canvas)
        self.main_frame.setLayout(mbox)
        self.setCentralWidget(self.main_frame)

    def removeCurrentGroupTab(self):
        '''Remove current tab.'''
        self.removeGroupTab(self.tab.currentIndex())

    def removeGroupTab(self, index):
        '''Removes group tab.'''
        if index == len(self.groups)-1:
            self.maxGroupNumber -= 1
        self.tab.removeItem(index)
        self.tab.setCurrentIndex(index-1)
        self.TernaryPlot.remove_plot(index)

    def addGroupTab(self):
        '''Adds group tab.'''
        table = QtGui.QTableWidget()
        table.setRowCount(1)
        table.setColumnCount(3)
        table.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
        table.setHorizontalHeaderLabels(self.shortTitles)
        table.horizontalHeader().sectionDoubleClicked.connect(self.__changeHorizontalHeader)
        self.__updateRows(table)

        for i in range(3):
            table.setColumnWidth(i, 60)
            table.setItem(0, i, QtGui.QTableWidgetItem(''))

        #Table connections
        table.cellChanged.connect(lambda row, col:
            self.__cellTableChanged(table, row, col, len(self.groups)-1))
        #table.cellActivated.connect(lambda row, col: self.__activatedCellTable(table, row, col))

        #Creating Buttons
        btn_addRow = QtGui.QPushButton('+')
        btn_removeRow = QtGui.QPushButton('-')
        btn_import = QtGui.QPushButton('Im')
        btn_export = QtGui.QPushButton('Ex')

        #Setting buttons shape and tooltips
        btn_addRow.setMaximumWidth(30)
        btn_removeRow.setMaximumWidth(30)
        btn_import.setMaximumWidth(50)
        btn_export.setMaximumWidth(50)
        btn_addRow.setToolTip('Add next row')
        btn_removeRow.setToolTip('Remove current row')
        btn_import.setToolTip('Import data to group')
        btn_export.setToolTip('Export group data')

        #Conecting buttons
        self.connect(btn_addRow, QtCore.SIGNAL('clicked()'),
                     lambda: self.__addRow(table))
        self.connect(btn_removeRow, QtCore.SIGNAL('clicked()'),
                     lambda: self.__removeRow(table))
        self.connect(btn_import, QtCore.SIGNAL('clicked()'),
                     lambda: self.__importData2Table(table, len(self.groups)))
        self.connect(btn_export, QtCore.SIGNAL('clicked()'),
                     lambda: self.__exportData2File(table))

        #Creating button layout
        bbox = QtGui.QHBoxLayout()
        bbox.addWidget(btn_addRow)
        bbox.addWidget(btn_removeRow)
        bbox.addWidget(btn_import)
        bbox.addWidget(btn_export)
        bbox.addStretch()

        #Creating main layout for group
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(table)
        vbox.addLayout(bbox)

        #Updating max group number
        if len(self.groups) == 0:
            self.maxGroupNumber = 0
        self.maxGroupNumber += 1

        #Creating group
        frame = QtGui.QFrame()
        frame.setLayout(vbox)
        groupName = 'Group %d' % self.maxGroupNumber
        self.tab.addItem(frame, groupName)
        self.tab.setCurrentIndex(len(self.groups))

        #Saving group
        self.groups.append([table, btn_import, btn_export])
        self.groups_brief.append('')
        self.TernaryPlot.add_null_plot(label=groupName)

    def __addRow(self, table):
        '''Adds row.'''
        row = table.rowCount() if table.currentRow()==-1 else table.currentRow()+1
        table.insertRow(row)
        self.__updateRows(table)

        #Setting selection
        table.setCurrentCell(row, 0)
        for r,s in[(row-1, False), (row, True)]:
            for col in range(table.columnCount()):
                item = table.item(r, col)
                if not item: table.setItem(r, col, QtGui.QTableWidgetItem(''))
                table.item(r,col).setSelected(s)

    def __removeRow(self, table):
        '''Removes row.'''
        if table.rowCount()==1:
            self.__clearRow(table, 0)
            return
        row = table.rowCount()-1 if table.currentRow()==-1 else table.currentRow()
        item = table.item(row, table.currentRow())
        table.removeRow(row)
        self.__updateRows(table)

        #Setting selection
        if row==table.rowCount(): row -= 1
        table.setCurrentCell(row, 0)
        for col in range(table.columnCount()):
            item = table.item(row, col)
            if not item: table.setItem(row, col, QtGui.QTableWidgetItem(''))
            table.item(row,col).setSelected(True)

    def __clearRow(self, table, row):
        '''Clears row.'''
        for col in range(3):
            table.setItem(row, col, QtGui.QTableWidgetItem(''))

    def __updateRows(self, table):
        '''Updates rows.'''
        table.setVerticalHeaderLabels(['%02i' % (i+1) for i in range(table.rowCount())])
        for i in range(table.rowCount()):
            table.setRowHeight(i, 20)

    def __changeHorizontalHeader(self, index):
        '''Changes horizontal header.'''
        table = self.groups[0][0]
        oldHeader = table.horizontalHeaderItem(index).text()
        newHeader, ok = QtGui.QInputDialog.getText(self,
                                                   'Change Header Label', 'Header:',
                                                   QtGui.QLineEdit.Normal, oldHeader)
        if ok:
            self.shortTitles[index] = newHeader
            self.TernaryPlot.set_short_labels(self.shortTitles)
            self.canvas.draw()
            for table in [t[0] for t in self.groups]:
                table.horizontalHeaderItem(index).setText(newHeader)

    def __cellTableChanged(self, table, row, col, index):
        '''Connection to cell table change.'''
        text = table.item(row, col).text()

        try:
            if str(float(text)) != text:
                raise ValueError
        except:
            try:
                text = str(float(text.replace(',','.')))
            except:
                text = ''
            table.item(row, col).setText(text)
            return

        line = []
        for i in range(3):
            item = table.item(row, i)
            if item and item.text():
                line.append(float(item.text()) if item.text() else None)
            else:
                line.append(None)

        if line.count(None) == 1:
            i = line.index(None)
            line.remove(None)
            sum_ = sum(line)
            if sum_ <= 1:
                value = 1-sum_
            elif sum_ <= 100:
                value = 100-sum_
            if sum_ <= 100:
                item_ = QtGui.QTableWidgetItem(str(value))
                item_.setBackgroundColor(QtGui.QColor('white'))
                table.setItem(row, i, item_)
        elif None not in line:
            self.__updateGroupPlot(index)

    def __updateGroupPlot(self, index):
        '''Updates the plot for group in "index" position.'''
        data = self.__getGroupData(index)
        if data:
            self.TernaryPlot.update_plot(index, data)
            self.canvas.draw()

    def __getGroupData(self, index):
        '''Gets group data as a matrix (type: list).'''
        data = []
        table = self.groups[index][0]
        for row in range(table.rowCount()):
            try:
                line = [float(table.item(row, col).text()) for col in range(3)]
            except:
                continue
            data.append(line)
        return data

    def __importData2Table(self, table, index):
        '''Imports data to table.'''
        fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file','./Teste', '*'+self.FORMATFILE)
        if not fname: return
        if not [True for j in range(3) if table.item(table.rowCount()-1,j)]:
            table.removeRow(table.rowCount()-1)
        lines_error = []
        for nline, line in enumerate(open(str(fname.toUtf8()),'r').readlines()):
            line = line.strip()
            if line and line[0] != '#':
                row = line.split('\t')
                if len(row)<3:
                    row = line.split()
                if len(row)>2:
                    nrow = table.rowCount()
                    table.insertRow(nrow)
                    for col in range(3):
                        cell = row[col] if row[col] != '_' else ''
                        table.setItem(nrow, col, QtGui.QTableWidgetItem(cell))
                        self.__cellTableChanged(table, nrow, col, index)
                else:
                    lines_error.append(str(nline+1))

        self.__updateRows(table)

        #Warning Message
        if lines_error:
            wm = QtGui.QMessageBox(self)
            wm.setWindowTitle('Warning')
            msg = '<h2 align="center">Warning</h2> <p>Problems in line(s): %s</p>'
            if len(lines_error)>5:
                lines_error = lines_error[:5]+['...']
            wm.setText(msg % ', '.join(lines_error))
            wm.show()

    def __exportData2File(self, table):
        '''Exports datat to file.'''
        fname = QtGui.QFileDialog.getSaveFileName(self, 'Save file','./Teste', '*'+ self.FORMATFILE)
        if not fname: return
        if not fname.endsWith(self.FORMATFILE):
            fname += self.FORMATFILE
        f = open(str(fname.toUtf8()), 'w')
        f.write('#%s\t%s\t%s\n' % tuple([t.text() for t in self.shortTitles]))
        for row in range(table.rowCount()):
            for col in range(3):
                item = table.item(row, col)
                f.write('%s\t' % (item.text() if item and item.text() else '_'))
            f.write('\n')
        f.close()
Пример #4
0
class PyTernary(QtGui.QMainWindow):
    FORMATFILE = '.dat'

    def __init__(self, parent=None):
        '''Constructor.'''
        super(PyTernary, self).__init__(parent)
        self.setWindowTitle('TernaryPlot')

        self.plots = {'view': {'groups': []}}

        #Creating main frame
        self.create_main_frame()

    def create_main_frame(self):
        '''Creates main frame.'''
        self.main_frame = QtGui.QWidget()

        #Creating short title A, B, C
        self.shortTitles = []
        for t in ['A', 'B', 'C']:
            self.shortTitles.append(t)

        #Creating Plot panel
        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setParent(self.main_frame)
        self.TernaryPlot = TernaryPlot(self.fig, short_labels=self.shortTitles)

        #Creating Toolbox for groups
        self.tab = QtGui.QToolBox()
        self.tab.setMaximumWidth(300)
        self.groups = []
        self.groups_brief = []
        self.maxGroupNumber = 0
        self.addGroupTab()

        #Creating buttons for groups
        bbox = QtGui.QHBoxLayout()
        self.btn_addGroup = QtGui.QPushButton('+')
        self.btn_removeGroup = QtGui.QPushButton('-')
        self.btn_editGroups = QtGui.QPushButton('*')

        #Setting buttons shape and tooltip
        self.btn_addGroup.setMaximumWidth(30)
        self.btn_removeGroup.setMaximumWidth(30)
        self.btn_editGroups.setMaximumWidth(30)
        self.btn_addGroup.setToolTip('Add a group')
        self.btn_removeGroup.setToolTip('Remove the current group')
        self.btn_editGroups.setToolTip('Edit the panel labels')

        #Creating layout for buttons
        bbox.addWidget(self.btn_addGroup)
        bbox.addWidget(self.btn_removeGroup)
        bbox.addStretch(1)
        bbox.addWidget(self.btn_editGroups)
        bbox.setSpacing(2)

        #Conecting buttons
        self.connect(self.btn_addGroup, QtCore.SIGNAL('clicked()'),
                     self.addGroupTab)
        self.connect(self.btn_removeGroup, QtCore.SIGNAL('clicked()'),
                     self.removeCurrentGroupTab)
        self.connect(
            self.btn_editGroups,
            QtCore.SIGNAL('clicked()'), lambda: PlotSettingsWindow(
                self, self.TernaryPlot, self.canvas).exec_())

        #Creating Dock Panel
        pbox = QtGui.QVBoxLayout()
        pbox.addLayout(bbox)
        pbox.addWidget(self.tab)
        pbox.setSpacing(10)
        dock_w = QtGui.QWidget()
        dock_w.setLayout(pbox)
        dock_w.setMaximumWidth(270)
        dock_w.setMinimumWidth(270)
        self.dock = QtGui.QDockWidget(self)
        self.dock.setWidget(dock_w)
        self.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dock)

        #Creating main_frame
        mbox = QtGui.QHBoxLayout()
        mbox.addWidget(self.canvas)
        self.main_frame.setLayout(mbox)
        self.setCentralWidget(self.main_frame)

    def removeCurrentGroupTab(self):
        '''Remove current tab.'''
        self.removeGroupTab(self.tab.currentIndex())

    def removeGroupTab(self, index):
        '''Removes group tab.'''
        if index == len(self.groups) - 1:
            self.maxGroupNumber -= 1
        self.tab.removeItem(index)
        self.tab.setCurrentIndex(index - 1)
        self.TernaryPlot.remove_plot(index)

    def addGroupTab(self):
        '''Adds group tab.'''
        table = QtGui.QTableWidget()
        table.setRowCount(1)
        table.setColumnCount(3)
        table.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch)
        table.setHorizontalHeaderLabels(self.shortTitles)
        table.horizontalHeader().sectionDoubleClicked.connect(
            self.__changeHorizontalHeader)
        self.__updateRows(table)

        for i in range(3):
            table.setColumnWidth(i, 60)
            table.setItem(0, i, QtGui.QTableWidgetItem(''))

        #Table connections
        table.cellChanged.connect(
            lambda row, col: self.__cellTableChanged(table, row, col,
                                                     len(self.groups) - 1))
        #table.cellActivated.connect(lambda row, col: self.__activatedCellTable(table, row, col))

        #Creating Buttons
        btn_addRow = QtGui.QPushButton('+')
        btn_removeRow = QtGui.QPushButton('-')
        btn_import = QtGui.QPushButton('Im')
        btn_export = QtGui.QPushButton('Ex')

        #Setting buttons shape and tooltips
        btn_addRow.setMaximumWidth(30)
        btn_removeRow.setMaximumWidth(30)
        btn_import.setMaximumWidth(50)
        btn_export.setMaximumWidth(50)
        btn_addRow.setToolTip('Add next row')
        btn_removeRow.setToolTip('Remove current row')
        btn_import.setToolTip('Import data to group')
        btn_export.setToolTip('Export group data')

        #Conecting buttons
        self.connect(btn_addRow, QtCore.SIGNAL('clicked()'),
                     lambda: self.__addRow(table))
        self.connect(btn_removeRow, QtCore.SIGNAL('clicked()'),
                     lambda: self.__removeRow(table))
        self.connect(btn_import, QtCore.SIGNAL('clicked()'),
                     lambda: self.__importData2Table(table, len(self.groups)))
        self.connect(btn_export, QtCore.SIGNAL('clicked()'),
                     lambda: self.__exportData2File(table))

        #Creating button layout
        bbox = QtGui.QHBoxLayout()
        bbox.addWidget(btn_addRow)
        bbox.addWidget(btn_removeRow)
        bbox.addWidget(btn_import)
        bbox.addWidget(btn_export)
        bbox.addStretch()

        #Creating main layout for group
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(table)
        vbox.addLayout(bbox)

        #Updating max group number
        if len(self.groups) == 0:
            self.maxGroupNumber = 0
        self.maxGroupNumber += 1

        #Creating group
        frame = QtGui.QFrame()
        frame.setLayout(vbox)
        groupName = 'Group %d' % self.maxGroupNumber
        self.tab.addItem(frame, groupName)
        self.tab.setCurrentIndex(len(self.groups))

        #Saving group
        self.groups.append([table, btn_import, btn_export])
        self.groups_brief.append('')
        self.TernaryPlot.add_null_plot(label=groupName)

    def __addRow(self, table):
        '''Adds row.'''
        row = table.rowCount() if table.currentRow(
        ) == -1 else table.currentRow() + 1
        table.insertRow(row)
        self.__updateRows(table)

        #Setting selection
        table.setCurrentCell(row, 0)
        for r, s in [(row - 1, False), (row, True)]:
            for col in range(table.columnCount()):
                item = table.item(r, col)
                if not item: table.setItem(r, col, QtGui.QTableWidgetItem(''))
                table.item(r, col).setSelected(s)

    def __removeRow(self, table):
        '''Removes row.'''
        if table.rowCount() == 1:
            self.__clearRow(table, 0)
            return
        row = table.rowCount() - 1 if table.currentRow(
        ) == -1 else table.currentRow()
        item = table.item(row, table.currentRow())
        table.removeRow(row)
        self.__updateRows(table)

        #Setting selection
        if row == table.rowCount(): row -= 1
        table.setCurrentCell(row, 0)
        for col in range(table.columnCount()):
            item = table.item(row, col)
            if not item: table.setItem(row, col, QtGui.QTableWidgetItem(''))
            table.item(row, col).setSelected(True)

    def __clearRow(self, table, row):
        '''Clears row.'''
        for col in range(3):
            table.setItem(row, col, QtGui.QTableWidgetItem(''))

    def __updateRows(self, table):
        '''Updates rows.'''
        table.setVerticalHeaderLabels(
            ['%02i' % (i + 1) for i in range(table.rowCount())])
        for i in range(table.rowCount()):
            table.setRowHeight(i, 20)

    def __changeHorizontalHeader(self, index):
        '''Changes horizontal header.'''
        table = self.groups[0][0]
        oldHeader = table.horizontalHeaderItem(index).text()
        newHeader, ok = QtGui.QInputDialog.getText(self, 'Change Header Label',
                                                   'Header:',
                                                   QtGui.QLineEdit.Normal,
                                                   oldHeader)
        if ok:
            self.shortTitles[index] = newHeader
            self.TernaryPlot.set_short_labels(self.shortTitles)
            self.canvas.draw()
            for table in [t[0] for t in self.groups]:
                table.horizontalHeaderItem(index).setText(newHeader)

    def __cellTableChanged(self, table, row, col, index):
        '''Connection to cell table change.'''
        text = table.item(row, col).text()

        try:
            if str(float(text)) != text:
                raise ValueError
        except:
            try:
                text = str(float(text.replace(',', '.')))
            except:
                text = ''
            table.item(row, col).setText(text)
            return

        line = []
        for i in range(3):
            item = table.item(row, i)
            if item and item.text():
                line.append(float(item.text()) if item.text() else None)
            else:
                line.append(None)

        if line.count(None) == 1:
            i = line.index(None)
            line.remove(None)
            sum_ = sum(line)
            if sum_ <= 1:
                value = 1 - sum_
            elif sum_ <= 100:
                value = 100 - sum_
            if sum_ <= 100:
                item_ = QtGui.QTableWidgetItem(str(value))
                item_.setBackgroundColor(QtGui.QColor('white'))
                table.setItem(row, i, item_)
        elif None not in line:
            self.__updateGroupPlot(index)

    def __updateGroupPlot(self, index):
        '''Updates the plot for group in "index" position.'''
        data = self.__getGroupData(index)
        if data:
            self.TernaryPlot.update_plot(index, data)
            self.canvas.draw()

    def __getGroupData(self, index):
        '''Gets group data as a matrix (type: list).'''
        data = []
        table = self.groups[index][0]
        for row in range(table.rowCount()):
            try:
                line = [float(table.item(row, col).text()) for col in range(3)]
            except:
                continue
            data.append(line)
        return data

    def __importData2Table(self, table, index):
        '''Imports data to table.'''
        fname = QtGui.QFileDialog.getOpenFileName(self, 'Open file', './Teste',
                                                  '*' + self.FORMATFILE)
        if not fname: return
        if not [True for j in range(3) if table.item(table.rowCount() - 1, j)]:
            table.removeRow(table.rowCount() - 1)
        lines_error = []
        for nline, line in enumerate(
                open(str(fname.toUtf8()), 'r').readlines()):
            line = line.strip()
            if line and line[0] != '#':
                row = line.split('\t')
                if len(row) < 3:
                    row = line.split()
                if len(row) > 2:
                    nrow = table.rowCount()
                    table.insertRow(nrow)
                    for col in range(3):
                        cell = row[col] if row[col] != '_' else ''
                        table.setItem(nrow, col, QtGui.QTableWidgetItem(cell))
                        self.__cellTableChanged(table, nrow, col, index)
                else:
                    lines_error.append(str(nline + 1))

        self.__updateRows(table)

        #Warning Message
        if lines_error:
            wm = QtGui.QMessageBox(self)
            wm.setWindowTitle('Warning')
            msg = '<h2 align="center">Warning</h2> <p>Problems in line(s): %s</p>'
            if len(lines_error) > 5:
                lines_error = lines_error[:5] + ['...']
            wm.setText(msg % ', '.join(lines_error))
            wm.show()

    def __exportData2File(self, table):
        '''Exports datat to file.'''
        fname = QtGui.QFileDialog.getSaveFileName(self, 'Save file', './Teste',
                                                  '*' + self.FORMATFILE)
        if not fname: return
        if not fname.endsWith(self.FORMATFILE):
            fname += self.FORMATFILE
        f = open(str(fname.toUtf8()), 'w')
        f.write('#%s\t%s\t%s\n' % tuple([t.text() for t in self.shortTitles]))
        for row in range(table.rowCount()):
            for col in range(3):
                item = table.item(row, col)
                f.write('%s\t' %
                        (item.text() if item and item.text() else '_'))
            f.write('\n')
        f.close()