Ejemplo n.º 1
0
	def tableWidget_right_click_remove_event(self):
		index_list = []                                                          
		for model_index in self.tableWidget.selectionModel().selectedRows():       
			index = QPersistentModelIndex(model_index)         
			index_list.append(index)                                             
		
		for index in index_list:
			
			# first, remove data if it is in enabled_list
			if self.data_list[index.row()] in self.enabled_list:
				self.enabled_list.remove(self.data_list[index.row()])
				
			self.remove(index.row()) #remove internal data in list
			self.tableWidget.removeRow(index.row()) #remove gui

		print(self.data_list)
Ejemplo n.º 2
0
class TableWidget(QTableWidget):
    cellExited = pyqtSignal(int, int)
    itemExited = pyqtSignal(QTableWidgetItem)
    released = pyqtSignal(QMouseEvent)

    def __init__(self, rows, columns, parent=None):
        QTableWidget.__init__(self, rows, columns, parent)
        self._last_index = QPersistentModelIndex()
        self.viewport().installEventFilter(self)

    def mouseReleaseEvent(self, event: QMouseEvent):
        event.accept()
        if event.button() == 1:
            self.released.emit(event)

    def eventFilter(self, widget, event):
        if widget is self.viewport():
            index = self._last_index
            if event.type() == QEvent.MouseMove:
                index = self.indexAt(event.pos())
            elif event.type() == QEvent.Leave:
                index = QModelIndex()
            if index != self._last_index:
                row = self._last_index.row()
                column = self._last_index.column()
                item = self.item(row, column)
                if item is not None:
                    self.itemExited.emit(item)
                self.cellExited.emit(row, column)
                self._last_index = QPersistentModelIndex(index)
        return QTableWidget.eventFilter(self, widget, event)
Ejemplo n.º 3
0
    def slot_deleteItems(self, group=None):
        '''delete items by group if group is not empty, otherwise delete selected items'''

        # collect indexes to be removed
        indexes = []
        if group:
            for i in range(self.sourceModel.rowCount()):
                index = self.sourceModel.index(i, ItemModel.GROUP)
                if index.data() == group:
                    indexes.append(index)
        else:
            for proxy_index in self.selectionModel().selectedRows(
            ):  # proxy index
                source_index = self.proxyModel.mapToSource(proxy_index)
                index = QPersistentModelIndex(source_index)
                indexes.append(index)

        # request confirm
        reply = QMessageBox.question(
            self, 'Confirm',
            "Confirm to remove the selected {0} item(s)? Items deleted by this operation can not be restored."
            .format(len(indexes)), QMessageBox.Yes | QMessageBox.No,
            QMessageBox.No)
        if reply != QMessageBox.Yes:
            return

        # delete
        for index in indexes[::-1]:
            self.sourceModel.removeRow(index.row())

        # emit signal to request updating group/tag counter
        if indexes:
            self.itemsChanged.emit(self.sourceModel.serialize(save=False))
Ejemplo n.º 4
0
	def enable_checkbox_clicked(self):
		print("enable_checkbox_clicked")
		index_list = []                                                          
		for model_index in self.tableWidget.selectionModel().selectedRows():       
			index = QPersistentModelIndex(model_index)         
			index_list.append(index)                                             
		
		for index in index_list:
			print(index.row())
			print(self.data_list[index.row()]["use"])
			if(self.data_list[index.row()]["use"] == "False"):
				print("enabled_list append")
				self.data_list[index.row()]["use"] = "True"
				self.enabled_list.append(self.data_list[index.row()])	
			else:
				print("enabled_list remove!")
				self.data_list[index.row()]["use"] = "False"
				print("enabled_length")
				print(len(self.enabled_list))
				for count in range(0, len(self.enabled_list)):
					if self.enabled_list[count]['idx'] == self.data_list[index.row()]['idx']:
						print("delete enabled_list")
						del self.enabled_list[count]
						break
		print("enabled_list: ")
		print(self.enabled_list)
