1 /* Copyright 2000 Kjetil S. Matheussen
3 This program is free software; you can redistribute it and/or
4 modify it under the terms of the GNU General Public License
5 as published by the Free Software Foundation; either version 2
6 of the License, or (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20 #include "nsmtracker.h"
21 #include "visual_proc.h"
22 #include "common_proc.h"
23 #include "gfx_subtrack_proc.h"
24 #include "list_proc.h"
25 #include "windows_proc.h"
26 #include "wtracks_proc.h"
27 #include "gfx_wblocks_proc.h"
28 #include "gfx_wtracks_proc.h"
29 #include "sliders_proc.h"
30 #include "blts_proc.h"
31 #include "wblocks_proc.h"
32 #include "gfx_wtrackheaders_proc.h"
34 #include "cursor_proc.h"
37 void SetCursorPos(struct Tracker_Windows
*window
){
38 struct WBlocks
*wblock
=window
->wblock
;
39 // NInt track=window->curr_track;
40 // int subtrack=window->curr_track_sub;
42 Blt_markAll(window
,LINENUMBTRACK
,wblock
->right_track
,wblock
->curr_realline
,wblock
->curr_realline
);
48 GetCursorY1Pos(window,wblock),
50 GetCursorY2Pos(window,wblock),
52 GetXSubTrack_B1(wblock,track,subtrack),
53 GetCursorY1Pos(window,wblock),
54 GetXSubTrack_B2(wblock,track,subtrack),
55 GetCursorY2Pos(window,wblock)
61 int CursorRight(struct Tracker_Windows
*window
,struct WBlocks
*wblock
){
62 struct WTracks
*wtrack
=wblock
->wtrack
;
63 struct WTracks
*leftwtrack
;
64 struct WTracks
*rightwtrack
;
68 if(window
->curr_track
>=0){
70 window
->curr_track_sub
++;
72 if(window
->curr_track_sub
>=wtrack
->num_vel
){
74 if(NextWTrack(wtrack
)==NULL
){
76 window
->curr_track_sub
--;
79 window
->curr_track_sub
= -1;
80 wblock
->wtrack
=NextWTrack(wtrack
);
85 window
->curr_track
>wblock
->right_track
88 window
->curr_track
==wblock
->right_track
89 && window
->curr_track_sub
>wblock
->right_subtrack
92 leftwtrack
=ListFindElement1(&wblock
->wtracks
->l
,wblock
->left_track
);
93 wblock
->left_subtrack
++;
94 if(wblock
->left_subtrack
>=leftwtrack
->num_vel
){
95 wblock
->left_subtrack
= -1;
98 leftwtrack
=ListFindElement1(&wblock
->wtracks
->l
,wblock
->left_track
);
100 wblock
->left_track
==wblock
->block
->num_tracks
-1 &&
101 wblock
->left_subtrack
==leftwtrack
->num_vel
-1
105 UpdateAllWTracksCoordinates(window
,wblock
);
109 rightwtrack
=ListFindElement1(&wblock
->wtracks
->l
,window
->curr_track
);
110 x2
=GetXSubTrack2(rightwtrack
,window
->curr_track_sub
);
112 leftwtrack
=ListFindElement1(&wblock
->wtracks
->l
,wblock
->left_track
);
113 wblock
->left_subtrack
++;
114 if(wblock
->left_subtrack
>=leftwtrack
->num_vel
){
115 wblock
->left_subtrack
= -1;
116 wblock
->left_track
++;
118 leftwtrack
=ListFindElement1(&wblock
->wtracks
->l
,wblock
->left_track
);
119 UpdateAllWTracksCoordinates(window
,wblock
);
127 window
->curr_track
++;
128 if(0==window
->curr_track
) window
->curr_track_sub
= -1;
138 int CursorLeft(struct Tracker_Windows
*window
,struct WBlocks
*wblock
){
139 struct WTracks
*wtrack
=wblock
->wtrack
;
141 if(window
->curr_track
>0 || (0==window
->curr_track
&& window
->curr_track_sub
>=0)){
143 window
->curr_track_sub
--;
145 if(window
->curr_track_sub
==-2){
146 wblock
->wtrack
=ListFindElement1(&wblock
->wtracks
->l
,wtrack
->l
.num
-1);
147 window
->curr_track_sub
=wblock
->wtrack
->num_vel
-1;
148 window
->curr_track
--;
152 window
->curr_track
<wblock
->left_track
||
153 (window
->curr_track
==wblock
->left_track
&& window
->curr_track_sub
<wblock
->left_subtrack
)
155 wblock
->left_subtrack
=window
->curr_track_sub
;
156 wblock
->left_track
=window
->curr_track
;
157 UpdateAllWTracksCoordinates(window
,wblock
);
163 if(LPBTRACK
==window
->curr_track
) return 0;
164 window
->curr_track
--;
169 void TrackSelectUpdate(struct Tracker_Windows
*window
,struct WBlocks
*wblock
,int ret
){
170 struct WTracks
*wtrack2
;
176 SetCursorPos(window
);
179 UpdateWBlockCoordinates(window
,wblock
);
180 DrawUpAllWTracks(window
,wblock
);
181 DrawAllWTrackHeaders(window
,wblock
);
183 wtrack2
=ListLast1(&wblock
->wtracks
->l
);
184 if(wtrack2
->fxarea
.x2
<wblock
->a
.x2
){
185 GFX_P_FilledBox(window
,0,wtrack2
->fxarea
.x2
+2,wblock
->t
.y1
,wblock
->a
.x2
,wblock
->t
.y2
);
186 GFX_FilledBox(window
,0,wtrack2
->fxarea
.x2
+2,0,wblock
->a
.x2
,wblock
->t
.y1
);
189 DrawBottomSlider(window
);
190 // DrawUpTrackerWindow(window);
193 (*wblock
->wtrack
->track
->instrument
->PP_Update
)(
194 wblock
->wtrack
->track
->instrument
,
195 wblock
->wtrack
->track
->patch
199 void CursorRight_CurrPos(struct Tracker_Windows
*window
){
200 struct WBlocks
*wblock
=window
->wblock
;
201 TrackSelectUpdate(window
,wblock
,CursorRight(window
,wblock
));
206 void CursorLeft_CurrPos(struct Tracker_Windows
*window
){
207 struct WBlocks
*wblock
=window
->wblock
;
208 TrackSelectUpdate(window
,wblock
,CursorLeft(window
,wblock
));
211 int CursorNextTrack(struct Tracker_Windows
*window
,struct WBlocks
*wblock
){
212 int curr_track
=window
->curr_track
;
215 while(curr_track
==window
->curr_track
){
216 tempret
=CursorRight(window
,wblock
);
217 ret
=max(tempret
,ret
);
224 int SetCursorPosConcrete(
225 struct Tracker_Windows
*window
,
226 struct WBlocks
*wblock
,
230 struct WTracks
*wtrack
;
233 if(tracknum
>=wblock
->block
->num_tracks
|| tracknum
<LPBTRACK
) return 0;
236 if(tracknum
==window
->curr_track
) return 0;
238 if(tracknum
>window
->curr_track
){
239 while(window
->curr_track
!=tracknum
){
240 tempret
=CursorRight(window
,wblock
);
241 ret
=max(tempret
,ret
);
244 while(window
->curr_track
!=tracknum
){
245 tempret
=CursorLeft(window
,wblock
);
246 ret
=max(tempret
,ret
);
250 wtrack
=ListFindElement1(&wblock
->wtracks
->l
,tracknum
);
252 subtrack
=min(wtrack
->num_vel
-1,subtrack
);
254 if(tracknum
==window
->curr_track
&& subtrack
==window
->curr_track_sub
) return 0;
256 if(tracknum
>window
->curr_track
|| (tracknum
==window
->curr_track
&& subtrack
>window
->curr_track_sub
)){
257 while(window
->curr_track
!=tracknum
|| window
->curr_track_sub
!=subtrack
){
258 tempret
=CursorRight(window
,wblock
);
259 ret
=max(tempret
,ret
);
262 while(window
->curr_track
!=tracknum
|| window
->curr_track_sub
!=subtrack
){
263 tempret
=CursorLeft(window
,wblock
);
264 ret
=max(tempret
,ret
);
272 void SetCursorPosConcrete_CurrPos(
273 struct Tracker_Windows
*window
,
276 struct WBlocks
*wblock
=window
->wblock
;
279 if(tracknum
>=wblock
->block
->num_tracks
) return;
281 ret
=SetCursorPosConcrete(
288 TrackSelectUpdate(window
,wblock
,ret
);
292 void CursorNextTrack_CurrPos(struct Tracker_Windows
*window
){
293 struct WBlocks
*wblock
=window
->wblock
;
294 struct WTracks
*wtrack
=wblock
->wtrack
;
297 if(wtrack
->l
.next
==NULL
){
298 ret
=SetCursorPosConcrete(window
,wblock
,0,-1);
300 ret
=CursorNextTrack(window
,wblock
);
303 TrackSelectUpdate(window
,wblock
,ret
);
307 void CursorPrevTrack_CurrPos(struct Tracker_Windows
*window
){
308 struct WBlocks
*wblock
=window
->wblock
;
309 NInt curr_track
=window
->curr_track
;
312 if(curr_track
==LPBTRACK
){
313 ret
=SetCursorPosConcrete(window
,wblock
,wblock
->block
->num_tracks
-1,-1);
315 ret
=SetCursorPosConcrete(window
,wblock
,curr_track
-1,-1);
318 TrackSelectUpdate(window
,wblock
,ret
);