diff --git a/app/scanner/custom_file_dialog.h b/app/scanner/custom_file_dialog.h index 9ab4a589..7ceca36c 100644 --- a/app/scanner/custom_file_dialog.h +++ b/app/scanner/custom_file_dialog.h @@ -230,9 +230,19 @@ protected: new_->setText(text); else if(edit_) { + QString ext(text), sel_ext(((T*)this)->getSaveExt()); + int pos = ext.lastIndexOf('.'); + list_->clearSelection(); - edit_->setText(text); - edit_->setSelection(0, text.length()); + if(pos == -1) + edit_->setText(text + sel_ext); + else { + ext = ext.right(ext.length() - pos); + if(ext.compare(sel_ext, Qt::CaseInsensitive) == 0) + edit_->setText(text); + else + edit_->setText(text + sel_ext); + } } if(save_) diff --git a/app/scanner/dialog_export.cpp b/app/scanner/dialog_export.cpp index 7ca08ec9..2c3aec40 100644 --- a/app/scanner/dialog_export.cpp +++ b/app/scanner/dialog_export.cpp @@ -9,6 +9,32 @@ #include "app_cfg.h" #include +#define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) + +enum file_type_attr +{ + FILE_TYPE_ATTR_NO_MORE_OPTION = 0x0, + FILE_TYPE_ATTR_MORE_OPTIONS = 0x01 << 0, // this type supports more-parameters + FILE_TYPE_ATTR_CONTAIN_MULTI_PAGES = 0x01 << 1, // this type supports multi-images to be saved into one file + FILE_TYPE_ATTR_THIRD_HANDLER = 0x01 << 2, // this type supports third-handling methods +}; +static struct +{ + QString ext; + QString title; + int attr; +}g_support_type[] = +{ + {".jpg", "JPG - JPEG / JFIF", FILE_TYPE_ATTR_MORE_OPTIONS} + , {".bmp", "BMP - Windows Bitmap", FILE_TYPE_ATTR_NO_MORE_OPTION} + , {".png", "PNG - Portable Network Graphics", FILE_TYPE_ATTR_NO_MORE_OPTION} + , {".tif", "TIF - TIFF Revision 6", FILE_TYPE_ATTR_CONTAIN_MULTI_PAGES | FILE_TYPE_ATTR_MORE_OPTIONS} + , {".pdf", "PDF - Portable Document Format", FILE_TYPE_ATTR_CONTAIN_MULTI_PAGES} + , {".ofd", "OFD - Open Fixed-layout Document", FILE_TYPE_ATTR_CONTAIN_MULTI_PAGES} + , {".pdf", "OCR->PDF - Portable Document Format", FILE_TYPE_ATTR_THIRD_HANDLER} + , {".ofd", "OCR->OFD - Open Fixed-layout Document", FILE_TYPE_ATTR_THIRD_HANDLER} +}; + Dialog_Export::Dialog_Export(int total, const std::vector &selectedIndexs, QWidget *parent) : QDialog(parent) , ui(new Ui::Dialog_Export) @@ -22,14 +48,18 @@ Dialog_Export::Dialog_Export(int total, const std::vector &selectedIndexs, ui->fileDialog->setOption(QFileDialog::DontUseNativeDialog, true); ui->fileDialog->setSizeGripEnabled(false); - ui->fileDialog->setNameFilter("JPG - JPEG / JFIF(*.jpg);;" - "BMP - Windows Bitmap(*.bmp);;" - "PNG - Portable Network Graphics(*.png);;" - "TIF - TIFF Revision 6(*.tif);;" - "PDF - Portable Document Format(*.pdf);;" - "OFD - Open Fixed-layout Document(*.ofd);;" - "OCR->PDF - Portable Document Format(*.pdf);;" - "OCR->OFD - Open Fixed-layout Document(*.ofd)"); +// ui->fileDialog->setNameFilter("JPG - JPEG / JFIF(*.jpg);;" +// "BMP - Windows Bitmap(*.bmp);;" +// "PNG - Portable Network Graphics(*.png);;" +// "TIF - TIFF Revision 6(*.tif);;" +// "PDF - Portable Document Format(*.pdf);;" +// "OFD - Open Fixed-layout Document(*.ofd);;" +// "OCR->PDF - Portable Document Format(*.pdf);;" +// "OCR->OFD - Open Fixed-layout Document(*.ofd)"); + QStringList filters; + for(int i = 0; i < ARRAY_SIZE(g_support_type); ++i) + filters.push_back(g_support_type[i].title + "(*" + g_support_type[i].ext + ")"); + ui->fileDialog->setNameFilters(filters); connect(ui->fileDialog, SIGNAL(accepted()), this, SLOT(on_dialog_accepted())); connect(ui->fileDialog, SIGNAL(rejected()), this, SLOT(close())); @@ -48,10 +78,15 @@ Dialog_Export::Dialog_Export(int total, const std::vector &selectedIndexs, ui->lineEdit_nominatePages->setValidator(new QRegExpValidator(rx, this)); m_suffix = getCfgValue("export", "suffix", 0); + if(m_suffix < 0 || m_suffix >= ARRAY_SIZE(g_support_type)) + m_suffix = 0; ui->fileDialog->selectNameFilter(ui->fileDialog->nameFilters().at(m_suffix)); - ui->check_saveAsMulti->setEnabled(m_suffix > 2 && m_suffix < 6); + m_saveExt = g_support_type[m_suffix].ext; + // ui->check_saveAsMulti->setEnabled(m_suffix > 2 && m_suffix < 6); + ui->check_saveAsMulti->setEnabled((g_support_type[m_suffix].attr & FILE_TYPE_ATTR_CONTAIN_MULTI_PAGES) == FILE_TYPE_ATTR_CONTAIN_MULTI_PAGES); ui->check_saveAsMulti->setChecked(getCfgValue("export", "saveAsMulti", false)); - ui->btn_option->setEnabled(0 == m_suffix || 3 == m_suffix); + // ui->btn_option->setEnabled(m_suffix == 0 || m_suffix == 3); + ui->btn_option->setEnabled((g_support_type[m_suffix].attr & FILE_TYPE_ATTR_MORE_OPTIONS) == FILE_TYPE_ATTR_MORE_OPTIONS); int exportType = getCfgValue("export", "exportType", 0); if (0 == exportType) @@ -120,7 +155,8 @@ int Dialog_Export::getTiffQuality() bool Dialog_Export::isOcr() { - return (m_suffix >= 6); + // return (m_suffix >= 6); + return (g_support_type[m_suffix].attr & FILE_TYPE_ATTR_THIRD_HANDLER) == FILE_TYPE_ATTR_THIRD_HANDLER; } bool Dialog_Export::isSaveAsMultiPage() @@ -135,37 +171,38 @@ void Dialog_Export::getSaveIndexs(std::vector &indexs) void Dialog_Export::on_dialog_accepted() { - QString extName; - switch (m_suffix) - { - case 0: - extName = ".jpg"; - break; - case 1: - extName = ".bmp"; - break; - case 2: - extName = ".png"; - break; - case 3: - extName = ".tif"; - break; - case 4: - extName = ".pdf"; - break; - case 5: - extName = ".ofd"; - break; - case 6: - extName = ".pdf"; - break; - case 7: - extName = ".ofd"; - break; - } + QString extName(g_support_type[m_suffix].ext); +// switch (m_suffix) +// { +// case 0: +// extName = ".jpg"; +// break; +// case 1: +// extName = ".bmp"; +// break; +// case 2: +// extName = ".png"; +// break; +// case 3: +// extName = ".tif"; +// break; +// case 4: +// extName = ".pdf"; +// break; +// case 5: +// extName = ".ofd"; +// break; +// case 6: +// extName = ".pdf"; +// break; +// case 7: +// extName = ".ofd"; +// break; +// } assert(!extName.isEmpty()); + bool warning = true; QString selectedFile = ui->fileDialog->selectedFiles()[0]; int pos = selectedFile.lastIndexOf('/'); if (-1 != pos) @@ -173,8 +210,12 @@ void Dialog_Export::on_dialog_accepted() QString path = selectedFile.left(pos + 1); QString name = selectedFile.right(selectedFile.count() - pos - 1); pos = name.lastIndexOf('.'); - if (-1 != pos) + if (-1 != pos + && is_support_file_type(name.right(name.length() - pos))) + { + warning = false; // 带扩展名,系统已经警告同名文件 name = name.left(pos); + } m_savePath = getStdFileName(path); m_saveName = name; @@ -183,6 +224,10 @@ void Dialog_Export::on_dialog_accepted() makeSaveIndexs(); + // 同名警告 + if(warning && avoid_overwriting(m_savePath + "/" + m_saveName + m_saveExt)) + return; + saveCfgValue("export", "suffix", m_suffix); int exportType = 0; @@ -200,12 +245,20 @@ void Dialog_Export::on_dialog_accepted() void Dialog_Export::on_filterSelected(const QString& filterName) { + bool enabled = false; + m_suffix = ui->fileDialog->nameFilters().indexOf(filterName); - ui->check_saveAsMulti->setEnabled(m_suffix > 2 && m_suffix < 6); - if (m_suffix <= 2 || m_suffix >= 6) + enabled = (g_support_type[m_suffix].attr & FILE_TYPE_ATTR_CONTAIN_MULTI_PAGES) == FILE_TYPE_ATTR_CONTAIN_MULTI_PAGES; + ui->check_saveAsMulti->setEnabled(enabled); + // ui->check_saveAsMulti->setEnabled(m_suffix > 2 && m_suffix < 6); + // if (m_suffix <= 2 || m_suffix >= 6) + if(!enabled) ui->check_saveAsMulti->setChecked(false); - ui->btn_option->setEnabled(0 == m_suffix || 3 == m_suffix); + enabled = (g_support_type[m_suffix].attr & FILE_TYPE_ATTR_MORE_OPTIONS) == FILE_TYPE_ATTR_MORE_OPTIONS; +// ui->btn_option->setEnabled(0 == m_suffix || 3 == m_suffix); + ui->btn_option->setEnabled(enabled); + m_saveExt = g_support_type[m_suffix].ext; } void Dialog_Export::on_btn_option_clicked() @@ -519,3 +572,44 @@ void Dialog_Export::makeSaveIndexs() std::vector::iterator iter = std::unique(m_saveIndexs.begin(), m_saveIndexs.end(), indexUniqueCompare); m_saveIndexs.erase(iter, m_saveIndexs.end()); } + +bool Dialog_Export::is_support_file_type(const QString& ext) +{ + return ext.compare(g_support_type[m_suffix].ext, Qt::CaseInsensitive) == 0; + + for(int i = 0; i < ARRAY_SIZE(g_support_type); ++i) + { + if(ext.compare(g_support_type[i].ext, Qt::CaseInsensitive) == 0) + return true; + } + + return false; +} +bool Dialog_Export::avoid_overwriting(const QString& path_file) +{ + return false; // 不能阻止文件对话框关闭,暂时不做处理 + + bool ret = false; + QFileInfo fi(path_file); + + if(fi.exists()) + { + // 单个文件才判断 + if((ui->radio_allPages->isChecked() && m_total == 1) || + (ui->radio_chosenPages->isChecked() && m_saveIndexs.size() == 1) || + (ui->radio_nominatedPages->isChecked() && m_saveIndexs.size() == 1)) + { + QString title(QString::fromStdString("\345\257\274\345\207\272\344\270\272")), info(""); + int pos = path_file.lastIndexOf('/'); + + if(pos++ == -1) + info = path_file; + else + info = path_file.right(path_file.length() - pos); + info += QString::fromStdString("\345\267\262\347\273\217\345\255\230\345\234\250\357\274\214\n\346\202\250\346\203\263\350\246\201\346\233\277\346\215\242\345\256\203\345\220\227\357\274\237"); + ret = QMessageBox::question(this, title, info) == QMessageBox::No; + } + } + + return ret; +} diff --git a/app/scanner/dialog_export.h b/app/scanner/dialog_export.h index 5bfa40e2..06c482c3 100644 --- a/app/scanner/dialog_export.h +++ b/app/scanner/dialog_export.h @@ -49,6 +49,8 @@ private slots: private: bool isNominatedPagesLegal(const QString& page); void makeSaveIndexs(); + bool is_support_file_type(const QString& ext); // ext is like as '.bmp' '.png' ... + bool avoid_overwriting(const QString& path_file); // 判断文件是否存在,若存在则提示用户是否覆盖。返回true表示用户希望重新选择 private: Ui::Dialog_Export *ui; diff --git a/modules/base/HGImage.cpp b/modules/base/HGImage.cpp index ddae0ae5..61b054d6 100644 --- a/modules/base/HGImage.cpp +++ b/modules/base/HGImage.cpp @@ -280,11 +280,14 @@ HGResult HGAPI HGBase_CreateImageFromData(HGByte* data, const HGImageInfo* info, if (HGBASE_ERR_OK != ret) return ret; - ret = HGBase_SetImageROI(srcImage, roi); - if (HGBASE_ERR_OK != ret) + if (NULL != roi) { - HGBase_DestroyImage(srcImage); - return ret; + ret = HGBase_SetImageROI(srcImage, roi); + if (HGBASE_ERR_OK != ret) + { + HGBase_DestroyImage(srcImage); + return ret; + } } ret = HGBase_CloneImage(srcImage, type, origin, image);