Ejemplo n.º 5
0
    def _delete(self):
        index_list = []
        for model_index in self.tableView.selectionModel().selectedRows():
            index = QPersistentModelIndex(model_index)
            index_list.append(index)

        for index in index_list:
            self.model.removeRow(index.row())
            self._remove_project_from_config(index.data())

        if index_list:
            self.dirty = True
Ejemplo n.º 6
0
def test_model_persistent_index(model_test):
    '''
    ☑ 🛇 read-only.ro
    ☑ ★ user.json
    ☑ ⎕ commands.json
    ☐ 🛇 asset:plover:assets/main.json
    '''
    persistent_index = QPersistentModelIndex(model_test.model.index(1))
    assert persistent_index.row() == 1
    assert persistent_index.data(Qt.CheckStateRole) == Qt.Checked
    assert persistent_index.data(Qt.DecorationRole) == 'favorite'
    assert persistent_index.data(Qt.DisplayRole) == 'user.json'
    model_test.configure(classic_dictionaries_display_order=True)
    assert persistent_index.row() == 2
    assert persistent_index.data(Qt.CheckStateRole) == Qt.Checked
    assert persistent_index.data(Qt.DecorationRole) == 'favorite'
    assert persistent_index.data(Qt.DisplayRole) == 'user.json'
    model_test.model.setData(persistent_index, Qt.Unchecked, Qt.CheckStateRole)
    assert persistent_index.row() == 2
    assert persistent_index.data(Qt.CheckStateRole) == Qt.Unchecked
    assert persistent_index.data(Qt.DecorationRole) == 'normal'
    assert persistent_index.data(Qt.DisplayRole) == 'user.json'
Ejemplo n.º 7
0
    def btn_removeBtn_clicked(self):
        index_list = []
        selModel = self.tbl_address.selectionModel()
        if selModel is None:
            return
        if len(selModel.selectedRows()) < 1:
            return
        for model_index in selModel.selectedRows():
            index = QPersistentModelIndex(model_index)
            index_list.append(index)

        oldrow = index.row()
        for index in index_list:
            self.model.removeRows(index.row(), 1, 0)

        if self.model.rowCount(QModelIndex()) == 1:
            next_index = self.model.index(0, 0)
        else:
            next_index = self.model.index(oldrow, 0)
        # next_index = self.model.index(self.model.rowCount(QModelIndex()) - 1, 0)
        selModel.select(
            next_index,
            QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows)
        self.tbl_address.setFocus()
Ejemplo n.º 8
0
    def removeBtn_clicked(self):
        # selRows = self.tableView.selectionModel().selectedRows()
        rows = sorted(set(index.row() for index in
                          self.tableView.selectedIndexes()), reverse=True)

        index_list = []
        for model_index in self.tableView.selectionModel().selectedRows():
            index = QPersistentModelIndex(model_index)
            index_list.append(index)

        for index in index_list:
            self.tableView.model().removeRows(index.row(), 1, 0)

        next_index = self.tableView.model().index(self.tableView.model().rowCount(QModelIndex()) - 1, 0)
        # self.tableView.setCurrentIndex(next_index)
        self.tableView.selectionModel().select(next_index, QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows)
        self.tableView.setFocus()
Ejemplo n.º 9
0
def tab_remove(tab):
    tab.blockSignals(True)
    #index = tab.selectionModel().selectedRows()

    #if len(index)>0:
    #	for i in range(0,len(index)):
    #		pos=index[i].row()
    #		tab.removeRow(pos)
    index_list = []
    for model_index in tab.selectionModel().selectedRows():
        index = QPersistentModelIndex(model_index)
        index_list.append(index)

    for index in index_list:
        tab.removeRow(index.row())

    tab.blockSignals(False)
