21#ifndef TEXT_VAR_DEPENDENCY_H_
22#define TEXT_VAR_DEPENDENCY_H_
27#include <initializer_list>
28#include <shared_mutex>
29#include <unordered_map>
30#include <unordered_set>
73 enum class KIND : std::uint8_t
111 const std::vector<TEXT_VAR_REF_KEY>& aRefs );
136 void Register(
EDA_ITEM* aItem,
const std::vector<TEXT_VAR_REF_KEY>& aKeys );
151 const std::function<
void(
EDA_ITEM* )>& aFn )
const;
173 std::unordered_set<EDA_ITEM*>,
176 std::unordered_map<EDA_ITEM*, std::vector<TEXT_VAR_REF_KEY>>
m_itemKeys;
226 void SetSourceKeyExtractor( SourceKeyExtractor aExtractor );
236 [[nodiscard]] ListenerHandle AddInvalidateListener( InvalidateCallback aCallback );
242 void RemoveInvalidateListener( ListenerHandle aHandle );
250 void RegisterItem(
EDA_ITEM* aItem,
const std::vector<TEXT_VAR_REF_KEY>& aKeys );
255 void UnregisterItem(
EDA_ITEM* aItem );
262 void HandleItemChanged(
EDA_ITEM* aItem,
const std::vector<TEXT_VAR_REF_KEY>& aUpdatedKeys );
276 void InvalidateByKind( std::initializer_list<TEXT_VAR_REF_KEY::KIND> aKinds );
285 void InvalidateProjectScoped();
293 void InvalidateVariantScoped();
298 void fanOutSourceKeys(
EDA_ITEM* aItem );
A base class for most all the KiCad significant classes used in schematics and boards.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Bidirectional index mapping TEXT_VAR_REF_KEY → dependent items and item → keys.
std::vector< TEXT_VAR_REF_KEY > GetRegisteredKeys() const
Enumerate every key currently present in the forward index.
std::unordered_map< TEXT_VAR_REF_KEY, std::unordered_set< EDA_ITEM * >, TEXT_VAR_REF_KEY_HASH > m_dependents
void Clear()
Drop every entry.
std::size_t ItemCount() const
std::size_t DependentCount(const TEXT_VAR_REF_KEY &aKey) const
void Register(EDA_ITEM *aItem, const std::vector< TEXT_VAR_REF_KEY > &aKeys)
Replace the key set for aItem with aKeys.
std::unordered_map< EDA_ITEM *, std::vector< TEXT_VAR_REF_KEY > > m_itemKeys
std::shared_mutex m_mutex
TEXT_VAR_DEPENDENCY_INDEX()=default
void Unregister(EDA_ITEM *aItem)
Remove aItem from the index entirely.
void ForEachDependent(const TEXT_VAR_REF_KEY &aKey, const std::function< void(EDA_ITEM *)> &aFn) const
Invoke aFn exactly once per item registered under aKey.
SourceKeyExtractor m_extractSourceKeys
std::function< void(EDA_ITEM *aDependent, const TEXT_VAR_REF_KEY &aKey)> InvalidateCallback
Called when a dependent item should recompute its resolved text.
std::unordered_map< ListenerHandle, InvalidateCallback > m_invalidateListeners
TEXT_VAR_DEPENDENCY_INDEX m_index
const TEXT_VAR_DEPENDENCY_INDEX & Index() const
std::size_t ListenerHandle
Opaque handle returned by AddInvalidateListener and consumed by RemoveInvalidateListener.
TEXT_VAR_TRACKER(SourceKeyExtractor aSourceKeyExtractor={})
ListenerHandle m_nextListenerHandle
TEXT_VAR_DEPENDENCY_INDEX & Index()
std::function< std::vector< TEXT_VAR_REF_KEY >(EDA_ITEM *)> SourceKeyExtractor
Return the keys aItem could source as a cross-reference target.
static constexpr ListenerHandle INVALID_LISTENER
std::shared_mutex m_listenersMutex
std::size_t operator()(const TEXT_VAR_REF_KEY &aKey) const
Identifies a single resolvable source that a text item's ${...} reference depends on.
static TEXT_VAR_REF_KEY FromToken(const wxString &aToken)
Parse a raw token (the text between ${ and }) into a key using lexical classification only — no looku...
KIND
Categorizes a reference by the source that will produce its value.
bool operator==(const TEXT_VAR_REF_KEY &) const =default
KICOMMON_API std::vector< TEXT_VAR_REF_KEY > FilterTrackable(const std::vector< TEXT_VAR_REF_KEY > &aRefs)
Filter aRefs down to the subset that should be registered in the index (drops OP and any future non-t...