Exemplo n.º 1
0
class _MetadataGroupBox(QGroupBox):
    def __init__(self, parent: QWidget) -> None:
        super().__init__("Meta data:", parent)
        self.model = QStandardItemModel(self)
        self.model.setHorizontalHeaderLabels(["Key", "Value"])

        self._table_view = QTableView(self)
        self._table_view.setModel(self.model)
        self._table_view.setTabKeyNavigation(False)

        self._table_view.horizontalHeader().setSectionResizeMode(
            0, QHeaderView.ResizeToContents)
        self._table_view.horizontalHeader().setSectionResizeMode(
            1, QHeaderView.Stretch)

        self._table_view.verticalHeader().setSectionsMovable(True)
        self._table_view.verticalHeader().setDragEnabled(True)
        self._table_view.verticalHeader().setDragDropMode(
            QAbstractItemView.InternalMove)

        self._table_view.verticalHeader().setDefaultSectionSize(
            int(self._table_view.fontMetrics().height() * 1.8))

        strip = QWidget(self)
        add_row_button = QPushButton("Add new row", strip)
        del_rows_button = QPushButton("Remove selected rows", strip)
        strip_layout = QHBoxLayout(strip)
        strip_layout.setContentsMargins(0, 0, 0, 0)
        strip_layout.addWidget(add_row_button)
        strip_layout.addWidget(del_rows_button)
        strip_layout.addStretch()

        add_row_button.clicked.connect(self._on_add_button_click)
        del_rows_button.clicked.connect(self._on_delete_rows_button_click)

        layout = QVBoxLayout(self)
        layout.addWidget(self._table_view)
        layout.addWidget(strip)

    def get_data(self) -> dict[str, str]:
        metadata: dict[str, str] = OrderedDict()
        for y in range(self.model.rowCount()):
            visual_y = self._table_view.verticalHeader().visualIndex(y)
            key = self.model.item(visual_y, 0).text().strip()
            value = self.model.item(visual_y, 1).text().strip()
            if key and value:
                metadata[key] = value
        return metadata

    def _on_add_button_click(self) -> None:
        self.model.appendRow([QStandardItem(""), QStandardItem("")])

    def _on_delete_rows_button_click(self) -> None:
        rows = set(
            index.row()
            for index in self._table_view.selectionModel().selectedIndexes())
        for row in sorted(rows, reverse=True):
            self.model.removeRow(row)