Ejemplo n.º 10
0
    def delete_rows(self):
        index_list = []
        if self.tbvExtratacao.model() is not None:
            for model_index in self.tbvExtratacao.selectionModel().selectedRows():
                index = QPersistentModelIndex(model_index)
                index_list.append(index)

            # print(f'Before delete_rows():\tself.df.shape(): {self.tbvExtratacao.model()._data.shape}')
            for index in index_list:
                self.tbvExtratacao.model().layoutAboutToBeChanged.emit()
                self.tbvExtratacao.model().removeRow(index.row())
                self.tbvExtratacao.model().layoutChanged.emit()
                self.tbvExtratacao.model()._data = self.tbvExtratacao.model()._data.drop([int(index.row())], axis=0)
            # print(f'After delete_rows():\tself.df.shape(): {self.tbvExtratacao.model()._data.shape}')

            if self.tbvExtratacao.model() is not None:
                dfProcess = self.tbvExtratacao.model()._data.reset_index(level=0, drop=True)

                """Preenche a TableView"""
                self.carrega_tableview(dfProcess)

        return
Ejemplo n.º 11
0
    def myDropEvent(self, event, drop_item):
        """Workaround for broken QTreeWidget::dropEvent
        per https://bugreports.qt.io/browse/QTBUG-45320
        doing reverse ordering of items on dropping. reimplementation in python
        from C++

        For this code we need dual GPL3 license instead of pure BSD3
        """
        if event.source() == self and (event.dropAction() == Qt.MoveAction
                                       or self.dragDropMode()
                                       == QAbstractItemView.InternalMove):
            droptuple = self.dropOn(event, drop_item)
            if droptuple is not None:
                (row, col, drop_index) = droptuple
                # print("droptuple", droptuple[2].row())
                idxs = self.selectedIndexes()
                indexes = []
                for idx in idxs:
                    if idx.column() == 0:
                        indexes.append(idx)
                if drop_index in indexes:
                    return
                # When removing items the drop location could shift
                new_drop_index = QPersistentModelIndex(self.model().index(
                    row, col, drop_index))
                # print("updatated drop_row", new_drop_index.row())
                # Remove the items
                taken = []
                for i in range(len(indexes) - 1, -1, -1):
                    # print("idx", indexes[i].row(), indexes[i].column())
                    parent = self.itemFromIndex(indexes[i])
                    if parent is None or parent.parent() is None:
                        t_item = self.takeTopLevelItem(indexes[i].row())
                        taken.append(t_item)
                    else:
                        t_item = parent.parent().takeChild(indexes[i].row())
                        taken.append(t_item)
                # end for
                # insert them back in at their new positions
                for i in range(len(indexes)):
                    # Either at a specific point or appended
                    if row == -1:
                        if drop_index.isValid():
                            parent = self.itemFromIndex(drop_index)
                            parent.insertChild(parent.childCount(),
                                               taken.pop())
                        else:
                            self.insertTopLevelItem(self.topLevelItemCount(),
                                                    taken.pop())
                    else:
                        r = new_drop_index.row(
                        ) if new_drop_index.row() >= 0 else row
                        if drop_index.isValid():
                            parent = self.itemFromIndex(drop_index)
                            parent.insertChild(min(r, parent.childCount()),
                                               taken.pop())
                        else:
                            self.insertTopLevelItem(
                                min(r, self.topLevelItemCount()), taken.pop())
                # end for

                event.accept()
                # Don't want QAbstractItemView to delete it because it was "moved" we already did it
                event.setDropAction(Qt.CopyAction)
        QTreeView.dropEvent(self, event)
