Implement slave contact groups — label transfer, terminal assignment and UI fixes

This commit is contained in:
Kellermorph
2026-07-17 09:47:32 +02:00
parent b543adcb46
commit b025bd205d
29 changed files with 1305 additions and 31 deletions
+49 -6
View File
@@ -274,7 +274,8 @@ void Terminal::paint(
}
// Draw label if show_name is enabled
if (d->m_show_name && !d->m_name.isEmpty()) {
const QString display_name = name();
if (d->m_show_name && !display_name.isEmpty()) {
painter->setRenderHint(QPainter::Antialiasing, true);
painter->setRenderHint(QPainter::TextAntialiasing, true);
painter->setFont(d->m_label_font);
@@ -282,7 +283,7 @@ void Terminal::paint(
QPointF label_pos = d->m_pos + d->m_label_pos;
QFontMetrics fm(d->m_label_font);
QSizeF text_size = fm.size(Qt::TextSingleLine, d->m_name);
QSizeF text_size = fm.size(Qt::TextSingleLine, display_name);
if (!qFuzzyIsNull(d->m_label_rotation)) {
painter->save();
@@ -290,7 +291,7 @@ void Terminal::paint(
painter->rotate(d->m_label_rotation);
QRectF text_rect(-text_size.width()/2.0, -text_size.height()/2.0,
text_size.width(), text_size.height());
painter->drawText(text_rect, static_cast<int>(d->m_label_halignment | d->m_label_valignment), d->m_name);
painter->drawText(text_rect, static_cast<int>(d->m_label_halignment | d->m_label_valignment), display_name);
painter->restore();
} else {
qreal dx = 0, dy = 0;
@@ -306,7 +307,7 @@ void Terminal::paint(
if (d->m_label_frame) {
painter->drawRect(text_rect.adjusted(-1, -1, 1, 1));
}
painter->drawText(text_rect, static_cast<int>(Qt::AlignLeft | Qt::AlignTop), d->m_name);
painter->drawText(text_rect, static_cast<int>(Qt::AlignLeft | Qt::AlignTop), display_name);
}
}
@@ -378,12 +379,13 @@ QLineF Terminal::HelpLine() const
@return Le rectangle (en precision flottante) delimitant la borne et ses alentours.
*/
QRectF Terminal::boundingRect() const {
if (!d->m_show_name || d->m_name.isEmpty()) {
const QString display_name = name();
if (!d->m_show_name || display_name.isEmpty()) {
return m_br;
}
QFontMetrics fm(d->m_label_font);
QSizeF text_size = fm.size(Qt::TextSingleLine, d->m_name);
QSizeF text_size = fm.size(Qt::TextSingleLine, display_name);
QPointF label_pos = d->m_pos + d->m_label_pos;
qreal dx = 0, dy = 0;
@@ -808,6 +810,25 @@ QUuid Terminal::uuid() const
QString Terminal::name() const
{
if (d->m_use_master_label && parent_element_) {
// Find the master element in the slave's linked elements
for (Element *elmt : parent_element_->linkedElements()) {
if (elmt->linkType() == Element::Master) {
int group_idx = elmt->groupIndexForElement(parent_element_);
if (group_idx >= 0) {
const auto &groups = elmt->elementData().m_slave_contact_groups;
if (group_idx < groups.size()) {
int label_idx = d->m_master_label_index;
const QStringList &labels = groups.at(group_idx).labels;
if (label_idx >= 0 && label_idx < labels.size()) {
return labels.at(label_idx);
}
}
}
break;
}
}
}
return d->m_name;
}
@@ -820,6 +841,28 @@ TerminalData::Type Terminal::terminalType() const
return d->m_type;
}
/**
@brief Terminal::setUseMasterLabel
Set whether this terminal uses a label from the master's contact group
@param use true to use master label
*/
void Terminal::setUseMasterLabel(bool use)
{
d->m_use_master_label = use;
update();
}
/**
@brief Terminal::setMasterLabelIndex
Set the index into the master's contact group labels
@param index the label index (0-based)
*/
void Terminal::setMasterLabelIndex(int index)
{
d->m_master_label_index = index;
update();
}
/**
@brief Conductor::relatedPotentialTerminal
Return terminal at the same potential from the same