#include "ItemGeneralSettings.h" #include "ui_ItemGeneralSettings.h" #include ItemGeneralSettings::ItemGeneralSettings(QWidget *parent) : QWidget(parent), ui(new Ui::ItemGeneralSettings) { ui->setupUi(this); m_directionButtonGroup.addButton(ui->normalRBtn, NORMAL); m_directionButtonGroup.addButton(ui->verMirrorRBtn, MIRROR_V); m_directionButtonGroup.addButton(ui->horMirrorRBtn, MIRROR_H); m_directionButtonGroup.addButton(ui->mirrorRBtn, MIRROR_VH); m_directionButtonGroup.addButton(ui->m90NHorRBtn, MIRROR_H_R270); m_directionButtonGroup.addButton(ui->a90RBtn, R90); m_directionButtonGroup.addButton(ui->m90RBtn, R270); m_directionButtonGroup.addButton(ui->m90NVerRBtn, MIRROR_V_R270); connect(&m_directionButtonGroup, static_cast(&QButtonGroup::buttonClicked), this, &ItemGeneralSettings::ondirectionChanged); connect(ui->boldSpinBox, static_cast(&QSpinBox::valueChanged), this, &ItemGeneralSettings::onBoldSpinBoxValueChanged); connect(ui->txtSpanSpinBox, static_cast(&QSpinBox::valueChanged), this, &ItemGeneralSettings::onLetterSpaceSpinBoxChanged); connect(ui->invertCheckBox, &QCheckBox::stateChanged, this, [this](int state) { onColorReversalCheckBoxChecked(state == Qt::Checked); }); initUI(); } ItemGeneralSettings::~ItemGeneralSettings() { delete ui; } void ItemGeneralSettings::edit(PicTextItem *item) { m_currItem = item; // 从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); } 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: ui->letterSpacePanel->setVisible(true); break; case SourceType::UNKNOWN: default: ui->letterSpacePanel->setVisible(false); break; } updatePreview(); } 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) { // 只更新VM,不直接修改item m_vm.direction = ItemDirectionType(dir); updatePreview(); } void ItemGeneralSettings::onBoldSpinBoxValueChanged(int multiple) { // 只更新VM m_vm.boldMultiple = multiple; updatePreview(); } void ItemGeneralSettings::onLetterSpaceSpinBoxChanged(int space) { // 只更新VM m_vm.letterSpace = space; updatePreview(); } void ItemGeneralSettings::onColorReversalCheckBoxChecked(bool b) { // 只更新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(); }