Ejemplo n.º 12
0
class Viewer(QtMainWindow):
    jobAdded = Signal()
    jobFinished = Signal()

    def __init__(self, weboob, parent=None):
        super(Viewer, self).__init__(parent)

        self.ui = Ui_Viewer()
        self.ui.setupUi(self)
        self.ui.prevButton.clicked.connect(self.prev)
        self.ui.nextButton.clicked.connect(self.next)
        self.ui.firstButton.clicked.connect(self.first)
        self.ui.lastButton.clicked.connect(self.last)
        self.ui.actionZoomIn.triggered.connect(self.zoomIn)
        self.ui.actionZoomOut.triggered.connect(self.zoomOut)
        self.ui.actionFullSize.triggered.connect(self.zoomFullSize)
        self.ui.actionFitWindow.triggered.connect(self.zoomFit)

        self.ui.actionSaveImage.setShortcut(QKeySequence.Save)
        self.ui.actionSaveImage.triggered.connect(self.saveImage)
        self.ui.actionClose.setShortcut(QKeySequence.Close)
        self.ui.actionClose.triggered.connect(self.close)

        self.model = None
        self.current = None
        self.total = 0
        self.zoomFactor = 1
        self.zoomMode = ZOOM_FACTOR
        self.weboob = weboob

    def setData(self, model, qidx):
        self.model = model
        self.current = QPersistentModelIndex(qidx)

        self.model.rowsInserted.connect(self.updatePos)
        self.model.rowsRemoved.connect(self.updatePos)
        self.model.rowsInserted.connect(self.updateNavButtons)
        self.model.rowsRemoved.connect(self.updateNavButtons)
        self.model.dataChanged.connect(self._dataChanged)
        self.model.modelReset.connect(self.disable)

        self.updateImage()

    @Slot()
    def disable(self):
        self.setEnabled(False)

    def updateNavButtons(self):
        prev = self.current.row() > 0
        self.ui.prevButton.setEnabled(prev)
        self.ui.firstButton.setEnabled(prev)
        next = self.current.row() < self.total - 1
        self.ui.nextButton.setEnabled(next)
        self.ui.lastButton.setEnabled(next)

    def updatePos(self):
        self.total = self.model.rowCount(self.current.parent())
        self.ui.posLabel.setText('%d / %d' % (self.current.row() + 1, self.total))

    def updateImage(self):
        self.updatePos()
        self.updateNavButtons()

        obj = self.current.data(ResultModel.RoleObject)

        if obj.data is NotLoaded:
            self.model.fillObj(obj, ['data'], QModelIndex(self.current))
            self.pixmap = None
        elif obj.data:
            self.pixmap = QPixmap(QImage.fromData(obj.data))
        else:
            self.pixmap = QPixmap()

        self._rebuildImage()

    @Slot(QModelIndex)
    def _dataChanged(self, qidx):
        if qidx == self.current:
            obj = qidx.data(ResultModel.RoleObject)

            if obj.data:
                self.pixmap = QPixmap(QImage.fromData(obj.data))
            else:
                self.pixmap = QPixmap()
            self._rebuildImage()

    @Slot()
    def next(self):
        new = self.current.sibling(self.current.row() + 1, 0)
        if not new.isValid():
            return
        self.current = QPersistentModelIndex(new)
        self.updateImage()

    @Slot()
    def prev(self):
        if self.current.row() == 0:
            return
        self.current = QPersistentModelIndex(self.current.sibling(self.current.row() - 1, 0))
        self.updateImage()

    @Slot()
    def first(self):
        self.current = QPersistentModelIndex(self.current.sibling(0, 0))
        self.updateImage()

    @Slot()
    def last(self):
        self.current = QPersistentModelIndex(self.current.sibling(self.total - 1, 0))
        self.updateImage()

    @Slot()
    def zoomIn(self):
        self.zoomFactor *= 1.25
        self.zoomMode = ZOOM_FACTOR
        self._rebuildImage()

    @Slot()
    def zoomOut(self):
        self.zoomFactor *= 0.75
        self.zoomMode = ZOOM_FACTOR
        self._rebuildImage()

    @Slot()
    def zoomFullSize(self):
        self.zoomFactor = 1
        self.zoomMode = ZOOM_FACTOR
        self._rebuildImage()

    @Slot()
    def zoomFit(self):
        self.zoomMode = ZOOM_FIT
        self._rebuildImage()

    def resizeEvent(self, ev):
        super(Viewer, self).resizeEvent(ev)
        if self.zoomMode == ZOOM_FIT:
            self._rebuildImage()

    def _rebuildZoom(self):
        if self.zoomMode == ZOOM_FACTOR:
            new_width = int(self.pixmap.width() * self.zoomFactor)
            pixmap = self.pixmap.scaledToWidth(new_width, Qt.SmoothTransformation)
        else:
            new_size = self.ui.scrollArea.viewport().size()
            pixmap = self.pixmap.scaled(new_size, Qt.KeepAspectRatio, Qt.SmoothTransformation)
            self.zoomFactor = pixmap.width() / float(self.pixmap.width())
        return pixmap

    def _rebuildImage(self):
        if self.pixmap is None:
            self.ui.view.setText('Loading...')
            return
        elif self.pixmap.isNull():
            self.ui.view.setText('Image could not be loaded')
            return

        pixmap = self._rebuildZoom()
        self.ui.view.setPixmap(pixmap)

    @Slot()
    def saveImage(self):
        def ext_for_filter(s):
            return re.match(r'(?:[A-Z]+) \(\*\.([a-z]+)\)$', s).group(1)

        if not self.pixmap:
            return

        filters = ['PNG (*.png)', 'JPEG (*.jpg)', 'GIF (*.gif)']

        obj = self.current.data(ResultModel.RoleObject)
        name = '%s.%s' % (obj.title or obj.id or u'', obj.ext or 'png')
        default = filters[0]
        for f in filters:
            if name.endswith(ext_for_filter(f)):
                default = f
        filters = ';;'.join(filters)

        target = os.path.join(self.parent().lastSaveDir, name)
        out, filter = QFileDialog.getSaveFileName(self, 'Save image', target, filters, default)
        if not out:
            return

        ext = ext_for_filter(filter)

        self.parent().lastSaveDir = os.path.dirname(out)
        if not os.path.splitext(out)[1]:
            out = '%s.%s' % (out, ext)

            if os.path.exists(out):
                q = self.tr('%s already exists, are you sure you want to replace it?') % out
                reply = QMessageBox.question(self, self.tr('Overwrite?'), q)
                if reply == QMessageBox.No:
                    return self.saveImage()

        self.pixmap.save(out, ext.upper())
