#include "BarcodeEditor.h" #include "ui_BarcodeEditor.h" #include "DateFormatEditor.h" #include "DateReplaceEditor.h" #include "CounterEditor.h" #include #include #include "DlgQrcodeFormat.h" // 使用SysPara的相关参数构造CounterEditorVM CounterEditorVM makeCounterVM(SysPara* sysPara, COUNTER_TYPE type, int digitalNum) { CounterEditorVM vm; if(!sysPara) return vm; vm.counterType = type; vm.digitalNum = digitalNum; auto& cnt1 = vm.counter1; cnt1.startValue = sysPara->para.cnt1StartValue; cnt1.endValue = sysPara->para.cnt1EndValue; cnt1.repeatValue = sysPara->para.cnt1RepeateValue; cnt1.stepValue = sysPara->para.cnt1StepValue; cnt1.currValue = sysPara->para.cnt1CurrValue; // cnt1CurrentValueInitDoneFlag 与 checkBoxResetCnt1CurrValue 的勾选互为反向 cnt1.editCurrValue = !sysPara->status.cnt1CurrentValueInitDoneFlag; cnt1.eleEyeIncEn = (sysPara->para.eleEyeClearCntInSynMode & 0x10) != 0; auto& cnt2 = vm.counter2; cnt2.startValue = sysPara->para.cnt2StartValue; cnt2.endValue = sysPara->para.cnt2EndValue; cnt2.repeatValue = sysPara->para.cnt2RepeateValue; cnt2.stepValue = sysPara->para.cnt2StepValue; cnt2.currValue = sysPara->para.cnt2CurrValue; cnt2.editCurrValue = !sysPara->status.cnt2CurrentValueInitDoneFlag; cnt2.eleEyeIncEn = (sysPara->para.eleEyeClearCntInSynMode & 0x20) != 0; return vm; } BarcodeEditor::BarcodeEditor(QWidget *parent) : QDialog(parent), ui(new Ui::BarcodeEditor) { ui->setupUi(this); applyStyleSheet(); m_dateFormatEditor = new DateFormatEditor(); m_dateReplaceEditor = new DateReplaceEditor(); m_counterEditor = new CounterEditor(); ui->lineEditContent->installEventFilter(this); m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); m_dateReplaceEditor->setDateModel(m_vm.dateViewModel); connect(ui->cbBoxType, QOverload::of(&QComboBox::currentIndexChanged), this, &BarcodeEditor::onTypeChanged); m_barcodeFormatEditor.setParent(this, m_barcodeFormatEditor.windowFlags()); m_qrcodeFormatEditor.setParent(this, m_qrcodeFormatEditor.windowFlags()); m_barcodeFormatEditor.setWindowModality(Qt::WindowModality::WindowModal); m_qrcodeFormatEditor.setWindowModality(Qt::WindowModality::WindowModal); m_barcodeFormatEditor.setWindowTitle(tr("BarCode Format")); m_qrcodeFormatEditor.setWindowTitle(tr("Qrcode Format")); } BarcodeEditor::~BarcodeEditor() { auto index = ui->tabWidget->indexOf(m_dateFormatEditor); if(index != -1) { ui->tabWidget->removeTab(index); } index = ui->tabWidget->indexOf(m_dateReplaceEditor); if(index != -1) { ui->tabWidget->removeTab(index); } index = ui->tabWidget->indexOf(m_counterEditor); if(index != -1) { ui->tabWidget->removeTab(index); } ui->lineEditContent->removeEventFilter(this); delete m_dateFormatEditor; delete m_dateReplaceEditor; delete m_counterEditor; delete ui; } void BarcodeEditor::bindSysPara(SysPara *sysPara) { if (!sysPara) { qWarning() << "BarcodeEditor::bindSysPara: null pointer passed, ignored"; return; } m_sysPara = sysPara; } void BarcodeEditor::bindViewModel(const BarcodeViewModel &vm) { m_vm = vm; // 通用设置视图模型 auto b = ui->widGeneralSettings->blockSignals(true); ui->widGeneralSettings->setViewModel(vm.generalSettingsVM); ui->widGeneralSettings->blockSignals(b); // 内容模版 b = ui->lineEditContent->blockSignals(true); ui->lineEditContent->setText(m_vm.contentPattern); ui->lineEditContent->blockSignals(b); // 类型选择框 b = ui->cbBoxType->blockSignals(true); ui->cbBoxType->setCurrentIndex(m_vm.type); ui->cbBoxType->blockSignals(b); // 缺失的代替表用默认值补齐 DateItemModel& dateVm = m_vm.dateViewModel; if (dateVm.dataMap.isEmpty() || dateVm.daysMap.isEmpty() || dateVm.monthsMap.isEmpty() || dateVm.yearsMap.isEmpty() || dateVm.weeksMap.isEmpty() || dateVm.hoursMap.isEmpty()) { DateItemModel def = DateItemModel::createDefaultReplaceModel(); if (dateVm.dataMap.isEmpty()) dateVm.dataMap = def.dataMap; if (dateVm.daysMap.isEmpty()) dateVm.daysMap = def.daysMap; if (dateVm.monthsMap.isEmpty()) dateVm.monthsMap = def.monthsMap; if (dateVm.yearsMap.isEmpty()) dateVm.yearsMap = def.yearsMap; if (dateVm.weeksMap.isEmpty()) dateVm.weeksMap = def.weeksMap; if (dateVm.hoursMap.isEmpty()) dateVm.hoursMap = def.hoursMap; } DateFormatEditorVM dateFormatVM; if(dateVm.daysOffset > 0) { dateFormatVM.expirationValue = dateVm.daysOffset; dateFormatVM.expirationType = EXPIRATION_TYPE_DAY; } else if(dateVm.monthsOffset > 0) { dateFormatVM.expirationValue = dateVm.monthsOffset; dateFormatVM.expirationType = EXPIRATION_TYPE_MONTH; } dateFormatVM.pattern = dateVm.datetimePattern; m_dateFormatEditor->setViewModel(dateFormatVM); m_dateReplaceEditor->setDateModel(dateVm); if(m_vm.contentPattern.contains("{t}")) { if(ui->tabWidget->indexOf(m_dateFormatEditor) == -1) { ui->tabWidget->addTab(m_dateFormatEditor, tr(u8"日期/时间")); } m_dateFormatEditor->setFixedSize(ui->tabBarcode->size()); if(ui->tabWidget->indexOf(m_dateReplaceEditor) == -1) { ui->tabWidget->addTab(m_dateReplaceEditor, tr(u8"代替")); } m_dateReplaceEditor->setFixedSize(ui->tabBarcode->size()); } else { auto index = ui->tabWidget->indexOf(m_dateFormatEditor); if(index != -1) { ui->tabWidget->removeTab(index); } index = ui->tabWidget->indexOf(m_dateReplaceEditor); if(index != -1) { ui->tabWidget->removeTab(index); } } if(m_vm.contentPattern.contains("{c}")) { if(ui->tabWidget->indexOf(m_counterEditor) == -1) { ui->tabWidget->addTab(m_counterEditor, tr(u8"计数器")); } m_counterEditor->setViewModel(makeCounterVM(m_sysPara, static_cast(m_vm.counterViewModel.counterType), m_vm.counterViewModel.digitalNum)); m_counterEditor->setFixedSize(ui->tabBarcode->size()); } else { auto index = ui->tabWidget->indexOf(m_counterEditor); if(index != -1) { ui->tabWidget->removeTab(index); } } } BarcodeViewModel BarcodeEditor::viewModel() { m_vm.contentPattern = ui->lineEditContent->text(); m_vm.type = (BarcodeType) (ui->cbBoxType->currentIndex()); // 从子编辑器拉取最新值回写到 m_vm // 通用设置 m_vm.generalSettingsVM = ui->widGeneralSettings->viewModel(); // 日期设置,如果存在 {t} 变量 if(m_vm.contentPattern.contains("{t}")) { DateFormatEditorVM fmt = m_dateFormatEditor->viewModel(); m_vm.dateViewModel.datetimePattern = fmt.pattern; if(fmt.expirationType == EXPIRATION_TYPE_DAY) { m_vm.dateViewModel.daysOffset = fmt.expirationValue; m_vm.dateViewModel.monthsOffset = 0; } else if(fmt.expirationType == EXPIRATION_TYPE_MONTH) { m_vm.dateViewModel.monthsOffset = fmt.expirationValue; m_vm.dateViewModel.daysOffset = 0; } else { m_vm.dateViewModel.daysOffset = 0; m_vm.dateViewModel.monthsOffset = 0; } // 代替表从 DateReplaceEditor 取 DateItemModel rep = m_dateReplaceEditor->dateModel(); m_vm.dateViewModel.dataMap = rep.dataMap; m_vm.dateViewModel.daysMap = rep.daysMap; m_vm.dateViewModel.monthsMap = rep.monthsMap; m_vm.dateViewModel.yearsMap = rep.yearsMap; m_vm.dateViewModel.weeksMap = rep.weeksMap; m_vm.dateViewModel.hoursMap = rep.hoursMap; } // 计数器设置,如果存在 {c} 变量 if(m_vm.contentPattern.contains("{c}")) { CounterEditorVM cnt = m_counterEditor->viewModel(); m_vm.counterViewModel.counterType = cnt.counterType; m_vm.counterViewModel.digitalNum = cnt.digitalNum; } return m_vm; } void BarcodeEditor::restoreViewModel() { m_vm.generalSettingsVM = TextItemModel(); m_vm.contentPattern = ""; m_vm.counterViewModel = CounterViewModel(); m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); m_vm.type = BARCODE_TYPE_BARCODE; m_vm.format.setValue(DlgBarcodeFormatVM()); bindViewModel(m_vm); } /** * @brief 逻辑基本类似 CounterVarSet::applyUIPara * */ void BarcodeEditor::applyCounterConfigToSysPara() { if(!m_vm.contentPattern.contains("{c}")) return; if (!m_sysPara) { qWarning() << "BarcodeEditor::applyCounterConfigToSysPara: m_sysPara is null, skipping"; return; } CounterEditorVM cnt = m_counterEditor->viewModel(); if(cnt.counterType == COUNTER_TYPE_1) { m_sysPara->para.cnt1StartValue = cnt.counter1.startValue; m_sysPara->para.cnt1EndValue = cnt.counter1.endValue; m_sysPara->para.cnt1RepeateValue = cnt.counter1.repeatValue; m_sysPara->para.cnt1StepValue = cnt.counter1.stepValue; m_sysPara->para.cnt1CurrValue = cnt.counter1.currValue; m_sysPara->status.cnt1CurrentValueInitDoneFlag = cnt.counter1.editCurrValue; if(cnt.counter1.eleEyeIncEn) m_sysPara->para.eleEyeClearCntInSynMode = (m_sysPara->para.eleEyeClearCntInSynMode | 0x10); // CNT1 +1 else m_sysPara->para.eleEyeClearCntInSynMode = (m_sysPara->para.eleEyeClearCntInSynMode & 0xef); // CNT1 = current } else if(cnt.counterType == COUNTER_TYPE_2) { m_sysPara->para.cnt2StartValue = cnt.counter2.startValue; m_sysPara->para.cnt2EndValue = cnt.counter2.endValue; m_sysPara->para.cnt2RepeateValue = cnt.counter2.repeatValue; m_sysPara->para.cnt2StepValue = cnt.counter2.stepValue; m_sysPara->para.cnt2CurrValue = cnt.counter2.currValue; m_sysPara->status.cnt2CurrentValueInitDoneFlag = cnt.counter2.editCurrValue; if(cnt.counter2.eleEyeIncEn) m_sysPara->para.eleEyeClearCntInSynMode = (m_sysPara->para.eleEyeClearCntInSynMode | 0x20); // CNT2 +1 else m_sysPara->para.eleEyeClearCntInSynMode = (m_sysPara->para.eleEyeClearCntInSynMode & 0xdf); // CNT2 = current } if(m_sysPara->devOp) m_sysPara->devOp->writeFpgaCalandar(0); } void BarcodeEditor::onBtnFormatClicked() { if(m_vm.type == BARCODE_TYPE_BARCODE) { m_barcodeFormatEditor.setViewModel(m_vm.format.value()); if (m_barcodeFormatEditor.exec() == QDialog::Accepted) { onBarcodeFormatConfirmed(); } } else { m_qrcodeFormatEditor.setViewModel(m_vm.format.value()); if (m_qrcodeFormatEditor.exec() == QDialog::Accepted) { onQrcodeFormatConfirmed(); } } } void BarcodeEditor::onBtnDatetimeClicked() { if(ui->lineEditContent->text().contains("{t}")) { qInfo() << "Cannot add datetime format twice"; return; } ui->lineEditContent->insert("{t}"); ui->tabWidget->setCurrentIndex(1); } void BarcodeEditor::onBtnCounterClicked() { QString cntStr = "{c}"; if(ui->lineEditContent->text().contains(cntStr)) { qInfo() << "Cannot add counter format twice"; return; } ui->lineEditContent->insert(cntStr); } void BarcodeEditor::onCheckBtnClicked() { m_vm = viewModel(); applyCounterConfigToSysPara(); emit accepted(); hide(); } void BarcodeEditor::onCloseBtnClicked() { emit rejected(); hide(); } void BarcodeEditor::onBarcodeFormatConfirmed() { m_vm.format.setValue(m_barcodeFormatEditor.viewModel()); m_vm.type = BARCODE_TYPE_BARCODE; auto b = ui->cbBoxType->blockSignals(true); ui->cbBoxType->setCurrentIndex(int(m_vm.type)); ui->cbBoxType->blockSignals(b); } void BarcodeEditor::onQrcodeFormatConfirmed() { m_vm.format.setValue(m_qrcodeFormatEditor.viewModel()); // m_vm.type = BARCODE_TYPE_QRCODE; auto b = ui->cbBoxType->blockSignals(true); ui->cbBoxType->setCurrentIndex(int(m_vm.type)); ui->cbBoxType->blockSignals(b); } void BarcodeEditor::onTypeChanged(int i) { if(m_vm.type == i) return; m_vm.type = (BarcodeType)(i); if(m_vm.type == BARCODE_TYPE_BARCODE) { m_vm.format.setValue(DlgBarcodeFormatVM()); } else m_vm.format.setValue(DlgQrcodeFormatVM()); } bool BarcodeEditor::eventFilter(QObject *obj, QEvent *event) { if(obj == ui->lineEditContent) { if(event->type() == QEvent::KeyPress) { QKeyEvent* keyEvent = static_cast(event); if(keyEvent->key() == Qt::Key_Backspace) { QString text = ui->lineEditContent->text(); int cursor = ui->lineEditContent->cursorPosition(); if(cursor < 0) { return false; } // 碰到 {t} 或 {c},直接删除 auto datePatternPos = text.indexOf("{t}"); auto counterPatternPos = text.indexOf("{c}"); if(datePatternPos >= 0 || counterPatternPos >= 0) { if(datePatternPos < cursor && cursor <= datePatternPos + 3) { ui->lineEditContent->setText(text.remove(datePatternPos, 3)); return true; } else if(counterPatternPos < cursor && cursor <= counterPatternPos + 3) { ui->lineEditContent->setText(text.remove(counterPatternPos, 3)); return true; } } } } } return false; } void BarcodeEditor::applyStyleSheet() { // QFile stylesFile(":/styles.qss"); // QTextStream ts(&stylesFile); // setStyleSheet(ts.readAll()); } void BarcodeEditor::onContentChanged(QString content) { const DateItemModel& dateVm = m_vm.dateViewModel; // 根据内容决定是否显示日期/时间选项卡 if(!content.contains("{t}")) { auto index = ui->tabWidget->indexOf(m_dateFormatEditor); if(index != -1) { ui->tabWidget->removeTab(index); } index = ui->tabWidget->indexOf(m_dateReplaceEditor); if(index != -1) { ui->tabWidget->removeTab(index); } } else { if(ui->tabWidget->indexOf(m_dateFormatEditor) == -1) { ui->tabWidget->addTab(m_dateFormatEditor, tr(u8"日期/时间")); } m_dateFormatEditor->setFixedSize(ui->tabBarcode->size()); if(ui->tabWidget->indexOf(m_dateReplaceEditor) == -1) { ui->tabWidget->addTab(m_dateReplaceEditor, tr(u8"代替")); } m_dateReplaceEditor->setFixedSize(ui->tabBarcode->size()); DateFormatEditorVM dateFormatVM; if(dateVm.daysOffset > 0) { dateFormatVM.expirationValue = dateVm.daysOffset; dateFormatVM.expirationType = EXPIRATION_TYPE_DAY; } else if(dateVm.monthsOffset > 0) { dateFormatVM.expirationValue = dateVm.monthsOffset; dateFormatVM.expirationType = EXPIRATION_TYPE_MONTH; } dateFormatVM.pattern = dateVm.datetimePattern; m_dateFormatEditor->setViewModel(dateFormatVM); m_dateReplaceEditor->setDateModel(dateVm); } // 根据内容决定是否显示计数器选项卡 if(!content.contains("{c}")) { auto index = ui->tabWidget->indexOf(m_counterEditor); if(index != -1) { ui->tabWidget->removeTab(index); } } else { if(ui->tabWidget->indexOf(m_counterEditor) == -1) { ui->tabWidget->addTab(m_counterEditor, tr(u8"计数器")); if(m_sysPara) { m_counterEditor->setViewModel(makeCounterVM(m_sysPara, static_cast(m_vm.counterViewModel.counterType), m_vm.counterViewModel.digitalNum)); } } m_counterEditor->setFixedSize(ui->tabBarcode->size()); } m_vm.contentPattern = content; } void BarcodeViewModel::saveToXml(const BarcodeViewModel &vm, QXmlStreamAttributes &attrs) { attrs.append("barcodeContentPattern", vm.contentPattern); attrs.append("barcodeType", QString::number(int(vm.type))); if(vm.type == BARCODE_TYPE_BARCODE) { DlgBarcodeFormatVM barcodeFormat = vm.format.value(); attrs.append("barcodeFormat", barcodeFormat.type); attrs.append("barcodeHeight", QString::number(barcodeFormat.height)); attrs.append("barcodeWidth", QString::number(barcodeFormat.width)); attrs.append("barcodeScale", QString::number(barcodeFormat.scale)); attrs.append("barcodeInkType", QString::number(int(barcodeFormat.inkType))); attrs.append("barcodeTxtVisible", barcodeFormat.txtVisible ? "true" : "false"); } else { DlgQrcodeFormatVM qrcodeFormat = vm.format.value(); attrs.append("qrcodeFormat", QString::number(qrcodeFormat.type)); attrs.append("qrcodeSize", QString::number(qrcodeFormat.size)); attrs.append("qrcodeLevel", QString::number(int(qrcodeFormat.level))); attrs.append("qrcodeInkType", QString::number(int(qrcodeFormat.inkType))); } if(vm.contentPattern.contains("{t}")) { DateItemModel::saveToXml(vm.dateViewModel, attrs); } if(vm.contentPattern.contains("{c}")) { attrs.append("counterType", QString::number(vm.counterViewModel.counterType)); attrs.append("counterDigitalNum", QString::number(vm.counterViewModel.digitalNum)); } } BarcodeViewModel BarcodeViewModel::loadFromXml(const QXmlStreamAttributes &attrs) { BarcodeViewModel vm; vm.contentPattern = attrs.value("barcodeContentPattern").toString(); vm.type = static_cast(attrs.value("barcodeType").toInt()); if(vm.type == BARCODE_TYPE_BARCODE) { DlgBarcodeFormatVM barcodeFormat; barcodeFormat.type = attrs.value("barcodeFormat").toString(); barcodeFormat.height = attrs.value("barcodeHeight").toInt(); barcodeFormat.width = attrs.value("barcodeWidth").toInt(); barcodeFormat.scale = attrs.value("barcodeScale").toInt(); barcodeFormat.inkType = static_cast(attrs.value("barcodeInkType").toInt()); barcodeFormat.txtVisible = attrs.value("barcodeTxtVisible").toString() == "true"; vm.format.setValue(barcodeFormat); } else { DlgQrcodeFormatVM qrcodeFormat; qrcodeFormat.type = static_cast(attrs.value("qrcodeFormat").toInt()); qrcodeFormat.size = static_cast(attrs.value("qrcodeSize").toInt()); qrcodeFormat.level = static_cast(attrs.value("qrcodeLevel").toInt()); qrcodeFormat.inkType = static_cast(attrs.value("qrcodeInkType").toInt()); vm.format.setValue(qrcodeFormat); } if(vm.contentPattern.contains("{t}")) { DateItemModel::loadFromXml(vm.dateViewModel, attrs); } if(vm.contentPattern.contains("{c}")) { vm.counterViewModel.counterType = static_cast(attrs.value("counterType").toInt()); vm.counterViewModel.digitalNum = attrs.value("counterDigitalNum").toInt(); } return vm; } QString BarcodeViewModel::toString(const BarcodeViewModel &vm) { QString str; str += QString("type: %1\r\n").arg(int(vm.type)); str += QString("contentPattern: \"%1\"\r\n").arg(vm.contentPattern); // counterViewModel str += QString("counterViewModel: \r\n"); str += QString("\t counter type: %1\r\n").arg(vm.counterViewModel.counterType); str += QString("\t digital number: %1\r\n").arg(vm.counterViewModel.digitalNum); str += QString("\t letter space: %1\r\n").arg(vm.counterViewModel.letterSpace); // dateViewModel str += QString("dateViewModel: \r\n"); str += QString("\t pattern: \"%1\"\r\n").arg(vm.dateViewModel.datetimePattern); int expirationValue = 0; int expirationType = 0; if(vm.dateViewModel.daysOffset > 0) { expirationValue = vm.dateViewModel.daysOffset; expirationType = EXPIRATION_TYPE_DAY; } else if(vm.dateViewModel.monthsOffset > 0) { expirationValue = vm.dateViewModel.monthsOffset; expirationType = EXPIRATION_TYPE_MONTH; } str += QString("\t expirationValue: %1\r\n").arg(expirationValue); str += QString("\t expirationType: %1\r\n").arg(expirationType); // format str += QString("format: \n"); if(vm.type == BARCODE_TYPE_BARCODE) { DlgBarcodeFormatVM barcodeFormat = vm.format.value(); str += QString("\t type: \"%1\"\r\n").arg(barcodeFormat.type); str += QString("\t height: %1\r\n").arg(barcodeFormat.height); str += QString("\t width: %1\r\n").arg(barcodeFormat.width); str += QString("\t scale: %1\r\n").arg(barcodeFormat.scale); str += QString("\t inkType: %1\r\n").arg(int(barcodeFormat.inkType)); str += QString("\t txtVisible: %1\r\n").arg(barcodeFormat.txtVisible ? "true" : "false"); } else { DlgQrcodeFormatVM qrcodeFormat = vm.format.value(); str += QString("\t type: %1\r\n").arg(int(qrcodeFormat.type)); str += QString("\t size: %1\r\n").arg(int(qrcodeFormat.size)); str += QString("\t level: %1\r\n").arg(int(qrcodeFormat.level)); str += QString("\t inkType: %1\r\n").arg(int(qrcodeFormat.inkType)); } return str; } void BarcodeEditor::on_cbBoxType_currentIndexChanged(int index) { //bar 0; qr 1; dm 2; m_vm.type = index; if (index == 0) return; m_qrcodeFormatEditor.setCodeType(ui->cbBoxType->currentText()); onQrcodeFormatConfirmed(); }