#include "dialog_export.h" #include "ui_dialog_export.h" #include #include #include #include #include "dialog_savequality.h" #include "HGUIGlobal.h" #include "app_cfg.h" Dialog_Export::Dialog_Export(int total, const std::vector &selectedIndexs, QWidget *parent) : QDialog(parent) , ui(new Ui::Dialog_Export) , m_total(total) , m_selectedIndexs(selectedIndexs) { ui->setupUi(this); ui->fileDialog->setAcceptMode(QFileDialog::AcceptSave); ui->fileDialog->setWindowFlags(ui->fileDialog->windowFlags() & ~Qt::Dialog); 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)"); connect(ui->fileDialog, SIGNAL(accepted()), this, SLOT(on_dialog_accepted())); connect(ui->fileDialog, SIGNAL(rejected()), this, SLOT(close())); connect(ui->fileDialog, SIGNAL(filterSelected(const QString&)), this, SLOT(on_filterSelected(const QString&))); QButtonGroup* btn_group = new QButtonGroup(this); btn_group->addButton(ui->radio_chosenPages, 0); btn_group->addButton(ui->radio_allPages, 1); btn_group->addButton(ui->radio_nominatedPages, 2); QRegExp rx("[0-9,-]+$"); ui->lineEdit_nominatePages->setValidator(new QRegExpValidator(rx, this)); m_saveQuality = getCfgValue("export", "quality", 0); m_suffix = getCfgValue("export", "suffix", 0); ui->fileDialog->selectNameFilter(ui->fileDialog->nameFilters().at(m_suffix)); ui->check_saveAsMulti->setEnabled(m_suffix > 2); ui->check_saveAsMulti->setChecked(getCfgValue("export", "saveAsMulti", false)); int exportType = getCfgValue("export", "exportType", 0); if (0 == exportType) { ui->radio_chosenPages->setChecked(true); ui->lab_nominatePages->setEnabled(false); ui->lineEdit_nominatePages->setEnabled(false); ui->lab_warning->setVisible(false); } else if (1 == exportType) { ui->radio_allPages->setChecked(true); ui->lab_nominatePages->setEnabled(false); ui->lineEdit_nominatePages->setEnabled(false); ui->lab_warning->setVisible(false); } else { ui->radio_nominatedPages->setChecked(true); ui->lab_nominatePages->setEnabled(true); ui->lineEdit_nominatePages->setEnabled(true); ui->lab_warning->setVisible(true); ui->lab_warning->setText(tr("Input is not valid.\nPage range will be 'Chosen Pages'.")); } } Dialog_Export::~Dialog_Export() { delete ui; } QString Dialog_Export::getSavePath() { return m_savePath; } QString Dialog_Export::getSaveName() { return m_saveName; } QString Dialog_Export::getSaveExt() { return m_saveExt; } int Dialog_Export::getSaveQuality() { return m_saveQuality; } bool Dialog_Export::isSaveAsMultiPage() { return ui->check_saveAsMulti->isChecked(); } void Dialog_Export::getSaveIndexs(std::vector &indexs) { indexs = m_saveIndexs; } 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; } assert(!extName.isEmpty()); QString selectedFile = ui->fileDialog->selectedFiles()[0]; int pos = selectedFile.lastIndexOf('/'); if (-1 != pos) { QString path = selectedFile.left(pos + 1); QString name = selectedFile.right(selectedFile.count() - pos - 1); pos = name.lastIndexOf('.'); if (-1 != pos) name = name.left(pos); m_savePath = getStdFileName(path); m_saveName = name; m_saveExt = extName; } makeSaveIndexs(); saveCfgValue("export", "quality", m_saveQuality); saveCfgValue("export", "suffix", m_suffix); int exportType = 0; if (ui->radio_chosenPages->isChecked()) exportType = 0; else if (ui->radio_allPages->isChecked()) exportType = 1; else if (ui->radio_nominatedPages->isChecked()) exportType = 2; saveCfgValue("export", "exportType", exportType); saveCfgValue("export", "saveAsMulti", ui->check_saveAsMulti->isChecked()); accept(); } void Dialog_Export::on_filterSelected(const QString& filterName) { m_suffix = ui->fileDialog->nameFilters().indexOf(filterName); ui->check_saveAsMulti->setEnabled(m_suffix > 2); if (m_suffix <= 2) ui->check_saveAsMulti->setChecked(false); } void Dialog_Export::on_btn_option_clicked() { Dialog_SaveQuality dlg(m_saveQuality, this); if (dlg.exec()) { m_saveQuality = dlg.getSaveQuality(); } } void Dialog_Export::on_radio_nominatedPages_toggled(bool checked) { ui->lab_nominatePages->setEnabled(checked); ui->lineEdit_nominatePages->setEnabled(checked); if (!checked) { ui->lab_warning->setVisible(false); } else { bool isVaild = isNominatedPagesLegal(ui->lineEdit_nominatePages->text()); ui->lab_warning->setVisible(!isVaild); if (!isVaild) ui->lab_warning->setText(tr("Input is not valid.\nPage range will be 'Chosen Pages'.")); } } void Dialog_Export::on_lineEdit_nominatePages_textChanged(const QString& arg1) { (void)arg1; bool isVaild = isNominatedPagesLegal(ui->lineEdit_nominatePages->text()); ui->lab_warning->setVisible(!isVaild); if (!isVaild) ui->lab_warning->setText(tr("Input is not valid.\nPage range will be 'Chosen Pages'.")); } bool Dialog_Export::isNominatedPagesLegal(const QString& page) { if (page.isEmpty()) { return false; } QStringList commalist = page.split(','); for (int i = 0; i < commalist.size(); ++i) { QString number1, number2; bool setNumber2 = false; for (int j = 0; j < commalist[i].size(); j++) { if (number1.isEmpty() && number2.isEmpty()) { if (commalist[i][j] == '-') { return false; } else { number1.append(commalist[i][j]); } } else if (!number1.isEmpty() && number2.isEmpty()) { if (commalist[i][j] == '-') { if (setNumber2) { return false; } else { setNumber2 = true; } } else { if (!setNumber2) { number1.append(commalist[i][j]); } else { number2.append(commalist[i][j]); } } } else { assert(!number1.isEmpty() && !number2.isEmpty()); assert(setNumber2); if (commalist[i][j] == '-') { return false; } else { number2.append(commalist[i][j]); } } } if (number1.isEmpty()) { return false; } if (setNumber2 && number2.isEmpty()) { return false; } if (!number1.isEmpty() && number2.isEmpty()) { int num1 = number1.toInt(); if (num1 < 1 || num1 > m_total) { return false; } } else { assert(!number1.isEmpty() && !number2.isEmpty()); int num1 = number1.toInt(); int num2 = number2.toInt(); if (num1 < 1 || num1 > m_total || num2 < 1 || num2 > m_total || num1 > num2) { return false; } } } return true; } static bool indexSortCompare(int iter1, int iter2) { return iter1 < iter2; } static bool indexUniqueCompare(int iter1, int iter2) { return iter1 == iter2; } void Dialog_Export::makeSaveIndexs() { if (ui->radio_chosenPages->isChecked()) { m_saveIndexs = m_selectedIndexs; } else if (ui->radio_allPages->isChecked()) { for (int i = 0; i < m_total; ++i) { m_saveIndexs.push_back(i); } } else { assert(ui->radio_nominatedPages->isChecked()); QString page = ui->lineEdit_nominatePages->text(); if (!page.isEmpty()) { bool success = true; QStringList commalist = page.split(','); for (int i = 0; i < commalist.size(); ++i) { bool ret = true; QString number1, number2; bool setNumber2 = false; for (int j = 0; j < commalist[i].size(); j++) { if (number1.isEmpty() && number2.isEmpty()) { if (commalist[i][j] == '-') { ret = false; break; } else { number1.append(commalist[i][j]); } } else if (!number1.isEmpty() && number2.isEmpty()) { if (commalist[i][j] == '-') { if (setNumber2) { ret = false; break; } else { setNumber2 = true; } } else { if (!setNumber2) { number1.append(commalist[i][j]); } else { number2.append(commalist[i][j]); } } } else { assert(!number1.isEmpty() && !number2.isEmpty()); assert(setNumber2); if (commalist[i][j] == '-') { ret = false; break; } else { number2.append(commalist[i][j]); } } } if (!ret) { success = false; break; } if (number1.isEmpty()) { ret = false; } if (setNumber2 && number2.isEmpty()) { ret = false; } if (!number1.isEmpty() && number2.isEmpty()) { int num1 = number1.toInt(); if (num1 < 1 || num1 > m_total) { ret = false; } else { m_saveIndexs.push_back(num1); } } else { assert(!number1.isEmpty() && !number2.isEmpty()); int num1 = number1.toInt(); int num2 = number2.toInt(); if (num1 < 1 || num1 > m_total || num2 < 1 || num2 > m_total || num1 > num2) { ret = false; } else { for (int k = num1; k <= num2; ++k) { m_saveIndexs.push_back(k - 1); } } } if (!ret) { success = false; break; } } if (!success) { m_saveIndexs = m_selectedIndexs; } } else { m_saveIndexs = m_selectedIndexs; } } // 排序和去重 std::sort(m_saveIndexs.begin(), m_saveIndexs.end(), indexSortCompare); std::vector::iterator iter = std::unique(m_saveIndexs.begin(), m_saveIndexs.end(), indexUniqueCompare); m_saveIndexs.erase(iter, m_saveIndexs.end()); }