Ejemplo n.º 13
0
class Viewer(QtMainWindow):
    jobAdded = Signal()
    jobFinished = Signal()

    def __init__(self, weboob, parent=None):
        super(Viewer, self).__init__(parent)

        self.ui = Ui_Viewer()
        self.ui.setupUi(self)
        self.ui.prevButton.clicked.connect(self.prev)
        self.ui.nextButton.clicked.connect(self.next)
        self.ui.firstButton.clicked.connect(self.first)
        self.ui.lastButton.clicked.connect(self.last)
        self.ui.actionZoomIn.triggered.connect(self.zoomIn)
        self.ui.actionZoomOut.triggered.connect(self.zoomOut)
        self.ui.actionFullSize.triggered.connect(self.zoomFullSize)
        self.ui.actionFitWindow.triggered.connect(self.zoomFit)

        self.ui.actionSaveImage.setShortcut(QKeySequence.Save)
        self.ui.actionSaveImage.triggered.connect(self.saveImage)
        self.ui.actionClose.setShortcut(QKeySequence.Close)
        self.ui.actionClose.triggered.connect(self.close)

        self.model = None
        self.current = None
        self.total = 0
        self.zoomFactor = 1
        self.zoomMode = ZOOM_FACTOR
        self.weboob = weboob

    def setData(self, model, qidx):
        self.model = model
        self.current = QPersistentModelIndex(qidx)

        self.model.rowsInserted.connect(self.updatePos)
        self.model.rowsRemoved.connect(self.updatePos)
        self.model.rowsInserted.connect(self.updateNavButtons)
        self.model.rowsRemoved.connect(self.updateNavButtons)
        self.model.dataChanged.connect(self._dataChanged)
        self.model.modelReset.connect(self.disable)

        self.updateImage()

    @Slot()
    def disable(self):
        self.setEnabled(False)

    def updateNavButtons(self):
        prev = self.current.row() > 0
        self.ui.prevButton.setEnabled(prev)
        self.ui.firstButton.setEnabled(prev)
        next = self.current.row() < self.total - 1
        self.ui.nextButton.setEnabled(next)
        self.ui.lastButton.setEnabled(next)

    def updatePos(self):
        self.total = self.model.rowCount(self.current.parent())
        self.ui.posLabel.setText('%d / %d' %
                                 (self.current.row() + 1, self.total))

    def updateImage(self):
        self.updatePos()
        self.updateNavButtons()

        obj = self.current.data(ResultModel.RoleObject)

        if obj.data is NotLoaded:
            self.model.fillObj(obj, ['data'], QModelIndex(self.current))
            self.pixmap = None
        elif obj.data:
            self.pixmap = QPixmap(QImage.fromData(obj.data))
        else:
            self.pixmap = QPixmap()

        self._rebuildImage()

    @Slot(QModelIndex)
    def _dataChanged(self, qidx):
        if qidx == self.current:
            obj = qidx.data(ResultModel.RoleObject)

            if obj.data:
                self.pixmap = QPixmap(QImage.fromData(obj.data))
            else:
                self.pixmap = QPixmap()
            self._rebuildImage()

    @Slot()
    def next(self):
        new = self.current.sibling(self.current.row() + 1, 0)
        if not new.isValid():
            return
        self.current = QPersistentModelIndex(new)
        self.updateImage()

    @Slot()
    def prev(self):
        if self.current.row() == 0:
            return
        self.current = QPersistentModelIndex(
            self.current.sibling(self.current.row() - 1, 0))
        self.updateImage()

    @Slot()
    def first(self):
        self.current = QPersistentModelIndex(self.current.sibling(0, 0))
        self.updateImage()

    @Slot()
    def last(self):
        self.current = QPersistentModelIndex(
            self.current.sibling(self.total - 1, 0))
        self.updateImage()

    @Slot()
    def zoomIn(self):
        self.zoomFactor *= 1.25
        self.zoomMode = ZOOM_FACTOR
        self._rebuildImage()

    @Slot()
    def zoomOut(self):
        self.zoomFactor *= 0.75
        self.zoomMode = ZOOM_FACTOR
        self._rebuildImage()

    @Slot()
    def zoomFullSize(self):
        self.zoomFactor = 1
        self.zoomMode = ZOOM_FACTOR
        self._rebuildImage()

    @Slot()
    def zoomFit(self):
        self.zoomMode = ZOOM_FIT
        self._rebuildImage()

    def resizeEvent(self, ev):
        super(Viewer, self).resizeEvent(ev)
        if self.zoomMode == ZOOM_FIT:
            self._rebuildImage()

    def _rebuildZoom(self):
        if self.zoomMode == ZOOM_FACTOR:
            new_width = int(self.pixmap.width() * self.zoomFactor)
            pixmap = self.pixmap.scaledToWidth(new_width,
                                               Qt.SmoothTransformation)
        else:
            new_size = self.ui.scrollArea.viewport().size()
            pixmap = self.pixmap.scaled(new_size, Qt.KeepAspectRatio,
                                        Qt.SmoothTransformation)
            self.zoomFactor = pixmap.width() / float(self.pixmap.width())
        return pixmap

    def _rebuildImage(self):
        if self.pixmap is None:
            self.ui.view.setText('Loading...')
            return
        elif self.pixmap.isNull():
            self.ui.view.setText('Image could not be loaded')
            return

        pixmap = self._rebuildZoom()
        self.ui.view.setPixmap(pixmap)

    @Slot()
    def saveImage(self):
        def ext_for_filter(s):
            return re.match(r'(?:[A-Z]+) \(\*\.([a-z]+)\)$', s).group(1)

        if not self.pixmap:
            return

        filters = ['PNG (*.png)', 'JPEG (*.jpg)', 'GIF (*.gif)']

        obj = self.current.data(ResultModel.RoleObject)
        name = '%s.%s' % (obj.title or obj.id or u'', obj.ext or 'png')
        default = filters[0]
        for f in filters:
            if name.endswith(ext_for_filter(f)):
                default = f
        filters = ';;'.join(filters)

        target = os.path.join(self.parent().lastSaveDir, name)
        out, filter = QFileDialog.getSaveFileName(self, 'Save image', target,
                                                  filters, default)
        if not out:
            return

        ext = ext_for_filter(filter)

        self.parent().lastSaveDir = os.path.dirname(out)
        if not os.path.splitext(out)[1]:
            out = '%s.%s' % (out, ext)

            if os.path.exists(out):
                q = self.tr(
                    '%s already exists, are you sure you want to replace it?'
                ) % out
                reply = QMessageBox.question(self, self.tr('Overwrite?'), q)
                if reply == QMessageBox.No:
                    return self.saveImage()

        self.pixmap.save(out, ext.upper())
