Пример #1
0
 def load_file(self):
     path = QFileDialog.getOpenFileName(self, "Open File")[0]
     if path != "":
         self.data = HexData(path)
         self.fill_data()
         self.file_name.setText("File name: " + path.split("/")[-1])
         self.table.setDisabled(False)
         self.add.setDisabled(False)
         self.save.setDisabled(False)
         self.delete.setDisabled(False)
Пример #2
0
 def test_data_long_change(self):
     data = HexData("test.txt")
     assert(data.check_change(0, 0, "aaaaa") is False)
Пример #3
0
 def test_data_change(self):
     data = HexData("test.txt")
     assert(data.check_change(0, 0, "aa") is True)
Пример #4
0
 def test_save(self):
     data = HexData("test.txt")
     length = len(data.data)
     data.save()
     data = HexData("test.txt")
     assert(len(data.data) == length)
Пример #5
0
 def test_delete_row(self):
     data = HexData("test.txt")
     rows = len(data.data)
     data.delete_row()
     assert(len(data.data) - rows == -1)
Пример #6
0
 def test_add_row(self):
     data = HexData("test.txt")
     rows = len(data.data)
     data.add_row()
     assert(len(data.data) - rows == 1)
Пример #7
0
 def test_bad_encoding(self):
     data = HexData("test.txt")
     assert(data.check_change_encoded_text(0, "a" * 24) is False)
Пример #8
0
 def test_encoding(self):
     data = HexData("test.txt")
     assert(data.check_change_encoded_text(0, "A.ab" * 4) is True)
Пример #9
0
 def test_data_change_last_row(self):
     data = HexData("test.txt")
     assert(data.check_change(-1, 15, "aa") is True)
Пример #10
0
 def test_data_bad_change(self):
     data = HexData("test.txt")
     assert(data.check_change(0, 0, "fashfbaksj") is False)
Пример #11
0
class HexEditorWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.data = None
        self.initUI()

    def initUI(self):
        self.setFixedSize(1050, 900)
        self.setWindowTitle("Hex editor")

        self.table = QTableWidget(100, 10, self)
        self.table.cellChanged.connect(self.cell_changed)
        self.table.setColumnCount(17)
        self.table.resizeRowsToContents()
        self.table.resizeColumnsToContents()
        self.table.setHorizontalHeaderLabels(
            ["0" + hex(x)[2:] for x in range(0, 16)] + [""])
        self.table.setVerticalHeaderLabels(
            [hex(y * 16)[2:].zfill(8) for y in range(0, 100)])
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
        self.table.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)
        self.table.setDisabled(True)

        self.file_name = QLabel(self)
        self.file_name.setText("File name: ")

        self.load = QPushButton("Open", self)
        self.load.clicked.connect(self.load_file)

        self.add = QPushButton("Add row", self)
        self.add.clicked.connect(self.add_row)
        self.add.setDisabled(True)

        self.delete = QPushButton("Delete row", self)
        self.delete.clicked.connect(self.delete_row)
        self.delete.setDisabled(True)

        self.save = QPushButton("Save", self)
        self.save.clicked.connect(self.save_file)
        self.save.setDisabled(True)

        layout = QGridLayout()
        layout.addWidget(self.table, 1, 0, 10, 10)
        layout.addWidget(self.load, 0, 0)
        layout.addWidget(self.add, 0, 1)
        layout.addWidget(self.save, 0, 3)
        layout.addWidget(self.delete, 0, 2)
        layout.addWidget(self.file_name, 0, 4)
        window = QWidget()
        window.setLayout(layout)
        self.setCentralWidget(window)

    def load_file(self):
        path = QFileDialog.getOpenFileName(self, "Open File")[0]
        if path != "":
            self.data = HexData(path)
            self.fill_data()
            self.file_name.setText("File name: " + path.split("/")[-1])
            self.table.setDisabled(False)
            self.add.setDisabled(False)
            self.save.setDisabled(False)
            self.delete.setDisabled(False)

    def fill_data(self):
        self.table.setRowCount(len(self.data.data))
        for y in range(len(self.data.data)):
            for x in range(len(self.data.data[y])):
                self.table.setItem(y, x,
                                   QTableWidgetItem(self.data.data[y][x]))
        for i in range(len(self.data.encoding)):
            self.table.setItem(i, 16, QTableWidgetItem(self.data.encoding[i]))
        self.table.resizeColumnsToContents()
        self.table.setVerticalHeaderLabels(
            [hex(y * 16)[2:].zfill(8) for y in range(len(self.data.data))])

    def cell_changed(self, row, col):
        if self.data is None:
            self.table.item(row, col).setText("")
            return
        if not self.table.item(row, col).isSelected():
            return
        if col == 16:
            if self.data.check_change_encoded_text(
                    row,
                    self.table.item(row, col).text()):
                self.update_row(row)
            else:
                self.table.setItem(row, 16,
                                   QTableWidgetItem(self.data.encoding[row]))
            return
        elif not self.data.check_change(
                row, col,
                self.table.item(row, col).text().lower()):
            if not len(self.data.data[row]) - 1 < col:
                self.table.item(row, col).setText(self.data.data[row][col])
            else:
                self.table.item(row, col).setText("")
        else:
            self.table.item(row, 16).setText(self.data.encoding[row])
            self.table.item(row, col).setForeground(QBrush(Qt.red))
            self.data.changed_cells.add((row, col))
        self.update_row(row)

    def update_row(self, row):
        for x in range(len(self.data.data[row])):
            if self.table.item(row, x) is None:
                self.table.setItem(row, x, QTableWidgetItem(""))
            if self.table.item(row, x).text() != self.data.data[row][x]:
                self.table.item(row, x).setText(self.data.data[row][x])
                self.table.item(row, x).setForeground(QBrush(Qt.red))
                self.data.changed_cells.add((row, x))
        if self.table.item(row, 16) is None:
            self.table.setItem(row, 16, QTableWidgetItem(""))
        if self.table.item(row, 16).text() != self.data.encoding[row]:
            self.table.setItem(row, 16,
                               QTableWidgetItem(self.data.encoding[row]))

    def save_file(self):
        if self.data is not None:
            self.data.save()
            self.recolor_changes()

    def add_row(self):
        row_count = self.table.rowCount()
        self.table.insertRow(row_count)
        for x in range(17):
            self.table.setItem(row_count, x, QTableWidgetItem(""))
        self.table.setVerticalHeaderItem(
            row_count, QTableWidgetItem(hex(row_count * 16)[2:].zfill(8)))
        self.data.add_row()
        self.update_row(row_count - 1)

    def delete_row(self):
        self.table.removeRow(self.table.rowCount() - 1)
        self.data.delete_row()

    def recolor_changes(self):
        for cell in self.data.changed_cells:
            self.table.item(cell[0], cell[1]).setForeground(QBrush(Qt.black))
        self.data.changed_cells.clear()