新二维码/条形码编辑逻辑
This commit is contained in:
+115
-51
@@ -18,6 +18,14 @@ ItemGeneralSettings::ItemGeneralSettings(QWidget *parent) :
|
||||
|
||||
connect(&m_directionButtonGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
|
||||
this, &ItemGeneralSettings::ondirectionChanged);
|
||||
connect(ui->boldSpinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this, &ItemGeneralSettings::onBoldSpinBoxValueChanged);
|
||||
connect(ui->txtSpanSpinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged),
|
||||
this, &ItemGeneralSettings::onLetterSpaceSpinBoxChanged);
|
||||
connect(ui->invertCheckBox, &QCheckBox::stateChanged,
|
||||
this, [this](int state) { onColorReversalCheckBoxChecked(state == Qt::Checked); });
|
||||
|
||||
initUI();
|
||||
}
|
||||
|
||||
ItemGeneralSettings::~ItemGeneralSettings()
|
||||
@@ -28,35 +36,51 @@ ItemGeneralSettings::~ItemGeneralSettings()
|
||||
void ItemGeneralSettings::edit(PicTextItem *item)
|
||||
{
|
||||
m_currItem = item;
|
||||
if(!m_currItem) {
|
||||
ui->boldSpinBox->setValue(ui->boldSpinBox->minimum());
|
||||
ui->txtSpanSpinBox->setValue(ui->txtSpanSpinBox->minimum());
|
||||
ui->normalRBtn->setChecked(true);
|
||||
ui->invertCheckBox->setChecked(false);
|
||||
ui->previewWidget->setImg(QImage());
|
||||
return;
|
||||
|
||||
// 从item快照创建ViewModel(如果item为空,使用默认值)
|
||||
setViewModel(ItemGeneralSettingsVM::fromItem(item));
|
||||
}
|
||||
|
||||
void ItemGeneralSettings::initUI()
|
||||
{
|
||||
ui->densitySpinBox->setValue(0);
|
||||
ui->invertCheckBox->setChecked(false);
|
||||
ui->alternateCheckBox->setChecked(false);
|
||||
ui->boldSpinBox->setValue(0);
|
||||
ui->txtSpanSpinBox->setValue(0);
|
||||
ui->normalRBtn->setChecked(true);
|
||||
ui->applyCounterCheckBox->setChecked(false);
|
||||
ui->counterIDSpinBox->setValue(0);
|
||||
}
|
||||
|
||||
void ItemGeneralSettings::setViewModel(const ItemGeneralSettingsVM &vm)
|
||||
{
|
||||
m_vmSnapshot = vm;
|
||||
m_vm = vm;
|
||||
|
||||
// 阻止信号以避免重复回调
|
||||
auto blockBold = ui->boldSpinBox->blockSignals(true);
|
||||
auto blockSpan = ui->txtSpanSpinBox->blockSignals(true);
|
||||
auto blockInvert = ui->invertCheckBox->blockSignals(true);
|
||||
|
||||
// 根据m_vm更新UI显示
|
||||
ui->boldSpinBox->setValue(m_vm.boldMultiple);
|
||||
ui->txtSpanSpinBox->setValue(m_vm.letterSpace);
|
||||
|
||||
auto dirBtn = m_directionButtonGroup.button(m_vm.direction);
|
||||
if (dirBtn) {
|
||||
dirBtn->setChecked(true);
|
||||
}
|
||||
|
||||
auto b = ui->boldSpinBox->blockSignals(true);
|
||||
ui->boldSpinBox->setValue(item->boldMultiple());
|
||||
ui->boldSpinBox->blockSignals(b);
|
||||
|
||||
b = ui->txtSpanSpinBox->blockSignals(true);
|
||||
ui->txtSpanSpinBox->setValue(item->letterSpace());
|
||||
ui->txtSpanSpinBox->blockSignals(b);
|
||||
|
||||
auto dirBtn = m_directionButtonGroup.button(item->direction());
|
||||
b = dirBtn->blockSignals(true);
|
||||
dirBtn->setChecked(true);
|
||||
dirBtn->blockSignals(b);
|
||||
|
||||
b = ui->invertCheckBox->blockSignals(true);
|
||||
ui->invertCheckBox->setChecked(item->colorReversal());
|
||||
ui->invertCheckBox->blockSignals(b);
|
||||
|
||||
// 文字、日期、轮班可调字符间距
|
||||
// 计数器类的字符间距由 @see CounterVarSet 单独调整
|
||||
switch(item->sourceType()) {
|
||||
|
||||
ui->invertCheckBox->setChecked(m_vm.colorReversal);
|
||||
|
||||
// 恢复信号
|
||||
ui->boldSpinBox->blockSignals(blockBold);
|
||||
ui->txtSpanSpinBox->blockSignals(blockSpan);
|
||||
ui->invertCheckBox->blockSignals(blockInvert);
|
||||
|
||||
// 字间距可见性由item的类型决定
|
||||
switch(m_vm.sourceType) {
|
||||
case SourceType::TEXT:
|
||||
case SourceType::DATETIME:
|
||||
case SourceType::SCHEDULE_SHIFT:
|
||||
@@ -67,44 +91,84 @@ void ItemGeneralSettings::edit(PicTextItem *item)
|
||||
ui->letterSpacePanel->setVisible(false);
|
||||
break;
|
||||
}
|
||||
|
||||
updatePreview();
|
||||
}
|
||||
|
||||
ui->previewWidget->setImg(m_currItem->preview());
|
||||
void ItemGeneralSettings::applyToItem(PicTextItem *item)
|
||||
{
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
// VM的属性被逐一应用到item
|
||||
item->setDirection(m_vm.direction);
|
||||
item->setBoldMultiple(m_vm.boldMultiple);
|
||||
item->setLetterSpace(m_vm.letterSpace);
|
||||
item->setColorReversal(m_vm.colorReversal);
|
||||
item->applyModify();
|
||||
}
|
||||
|
||||
void ItemGeneralSettings::ondirectionChanged(int dir)
|
||||
{
|
||||
if(!m_currItem) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_currItem->setDirection(ItemDirectionType(dir));
|
||||
m_currItem->applyModify();
|
||||
ui->previewWidget->setImg(m_currItem->preview());
|
||||
// 只更新VM,不直接修改item
|
||||
m_vm.direction = ItemDirectionType(dir);
|
||||
updatePreview();
|
||||
}
|
||||
|
||||
void ItemGeneralSettings::onBoldSpinBoxValueChanged(int multiple)
|
||||
{
|
||||
if(m_currItem) {
|
||||
m_currItem->setBoldMultiple(multiple);
|
||||
m_currItem->applyModify();
|
||||
ui->previewWidget->setImg(m_currItem->preview());
|
||||
}
|
||||
// 只更新VM
|
||||
m_vm.boldMultiple = multiple;
|
||||
updatePreview();
|
||||
}
|
||||
|
||||
void ItemGeneralSettings::onLetterSpaceSpinBoxChanged(int space)
|
||||
{
|
||||
if(m_currItem) {
|
||||
m_currItem->setLetterSpace(space);
|
||||
m_currItem->applyModify();
|
||||
ui->previewWidget->setImg(m_currItem->preview());
|
||||
}
|
||||
// 只更新VM
|
||||
m_vm.letterSpace = space;
|
||||
updatePreview();
|
||||
}
|
||||
|
||||
void ItemGeneralSettings::onColorReversalCheckBoxChecked(bool b)
|
||||
{
|
||||
if(m_currItem) {
|
||||
m_currItem->setColorReversal(b);
|
||||
m_currItem->applyModify();
|
||||
ui->previewWidget->setImg(m_currItem->preview());
|
||||
}
|
||||
// 只更新VM
|
||||
m_vm.colorReversal = b;
|
||||
updatePreview();
|
||||
}
|
||||
|
||||
void ItemGeneralSettings::updatePreview()
|
||||
{
|
||||
// 预览需要基于item的source和m_vm的属性组合渲染
|
||||
// 如果m_currItem为空,显示空图像
|
||||
if (!m_currItem) {
|
||||
if(m_vm.imageGenerator) {
|
||||
ui->previewWidget->setImg(m_vm.imageGenerator());
|
||||
}
|
||||
else {
|
||||
ui->previewWidget->setImg(QImage());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// 临时应用VM到item以获取预览,随后还原
|
||||
auto backupDir = m_currItem->direction();
|
||||
auto backupBold = m_currItem->boldMultiple();
|
||||
auto backupSpace = m_currItem->letterSpace();
|
||||
auto backupReverse = m_currItem->colorReversal();
|
||||
|
||||
m_currItem->setDirection(m_vm.direction);
|
||||
m_currItem->setBoldMultiple(m_vm.boldMultiple);
|
||||
m_currItem->setLetterSpace(m_vm.letterSpace);
|
||||
m_currItem->setColorReversal(m_vm.colorReversal);
|
||||
m_currItem->applyModify();
|
||||
|
||||
ui->previewWidget->setImg(m_currItem->preview());
|
||||
|
||||
// 还原原始状态(preview()后item的属性不应该被留下改动)
|
||||
m_currItem->setDirection(backupDir);
|
||||
m_currItem->setBoldMultiple(backupBold);
|
||||
m_currItem->setLetterSpace(backupSpace);
|
||||
m_currItem->setColorReversal(backupReverse);
|
||||
m_currItem->applyModify();
|
||||
}
|
||||
Reference in New Issue
Block a user