Ejemplo n.º 14
0
 def cleardata(self, tableview, tablemodel, data):
     for r in range(len(data)):
         tableview.selectRow(r)
         for model_index in tableview.selectionModel().selectedRows():
             index = QPersistentModelIndex(model_index)
             tablemodel.removeRow(index.row())
Ejemplo n.º 15
0
    def fillTable(self, init=False):
        try:
            if self.crs is None or self.crsLay is None: return
            if self.isHidden() and not init: return
            if self.debug: self.info.log("fillTable", "debug", self.debug)
            self.blockItemChange = True
            self.tblCoords.clear()
            self.tblCoords.setColumnCount(5)
            self.tblCoords.setHorizontalHeaderItem(0, QTableWidgetItem("X"))
            self.tblCoords.setHorizontalHeaderItem(1, QTableWidgetItem("Y"))
            self.tblCoords.setHorizontalHeaderItem(2, QTableWidgetItem(""))
            self.tblCoords.setHorizontalHeaderItem(3, QTableWidgetItem("Xr"))
            self.tblCoords.setHorizontalHeaderItem(4, QTableWidgetItem("Yr"))
            self.tblCoords.horizontalHeader().setSectionHidden(3, self.debug)
            # self.tblCoords.setColumnHidden(3, self.debug)
            self.tblCoords.setColumnHidden(4, self.debug)

            self.tblCoords.horizontalHeader().setSectionResizeMode(
                QHeaderView.Stretch)
            self.tblCoords.horizontalHeader().setSectionResizeMode(
                2, QHeaderView.ResizeToContents)  # QHeaderView.Fixed

            destCrs = self.crs
            self.canvas.refresh()

            if self.cboFeat.currentData():
                feat = self.layer.getFeature(self.cboFeat.currentData())
                geometry = feat.geometry()
                tr = QgsCoordinateTransform(self.crsLay, destCrs, self.prj)
                row = 0
                column = 2  # btn column
                for v in geometry.vertices():
                    self.tblCoords.setRowCount(row + 1)
                    if self.debug: self.info.log("vertex:", v.x(), v.y())
                    v.transform(tr)

                    itemX = QTableWidgetItem(str(v.x()))
                    self.tblCoords.setItem(row, 0, itemX)
                    itemY = QTableWidgetItem(str(v.y()))
                    self.tblCoords.setItem(row, 1, itemY)

                    itemXr = QTableWidgetItem(str(v.x()))
                    self.tblCoords.setItem(row, 3, itemXr)
                    itemYr = QTableWidgetItem(str(v.y()))
                    self.tblCoords.setItem(row, 4, itemYr)

                    index = QPersistentModelIndex(self.tblCoords.model().index(
                        row, column))
                    btn = MyButton(self.gtomain)
                    btn.setIcon(self.icon)
                    btn.click.connect(lambda *args, index=index: self.
                                      cellClick(index.row(), index.column()))
                    btn.setEnabled(False)
                    btn.setPixmap(self.icon.pixmap(24, 24))

                    self.tblCoords.setCellWidget(row, 2, btn)
                    row = row + 1
                    if self.debug:
                        self.info.log("vertex transformed:", v.x(), v.y())
                self.reset()

                if geometry.type(
                ) == QgsWkbTypes.GeometryType.PolygonGeometry:  # remove double vertex????
                    self.tblCoords.removeRow(self.tblCoords.rowCount() - 1)
                if self.isVisible():
                    self.setRubber()
                    self.markedFeature = self.helper.markFeature(
                        self.layer, feat)
                    self.btnZoomTo.setEnabled(True)
                    self.blockItemChange = False
                    self.tblCoords.setCurrentCell(0, 0)
            else:
                self.reset()
            self.blockItemChange = False
        except Exception as e:
            self.info.err(e)