From 015df38328c24c96dea395574a6abcb3172cbf7f Mon Sep 17 00:00:00 2001 From: forbes-0023 Date: Thu, 5 Feb 2026 14:53:45 -0600 Subject: [PATCH] feat(gui): add document-origin tracking and display in window title (#16) - Add originForDocument(), setDocumentOrigin(), clearDocumentOrigin() methods to OriginManager - Add signalDocumentOriginChanged signal for UI updates - Add document-to-origin tracking map in OriginManager - Update MDIView::buildWindowTitle() to append origin suffix for non-local origins (e.g., 'Part001 [Silo]') This implements Issue #16: Document origin tracking and display --- src/Gui/MDIView.cpp | 9 +++++++ src/Gui/OriginManager.cpp | 57 +++++++++++++++++++++++++++++++++++++++ src/Gui/OriginManager.h | 26 ++++++++++++++++++ 3 files changed, 92 insertions(+) diff --git a/src/Gui/MDIView.cpp b/src/Gui/MDIView.cpp index 00de2e5f5d..7147fd5591 100644 --- a/src/Gui/MDIView.cpp +++ b/src/Gui/MDIView.cpp @@ -44,7 +44,9 @@ #include "Application.h" #include "Document.h" #include "FileDialog.h" +#include "FileOrigin.h" #include "MainWindow.h" +#include "OriginManager.h" #include "ViewProviderDocumentObject.h" @@ -522,6 +524,13 @@ QString MDIView::buildWindowTitle() const QString windowTitle; if (auto document = getAppDocument()) { windowTitle.append(QString::fromStdString(document->Label.getStrValue())); + + // Append origin suffix for non-local origins + FileOrigin* origin = OriginManager::instance()->originForDocument(document); + if (origin && origin->type() != OriginType::Local) { + windowTitle.append(QStringLiteral(" [%1]") + .arg(QString::fromStdString(origin->nickname()))); + } } return windowTitle; diff --git a/src/Gui/OriginManager.cpp b/src/Gui/OriginManager.cpp index 2f40bb8126..f97fb8a443 100644 --- a/src/Gui/OriginManager.cpp +++ b/src/Gui/OriginManager.cpp @@ -231,6 +231,63 @@ FileOrigin* OriginManager::findOwningOrigin(App::Document* doc) const return nullptr; } +FileOrigin* OriginManager::originForDocument(App::Document* doc) const +{ + if (!doc) { + return nullptr; + } + + // Check explicit association first + auto it = _documentOrigins.find(doc); + if (it != _documentOrigins.end()) { + FileOrigin* origin = getOrigin(it->second); + if (origin) { + return origin; + } + // Origin was unregistered, clear stale association + _documentOrigins.erase(it); + } + + // Fall back to ownership detection + FileOrigin* owner = findOwningOrigin(doc); + if (owner) { + // Cache the result + _documentOrigins[doc] = owner->id(); + return owner; + } + + return nullptr; +} + +void OriginManager::setDocumentOrigin(App::Document* doc, FileOrigin* origin) +{ + if (!doc) { + return; + } + + std::string originId = origin ? origin->id() : ""; + + if (origin) { + _documentOrigins[doc] = originId; + } else { + _documentOrigins.erase(doc); + } + + signalDocumentOriginChanged(doc, originId); +} + +void OriginManager::clearDocumentOrigin(App::Document* doc) +{ + if (!doc) { + return; + } + + auto it = _documentOrigins.find(doc); + if (it != _documentOrigins.end()) { + _documentOrigins.erase(it); + } +} + FileOrigin* OriginManager::originForNewDocument() const { return currentOrigin(); diff --git a/src/Gui/OriginManager.h b/src/Gui/OriginManager.h index 3c396d9d33..ad40037bad 100644 --- a/src/Gui/OriginManager.h +++ b/src/Gui/OriginManager.h @@ -121,6 +121,27 @@ public: */ FileOrigin* findOwningOrigin(App::Document* doc) const; + /** + * Get the origin associated with a document. + * First checks explicit association, then uses findOwningOrigin(). + * @param doc The document to check + * @return The document's origin or nullptr if unknown + */ + FileOrigin* originForDocument(App::Document* doc) const; + + /** + * Associate a document with an origin. + * @param doc The document + * @param origin The origin to associate (nullptr to clear) + */ + void setDocumentOrigin(App::Document* doc, FileOrigin* origin); + + /** + * Clear document origin association (called when document closes). + * @param doc The document being closed + */ + void clearDocumentOrigin(App::Document* doc); + /** * Get the appropriate origin for a new document. * Returns the current origin. @@ -137,6 +158,8 @@ public: fastsignals::signal signalOriginUnregistered; /** Emitted when current origin changes */ fastsignals::signal signalCurrentOriginChanged; + /** Emitted when a document's origin association changes */ + fastsignals::signal signalDocumentOriginChanged; //@} protected: @@ -151,6 +174,9 @@ private: static OriginManager* _instance; std::map> _origins; std::string _currentOriginId; + + // Document-to-origin associations (doc -> origin ID) + mutable std::map _documentOrigins; }; } // namespace Gui