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(); };