#include "props/HotspotPropertySection.h" #include #include #include #include #include #include #include #include namespace gui { HotspotPropertySection::HotspotPropertySection(QWidget* parent) : PropertySectionWidget(parent) { auto* root = new QVBoxLayout(this); root->setContentsMargins(0, 0, 0, 0); auto* title = new QLabel(QStringLiteral("已添加热点"), this); root->addWidget(title); m_hotspotList = new QListWidget(this); m_hotspotList->setObjectName(QStringLiteral("PropertyPanelListWidget")); m_hotspotList->setMinimumHeight(120); m_hotspotList->setContextMenuPolicy(Qt::CustomContextMenu); root->addWidget(m_hotspotList); auto* form = new QFormLayout(); form->setSpacing(6); root->addLayout(form); m_targetAnim = new QComboBox(this); m_targetAnim->setMinimumWidth(120); form->addRow(QStringLiteral("目标"), m_targetAnim); m_btnDelete = new QPushButton(QStringLiteral("删除"), this); root->addWidget(m_btnDelete); connect(m_targetAnim, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int) { if (m_hotspotId.isEmpty() || !m_targetAnim) { return; } const QString aid = m_targetAnim->currentData().toString(); emit targetAnimationChanged(m_hotspotId, aid); }); connect(m_hotspotList, &QListWidget::currentItemChanged, this, [this](QListWidgetItem* current, QListWidgetItem*) { const QString hotspotId = current ? current->data(Qt::UserRole).toString() : QString(); if (hotspotId == m_hotspotId) { return; } m_hotspotId = hotspotId; emit hotspotSelected(hotspotId); }); connect(m_hotspotList, &QListWidget::customContextMenuRequested, this, [this](const QPoint& pos) { if (!m_hotspotList) { return; } auto* item = m_hotspotList->itemAt(pos); if (!item) { return; } const QString hotspotId = item->data(Qt::UserRole).toString(); if (hotspotId.isEmpty()) { return; } m_hotspotList->setCurrentItem(item); QMenu menu(this); auto* actDelete = menu.addAction(QStringLiteral("移除热点")); if (menu.exec(m_hotspotList->viewport()->mapToGlobal(pos)) == actDelete) { emit deleteRequested(hotspotId); } }); connect(m_btnDelete, &QPushButton::clicked, this, [this]() { if (!m_hotspotId.isEmpty()) { emit deleteRequested(m_hotspotId); } }); } void HotspotPropertySection::clearDisconnected() { m_hotspotId.clear(); } void HotspotPropertySection::applyState(const QVector& hotspots, const QString& selectedHotspotId, const QVector>& animIdToLabelNonNone) { m_hotspotId = selectedHotspotId; if (!m_targetAnim || !m_hotspotList) { return; } QString targetAnimationId; QHash animLabelById; for (const auto& p : animIdToLabelNonNone) { animLabelById.insert(p.first, p.second); } m_hotspotList->blockSignals(true); m_hotspotList->clear(); QListWidgetItem* selectedItem = nullptr; for (const auto& hotspot : hotspots) { QString text = hotspot.id; const QString animLabel = animLabelById.value(hotspot.targetAnimationId); if (!animLabel.isEmpty()) { text += QStringLiteral(" -> ") + animLabel; } else if (!hotspot.targetAnimationId.isEmpty()) { text += QStringLiteral(" -> ") + hotspot.targetAnimationId; } else { text += QStringLiteral(" -> 未设"); } auto* item = new QListWidgetItem(text, m_hotspotList); item->setData(Qt::UserRole, hotspot.id); if (hotspot.id == selectedHotspotId) { selectedItem = item; targetAnimationId = hotspot.targetAnimationId; } } if (selectedItem) { m_hotspotList->setCurrentItem(selectedItem); } else { m_hotspotList->setCurrentRow(-1); m_hotspotId.clear(); } m_hotspotList->blockSignals(false); m_targetAnim->blockSignals(true); m_targetAnim->clear(); m_targetAnim->addItem(QStringLiteral("未设"), QString()); for (const auto& p : animIdToLabelNonNone) { m_targetAnim->addItem(p.second, p.first); } int idx = -1; for (int i = 0; i < m_targetAnim->count(); ++i) { if (m_targetAnim->itemData(i).toString() == targetAnimationId) { idx = i; break; } } if (idx >= 0) { m_targetAnim->setCurrentIndex(idx); } else { m_targetAnim->setCurrentIndex(0); } m_targetAnim->blockSignals(false); const bool ok = !m_hotspotId.isEmpty() && m_targetAnim->count() > 0; m_targetAnim->setEnabled(ok); if (m_btnDelete) { m_btnDelete->setEnabled(!m_hotspotId.isEmpty()); } } } // namespace gui