20#ifndef ORES_QT_RECENCY_TRACKER_HPP
21#define ORES_QT_RECENCY_TRACKER_HPP
25#include <unordered_set>
27#include <ores.platform/attributes.hpp>
28#include "ores.qt/export.hpp"
35template<
typename Entity>
37 auto operator()(
const Entity& e)
const {
73template<
typename Entity,
74 typename KeyExtractor,
86 : key_extractor_(
std::move(key_extractor)),
87 timestamp_extractor_() {}
95 RecencyTracker(KeyExtractor key_extractor, TimestampExtractor timestamp_extractor)
96 : key_extractor_(
std::move(key_extractor)),
97 timestamp_extractor_(
std::move(timestamp_extractor)) {}
108 template<
typename Container>
110 recent_keys_.clear();
112 const QDateTime now = QDateTime::currentDateTime();
115 if (!last_reload_time_.isValid()) {
116 last_reload_time_ = now;
121 for (
const auto& entity : entities) {
122 const auto recorded_at = timestamp_extractor_(entity);
123 if (recorded_at == std::chrono::system_clock::time_point{}) {
127 const auto msecs = std::chrono::duration_cast<std::chrono::milliseconds>(
128 recorded_at.time_since_epoch()).count();
129 QDateTime recorded_dt = QDateTime::fromMSecsSinceEpoch(msecs);
131 if (recorded_dt.isValid() && recorded_dt > last_reload_time_) {
132 recent_keys_.insert(key_extractor_(entity));
136 last_reload_time_ = now;
137 return !recent_keys_.empty();
146 [[nodiscard]]
bool is_recent(
const std::string& key)
const {
147 return recent_keys_.find(key) != recent_keys_.end();
154 return recent_keys_.size();
161 return !recent_keys_.empty();
170 recent_keys_.clear();
179 recent_keys_.clear();
180 last_reload_time_ = QDateTime();
184 KeyExtractor key_extractor_;
185 ORES_NO_UNIQUE_ADDRESS TimestampExtractor timestamp_extractor_;
186 std::unordered_set<std::string> recent_keys_;
187 QDateTime last_reload_time_;
196template<
typename Entity,
typename KeyExtractor>
208template<
typename Entity,
typename KeyExtractor,
typename TimestampExtractor>
210 TimestampExtractor timestamp_extractor) {
212 std::move(key_extractor), std::move(timestamp_extractor));
Qt-based graphical user interface for ORE Studio.
Definition AccountController.hpp:32
auto make_recency_tracker(KeyExtractor key_extractor)
Helper function to create a RecencyTracker with type deduction.
Definition RecencyTracker.hpp:197
Default timestamp extractor that accesses .recorded_at member.
Definition RecencyTracker.hpp:36
Tracks recently-modified records for recency highlighting.
Definition RecencyTracker.hpp:76
RecencyTracker(KeyExtractor key_extractor, TimestampExtractor timestamp_extractor)
Construct a RecencyTracker with custom key and timestamp extractors.
Definition RecencyTracker.hpp:95
bool has_recent() const
Check if there are any recent records.
Definition RecencyTracker.hpp:160
bool update(const Container &entities)
Update the set of recent records by comparing timestamps.
Definition RecencyTracker.hpp:109
std::size_t recent_count() const
Get the number of recent records.
Definition RecencyTracker.hpp:153
bool is_recent(const std::string &key) const
Check if a record with the given key is recent.
Definition RecencyTracker.hpp:146
void clear()
Clear the recent records set.
Definition RecencyTracker.hpp:169
void reset()
Reset the tracker completely.
Definition RecencyTracker.hpp:178
RecencyTracker(KeyExtractor key_extractor)
Construct a RecencyTracker with custom key extractor.
Definition RecencyTracker.hpp:85