feat(gui): add document-origin tracking and display in window title (#16)
Some checks failed
Build and Test / build (push) Has been cancelled
Some checks failed
Build and Test / build (push) Has been cancelled
- 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
This commit is contained in:
@@ -44,7 +44,9 @@
|
|||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "Document.h"
|
#include "Document.h"
|
||||||
#include "FileDialog.h"
|
#include "FileDialog.h"
|
||||||
|
#include "FileOrigin.h"
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
|
#include "OriginManager.h"
|
||||||
#include "ViewProviderDocumentObject.h"
|
#include "ViewProviderDocumentObject.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -522,6 +524,13 @@ QString MDIView::buildWindowTitle() const
|
|||||||
QString windowTitle;
|
QString windowTitle;
|
||||||
if (auto document = getAppDocument()) {
|
if (auto document = getAppDocument()) {
|
||||||
windowTitle.append(QString::fromStdString(document->Label.getStrValue()));
|
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;
|
return windowTitle;
|
||||||
|
|||||||
@@ -231,6 +231,63 @@ FileOrigin* OriginManager::findOwningOrigin(App::Document* doc) const
|
|||||||
return nullptr;
|
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
|
FileOrigin* OriginManager::originForNewDocument() const
|
||||||
{
|
{
|
||||||
return currentOrigin();
|
return currentOrigin();
|
||||||
|
|||||||
@@ -121,6 +121,27 @@ public:
|
|||||||
*/
|
*/
|
||||||
FileOrigin* findOwningOrigin(App::Document* doc) const;
|
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.
|
* Get the appropriate origin for a new document.
|
||||||
* Returns the current origin.
|
* Returns the current origin.
|
||||||
@@ -137,6 +158,8 @@ public:
|
|||||||
fastsignals::signal<void(const std::string&)> signalOriginUnregistered;
|
fastsignals::signal<void(const std::string&)> signalOriginUnregistered;
|
||||||
/** Emitted when current origin changes */
|
/** Emitted when current origin changes */
|
||||||
fastsignals::signal<void(const std::string&)> signalCurrentOriginChanged;
|
fastsignals::signal<void(const std::string&)> signalCurrentOriginChanged;
|
||||||
|
/** Emitted when a document's origin association changes */
|
||||||
|
fastsignals::signal<void(App::Document*, const std::string&)> signalDocumentOriginChanged;
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -151,6 +174,9 @@ private:
|
|||||||
static OriginManager* _instance;
|
static OriginManager* _instance;
|
||||||
std::map<std::string, std::unique_ptr<FileOrigin>> _origins;
|
std::map<std::string, std::unique_ptr<FileOrigin>> _origins;
|
||||||
std::string _currentOriginId;
|
std::string _currentOriginId;
|
||||||
|
|
||||||
|
// Document-to-origin associations (doc -> origin ID)
|
||||||
|
mutable std::map<App::Document*, std::string> _documentOrigins;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Gui
|
} // namespace Gui
|
||||||
|
|||||||
Reference in New Issue
Block a user