add progress callback