From 6ebd78e47427234093ad10d8eb0223ccc5399ab0 Mon Sep 17 00:00:00 2001 From: forth32 Date: Thu, 19 Apr 2018 14:09:09 +0300 Subject: [PATCH] =?UTF-8?q?nvexplorer:=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B8=20=D0=B8=D0=B7=D0=B2=D0=BB=D0=B5=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=8F=D1=87=D0=B5=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nvexplorer.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++----- nvexplorer.h | 3 ++ 2 files changed, 84 insertions(+), 9 deletions(-) diff --git a/nvexplorer.cpp b/nvexplorer.cpp index a3715a6..23000f6 100644 --- a/nvexplorer.cpp +++ b/nvexplorer.cpp @@ -188,7 +188,11 @@ toolbar->addSeparator(); menu_edit->addAction(QIcon(":/icon_hex.png"),"Редактировать ячейку",this,SLOT(edititem()),QKeySequence("F2")); toolbar->addAction(QIcon(":/icon_hex.png"),"Редактировать ячейку",this,SLOT(edititem())); -toolbar->addSeparator(); +menu_edit->addAction(QIcon::fromTheme("document-save"),"Извлечь ячейку в файл",this,SLOT(extract_item()),QKeySequence("F11")); +toolbar->addAction(QIcon::fromTheme("document-save"),"Извлечь ячейку в файл",this,SLOT(extract_item())); + +menu_edit->addAction(QIcon::fromTheme("object-flip-vertical"),"Загрузить ячейку из файла",this,SLOT(replace_file()),0); +toolbar->addAction(QIcon::fromTheme("object-flip-vertical"),"Загрузить ячейку из файла",this,SLOT(replace_item())); menu_view->addAction(QIcon::fromTheme("zoom-in"),"Увеличить шрифт",this,SLOT(zoomin()),QKeySequence("Ctrl++")); toolbar->addAction(QIcon::fromTheme("zoom-in"),"Увеличить шрифт",this,SLOT(zoomin())); @@ -340,24 +344,36 @@ if (res == QDialog::Accepted) { // изменения приняты hexcup=dhex->data(); memcpy(pdata+itemoff_idx(row),hexcup.data(),len); - // пересчитываем индивидуальную CRC - для файлов образов прошивок это не требуется + changed_item(row); +} +qDebug ()<< qd->geometry(); +delete qd; +} + + + +//********************************************************************** +//* Пост-обработка модификации ячеек +//********************************************************************** +void nvexplorer::changed_item(int row) { + +QString title; + +// пересчитываем индивидуальную CRC - для файлов образов прошивок это не требуется // if (crcmode == 2) restore_item_crc(row); - // заголовок - if (!changed) { + +// Вводим звездочку в заголовок +if (!changed) { // вводим звездочку в заголовок title=windowTitle(); title.append(" *"); setWindowTitle(title); changed=true; - } -} +} // перерисовываем строку данных в таблице datacell(row); -qDebug ()<< qd->geometry(); -delete qd; } - //********************************************************************** //* Сохранение всех изменений обратно в исходный буфер //********************************************************************** @@ -383,3 +399,59 @@ if (pos != -1) { changed=false; } +//********************************************************************** +//* Извлечение ячейки в файл +//********************************************************************** +void nvexplorer::extract_item() { + +QString filename; + +int row=nvtable->currentRow(); +filename.sprintf("nvitem-%05i.bin",itemlist[row].id); +filename=QFileDialog::getSaveFileName(this,"Имя сохраняемого файла",filename,"All files (*.*)"); +if (filename.isEmpty()) return; + +QFile out(filename,this); +if (!out.open(QIODevice::WriteOnly)) { + QMessageBox::critical(0,"Ошибка","Ошибка создания файла"); + return; +} +out.write((char*)(pdata+itemoff_idx(row)),itemlist[row].len); +out.close(); +} + +//********************************************************************** +//* Загрузка ячейки из файла +//********************************************************************** +void nvexplorer::replace_item() { + +QString filename; +QString str; + +int row=nvtable->currentRow(); +filename.sprintf("nvitem-%05i.bin",itemlist[row].id); +filename=QFileDialog::getOpenFileName(this,"Имя файла",filename,"All files (*.*)"); +if (filename.isEmpty()) return; + +QFile in(filename,this); +if (!in.open(QIODevice::ReadOnly)) { + QMessageBox::critical(0,"Ошибка","Ошибка открытия файла"); + return; +} + +if (in.size() != itemlist[row].len) { + in.close(); + str.sprintf("Размер файла (%i) не совпадает с размером ячейки (%i)",(uint32_t)in.size(),(uint32_t)itemlist[row].len); + QMessageBox::critical(0,"Ошибка",str); + return; +} + + +in.read((char*)(pdata+itemoff_idx(row)),itemlist[row].len); +in.close(); +changed_item(row); + +} + + + \ No newline at end of file diff --git a/nvexplorer.h b/nvexplorer.h index f223084..3e03a1d 100644 --- a/nvexplorer.h +++ b/nvexplorer.h @@ -95,6 +95,7 @@ int32_t itemoff (int item); int32_t itemlen (int item); int load_item(int item, char* buf); void datacell(int); +void changed_item(int); // тип CRC, используемый в файле // 0 - нет crc @@ -140,6 +141,8 @@ void save_all(); void zoomin(); void zoomout(); void edititem(); +void extract_item(); +void replace_item(); };