/* ----- set focus to the next sibling ----- */ void SetNextFocus() { if (inFocus != NULL) { WINDOW wnd1 = inFocus, pwnd; while (TRUE) { pwnd = GetParent(wnd1); if (NextWindow(wnd1) != NULL) wnd1 = NextWindow(wnd1); else if (pwnd != NULL) wnd1 = FirstWindow(pwnd); if (wnd1 == NULL || wnd1 == inFocus) { wnd1 = pwnd; break; } if (GetClass(wnd1) == STATUSBAR || GetClass(wnd1) == MENUBAR || GetClass(wnd1) == TABBAR) continue; if (isVisible(wnd1)) break; } if (wnd1 != NULL) { while (wnd1->childfocus != NULL) wnd1 = wnd1->childfocus; if (wnd1->condition != ISCLOSING) SendMessage(wnd1, SETFOCUS, TRUE, 0); } } }
void Block_Properties( struct Blocks *block, NInt num_tracks, int num_lines ){ if(num_tracks!=block->num_tracks){ struct Tracker_Windows *window=root->song->tracker_windows; while(window!=NULL){ struct WBlocks *wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,block->l.num); SetCursorPosConcrete(window,wblock,0,-1); window=NextWindow(window); } Block_Set_num_tracks(block,num_tracks); } if(num_lines!=block->num_lines){ Block_Set_num_lines(block,num_lines); } struct Tracker_Windows *window=root->song->tracker_windows; while(window!=NULL){ struct WBlocks *wblock=ListFindElement1(&window->wblocks->l,block->l.num); if(wblock->curr_realline>=wblock->num_reallines){ wblock->curr_realline = wblock->num_reallines-1; } UpdateReallinesDependens(window,wblock); window=NextWindow(window); } }
/* ---- append a window to the linked list ---- */ void AppendWindow(WINDOW wnd) { if (wnd != NULL) { WINDOW pwnd = GetParent(wnd); if (pwnd != NULL) { if (FirstWindow(pwnd) == NULL) FirstWindow(pwnd) = wnd; if (LastWindow(pwnd) != NULL) NextWindow(LastWindow(pwnd)) = wnd; PrevWindow(wnd) = LastWindow(pwnd); LastWindow(pwnd) = wnd; } NextWindow(wnd) = NULL; } }
/* ---- remove a window from the linked list ---- */ void RemoveWindow(WINDOW wnd) { if (wnd != NULL) { WINDOW pwnd = GetParent(wnd); if (PrevWindow(wnd) != NULL) NextWindow(PrevWindow(wnd)) = NextWindow(wnd); if (NextWindow(wnd) != NULL) PrevWindow(NextWindow(wnd)) = PrevWindow(wnd); if (pwnd != NULL) { if (wnd == FirstWindow(pwnd)) FirstWindow(pwnd) = NextWindow(wnd); if (wnd == LastWindow(pwnd)) LastWindow(pwnd) = PrevWindow(wnd); } } }
struct Blocks *InsertBlock( NInt blockpos, NInt num_tracks, int num_lines, const char *name ) { R_ASSERT(is_playing()==false); struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock; struct Blocks *block; InsertBlock_IncBlockNums(blockpos); block=talloc(sizeof(struct Blocks)); block->l.num=blockpos; NewBlock(block,num_tracks,num_lines,name); while(window!=NULL){ wblock=talloc(sizeof(struct WBlocks)); wblock->l.num=blockpos; NewWBlock(window,wblock,block); window=NextWindow(window); } return block; }
void Block_Set_num_tracks( struct Blocks *block, NInt num_tracks ){ struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock; NInt org_num_tracks=block->num_tracks; NInt lokke; if(num_tracks==0){ RError("Error in function 'Block_Set_num_tracks' in file 'block_properties.c'. num_tracks=0.\n"); return; } if(num_tracks==org_num_tracks) return; block->num_tracks=num_tracks; if(num_tracks<org_num_tracks){ CutListAt1(&block->tracks,num_tracks); while(window!=NULL){ wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,block->l.num); CutListAt1(&wblock->wtracks,num_tracks); window=NextWindow(window); } }else{ for(lokke=org_num_tracks;lokke<num_tracks;lokke++){ AppendTrack(block); } window=root->song->tracker_windows; while(window!=NULL){ wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,block->l.num); UpdateWTracks(window,wblock); window=NextWindow(window); } } }
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); } }
void checkIfWBlocksAreDirty(void) { bool is_dirty = false; struct Blocks *block=root->song->blocks; while(block!=NULL){ if (block->is_dirty==true){ handleDirtyBlock(block->l.num); block->is_dirty = false; is_dirty = true; } block = NextBlock(block); } if(is_dirty==true){ struct Tracker_Windows *window=root->song->tracker_windows; while(window!=NULL){ //DrawUpTrackerWindow(window); window->must_redraw = true; window=NextWindow(window); } } }
static void handleDirtyBlock(int blocknum){ struct Tracker_Windows *window = root->song->tracker_windows; while(window!=NULL){ struct WBlocks *wblock=ListFindElement1(&window->wblocks->l,blocknum); UpdateAllWTracksCoordinates(window,wblock); UpdateAndClearSomeTrackReallinesAndGfxWTracks( window, wblock, 0, window->wblock->block->num_tracks-1 ); if(wblock->curr_realline>=wblock->num_reallines){ wblock->curr_realline=wblock->num_reallines-1; } UpdateReallinesDependens(window,wblock); window=NextWindow(window); } }
void InsertBlock_IncBlockNums( NInt blockpos ){ struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock; struct Blocks *block=ListFindElement1_r0(&root->song->blocks->l,blockpos); while(block!=NULL){ block->l.num++; block=NextBlock(block); } root->song->num_blocks++; g_editor_blocks_generation++; while(window!=NULL){ wblock=ListFindElement1_r0(&window->wblocks->l,blockpos); while(wblock!=NULL){ wblock->l.num++; wblock=NextWBlock(wblock); } window=NextWindow(window); } }
void DeleteBlock( NInt blockpos ){ struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock; struct Blocks *removed_block=ListFindElement1(&root->song->blocks->l,blockpos); struct Blocks *nextblock=NextBlock(removed_block); ListRemoveElement1(&root->song->blocks,&removed_block->l); { struct Blocks *block = nextblock; while(block!=NULL){ block->l.num--; block=NextBlock(block); } } root->song->num_blocks--; while(window!=NULL){ wblock=ListFindElement1(&window->wblocks->l,blockpos); ListRemoveElement1( &window->wblocks, &wblock->l ); wblock=NextWBlock(wblock); while(wblock!=NULL){ wblock->l.num--; wblock=NextWBlock(wblock); } window=NextWindow(window); } // Call BL_removeBlockFromPlaylist after blocklist is updated. BL_removeBlockFromPlaylist(removed_block); }
void InsertLines_CurrPos( struct Tracker_Windows *window, int toinsert ){ struct WBlocks *wblock=window->wblock; int curr_realline=wblock->curr_realline; int curr_line=wblock->reallines[curr_realline]->Tline; int num_lines=wblock->block->num_lines; if(toinsert==0) toinsert=GFX_GetInteger(window,NULL,"Number of lines to insert\n(number can be negative): ",-(num_lines-curr_line),10000); if(toinsert==-(num_lines-curr_line)-1) return; ADD_UNDO(Block_CurrPos(window)); InsertLines(window->wblock->block,curr_line,toinsert); 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); }
void Block_Set_num_lines( struct Blocks *block, int num_lines ){ Place lastplace1,lastplace; struct Tracker_Windows *window=root->song->tracker_windows; struct WBlocks *wblock; struct LocalZooms *localzoom; struct Tracks *track=block->tracks; struct Notes *note; struct FXs *fxs; int org_num_lines=block->num_lines; int lokke; if(org_num_lines==num_lines || num_lines<2) return; PlaceSetLastPos(block,&lastplace1); block->num_lines=num_lines; PlaceSetLastPos(block,&lastplace); if(num_lines<org_num_lines){ CutListAt_a(&block->lpbs,&lastplace); CutListAt_a(&block->tempos,&lastplace); CutListAt_a(&block->temponodes,&lastplace); PlaceSetLastPos(block,&block->lasttemponode->l.p); ListAddElement3(&block->temponodes,&block->lasttemponode->l); while(track!=NULL){ CutListAt_a(&track->notes,&lastplace); note=track->notes; while(note!=NULL){ CutListAt(¬e->velocities,&lastplace); CutListAt(¬e->pitches,&lastplace); if(PlaceEqual(¬e->end,&lastplace1) && note->noend==1){ PlaceCopy(¬e->end,&lastplace); } note=NextNote(note); } LegalizeNotes(block,track); CutListAt_a(&track->stops,&lastplace); fxs=track->fxs; while(fxs!=NULL){ CutListAt_a(&fxs->fxnodelines,&lastplace); fxs=NextFX(fxs); } LegalizeFXlines(block,track); track=NextTrack(track); } while(window!=NULL){ wblock=ListFindElement1(&window->wblocks->l,block->l.num); CutListAt_a(&wblock->localzooms,&lastplace); window=NextWindow(window); } }else{ PlaceSetLastPos(block,&block->lasttemponode->l.p); while(track!=NULL){ note=track->notes; while(note!=NULL){ if(PlaceEqual(¬e->end,&lastplace1) && note->noend==1){ PlaceSetLastPos(block,¬e->end); } note=NextNote(note); } LegalizeNotes(block,track); track=NextTrack(track); } while(window!=NULL){ wblock=ListFindElement1(&window->wblocks->l,block->l.num); for(lokke=org_num_lines;lokke<num_lines;lokke++){ localzoom=talloc(sizeof(struct LocalZooms)); localzoom->Tline=lokke; localzoom->Tdividor=1; localzoom->zoomline=lokke; ListAddElement3(&wblock->localzooms,&localzoom->l); } window=NextWindow(window); } } window=root->song->tracker_windows; while(window!=NULL){ wblock=ListFindElement1(&window->wblocks->l,block->l.num); UpdateWBlockWidths(window,wblock); UpdateRealLines(window,wblock); window=NextWindow(window); } UpdateSTimes(block); UpdateBeats(block); }
STime time = to_time - from_time; STime time_necessary_to_scroll = pc->pfreq / scrolls_per_second; if(time>=time_necessary_to_scroll) do_scrolling = true; } if(do_scrolling==true) { ScrollEditorToRealLine(window,wblock,till_curr_realline); last_time = ATOMIC_GET(pc->therealtime); last_wblock = wblock; } } #endif }); } window=NextWindow(window); } ATOMIC_SET(root->setfirstpos, false); } void (*Ptask2MtaskCallBack)(void)= &P2MUpdateSongPosCallBack; #endif