diff --git a/GUI/coregui/Models/ParameterizedItem.cpp b/GUI/coregui/Models/ParameterizedItem.cpp index 973d7738536e25e6fb22c631d7c446dd82736af1..7929487114612a121c6b194488e09c998c190bf1 100644 --- a/GUI/coregui/Models/ParameterizedItem.cpp +++ b/GUI/coregui/Models/ParameterizedItem.cpp @@ -29,8 +29,8 @@ const QString ParameterizedItem::P_NAME = "Name"; const QString ParameterizedItem::P_PORT = "Port"; -ParameterizedItem::ParameterizedItem(const QString &model_type, ParameterizedItem *parent) - : m_model_type(model_type), mp_parent(parent) +ParameterizedItem::ParameterizedItem(QString model_type, ParameterizedItem *parent) + : m_model_type(std::move(model_type)), mp_parent(parent) { if (mp_parent) { mp_parent->insertChildItem(-1, this); @@ -41,17 +41,17 @@ ParameterizedItem::ParameterizedItem(const QString &model_type, ParameterizedIte setItemName(m_model_type); } -bool ParameterizedItem::isRegisteredProperty(const QString &name) -{ - return m_registered_properties.contains(name); -} - ParameterizedItem::~ParameterizedItem() { qDeleteAll(m_children); qDeleteAll(m_sub_items); } +QString ParameterizedItem::modelType() const +{ + return m_model_type; +} + QString ParameterizedItem::itemName() const { return getRegisteredProperty(P_NAME).toString(); @@ -62,6 +62,51 @@ void ParameterizedItem::setItemName(const QString &item_name) setRegisteredProperty(P_NAME, item_name); } +QString ParameterizedItem::displayName() const +{ + return m_display_name; +} + +void ParameterizedItem::setDisplayName(QString display_name) +{ + m_display_name = std::move(display_name); +} + +QString ParameterizedItem::getItemLabel() const +{ + return QString(""); +} + +ParameterizedItem *ParameterizedItem::parent() const +{ + return mp_parent; +} + +ParameterizedItem *ParameterizedItem::childAt(int row) const +{ + return m_children.value(row); +} + +int ParameterizedItem::rowOfChild(ParameterizedItem *child) const +{ + return m_children.indexOf(child); +} + +int ParameterizedItem::childItemCount() const +{ + return m_children.count(); +} + +bool ParameterizedItem::hasChildItems() const +{ + return !m_children.isEmpty(); +} + +QList<ParameterizedItem *> ParameterizedItem::childItems() const +{ + return m_children; +} + void ParameterizedItem::insertChildItem(int row, ParameterizedItem *item) { if (row == -1) @@ -93,6 +138,11 @@ bool ParameterizedItem::acceptsAsChild(const QString &child_name) const return m_valid_children.contains(child_name); } +QList<QString> ParameterizedItem::acceptableChildItems() const +{ + return m_valid_children; +} + // emits signal on property change bool ParameterizedItem::event(QEvent *e) { @@ -106,62 +156,9 @@ bool ParameterizedItem::event(QEvent *e) return QObject::event(e); } -void ParameterizedItem::onPropertyChange(const QString &name) -{ - // qDebug() << "ParameterizedItem::onPropertyChange()" << modelType() << name; - if (mp_parent) - mp_parent->onChildPropertyChange(); - emit propertyChanged(name); -} - -// returns child which should be removed by the model due to over population of children of given -// type -ParameterizedItem *ParameterizedItem::getCandidateForRemoval(ParameterizedItem *new_comer) -{ - if (!new_comer) - return 0; - - QMap<int, QVector<ParameterizedItem *> > nport_to_nitems; - foreach (ParameterizedItem *child, m_children) { - int nport = child->getRegisteredProperty(P_PORT).toInt(); - nport_to_nitems[nport].push_back(child); - } - - QMap<int, QVector<ParameterizedItem *> >::iterator it = nport_to_nitems.begin(); - while (it != nport_to_nitems.end()) { - int nport = it.key(); - if (m_port_info.contains(nport)) { - if (m_port_info[nport].m_item_max_number != 0 - && it.value().size() > m_port_info[nport].m_item_max_number) { - foreach (ParameterizedItem *item, it.value()) { - if (item != new_comer) - return item; - } - } - } - - ++it; - } - - return 0; -} - -void ParameterizedItem::setItemPort(ParameterizedItem::PortInfo::EPorts nport) -{ - setRegisteredProperty(P_PORT, nport); -} - -void ParameterizedItem::addToValidChildren(const QString &name, PortInfo::EPorts nport, - int nmax_items) +QMap<QString, ParameterizedItem *> ParameterizedItem::getSubItems() const { - m_valid_children.append(name); - - if (m_port_info.contains(nport)) { - m_port_info[nport].m_item_names << name; - m_port_info[nport].m_item_max_number = nmax_items; - } else { - m_port_info[nport] = PortInfo(name, nmax_items); - } + return m_sub_items; } void ParameterizedItem::addPropertyItem(QString name, ParameterizedItem *item) @@ -178,13 +175,16 @@ void ParameterizedItem::addPropertyItem(QString name, ParameterizedItem *item) } m_sub_items[name] = item; item->mp_parent = this; - // connect(item, SIGNAL(propertyChanged(QString)), this, - // SLOT(onSubItemPropertyChanged(QString)), Qt::UniqueConnection); onSubItemChanged(name); onChildPropertyChange(); qDebug() << "ParameterizedItem::addPropertyItem() -> about to leave" << name; } +bool ParameterizedItem::isRegisteredProperty(const QString &name) +{ + return m_registered_properties.contains(name); +} + ParameterizedItem *ParameterizedItem::registerGroupProperty(const QString &group_name, const Constants::ModelType &group_model) { @@ -275,6 +275,21 @@ void ParameterizedItem::removeRegisteredProperty(const QString &name) } } +PropertyAttribute ParameterizedItem::getPropertyAttribute(const QString &name) const +{ + if (!m_registered_properties.contains(name)) + throw GUIHelpers::Error( + "ParameterizedItem::getPropertyAttribute() -> Error. Unknown property " + name + " " + + modelType()); + + if (!m_property_attribute.contains(name)) + throw GUIHelpers::Error( + "ParameterizedItem::getPropertyAttribute() -> Error. Unknown property attribute " + + name); + + return m_property_attribute[name]; +} + void ParameterizedItem::setPropertyAttribute(const QString &name, const PropertyAttribute &attribute) { @@ -305,6 +320,88 @@ void ParameterizedItem::setPropertyAppearance(const QString &name, m_property_attribute[name].setAppearance(appearance); } +void ParameterizedItem::onPropertyChange(const QString &name) +{ + // qDebug() << "ParameterizedItem::onPropertyChange()" << modelType() << name; + if (mp_parent) + mp_parent->onChildPropertyChange(); + emit propertyChanged(name); +} + +void ParameterizedItem::onChildPropertyChange() +{ + qDebug() << "ParameterizedItem::onChildPropertyChange()"; + if (mp_parent) + mp_parent->onChildPropertyChange(); +} + +void ParameterizedItem::print() const +{ + qDebug() << "--- ParameterizedItem::print() ------------------------------------"; + qDebug() << modelType() << itemName(); + qDebug() << "--- SubItems ---"; + for (QMap<QString, ParameterizedItem *>::const_iterator it = m_sub_items.begin(); + it != m_sub_items.end(); ++it) { + qDebug() << " key:" << it.key() << " value->modelType:" << it.value()->modelType(); + } + qDebug() << "--- Properties ---"; + QList<QByteArray> property_names = dynamicPropertyNames(); + for (int i = 0; i < property_names.length(); ++i) { + QString name(property_names[i]); + qDebug() << name << property(name.toUtf8().constData()); + } + qDebug() << " "; +} + +// returns child which should be removed by the model due to over population of children of given +// type +ParameterizedItem *ParameterizedItem::getCandidateForRemoval(ParameterizedItem *new_comer) +{ + if (!new_comer) + return 0; + + QMap<int, QVector<ParameterizedItem *> > nport_to_nitems; + foreach (ParameterizedItem *child, m_children) { + int nport = child->getRegisteredProperty(P_PORT).toInt(); + nport_to_nitems[nport].push_back(child); + } + + QMap<int, QVector<ParameterizedItem *> >::iterator it = nport_to_nitems.begin(); + while (it != nport_to_nitems.end()) { + int nport = it.key(); + if (m_port_info.contains(nport)) { + if (m_port_info[nport].m_item_max_number != 0 + && it.value().size() > m_port_info[nport].m_item_max_number) { + foreach (ParameterizedItem *item, it.value()) { + if (item != new_comer) + return item; + } + } + } + ++it; + } + + return 0; +} + +void ParameterizedItem::setItemPort(ParameterizedItem::PortInfo::EPorts nport) +{ + setRegisteredProperty(P_PORT, nport); +} + +void ParameterizedItem::addToValidChildren(const QString &name, PortInfo::EPorts nport, + int nmax_items) +{ + m_valid_children.append(name); + + if (m_port_info.contains(nport)) { + m_port_info[nport].m_item_names << name; + m_port_info[nport].m_item_max_number = nmax_items; + } else { + m_port_info[nport] = PortInfo(name, nmax_items); + } +} + QStringList ParameterizedItem::getParameterTreeList() const { QStringList result; @@ -346,13 +443,6 @@ QStringList ParameterizedItem::getParameterTreeList() const return result; } -void ParameterizedItem::onChildPropertyChange() -{ - qDebug() << "ParameterizedItem::onChildPropertyChange()"; - if (mp_parent) - mp_parent->onChildPropertyChange(); -} - //! called when new SubItem appeared void ParameterizedItem::onSubItemChanged(const QString &propertyName) { @@ -361,6 +451,14 @@ void ParameterizedItem::onSubItemChanged(const QString &propertyName) emit subItemChanged(propertyName); } +void ParameterizedItem::onSubItemPropertyChanged(const QString &property_group, + const QString &property_name) +{ + emit subItemPropertyChanged(property_group, property_name); + if (mp_parent) + mp_parent->onChildPropertyChange(); +} + //! called when SubItem change one of its properties void ParameterizedItem::processSubItemPropertyChanged(const QString &propertyName) { @@ -372,8 +470,6 @@ void ParameterizedItem::processSubItemPropertyChanged(const QString &propertyNam FancyGroupProperty_t group_property = getRegisteredProperty(it.key()).value<FancyGroupProperty_t>(); group_property->setValueLabel(propertyItem->getItemLabel()); - // emit subItemPropertyChanged(it.key(), propertyName); - // if (m_parent) m_parent->onChildPropertyChange(); onSubItemPropertyChanged(it.key(), propertyName); return; } @@ -382,47 +478,6 @@ void ParameterizedItem::processSubItemPropertyChanged(const QString &propertyNam " Error. No such propertyItem found"); } -void ParameterizedItem::onSubItemPropertyChanged(const QString &property_group, - const QString &property_name) -{ - emit subItemPropertyChanged(property_group, property_name); - if (mp_parent) - mp_parent->onChildPropertyChange(); -} - -PropertyAttribute ParameterizedItem::getPropertyAttribute(const QString &name) const -{ - if (!m_registered_properties.contains(name)) - throw GUIHelpers::Error( - "ParameterizedItem::getPropertyAttribute() -> Error. Unknown property " + name + " " - + modelType()); - - if (!m_property_attribute.contains(name)) - throw GUIHelpers::Error( - "ParameterizedItem::getPropertyAttribute() -> Error. Unknown property attribute " - + name); - - return m_property_attribute[name]; -} - -void ParameterizedItem::print() const -{ - qDebug() << "--- ParameterizedItem::print() ------------------------------------"; - qDebug() << modelType() << itemName(); - qDebug() << "--- SubItems ---"; - for (QMap<QString, ParameterizedItem *>::const_iterator it = m_sub_items.begin(); - it != m_sub_items.end(); ++it) { - qDebug() << " key:" << it.key() << " value->modelType:" << it.value()->modelType(); - } - qDebug() << "--- Properties ---"; - QList<QByteArray> property_names = dynamicPropertyNames(); - for (int i = 0; i < property_names.length(); ++i) { - QString name(property_names[i]); - qDebug() << name << property(name.toUtf8().constData()); - } - qDebug() << " "; -} - QStringList ParameterizedItem::getParameterList() const { QStringList result; diff --git a/GUI/coregui/Models/ParameterizedItem.h b/GUI/coregui/Models/ParameterizedItem.h index c98c329d75b638aab4d943c673f935ca9d88a4a4..7dfee28e863003e72c5df607c3e8ac183818a225 100644 --- a/GUI/coregui/Models/ParameterizedItem.h +++ b/GUI/coregui/Models/ParameterizedItem.h @@ -33,16 +33,13 @@ class BA_CORE_API_ ParameterizedItem : public QObject public: static const QString P_NAME; static const QString P_PORT; - explicit ParameterizedItem(const QString &model_type = QString(), + explicit ParameterizedItem(QString model_type = QString(), ParameterizedItem *parent = 0); virtual ~ParameterizedItem(); //! retrieves the model type - QString modelType() const - { - return m_model_type; - } + QString modelType() const; //! retrieves the item's name QString itemName() const; @@ -50,41 +47,32 @@ public: //! sets the item's name void setItemName(const QString &item_name); + //! retrieves the name used for displaying (possibly including an index + //! to distinguish it from siblings) + QString displayName() const; + + //! sets the display name + void setDisplayName(QString display_name); + + virtual QString getItemLabel() const; + //! retrieve parent item - ParameterizedItem *parent() const - { - return mp_parent; - } + ParameterizedItem *parent() const; //! retrieve child item in given row - ParameterizedItem *childAt(int row) const - { - return m_children.value(row); - } + ParameterizedItem *childAt(int row) const; //! get row number of child - int rowOfChild(ParameterizedItem *child) const - { - return m_children.indexOf(child); - } + int rowOfChild(ParameterizedItem *child) const; //! get number of child items - int childItemCount() const - { - return m_children.count(); - } + int childItemCount() const; //! indicates if item has child items - bool hasChildItems() const - { - return !m_children.isEmpty(); - } + bool hasChildItems() const; //! returns the a list of child items - QList<ParameterizedItem *> childItems() const - { - return m_children; - } + QList<ParameterizedItem *> childItems() const; //! inserts a child item at specified row virtual void insertChildItem(int row, ParameterizedItem *item); @@ -95,22 +83,15 @@ public: //! Returns a pointer to the first child of the given type ParameterizedItem *getChildOfType(QString type) const; - //! indicates if the passed item can be set as - //! a child item + //! indicates if the passed item can be set as a child item bool acceptsAsChild(const QString &child_name) const; //! get list of acceptable child object names - QList<QString> acceptableChildItems() const - { - return m_valid_children; - } + QList<QString> acceptableChildItems() const; bool event(QEvent *e); - QMap<QString, ParameterizedItem *> getSubItems() const - { - return m_sub_items; - } + QMap<QString, ParameterizedItem *> getSubItems() const; void addPropertyItem(QString name, ParameterizedItem *item); @@ -128,10 +109,17 @@ public: PropertyAttribute getPropertyAttribute(const QString &name) const; - void print() const; + void setPropertyAttribute(const QString &name, const PropertyAttribute &attribute); + + void setPropertyAppearance(const QString &name, + const PropertyAttribute::EAppearance &appearance); virtual void onPropertyChange(const QString &name); + virtual void onChildPropertyChange(); + + void print() const; + virtual ParameterizedItem *getCandidateForRemoval(ParameterizedItem *new_comer); class PortInfo @@ -148,19 +136,8 @@ public: void setItemPort(PortInfo::EPorts nport); - virtual QString getItemLabel() const - { - return QString(""); - } - - void setPropertyAppearance(const QString &name, - const PropertyAttribute::EAppearance &appearance); - QStringList getParameterTreeList() const; - virtual void onChildPropertyChange(); - void setPropertyAttribute(const QString &name, const PropertyAttribute &attribute); - signals: void propertyChanged(const QString &propertyName); void subItemChanged(const QString &propertyName); @@ -188,6 +165,7 @@ private: QMap<int, PortInfo> m_port_info; QString m_model_type; + QString m_display_name; ParameterizedItem *mp_parent; QList<ParameterizedItem *> m_children; QMap<QString, ParameterizedItem *> m_sub_items;