Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/ui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
14 changes: 14 additions & 0 deletions src/ui/UnifiedLogWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
44 changes: 44 additions & 0 deletions tests/test_eingabezeile_in_flucht.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ private slots:
void itStaysInLineWhenTheRunningNumberComesBack();
void theStatusColumnIsOnlyAsWideAsItsPill();
void theRunningVersionIsOnTheStatusBar();
void itStaysInLineWhenTheViewModeChanges();

private:
std::unique_ptr<AppController> makeController(QTemporaryDir& dir, const QString& file);
Expand Down Expand Up @@ -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<QTableView*>(QLatin1String(UnifiedLogWidget::kFeedTableObjectName));
QVERIFY(table);
auto* log = window.findChild<UnifiedLogWidget*>();
QVERIFY(log);
auto* row = window.findChild<QWidget*>(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<QLineEdit*>().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);
Expand Down
Loading