void Undo_Block( struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline ){ static struct WBlocks *last_wblock; static struct WTracks *last_wtrack; static int last_realline; static double last_undo_block_time = -1000; double time_now = TIME_get_ms(); //printf("last: %d, now: %d, diff: %d\n",(int)last_undo_block_time,(int)time_now,(int)(time_now-last_undo_block_time)); if( (time_now-last_undo_block_time) > 1000*3 // more than 3 seconds. || wblock!=last_wblock || wtrack!=last_wtrack || realline!=last_realline || Undo_get_last_function()!=Undo_Do_Block) Undo_Add( window->l.num, wblock->l.num, wtrack->l.num, realline, CB_CopyBlock(wblock), Undo_Do_Block ); last_undo_block_time = time_now; last_wblock=wblock; last_wtrack=wtrack; last_realline=realline; }
void ADD_UNDO_FUNC(Playlist(void)){ struct Tracker_Windows *window = root->song->tracker_windows; Undo_Add( window->l.num, window->wblock->l.num, window->curr_track, window->wblock->curr_realline, BL_copy(), Undo_Do_Playlist, "Playlist" ); }
void ADD_UNDO_FUNC(Sequencer(void)){ struct Tracker_Windows *window = root->song->tracker_windows; Undo_Add( window->l.num, window->wblock->l.num, window->curr_track, window->wblock->curr_realline, SEQUENCER_get_state(), Undo_Do_Sequencer, "Sequencer" ); }
void Undo_Tempos( struct Tracker_Windows *window, struct Blocks *block, NInt tracknum, int realline ){ Undo_Add( window->l.num, block->l.num, tracknum, realline, CB_CopyTempos(block->tempos), Undo_Do_Tempos ); }
void Undo_Signatures( struct Tracker_Windows *window, struct Blocks *block, NInt tracknum, int realline ){ Undo_Add( window->l.num, block->l.num, tracknum, realline, CB_CopySignatures(block->signatures), Undo_Do_Signatures ); }
static void Undo_Mixer( struct Tracker_Windows *window, struct WBlocks *wblock ){ //struct Undo_Mixer *u_rt=talloc(sizeof(struct Undo_Mixer)); //u_rt->reltempomax=wblock->reltempomax; Undo_Add( window->l.num, wblock->l.num, wblock->wtrack->l.num, wblock->curr_realline, MW_get_state(), Undo_Do_Mixer ); }
void Undo_Block_Split_CurrPos(void){ struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock=window->wblock; struct Undo_Block_MergeSplit *ubm=talloc(sizeof(struct Undo_Block_MergeSplit)); ubm->wblock=CB_CopyBlock(wblock); ubm->blockpos=wblock->l.num; Undo_Add( window->l.num, wblock->l.num, window->curr_track, wblock->curr_realline, ubm, Undo_Do_Block_Split ); }
void ADD_UNDO_FUNC(Block_Delete(NInt blockpos)){ struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock=window->wblock; struct Undo_Block_InsertDelete *ubi=talloc(sizeof(struct Undo_Block_InsertDelete)); ubi->blockpos=blockpos; ubi->wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,blockpos); ubi->sequencer_state=SEQUENCER_get_state(); Undo_Add( window->l.num, wblock->l.num, window->curr_track, wblock->curr_realline, ubi, Undo_Do_Block_Delete, "Block delete" ); }
void Undo_Block_Delete( NInt blockpos ){ struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock=window->wblock; struct Undo_Block_InsertDelete *ubi=talloc(sizeof(struct Undo_Block_InsertDelete)); ubi->blockpos=blockpos; ubi->wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,blockpos); ubi->playlist=BL_copy(); Undo_Add( window->l.num, wblock->l.num, window->curr_track, wblock->curr_realline, ubi, Undo_Do_Block_Delete ); }
void Undo_Range( struct Tracker_Windows *window, struct Blocks *block, NInt starttrack, NInt endtrack, int realline ){ Place *p1=PlaceGetFirstPos(); Place p2; struct Range *undo_range; NInt num_tracks; NInt lokke; struct Tracks *track; NInt num_tracks_in_block=block->num_tracks; if(endtrack>=num_tracks_in_block){ num_tracks=num_tracks_in_block-1; }else{ num_tracks=endtrack-starttrack+1; } undo_range=talloc(sizeof(struct Range)); undo_range->notes=talloc((size_t)(sizeof(struct Notes *)*num_tracks)); undo_range->stops=talloc((size_t)(sizeof(struct Stops *)*num_tracks)); undo_range->num_tracks=num_tracks; PlaceSetLastPos(block,&p2); for(lokke=0;lokke<num_tracks;lokke++){ track=ListFindElement1(&block->tracks->l,lokke+starttrack); CopyRange_stops(&undo_range->stops[lokke],track->stops,p1,&p2); CopyRange_notes(&undo_range->notes[lokke],track->notes,p1,&p2); } Undo_Add(window->l.num,block->l.num,starttrack,realline, undo_range,Undo_Do_Range, "Range", LOC() ); }
void Undo_Notes( struct Tracker_Windows *window, struct Blocks *block, struct Tracks *track, int realline ){ Place *p1=PlaceGetFirstPos(); Place p2; struct Undo_Notes *undo_notes=talloc(sizeof(struct Undo_Notes)); PlaceSetLastPos(block,&p2); CopyRange_stops(&undo_notes->stops,track->stops,p1,&p2); CopyRange_notes(&undo_notes->notes,track->notes,p1,&p2); Undo_Add( window->l.num, block->l.num, track->l.num, realline, undo_notes, Undo_Do_Notes); }
void ADD_UNDO_FUNC( MainTempo( struct Tracker_Windows *window, struct WBlocks *wblock ) ) { struct Undo_MainTempo *u_rt=talloc_atomic(sizeof(struct Undo_MainTempo)); u_rt->tempo=root->tempo; u_rt->lpb=root->lpb; u_rt->signature=root->signature; u_rt->quantitize_options = root->quantitize_options; Undo_Add( window->l.num, wblock->l.num, wblock->wtrack->l.num, wblock->curr_realline, u_rt, Undo_Do_MainTempo, "Block tempo/lpb/signature/quantiatize settings" ); }