| 2581 | } |
| 2582 | |
| 2583 | void VfoWidget::setCollapsed(bool collapsed) |
| 2584 | { |
| 2585 | if (m_collapsed == collapsed) return; |
| 2586 | m_collapsed = collapsed; |
| 2587 | |
| 2588 | // Persist per-slice preference |
| 2589 | if (m_slice) { |
| 2590 | auto& s = AppSettings::instance(); |
| 2591 | s.setValue(QString("SliceFlagCollapsed_%1").arg(m_slice->sliceId()), |
| 2592 | collapsed ? "True" : "False"); |
| 2593 | } |
| 2594 | |
| 2595 | if (collapsed) { |
| 2596 | // Remember which children were already hidden so we don't show them on expand |
| 2597 | m_hiddenBeforeCollapse.clear(); |
| 2598 | const QList<QWidget*> children = findChildren<QWidget*>(QString(), Qt::FindDirectChildrenOnly); |
| 2599 | for (QWidget* child : children) { |
| 2600 | if (!child->isVisible()) { |
| 2601 | m_hiddenBeforeCollapse.insert(child); |
| 2602 | } |
| 2603 | child->setVisible(false); |
| 2604 | // Make children ignore mouse events so external code that shows |
| 2605 | // them (e.g. updateSplitBadge) can't intercept our clicks |
| 2606 | child->setAttribute(Qt::WA_TransparentForMouseEvents, true); |
| 2607 | } |
| 2608 | // Hide external buttons (and remember their state) |
| 2609 | if (m_closeSliceBtn) { |
| 2610 | if (!m_closeSliceBtn->isVisible()) m_hiddenBeforeCollapse.insert(m_closeSliceBtn); |
| 2611 | m_closeSliceBtn->hide(); |
| 2612 | } |
| 2613 | if (m_lockVfoBtn) { |
| 2614 | if (!m_lockVfoBtn->isVisible()) m_hiddenBeforeCollapse.insert(m_lockVfoBtn); |
| 2615 | m_lockVfoBtn->hide(); |
| 2616 | } |
| 2617 | if (m_recordBtn) { |
| 2618 | if (!m_recordBtn->isVisible()) m_hiddenBeforeCollapse.insert(m_recordBtn); |
| 2619 | m_recordBtn->hide(); |
| 2620 | } |
| 2621 | if (m_playBtn) { |
| 2622 | if (!m_playBtn->isVisible()) m_hiddenBeforeCollapse.insert(m_playBtn); |
| 2623 | m_playBtn->hide(); |
| 2624 | } |
| 2625 | |
| 2626 | // Resize to narrow collapsed width with fixed height for painted content |
| 2627 | setMinimumWidth(COLLAPSED_W); |
| 2628 | setMaximumWidth(COLLAPSED_W); |
| 2629 | setFixedHeight(44); // slice badge (20) + gap (2) + TX badge (16) + padding (6) |
| 2630 | |
| 2631 | // Show collapsed frequency label and position it immediately |
| 2632 | if (m_collapsedFreqLabel) { |
| 2633 | updateFreqLabel(); |
| 2634 | m_collapsedFreqLabel->setText(m_freqLabel->text()); |
| 2635 | m_collapsedFreqLabel->adjustSize(); |
| 2636 | m_collapsedFreqLabel->show(); |
| 2637 | |
| 2638 | // Position now based on current widget location |
| 2639 | const int freqGap = 2; |
| 2640 | int freqH = m_collapsedFreqLabel->sizeHint().height(); |