ifcviewer: de-Qt ViewportWindow public API (QString → std::string)

Take QString out of ViewportWindow's outward-facing surface so it can
eventually move into a Qt-free ViewportCore:

  void     queueLoadSidecar(const QString&)    →  (const std::string&)
  uint32_t loadSidecar(const QString&)         →  (const std::string&)
  QString  cameraString() const                →  std::string …
  void     captureNextFrameToPng(const QString&, bool)
                                               →  (const std::string&, bool)
  void     setHudText(const QString&)          →  (const std::string&)

Internal members also moved off QString:
  std::deque<QString> pending_sidecars_     →  std::deque<std::string>
  QString             pending_screenshot_path_ →  std::string

Implementation strategy: convert at the boundary where ViewportWindow
still leans on Qt internals — `loadSidecar` bridges to QString once
for QFile/QDir/QFileInfo path handling; the screenshot save path
constructs a QString locally for QImage::save; the OverlayRenderer's
HUD setter still takes QString so setHudText converts before calling
through. Each of those bridges goes away when ViewportCore lands and
OverlayRenderer / SceneLoader / SidecarBuilder get their own de-Qt
sweeps. cameraString now produces its CSV via snprintf — no QString
ever instantiated.

Bonsai-side updates (compile-only):
  ifcviewer-minimal/main.cpp — queueLoadSidecar / captureNextFrameToPng
                              callers add .toStdString() on the QString
                              parser result
  modules/viewport/View.cpp  — setHudText callers add .toStdString() to
                              their `QString::arg(...)` formatter chains;
                              two `QString()` empty sentinels become
                              `std::string()`
  Measurement.cpp            — same pattern, two setHudText sites
  ifcviewer/LengthMeasurement.cpp — same, three sites

The cameraString string-streaming fix-up in ViewportWindow.cpp drops
the temporary .toUtf8().constData() bridge from #82 — Log::Stream's
std::string overload now handles it directly.

Builds: desktop / bonsai / web all green. Tests 100/100. Closes #80.
This commit is contained in:
Dion Moult
2026-06-05 09:14:19 +10:00
parent 6dd3558db9
commit b62e14a06a
6 changed files with 49 additions and 41 deletions
+4 -4
View File
@@ -80,7 +80,7 @@ ViewportView::ViewportView(bonsaiviewer::SessionState* session_state,
area_measurement_->onPick(*viewport_, x, y, alt);
viewport_->setHudText(QString("Area: %1 m² (%2 tris)")
.arg(area_measurement_->totalArea(), 0, 'f', 4)
.arg(area_measurement_->triangleCount()));
.arg(area_measurement_->triangleCount()).toStdString());
break;
case ViewportWindow::ToolMode::Length:
length_measurement_->onPick(*viewport_, x, y, alt);
@@ -96,7 +96,7 @@ ViewportView::ViewportView(bonsaiviewer::SessionState* session_state,
length_measurement_->clear(*viewport_);
switch (mode) {
case ViewportWindow::ToolMode::NoTool:
viewport_->setHudText(QString());
viewport_->setHudText(std::string());
viewport_->setOverlayLabels({});
session_state_->setStatusMessage("Measure", "Measurement tool off");
break;
@@ -241,7 +241,7 @@ void ViewportView::updateVolumeReadout() {
const auto& sel = viewport_->selection().selectionIds();
if (sel.empty()) {
viewport_->setHudText(QString());
viewport_->setHudText(std::string());
viewport_->setOverlayLabels({});
return;
}
@@ -268,7 +268,7 @@ void ViewportView::updateVolumeReadout() {
viewport_->setHudText(QString("Volume: %1 m³ (%2 object%3)")
.arg(total, 0, 'f', 4)
.arg(per_obj.size())
.arg(per_obj.size() == 1 ? "" : "s"));
.arg(per_obj.size() == 1 ? "" : "s").toStdString());
viewport_->setOverlayLabels(labels);
}