Icons for Radium and Shellplayer.
[AROS-Contrib.git] / MultiMedia / radium / common / mouse_temponodes.c
blobdcaf75b995cd18cb81ee5673f5f75d1cf70c69da
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. */
18 #include "nsmtracker.h"
19 #include "common_proc.h"
20 #include "area_proc.h"
21 #include "placement_proc.h"
22 #include "temponodes_proc.h"
23 #include "gfx_wblocks_proc.h"
24 #include "list_proc.h"
25 #include "time_proc.h"
26 #include "reltempo_proc.h"
27 #include "undo_temponodes_proc.h"
28 #include "gfx_window_title_proc.h"
29 #include "player_proc.h"
30 #include "blts_proc.h"
31 #include "realline_calc_proc.h"
32 #include "visual_proc.h"
33 #include "wblocks_proc.h"
35 #include "mouse_temponodes_proc.h"
39 int MoveTempoNode_Mouse(
40 struct Tracker_Windows *window,
41 int x,int y
43 struct WBlocks *wblock=window->wblock;
44 struct MouseAction *action= &window->prevaction;
45 struct TempoNodes *temponode=(struct TempoNodes *)action->pointer1;
46 struct TempoNodes *prev;
47 Place place,*prev_vel=NULL,*next_vel=NULL;
48 int realline;
49 int lx,dx;
50 int lokke;
52 int start_realline,end_realline;
54 PlayStop();
56 lx=max(wblock->temponodearea.x+1,x);
57 lx=min(wblock->temponodearea.x2,lx);
59 dx=lx - wblock->temponodearea.x -1;
61 if(
62 temponode==wblock->block->temponodes ||
63 temponode==wblock->block->lasttemponode
65 temponode->reltempo=Gfx2RelTempo(wblock,dx);
66 GFX_SetChangeFloat(window,wblock,"Reltempo",RelTempo2RealRelTempo(temponode->reltempo));
67 if(temponode==wblock->block->temponodes){
68 prev_vel=&temponode->l.p;
69 next_vel=&(NextTempoNode(temponode)->l.p);
70 }else{
71 prev_vel=&((struct ListHeader3 *)
72 (ListPrevElement3(&wblock->block->temponodes->l,&wblock->block->lasttemponode->l)
73 ))->p;
74 next_vel=&temponode->l.p;
76 }else{
77 prev=ListPrevElement3(&wblock->block->temponodes->l,&temponode->l);
78 prev_vel=&prev->l.p;
79 next_vel=&(NextTempoNode(temponode)->l.p);
80 realline=GetReallineAndPlaceFromY(
81 window,wblock,y,&place,prev_vel,
82 next_vel
85 if(
86 realline< -(window->fontheight*2) ||
87 x>wblock->temponodearea.x2+(window->fontheight*2) ||
88 x<wblock->temponodearea.x-(window->fontheight*2)
90 ListRemoveElement3(&window->wblock->block->temponodes->l,&temponode->l);
91 action->action=NOACTION;
92 }else{
93 PlaceCopy(&temponode->l.p,&place);
94 temponode->reltempo=Gfx2RelTempo(wblock,dx);
95 GFX_SetChangeFloat(window,wblock,"Reltempo",RelTempo2RealRelTempo(temponode->reltempo));
99 UpdateWTempoNodes(window,wblock);
101 start_realline=FindRealLineFor(wblock,0,prev_vel);
102 end_realline=FindRealLineFor(wblock,start_realline,next_vel);
104 WBlock_legalizeStartEndReallines(wblock,&start_realline,&end_realline);
106 // printf("start: %d,end: %d\n",start_realline,end_realline);
108 for(lokke=start_realline;lokke<=end_realline;lokke++){
109 GFX_P_FilledBox(
110 window,0,
111 wblock->temponodearea.x,
112 GetReallineY1Pos(window,wblock,lokke),
113 wblock->temponodearea.x2,
114 GetReallineY2Pos(window,wblock,lokke)
118 DrawWTempoNodes(window,wblock,start_realline,end_realline);
120 // DrawUpWTempoNodes(window,wblock);
121 UpdateSTimes(wblock->block);
123 GFX_DrawWindowTitle(window,wblock);
125 return 0;
128 extern char firstringinwindowtitle[32];
130 void SetMouseActionTempoNodes(
131 struct Tracker_Windows *window,
132 struct MouseAction *action,
133 int x,int y, int click
135 WTempoNodes *wtemponode;
136 struct WBlocks *wblock=window->wblock;
137 Place place;
138 int realline;
140 int dx;
142 realline=GetReallineAndPlaceFromY(window,wblock,y,&place,NULL,NULL);
144 x=max(wblock->temponodearea.x+1,x);
145 x=min(wblock->temponodearea.x2-1,x);
147 dx=x - wblock->temponodearea.x -1;
149 if(realline<0) return;
151 wtemponode=wblock->wtemponodes[realline];
153 while(wtemponode!=NULL){
154 if(wtemponode->type==TEMPONODE_NODE){
156 insideNArea(
157 x,y,
158 wblock->temponodearea.x,Common_oldGetReallineY1Pos(window,wblock,realline),
159 wtemponode->x1,wtemponode->y1,
160 wtemponode->x2,wtemponode->y2
163 if(1==click) Undo_TempoNodes_CurrPos(window);
164 action->action=TEMPONODE;
165 action->MouseUpFunction= &MoveTempoNode_Mouse;
166 action->pointer1=wtemponode->pointer;
167 GFX_SetChangeFloat(window,wblock,"Reltempo",RelTempo2RealRelTempo(((struct TempoNodes *)wtemponode->pointer)->reltempo));
168 GFX_DrawWindowTitle(window,wblock);
169 return;
172 wtemponode=wtemponode->next;
175 if(firstringinwindowtitle[0]!=0){
176 firstringinwindowtitle[0]=0;
177 GFX_DrawWindowTitle(window,window->wblock);
180 if(1==click){
181 PlayStop();
182 Undo_TempoNodes_CurrPos(window);
183 AddTempoNode(window,wblock,&place,Gfx2RelTempo(wblock,dx));
184 GFX_SetChangeFloat(window,wblock,"Reltempo",RelTempo2RealRelTempo(Gfx2RelTempo(wblock,dx)));
185 UpdateWTempoNodes(window,wblock);
186 DrawUpWTempoNodes(window,wblock);
187 UpdateSTimes(wblock->block);
188 SetMouseActionTempoNodes(window,action,x,y,0);
189 GFX_DrawWindowTitle(window,wblock);