void Gource::updateUsers(float t, float dt) { std::vector<RUser*> inactiveUsers; int idle_users = 0; //recalc the user bounds user_bounds.reset(); // move users for(std::map<std::string,RUser*>::iterator it = users.begin(); it!=users.end(); it++) { RUser* u = it->second; u->logic(t, dt); //deselect user if fading out from inactivity if(u->isFading() && selectedUser == u) { selectUser(0); } if(u->isInactive()) { inactiveUsers.push_back(u); } if(u->isIdle()) { idle_users++; } else { user_bounds.update(u->getPos()); //if nothing is selected, and this user is active and this user is the specified user to follow, select them if(selectedUser == 0 && selectedFile == 0) { for(std::vector<std::string>::iterator ui = follow_users.begin(); ui != follow_users.end(); ui++) { std::string follow = *ui; if(follow.size() && u->getName() == follow) { selectUser(u); } } } } } //nothing is moving so increment idle if(idle_users==users.size()) { idle_time += dt; //if stop_on_idle is set and either no stop condition is set or the condition has been reached, exit if(stop_on_idle && (stop_position == 0.0f && !stop_at_end || stop_position_reached)) appFinished = true; } else { idle_time = 0; } // delete inactive users for(std::vector<RUser*>::iterator it = inactiveUsers.begin(); it != inactiveUsers.end(); it++) { deleteUser(*it); } }
void Gource::updateUsers(float t, float dt) { std::vector<RUser*> inactiveUsers; int idle_users = 0; //recalc the user bounds user_bounds.reset(); // move users for(std::map<std::string,RUser*>::iterator it = users.begin(); it!=users.end(); it++) { RUser* u = it->second; u->logic(t, dt); //deselect user if fading out from inactivity if(u->isFading() && selectedUser == u) { selectUser(0); } if(u->isInactive()) { inactiveUsers.push_back(u); } if(u->isIdle()) { idle_users++; } else { user_bounds.update(u->getPos()); //if nothing is selected, and this user is active and this user is the specified user to follow, select them if(selectedUser == 0 && selectedFile == 0) { for(std::vector<std::string>::iterator ui = follow_users.begin(); ui != follow_users.end(); ui++) { std::string follow = *ui; if(follow.size() && u->getName() == follow) { selectUser(u); } } } } } //nothing is moving so increment idle if(idle_users==static_cast<int>(users.size())) { idle_time += dt; } else { idle_time = 0.0f; } // delete inactive users for(std::vector<RUser*>::iterator it = inactiveUsers.begin(); it != inactiveUsers.end(); it++) { deleteUser(*it); } }
void Gource::processCommit(RCommit& commit, float t) { //find user of this commit or create them RUser* user = 0; //see if user already exists but if not wait until //we actually use one of their files before adding them std::map<std::string, RUser*>::iterator seen_user = users.find(commit.username); if(seen_user != users.end()) user = seen_user->second; //find files of this commit or create it for(std::list<RCommitFile>::iterator it = commit.files.begin(); it != commit.files.end(); it++) { RCommitFile& cf = *it; bool filtered_filename = false; //check filename against filters for(std::vector<Regex*>::iterator ri = filters.begin(); ri != filters.end(); ri++) { Regex* r = *ri; if(r->match(cf.filename)) { filtered_filename = true; break; } } if(filtered_filename) continue; std::map<std::string, RFile*>::iterator seen_file; seen_file = files.find(cf.filename); RFile* file = 0; if(seen_file != files.end()) { file = seen_file->second; } else { //if we already have max files in circulation //we cant add any more if(files.size() >= gGourceMaxFiles) continue; int tagid = tag_seq++; file = new RFile(cf.filename, cf.colour, vec2f(0.0,0.0), tagid); files[cf.filename] = file; tagfilemap[tagid] = file; root->addFile(file); while(root->getParent() != 0) { debugLog("parent changed to %s\n", root->getPath().c_str()); root = root->getParent(); } } //create user if havent yet. do it here to ensure at least one of there files //was added (incase we hit gGourceMaxFiles!) if(user == 0) { vec2f pos; if(dir_bounds.area() > 0) { pos = dir_bounds.centre(); } else { pos = vec2f(0,0); } int tagid = tag_seq++; user = new RUser(commit.username, pos, tagid); users[commit.username] = user; tagusermap[tagid] = user; if(gGourceHighlightAllUsers) { user->setHighlighted(true); } else { // set the highlighted flag if name matches a highlighted user for(std::vector<std::string>::iterator hi = highlight_users.begin(); hi != highlight_users.end(); hi++) { std::string highlight = *hi; if(highlight.size() && user->getName() == highlight) { user->setHighlighted(true); break; } } } debugLog("added user %s, tagid = %d\n", commit.username.c_str(), tagid); } //create action RAction* action = 0; int commitNo = commit_seq++; if(cf.action == "D") { action = new RemoveAction(user, file, t); } else { if(cf.action == "A") { action = new CreateAction(user, file, t); } else { action = new ModifyAction(user, file, t); } } user->addAction(action); } }