34 LOG_DEBUG(
"CanvasUsage",
"Canvas %s: Usage mode changed to %s",
40 const std::string& details) {
47 switch (interaction) {
77 double total_time = 0.0;
80 for (
double t : times) {
100 const ImVec2& content_size,
104 bool enable_hex_labels,
105 bool enable_custom_labels) {
131 default:
return "Unknown";
146 default:
return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
151 std::vector<std::string> recommendations;
155 recommendations.push_back(
"Consider using keyboard shortcuts to reduce mouse usage");
159 recommendations.push_back(
"Frequent context menu usage - consider adding toolbar buttons");
163 recommendations.push_back(
"Many modal dialogs opened - consider persistent panels");
167 recommendations.push_back(
"Operations are slow - check performance optimization");
171 recommendations.push_back(
"Frequent mode switching - consider mode-specific toolbars");
174 return recommendations;
178 std::ostringstream report;
180 report <<
"Canvas Usage Report for: " <<
canvas_id_ <<
"\n";
181 report <<
"==========================================\n\n";
184 auto now = std::chrono::steady_clock::now();
185 auto session_duration = std::chrono::duration_cast<std::chrono::milliseconds>(
188 report <<
"Session Information:\n";
189 report <<
" Duration: " <<
FormatDuration(session_duration) <<
"\n";
194 report <<
"Interaction Statistics:\n";
202 report <<
"Performance Statistics:\n";
204 report <<
" Average Operation Time: " << std::fixed << std::setprecision(2)
206 report <<
" Max Operation Time: " << std::fixed << std::setprecision(2)
210 report <<
"Canvas State:\n";
215 report <<
" Global Scale: " << std::fixed << std::setprecision(2)
217 report <<
" Grid Step: " << std::fixed << std::setprecision(1)
225 report <<
"Operation Breakdown:\n";
228 report <<
" " << operation <<
": " << times.size() <<
" operations, "
229 <<
"avg " << std::fixed << std::setprecision(2) << avg_time <<
" ms\n";
236 if (!recommendations.empty()) {
237 report <<
"Recommendations:\n";
238 for (
const auto& rec : recommendations) {
239 report <<
" • " << rec <<
"\n";
270 LOG_DEBUG(
"CanvasUsage",
"Canvas %s: Session ended. Duration: %s, Operations: %d",
272 FormatDuration(std::chrono::duration_cast<std::chrono::milliseconds>(
278 auto now = std::chrono::steady_clock::now();
279 auto time_since_activity = std::chrono::duration_cast<std::chrono::milliseconds>(
282 if (time_since_activity.count() < 5000) {
288 auto now = std::chrono::steady_clock::now();
289 auto time_since_activity = std::chrono::duration_cast<std::chrono::milliseconds>(
292 if (time_since_activity.count() >= 5000) {
320 for (
double time : it->second) {
324 return total / it->second.size();
328 auto total_ms = duration.count();
329 auto hours = total_ms / 3600000;
330 auto minutes = (total_ms % 3600000) / 60000;
331 auto seconds = (total_ms % 60000) / 1000;
333 std::ostringstream ss;
335 ss << hours <<
"h " << minutes <<
"m " << seconds <<
"s";
336 }
else if (minutes > 0) {
337 ss << minutes <<
"m " << seconds <<
"s";
339 ss << seconds <<
"s";
353 std::shared_ptr<CanvasUsageTracker> tracker) {
355 LOG_DEBUG(
"CanvasUsage",
"Registered usage tracker for canvas: %s", canvas_id.c_str());
369 for (
const auto& [
id, tracker] :
trackers_) {
370 const auto& stats = tracker->GetCurrentStats();
393 std::ostringstream report;
395 report <<
"Global Canvas Usage Report\n";
396 report <<
"==========================\n\n";
398 report <<
"Registered Canvases: " <<
trackers_.size() <<
"\n\n";
400 for (
const auto& [
id, tracker] :
trackers_) {
401 report <<
"Canvas: " <<
id <<
"\n";
402 report <<
"----------------------------------------\n";
403 report << tracker->ExportUsageReport() <<
"\n\n";
408 report <<
"Global Summary:\n";
409 report <<
" Total Mouse Clicks: " << global_stats.mouse_clicks <<
"\n";
410 report <<
" Total Operations: " << global_stats.total_operations <<
"\n";
411 report <<
" Average Operation Time: " << std::fixed << std::setprecision(2)
412 << global_stats.average_operation_time_ms <<
" ms\n";
413 report <<
" Max Operation Time: " << std::fixed << std::setprecision(2)
414 << global_stats.max_operation_time_ms <<
" ms\n";
421 tracker->ClearHistory();
424 LOG_DEBUG(
"CanvasUsage",
"Cleared all canvas usage trackers");
Global canvas usage tracker manager.
std::unordered_map< std::string, std::shared_ptr< CanvasUsageTracker > > trackers_
void RegisterTracker(const std::string &canvas_id, std::shared_ptr< CanvasUsageTracker > tracker)
Register a canvas tracker.
void ClearAllTrackers()
Clear all trackers.
static CanvasUsageManager & Get()
std::string ExportGlobalReport() const
Export global usage report.
CanvasUsageStats GetGlobalStats() const
Get global usage statistics.
std::shared_ptr< CanvasUsageTracker > GetTracker(const std::string &canvas_id)
Get tracker for canvas.
std::chrono::steady_clock::time_point session_start_
void ClearHistory()
Clear usage history.
std::vector< CanvasUsageStats > usage_history_
std::vector< std::string > GetUsageRecommendations() const
Get usage recommendations.
std::unordered_map< std::string, std::vector< double > > operation_times_
std::chrono::steady_clock::time_point last_activity_
std::string FormatDuration(const std::chrono::milliseconds &duration) const
std::vector< std::pair< CanvasInteraction, std::string > > interaction_history_
void RecordInteraction(CanvasInteraction interaction, const std::string &details="")
Record an interaction.
double CalculateAverageOperationTime(const std::string &operation_name) const
void StartSession()
Start session.
void SetUsageMode(CanvasUsage usage)
Set the current usage mode.
std::string ExportUsageReport() const
Export usage report.
std::string GetUsageModeName(CanvasUsage usage) const
Get usage mode name.
CanvasUsageStats current_stats_
void EndSession()
End session.
void Initialize(const std::string &canvas_id)
Initialize the usage tracker.
void UpdateCanvasState(const ImVec2 &canvas_size, const ImVec2 &content_size, float global_scale, float grid_step, bool enable_grid, bool enable_hex_labels, bool enable_custom_labels)
Update canvas state.
void RecordOperation(const std::string &operation_name, double time_ms)
Record operation timing.
ImVec4 GetUsageModeColor(CanvasUsage usage) const
Get usage mode color for UI.
#define LOG_DEBUG(category, format,...)
CanvasUsage
Canvas usage patterns and tracking.
CanvasInteraction
Canvas interaction types.
Main namespace for the application.
double max_operation_time_ms
bool enable_custom_labels
std::chrono::milliseconds active_time
std::chrono::steady_clock::time_point session_start
double average_operation_time_ms
std::chrono::milliseconds idle_time
std::chrono::milliseconds total_time