Icons for Radium and Shellplayer.
[AROS-Contrib.git] / MultiMedia / radium / common / cursor.c
blobb8f25343b1cf48de2a5ebeb7846ff61f96789391
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);
44 GFX_DrawCursorPos(
45 window,
47 wblock->a.x1,
48 GetCursorY1Pos(window,wblock),
49 wblock->a.x2,
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;
65 int update=0;
66 int x2;
68 if(window->curr_track>=0){
70 window->curr_track_sub++;
72 if(window->curr_track_sub>=wtrack->num_vel){
73 window->curr_track++;
74 if(NextWTrack(wtrack)==NULL){
75 window->curr_track--;
76 window->curr_track_sub--;
77 return 0;
78 }else{
79 window->curr_track_sub= -1;
80 wblock->wtrack=NextWTrack(wtrack);
84 while(
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;
96 wblock->left_track++;
98 leftwtrack=ListFindElement1(&wblock->wtracks->l,wblock->left_track);
99 if(
100 wblock->left_track==wblock->block->num_tracks-1 &&
101 wblock->left_subtrack==leftwtrack->num_vel-1
103 return 2;
105 UpdateAllWTracksCoordinates(window,wblock);
106 update=1;
108 for(;;){
109 rightwtrack=ListFindElement1(&wblock->wtracks->l,window->curr_track);
110 x2=GetXSubTrack2(rightwtrack,window->curr_track_sub);
111 if(x2>wblock->a.x2){
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);
120 update=1;
121 }else{
122 break;
126 }else{
127 window->curr_track++;
128 if(0==window->curr_track) window->curr_track_sub= -1;
130 if(update==1){
131 return 2;
132 }else{
133 return 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);
158 return 2;
159 }else{
160 return 1;
162 }else{
163 if(LPBTRACK==window->curr_track) return 0;
164 window->curr_track--;
165 return 1;
169 void TrackSelectUpdate(struct Tracker_Windows *window,struct WBlocks *wblock,int ret){
170 struct WTracks *wtrack2;
172 switch(ret){
173 case 0:
174 return;
175 case 1:
176 SetCursorPos(window);
177 break;
178 case 2:
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);
191 break;
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;
213 int ret=0,tempret;
215 while(curr_track==window->curr_track){
216 tempret=CursorRight(window,wblock);
217 ret=max(tempret,ret);
219 return ret;
224 int SetCursorPosConcrete(
225 struct Tracker_Windows *window,
226 struct WBlocks *wblock,
227 NInt tracknum,
228 int subtrack
230 struct WTracks *wtrack;
231 int ret=0,tempret;
233 if(tracknum>=wblock->block->num_tracks || tracknum<LPBTRACK) return 0;
235 if(tracknum<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);
243 }else{
244 while(window->curr_track!=tracknum){
245 tempret=CursorLeft(window,wblock);
246 ret=max(tempret,ret);
249 }else{
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);
261 }else{
262 while(window->curr_track!=tracknum || window->curr_track_sub!=subtrack){
263 tempret=CursorLeft(window,wblock);
264 ret=max(tempret,ret);
269 return ret;
272 void SetCursorPosConcrete_CurrPos(
273 struct Tracker_Windows *window,
274 NInt tracknum
276 struct WBlocks *wblock=window->wblock;
277 int ret;
279 if(tracknum>=wblock->block->num_tracks) return;
281 ret=SetCursorPosConcrete(
282 window,
283 wblock,
284 tracknum,
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;
295 int ret;
297 if(wtrack->l.next==NULL){
298 ret=SetCursorPosConcrete(window,wblock,0,-1);
299 }else{
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;
310 int ret;
312 if(curr_track==LPBTRACK){
313 ret=SetCursorPosConcrete(window,wblock,wblock->block->num_tracks-1,-1);
314 }else{
315 ret=SetCursorPosConcrete(window,wblock,curr_track-1,-1);
318 TrackSelectUpdate(window,wblock,ret);