void Block_Properties_CurrPos( struct Tracker_Windows *window ){ NInt num_tracks; int num_lines; char seltext[500]; char *blockname; ReqType reqtype; struct WBlocks *wblock=window->wblock; struct Blocks *block=wblock->block; PlayStop(); reqtype=GFX_OpenReq(window,33,5,"Block Properties"); sprintf(seltext,"Number of tracks (now %d): ",wblock->block->num_tracks); num_tracks=GFX_GetInteger(window,reqtype,seltext,2,200); if(num_tracks==1) num_tracks=wblock->block->num_tracks; sprintf(seltext,"Number of lines (now %d): ",wblock->block->num_lines); num_lines=GFX_GetInteger(window,reqtype,seltext,2,2000); if(num_lines==1) num_lines=wblock->block->num_lines; sprintf(seltext,"Name (now: '%s'): ",wblock->block->name); blockname=GFX_GetString(window,reqtype,seltext); if(blockname!=NULL){ wblock->block->name=blockname; BS_UpdateBlockList(); BS_UpdatePlayList(); } GFX_CloseReq(window,reqtype); if(num_tracks==wblock->block->num_tracks && num_lines==wblock->block->num_lines){ return; } Undo_Block_CurrPos(window); Block_Properties(block,num_tracks,num_lines); window=root->song->tracker_windows; while(window!=NULL){ window->must_redraw = true; window=NextWindow(window); } }
/* Argh. This one was difficult, I don`t think it works correctly in all situations yet either. */ void InsertLines( struct Blocks *block, int line, int toinsert ){ int lokke; struct LocalZooms *localzoom; struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock; struct Tracks *track=block->tracks; int num_lines=block->num_lines; if(line>num_lines+toinsert){ toinsert=line-num_lines; } if (line==num_lines-1) { // special case Block_Properties(block, block->num_tracks, block->num_lines + toinsert); return; } if( line<0 || line>=num_lines) return; if(toinsert==0 || num_lines+toinsert<2 || num_lines+toinsert>=MAX_UINT32) return; PC_Pause();{ blocktobelongtoforinsertlines_notes_a_terrible_hack=block; block->num_lines=num_lines+toinsert; List_InsertLines3(&block->temponodes,block->temponodes->l.next,line,toinsert,NULL); LegalizeTempoNodes(block); List_InsertLines3(&block->signatures,&block->signatures->l,line,toinsert,NULL); List_InsertLines3(&block->lpbs,&block->lpbs->l,line,toinsert,NULL); List_InsertLines3(&block->tempos,&block->tempos->l,line,toinsert,NULL); UpdateSTimes(block); UpdateBeats(block); while(track!=NULL){ List_InsertLines3(&track->notes,&track->notes->l,line,toinsert,InsertLines_notes); LegalizeNotes(block,track); List_InsertLines3(&track->stops,&track->stops->l,line,toinsert,NULL); VECTOR_FOR_EACH(struct FXs *fxs, &track->fxs){ List_InsertLines3(&fxs->fxnodelines,&fxs->fxnodelines->l,line,toinsert,NULL); }END_VECTOR_FOR_EACH; LegalizeFXlines(block,track); track=NextTrack(track); } while(window!=NULL){ wblock=ListFindElement1(&window->wblocks->l,block->l.num); List_InsertLines3( &wblock->localzooms, &wblock->localzooms->l, line, toinsert, InsertLines_localzooms // NULL ); for(lokke=line;lokke<line+toinsert;lokke++){ localzoom=talloc(sizeof(struct LocalZooms)); localzoom->Tline=lokke; localzoom->Tdividor=1; localzoom->zoomline=lokke; ListAddElement3(&wblock->localzooms,&localzoom->l); } UpdateWBlockWidths(window,wblock); wblock->reallines = NULL; // We changed the localzooms, which is used to set new curr_realline. We don't need to set new curr_realline, so just set reallines to NULL. UpdateRealLines(window,wblock); UpdateReallinesDependens(window,wblock); if(wblock->curr_realline>=wblock->num_reallines){ wblock->curr_realline=wblock->num_reallines-1; } window=NextWindow(window); } blocktobelongtoforinsertlines_notes_a_terrible_hack=NULL; }PC_StopPause(window); }