/** * @RDE_HEADER@ * ABC widget for creating custom views of dds sequences * $Id$ * $HeadURL$ * $Author$ * Created by Jens Heilmann, SLTE, 2021-05-17 */ #include "abstractsequencewidget.h" #include AbstractSequenceWidget::AbstractSequenceWidget(const RwMode &readOnly, const QString &name, const dds::core::xtypes::DynamicType &contentType, NGL::INGLLogger &logger, QWidget *parent) : QGroupBox(name,parent) , m_rwMode(readOnly) , m_pbAddMember(new QToolButton) , m_contentType(contentType) , m_name(name) , m_logger(logger) { m_pbAddMember->setIcon(QIcon(QLatin1String(":/icons/png/add.png"))); connect(m_pbAddMember, &QToolButton::clicked, [&] () { const uint32_t &index = m_memberList.size() + 1; QString findObjectName = getObjectName(index); if(findChild(findObjectName)) return; QWidget *child = DetailView::createWidget(m_rwMode, m_contentType, findObjectName, m_logger); addMemberWidget(child); }); if(m_rwMode == RwMode::ReadOnly) m_pbAddMember->setDisabled(true); } AbstractSequenceWidget::~AbstractSequenceWidget() { delete m_pbAddMember; } void AbstractSequenceWidget::setValue(const dds::core::xtypes::DynamicData &inner, const uint32_t &index, const QWidget *useOn) { QString findObjectName = getObjectName(index); QWidget *child = findChild(findObjectName); if(!child) { child = DetailView::createWidget(m_rwMode, m_contentType, findObjectName, m_logger); addMemberWidget(child); } DetailView::setWidgetData(inner, m_contentType.kind(), index, findObjectName, useOn, m_logger); } void AbstractSequenceWidget::getValue(const QString &name, dds::core::xtypes::DynamicData &data, const uint32_t &index, const QWidget *useOn) const { QString findObjectName = name + QLatin1Char('.') + QString::number(index); if(!findChild(findObjectName)) return; DetailView::getWidgetData(data, m_contentType.kind(), index, findObjectName, useOn, m_logger); } void AbstractSequenceWidget::setMemberCount(int count) { QWidget *child = nullptr; do { child = findChild(getObjectName(++count)); delete child; } while (child); m_memberList.removeAll(nullptr); } uint32_t AbstractSequenceWidget::getMemberCount() const { int count = 0; QWidget *child = findChild(getObjectName(count+1)); while(child) { count++; child = findChild(getObjectName(count+1)); } return count; } NGL::INGLLogger &AbstractSequenceWidget::logger() const { return m_logger; } QToolButton *AbstractSequenceWidget::pbAddMember() const { return m_pbAddMember; } QString AbstractSequenceWidget::getObjectName(int index) const { return m_name + QLatin1Char('.') + QString::number(index); } void AbstractSequenceWidget::addMemberWidget(QWidget *member) { QToolButton *button = new QToolButton(member); button->setIcon(QIcon(QLatin1String(":/icons/png/remove.png"))); connect(button, &QToolButton::clicked, member, &QWidget::deleteLater); connect(member, &QWidget::destroyed, this, &AbstractSequenceWidget::deleteMemberWidget); connect(member, &QWidget::destroyed, button, &QToolButton::deleteLater); if(m_rwMode == RwMode::ReadOnly) button->setDisabled(true); DEBUG_LOG(m_logger) << "new member widget: " << member->objectName(); m_memberList.push_back(member); setupMemberWidget(member, button, member->objectName()); } void AbstractSequenceWidget::deleteMemberWidget(QObject *member) { QWidget *w = qobject_cast(member); if(!w) return; for(auto child : w->children()) // necessary? child->deleteLater(); m_memberList.removeAll(w); for(int i=0; isetObjectName(getObjectName(i + 1)); DEBUG_LOG(m_logger) << "new name: " << m_memberList[i]->objectName(); for(auto child : m_memberList[i]->children()) { if(child->objectName().isEmpty()) continue; QString childName = child->objectName(); QString newId = m_name + QLatin1Char('.') + QString::number(i + 1); child->setObjectName(childName.replace(QRegExp(m_name + QLatin1String(".([0-9]*)")), newId)); DEBUG_LOG(m_logger) << "new child name: " << child->objectName(); } } }