diff --git a/sources/editor/ui/elementpropertieseditorwidget.cpp b/sources/editor/ui/elementpropertieseditorwidget.cpp index 7ed277efb..e88282fd7 100644 --- a/sources/editor/ui/elementpropertieseditorwidget.cpp +++ b/sources/editor/ui/elementpropertieseditorwidget.cpp @@ -1,4 +1,4 @@ -/* +/* Copyright 2006-2026 The QElectroTech Team This file is part of QElectroTech. @@ -96,8 +96,18 @@ void ElementPropertiesEditorWidget::upDateInterface() } else if (m_data.m_type == ElementData::Master) { ui->m_master_type_cb->setCurrentIndex( - ui->m_master_type_cb->findData ( - m_data.m_master_type)); + ui->m_master_type_cb->findData ( + m_data.m_master_type)); + + // NEU: Checkbox und Zahlenbox für max_slaves einstellen + if (m_data.m_max_slaves == -1) { + ui->max_slaves_checkbox->setChecked(false); + ui->max_slaves_spinbox->setEnabled(false); + } else { + ui->max_slaves_checkbox->setChecked(true); + ui->max_slaves_spinbox->setEnabled(true); + ui->max_slaves_spinbox->setValue(m_data.m_max_slaves); + } } else if (m_data.m_type == ElementData::Terminal) { ui->m_terminal_type_cb->setCurrentIndex( ui->m_terminal_type_cb->findData( @@ -151,10 +161,14 @@ void ElementPropertiesEditorWidget::setUpInterface() ui->m_terminal_func_cb->addItem(tr("Phase"), ElementData::TFPhase); ui->m_terminal_func_cb->addItem(tr("Neutre"), ElementData::TFNeutral); - //Disable the edition of the first column of the information tree - //by this little workaround + //Disable the edition of the first column of the information tree + //by this little workaround ui->m_tree->setItemDelegate(new EditorDelegate(this)); ui->m_tree->header()->resizeSection(0, 150); + + // NEU: Checkbox mit der Zahlenbox verbinden (Aktivieren/Deaktivieren) + connect(ui->max_slaves_checkbox, SIGNAL(toggled(bool)), ui->max_slaves_spinbox, SLOT(setEnabled(bool))); + populateTree(); } @@ -226,6 +240,13 @@ void ElementPropertiesEditorWidget::on_m_buttonBox_accepted() } else if (m_data.m_type == ElementData::Master) { m_data.m_master_type = ui->m_master_type_cb->currentData().value(); + + // NEU: Wenn Häkchen gesetzt, speichere die Zahl, ansonsten -1 (unendlich) + if (ui->max_slaves_checkbox->isChecked()) { + m_data.m_max_slaves = ui->max_slaves_spinbox->value(); + } else { + m_data.m_max_slaves = -1; + } } else if (m_data.m_type == ElementData::Terminal) { diff --git a/sources/editor/ui/elementpropertieseditorwidget.ui b/sources/editor/ui/elementpropertieseditorwidget.ui index 6c3b33344..f7bf44641 100644 --- a/sources/editor/ui/elementpropertieseditorwidget.ui +++ b/sources/editor/ui/elementpropertieseditorwidget.ui @@ -7,7 +7,7 @@ 0 0 527 - 442 + 492 @@ -104,6 +104,23 @@ + + + + max. Slaves definieren + + + + + + + false + + + 1 + + + diff --git a/sources/properties/elementdata.cpp b/sources/properties/elementdata.cpp index 4a50c2fd2..944ce3c08 100644 --- a/sources/properties/elementdata.cpp +++ b/sources/properties/elementdata.cpp @@ -76,6 +76,14 @@ QDomElement ElementData::kindInfoToXml(QDomDocument &document) xml_type.appendChild(type_txt); returned_elmt.appendChild(xml_type); + + // NEU: max_slaves speichern + auto xml_max_slaves = document.createElement(QStringLiteral("kindInformation")); + xml_max_slaves.setAttribute(QStringLiteral("name"), QStringLiteral("max_slaves")); + auto max_slaves_txt = document.createTextNode(QString::number(m_max_slaves)); + xml_max_slaves.appendChild(max_slaves_txt); + + returned_elmt.appendChild(xml_max_slaves); } else if (m_type == ElementData::Slave) { @@ -558,9 +566,12 @@ void ElementData::kindInfoFromXml(const QDomElement &xml_element) } auto name = dom_elmt.attribute(QStringLiteral("name")); - if (m_type == ElementData::Master && - name == QLatin1String("type")) { - m_master_type = masterTypeFromString(dom_elmt.text()); + if (m_type == ElementData::Master) { + if (name == QLatin1String("type")) { + m_master_type = masterTypeFromString(dom_elmt.text()); + } else if (name == QLatin1String("max_slaves")) { + m_max_slaves = dom_elmt.text().toInt(); + } } else if (m_type == ElementData::Slave ) { if (name == QLatin1String("type")) { diff --git a/sources/properties/elementdata.h b/sources/properties/elementdata.h index b5561ef44..5402d064b 100644 --- a/sources/properties/elementdata.h +++ b/sources/properties/elementdata.h @@ -134,6 +134,7 @@ class ElementData : public PropertiesInterface ElementData::Type m_type = ElementData::Simple; ElementData::MasterType m_master_type = ElementData::Coil; + int m_max_slaves = -1; ElementData::SlaveType m_slave_type = ElementData::SSimple; ElementData::SlaveState m_slave_state = ElementData::NO; diff --git a/sources/qetgraphicsitem/masterelement.cpp b/sources/qetgraphicsitem/masterelement.cpp index 6f2394795..9d5f59f82 100644 --- a/sources/qetgraphicsitem/masterelement.cpp +++ b/sources/qetgraphicsitem/masterelement.cpp @@ -183,3 +183,34 @@ void MasterElement::aboutDeleteXref() return; } } + +/** + * @brief MasterElement::isFull + * @return true if the master has reached its maximum number of slaves + */ +bool MasterElement::isFull() const +{ + // Lese das Limit aus den XML-Daten (kindInformations) + // Die value() Funktion im DiagramContext nimmt nur einen Parameter! + QVariant max_slaves_variant = kindInformations().value("max_slaves"); + + // Wenn der Wert nicht existiert oder leer ist, ist das Bauteil nie voll + if (!max_slaves_variant.isValid() || max_slaves_variant.toString().isEmpty()) { + return false; + } + + // In Integer umwandeln + int max_slaves = max_slaves_variant.toInt(); + + // Wenn Limit -1 ist, ist der Master nie voll + if (max_slaves == -1) { + return false; + } + + // Wenn die Anzahl der verbundenen Elemente größer oder gleich dem Limit ist, ist er voll + if (connected_elements.size() >= max_slaves) { + return true; + } + + return false; +} diff --git a/sources/qetgraphicsitem/masterelement.h b/sources/qetgraphicsitem/masterelement.h index 19ceb9aaf..23c6feaf1 100644 --- a/sources/qetgraphicsitem/masterelement.h +++ b/sources/qetgraphicsitem/masterelement.h @@ -44,6 +44,8 @@ class MasterElement : public Element void unlinkElement (Element *elmt) override; void initLink (QETProject *project) override; QRectF XrefBoundingRect() const; + + bool isFull() const; // NEU: Prüft, ob das Slave-Limit erreicht ist protected: QVariant itemChange( diff --git a/sources/ui/linksingleelementwidget.cpp b/sources/ui/linksingleelementwidget.cpp index 0247989bd..4a7def2c3 100644 --- a/sources/ui/linksingleelementwidget.cpp +++ b/sources/ui/linksingleelementwidget.cpp @@ -16,7 +16,7 @@ along with QElectroTech. If not, see . */ #include "linksingleelementwidget.h" - +#include "../qetgraphicsitem/masterelement.h" #include "../qetgraphicsitem/conductor.h" #include "../diagram.h" #include "../diagramposition.h" @@ -386,7 +386,22 @@ QVector > LinkSingleElementWidget::availableElements() //If element is linked, remove is parent from the list if(!m_element->isFree()) elmt_vector.removeAll(m_element->linkedElements().first()); - + // NEU: Filtere volle Master-Elemente aus der Liste heraus + for (int i = elmt_vector.size() - 1; i >= 0; --i) { + Element *elmt = elmt_vector.at(i); + + // Wenn das Element in der Liste ein Master ist + if (elmt->linkType() == Element::Master) { + + // Wir wandeln den generischen Element-Pointer in einen MasterElement-Pointer um + MasterElement *master = static_cast(elmt); + + // Wenn der Master voll ist, werfen wir ihn aus der Liste! + if (master->isFull()) { + elmt_vector.removeAt(i); + } + } + } return elmt_vector; } diff --git a/sources/ui/masterpropertieswidget.cpp b/sources/ui/masterpropertieswidget.cpp index 1a44571a5..d1a346695 100644 --- a/sources/ui/masterpropertieswidget.cpp +++ b/sources/ui/masterpropertieswidget.cpp @@ -348,16 +348,34 @@ void MasterPropertiesWidget::headerCustomContextMenuRequested(const QPoint &pos) @brief MasterPropertiesWidget::on_link_button_clicked move current item in the free_list to linked_list */ +/** + * @brief MasterPropertiesWidget::on_link_button_clicked + * move current item in the free_list to linked_list + */ void MasterPropertiesWidget::on_link_button_clicked() { - //take the current item from free_list and push it to linked_list + // --- NEU: Prüfen, ob das Master-Limit im UI bereits erreicht ist --- + QVariant max_slaves_variant = m_element->kindInformations().value("max_slaves"); + + if (max_slaves_variant.isValid() && !max_slaves_variant.toString().isEmpty()) { + int max_slaves = max_slaves_variant.toInt(); + + // Wir zählen, wie viele Elemente schon in der "Verbunden"-Liste liegen + if (max_slaves != -1 && ui->m_link_tree_widget->topLevelItemCount() >= max_slaves) { + // Limit erreicht! Wir brechen die Aktion einfach ab. + return; + } + } + // ------------------------------------------------------------------- + + //take the current item from free_list and push it to linked_list QTreeWidgetItem *qtwi = ui->m_free_tree_widget->currentItem(); if (qtwi) { ui->m_free_tree_widget->takeTopLevelItem( - ui->m_free_tree_widget->indexOfTopLevelItem(qtwi)); + ui->m_free_tree_widget->indexOfTopLevelItem(qtwi)); ui->m_link_tree_widget->insertTopLevelItem(0, qtwi); - + if(m_live_edit) apply(); }