diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index 294135c..26b4edb 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -1113,7 +1113,11 @@ MainWindow::MainWindow(AppController& appController, QWidget* parent) m_versionLabel = new QLabel(this); m_versionLabel->setObjectName(QStringLiteral("versionStatus")); m_versionLabel->setFont(Style::monoFont(m_versionLabel->font(), Style::kFontSmall)); - m_versionLabel->setStyleSheet(QStringLiteral("color: %1;").arg(Style::kTextTertiary())); + // Polster links: die Statusnachricht (Rufzeichen, Contestname) endet + // unmittelbar davor, und ohne Abstand klebte die Fassung daran -- + // "...Subregional März/Maiv0.1.1". Live gesehen, 2026-09-30. + m_versionLabel->setStyleSheet( + QStringLiteral("color: %1; padding-left: 10px; padding-right: 4px;").arg(Style::kTextTertiary())); m_versionLabel->setText(QStringLiteral("v%1").arg(QString::fromLatin1(CONTESTPROGRAMM_VERSION))); m_versionLabel->setToolTip(QStringLiteral("Fassung %1 · Stand %2 · %3") .arg(QString::fromLatin1(CONTESTPROGRAMM_VERSION), diff --git a/src/ui/UnifiedLogWidget.cpp b/src/ui/UnifiedLogWidget.cpp index 2950e9a..1fe6218 100644 --- a/src/ui/UnifiedLogWidget.cpp +++ b/src/ui/UnifiedLogWidget.cpp @@ -2538,6 +2538,20 @@ void UnifiedLogWidget::setViewMode(ContestSettings::LogViewMode mode) rebuildExchangeCell(exchangeReceived()); } m_entryRowLayoutBuilt = true; + // Frisch gebaut heißt: in Standardbreiten, und die leere + // QSO-Nummern-Zelle steht noch auf dem Zustand von vorher. + // Erst das hier legt die Zeile auf die Spalten. Ohne den + // Aufruf fing das Rufzeichenfeld nach einem Ansichtswechsel + // bei 70 an, während seine Spalte bei 185 begann -- von der + // Windows-CI im Rüttel-Prüfstand gefunden (2026-09-30). Auf + // macOS fängt ein späterer Layout-Durchlauf es ein, deshalb + // fiel es hier nie auf. + // + // Ein früherer Anlauf an derselben Stelle brach die + // DXLog-Vollspalten (6 px Versatz). Das lag an der damaligen + // Rechnung aus SPALTENBREITEN; seit applyEntryRowWidths() die + // ABSTÄNDE der Spaltenpositionen nimmt, stimmt beides. + applyEntryRowWidths(); } else { applyEntryRowWidths(); } diff --git a/tests/test_eingabezeile_in_flucht.cpp b/tests/test_eingabezeile_in_flucht.cpp index ef29254..e4205df 100644 --- a/tests/test_eingabezeile_in_flucht.cpp +++ b/tests/test_eingabezeile_in_flucht.cpp @@ -44,6 +44,7 @@ private slots: void itStaysInLineWhenTheRunningNumberComesBack(); void theStatusColumnIsOnlyAsWideAsItsPill(); void theRunningVersionIsOnTheStatusBar(); + void itStaysInLineWhenTheViewModeChanges(); private: std::unique_ptr makeController(QTemporaryDir& dir, const QString& file); @@ -338,6 +339,49 @@ void TestEingabezeileInFlucht::theRunningVersionIsOnTheStatusBar() QVERIFY2(label->isVisibleTo(&window), "Die Fassung ist nicht sichtbar"); } +// Ansicht umschalten und sofort hinsehen. Die Windows-CI hat es am +// 2026-09-30 im Rüttel-Prüfstand gefunden: "nach ansicht: +// Rufzeichenfeld bei 70, Spalte bei 185" -- dieselben Zahlen wie beim +// Wiedereinschalten der laufenden Nummer, also wieder die leere +// QSO-Nummern-Zelle, die beim Neuaufbau der Zeile fehlt. Auf macOS +// fängt ein späterer Layout-Durchlauf es ein, auf Windows nicht. +void TestEingabezeileInFlucht::itStaysInLineWhenTheViewModeChanges() +{ + QTemporaryDir dir; + QVERIFY(dir.isValid()); + auto controller = makeController(dir, QStringLiteral("ansicht.sqlite")); + QVERIFY(controller); + + MainWindow window(*controller); + window.resize(1440, 900); + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + QCoreApplication::processEvents(); + + auto* table = window.findChild(QLatin1String(UnifiedLogWidget::kFeedTableObjectName)); + QVERIFY(table); + auto* log = window.findChild(); + QVERIFY(log); + auto* row = window.findChild(QLatin1String(UnifiedLogWidget::kEntryRowObjectName)); + QVERIFY(row); + + for (const auto modus : {ContestSettings::LogViewMode::DxLogFullColumns, + ContestSettings::LogViewMode::Compact, + ContestSettings::LogViewMode::DxLogFullColumns}) { + log->setViewMode(modus); + QCoreApplication::processEvents(); + QLineEdit* rufzeichen = row->findChildren().first(); + const int zelleX = zellenAnfang(window, rufzeichen); + const int spalteX = spaltenAnfang(table, UnifiedLogWidget::ColumnCall); + qInfo().noquote() << "Ansicht" << int(modus) << "-- Rufzeichenfeld bei" << zelleX + << ", Call-Spalte bei" << spalteX; + QVERIFY2(std::abs(zelleX - spalteX) <= 1, + qPrintable(QStringLiteral("Nach dem Ansichtswechsel fängt das Rufzeichenfeld bei %1 an, " + "seine Spalte bei %2") + .arg(zelleX).arg(spalteX))); + } +} + int main(int argc, char* argv[]) { QApplication app(argc, argv);