33 LOG_DEBUG(
"CanvasUsage",
"Canvas %s: Usage mode changed to %s",
39 const std::string& details) {
46 switch (interaction) {
76 double total_time = 0.0;
79 for (
double t : times) {
99 const ImVec2& content_size,
100 float global_scale,
float grid_step,
102 bool enable_hex_labels,
103 bool enable_custom_labels) {
122 return "Tile Painting";
124 return "Tile Selecting";
126 return "Rectangle Selection";
128 return "Color Painting";
130 return "Bitmap Editing";
132 return "Palette Editing";
134 return "BPP Conversion";
136 return "Performance Mode";
138 return "Entity Manipulation";
149 return ImVec4(0.2F, 1.0F, 0.2F, 1.0F);
151 return ImVec4(0.2F, 0.8F, 1.0F, 1.0F);
153 return ImVec4(1.0F, 0.8F, 0.2F, 1.0F);
155 return ImVec4(1.0F, 0.2F, 1.0F, 1.0F);
157 return ImVec4(1.0F, 0.5F, 0.2F, 1.0F);
159 return ImVec4(0.8F, 0.2F, 1.0F, 1.0F);
161 return ImVec4(0.2F, 1.0F, 1.0F, 1.0F);
163 return ImVec4(1.0F, 0.2F, 0.2F, 1.0F);
165 return ImVec4(0.4F, 0.8F, 1.0F, 1.0F);
167 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
169 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
174 std::vector<std::string> recommendations;
178 recommendations.push_back(
179 "Consider using keyboard shortcuts to reduce mouse usage");
183 recommendations.push_back(
184 "Frequent context menu usage - consider adding toolbar buttons");
188 recommendations.push_back(
189 "Many modal dialogs opened - consider persistent panels");
193 recommendations.push_back(
194 "Operations are slow - check performance optimization");
198 recommendations.push_back(
199 "Frequent mode switching - consider mode-specific toolbars");
202 return recommendations;
206 std::ostringstream report;
208 report <<
"Canvas Usage Report for: " <<
canvas_id_ <<
"\n";
209 report <<
"==========================================\n\n";
212 auto now = std::chrono::steady_clock::now();
213 auto session_duration = std::chrono::duration_cast<std::chrono::milliseconds>(
216 report <<
"Session Information:\n";
217 report <<
" Duration: " <<
FormatDuration(session_duration) <<
"\n";
223 report <<
"Interaction Statistics:\n";
232 report <<
"Performance Statistics:\n";
234 report <<
" Average Operation Time: " << std::fixed << std::setprecision(2)
236 report <<
" Max Operation Time: " << std::fixed << std::setprecision(2)
240 report <<
"Canvas State:\n";
243 report <<
" Content Size: "
246 report <<
" Global Scale: " << std::fixed << std::setprecision(2)
248 report <<
" Grid Step: " << std::fixed << std::setprecision(1)
252 report <<
" Hex Labels: "
254 report <<
" Custom Labels: "
259 report <<
"Operation Breakdown:\n";
262 report <<
" " << operation <<
": " << times.size() <<
" operations, "
263 <<
"avg " << std::fixed << std::setprecision(2) << avg_time
271 if (!recommendations.empty()) {
272 report <<
"Recommendations:\n";
273 for (
const auto& rec : recommendations) {
274 report <<
" • " << rec <<
"\n";
306 "CanvasUsage",
"Canvas %s: Session ended. Duration: %s, Operations: %d",
308 FormatDuration(std::chrono::duration_cast<std::chrono::milliseconds>(
315 auto now = std::chrono::steady_clock::now();
316 auto time_since_activity =
317 std::chrono::duration_cast<std::chrono::milliseconds>(now -
320 if (time_since_activity.count() < 5000) {
326 auto now = std::chrono::steady_clock::now();
327 auto time_since_activity =
328 std::chrono::duration_cast<std::chrono::milliseconds>(now -
331 if (time_since_activity.count() >= 5000) {
354 const std::string& operation_name)
const {
361 for (
double time : it->second) {
365 return total / it->second.size();
369 const std::chrono::milliseconds& duration)
const {
370 auto total_ms = duration.count();
371 auto hours = total_ms / 3600000;
372 auto minutes = (total_ms % 3600000) / 60000;
373 auto seconds = (total_ms % 60000) / 1000;
375 std::ostringstream ss;
377 ss << hours <<
"h " << minutes <<
"m " << seconds <<
"s";
378 }
else if (minutes > 0) {
379 ss << minutes <<
"m " << seconds <<
"s";
381 ss << seconds <<
"s";
395 const std::string& canvas_id, std::shared_ptr<CanvasUsageTracker> tracker) {
397 LOG_DEBUG(
"CanvasUsage",
"Registered usage tracker for canvas: %s",
402 const std::string& canvas_id) {
413 for (
const auto& [
id, tracker] :
trackers_) {
414 const auto& stats = tracker->GetCurrentStats();
425 if (stats.average_operation_time_ms >
438 std::ostringstream report;
440 report <<
"Global Canvas Usage Report\n";
441 report <<
"==========================\n\n";
443 report <<
"Registered Canvases: " <<
trackers_.size() <<
"\n\n";
445 for (
const auto& [
id, tracker] :
trackers_) {
446 report <<
"Canvas: " <<
id <<
"\n";
447 report <<
"----------------------------------------\n";
448 report << tracker->ExportUsageReport() <<
"\n\n";
453 report <<
"Global Summary:\n";
454 report <<
" Total Mouse Clicks: " << global_stats.mouse_clicks <<
"\n";
455 report <<
" Total Operations: " << global_stats.total_operations <<
"\n";
456 report <<
" Average Operation Time: " << std::fixed << std::setprecision(2)
457 << global_stats.average_operation_time_ms <<
" ms\n";
458 report <<
" Max Operation Time: " << std::fixed << std::setprecision(2)
459 << global_stats.max_operation_time_ms <<
" ms\n";
466 tracker->ClearHistory();
469 LOG_DEBUG(
"CanvasUsage",
"Cleared all canvas usage trackers");
Global canvas usage tracker manager.
std::unordered_map< std::string, std::shared_ptr< CanvasUsageTracker > > trackers_
static CanvasUsageManager & Get()
std::shared_ptr< CanvasUsageTracker > GetTracker(const std::string &canvas_id)
Get tracker for canvas.
std::string ExportGlobalReport() const
Export global usage report.
CanvasUsageStats GetGlobalStats() const
Get global usage statistics.
void ClearAllTrackers()
Clear all trackers.
void RegisterTracker(const std::string &canvas_id, std::shared_ptr< CanvasUsageTracker > tracker)
Register a canvas tracker.
void RecordOperation(const std::string &operation_name, double time_ms)
Record operation timing.
std::vector< std::string > GetUsageRecommendations() const
Get usage recommendations.
void SetUsageMode(CanvasUsage usage)
Set the current usage mode.
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.
std::string ExportUsageReport() const
Export usage report.
void ClearHistory()
Clear usage history.
std::chrono::steady_clock::time_point last_activity_
std::string FormatDuration(const std::chrono::milliseconds &duration) const
std::unordered_map< std::string, std::vector< double > > operation_times_
double CalculateAverageOperationTime(const std::string &operation_name) const
void RecordInteraction(CanvasInteraction interaction, const std::string &details="")
Record an interaction.
std::vector< std::pair< CanvasInteraction, std::string > > interaction_history_
void StartSession()
Start session.
std::chrono::steady_clock::time_point session_start_
ImVec4 GetUsageModeColor(CanvasUsage usage) const
Get usage mode color for UI.
std::string GetUsageModeName(CanvasUsage usage) const
Get usage mode name.
void EndSession()
End session.
void Initialize(const std::string &canvas_id)
Initialize the usage tracker.
std::vector< CanvasUsageStats > usage_history_
CanvasUsageStats current_stats_
#define LOG_DEBUG(category, format,...)
CanvasUsage
Canvas usage patterns and tracking.
CanvasInteraction
Canvas interaction types.
std::chrono::milliseconds total_time
double max_operation_time_ms
std::chrono::steady_clock::time_point session_start
double average_operation_time_ms
std::chrono::milliseconds idle_time
std::chrono::milliseconds active_time
bool enable_custom_labels