/** * Add a new message to the log */ void MenuHUDLog::add(const std::string& s, bool prevent_spam) { hide_overlay = false; // Make sure we don't spam the same message repeatedly if (log_msg.empty() || log_msg.back() != s || !prevent_spam) { // add new message log_msg.push_back(substituteVarsInString(s, pc)); msg_age.push_back(calcDuration(log_msg.back())); // render the log entry and store it in a buffer font->setFont("font_regular"); Point size = font->calc_size(log_msg.back(), window_area.w - (paragraph_spacing*2)); Image *graphics = render_device->createImage(size.x, size.y); font->renderShadowed(log_msg.back(), 0, 0, JUSTIFY_LEFT, graphics, window_area.w - (paragraph_spacing*2), color_normal); msg_buffer.push_back(graphics->createSprite()); graphics->unref(); } else if (!msg_age.empty()) { msg_age.back() = calcDuration(log_msg.back()); } // force HUD messages to vanish in order if (msg_age.size() > 1) { const size_t last = msg_age.size()-1; if (msg_age[last] < msg_age[last-1]) msg_age[last] = msg_age[last-1]; } }
void TimelineItem::updateDuration() const { if( mDirtyDuration ) { mDuration = std::max( calcDuration(), 0.0f ); mInvDuration = ( mDuration == 0 ) ? 1.0f : ( 1.0f / mDuration ); mDirtyDuration = false; } }
void LogManager::calcStatistic() { int len = events.size(); totaltime = GetTimeDifference(toSystemTime(events[0].timestamp),toSystemTime(events[len-1].timestamp)); EventProcess p(events[0].processName); p.from = 0; vector<LogEvent> keys; bool hasPushCtrl = false; for(int i=0; i<len-1; i++) { //LogEvent e = events[i]; events[i].duration = GetTimeDifference(toSystemTime(events[i].timestamp),toSystemTime(events[i+1].timestamp)); if(events[i].isHasAcc) { accui_events.push_back(i); string acc_name = events[i].acc.name; std::transform(acc_name.begin(), acc_name.end(), acc_name.begin(), ::tolower); int acc_index = acc_name.find("paste"); if(acc_index>=0 && events[i].acc.type == "menu item") { PasteEvent pe; pe.timestamp = events[i].timestamp; pe.windowName = events[i].windowName; pe.processName = events[i].processName; pe.parentWindowName = events[i].parentWindowName; pe.method = "Menu -> Paste"; paste_events.push_back(pe); } } if(events[i].isHasSrceenshot) { screenshot_events.push_back(i); } process_set.insert(events[i].processName); window_set.insert(events[i].windowName); //events_map[events[i].timestamp] = i; if(events[i].eventType == "keyinput") { if(hasPushCtrl) { keys.push_back(events[i]); if(events[i].name != "Ctrl" && events[i].name != "Shift" && events[i].name != "Alt") { hasPushCtrl = false; keyEvents.push_back(keys); string keystr = this->keysToString(keys); if(keystr == "Ctrl+V") { PasteEvent pe; pe.timestamp = keys[0].timestamp; pe.windowName = keys[0].windowName; pe.processName = keys[0].processName; pe.parentWindowName = keys[0].parentWindowName; pe.method = keystr; paste_events.push_back(pe); } keys = vector<LogEvent>(); } } else { if(events[i].name == "Ctrl") { hasPushCtrl = true; keys.push_back(events[i]); } else if(events[i].name.size()>1 && events[i].name.substr(0,1) == "F") { keys.push_back(events[i]); keyEvents.push_back(keys); keys = vector<LogEvent>(); } else { if(keys.size()>0) { keyEvents.push_back(keys); keys = vector<LogEvent>(); } } } } if(i>0) { if(events[i].processName != p.name) { p.to = i - 1; if(process_stat.find(p.name) != process_stat.end()) { process_stat[p.name] += calcDuration(p.from, p.to); } else { process_stat[p.name] = calcDuration(p.from, p.to); } processes.push_back(p); p = EventProcess(events[i].processName); p.from = i; } } } p.to = len - 1; processes.push_back(p); }