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
,
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
;
52 int start_realline
,end_realline
;
56 lx
=max(wblock
->temponodearea
.x
+1,x
);
57 lx
=min(wblock
->temponodearea
.x2
,lx
);
59 dx
=lx
- wblock
->temponodearea
.x
-1;
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
);
71 prev_vel
=&((struct ListHeader3
*)
72 (ListPrevElement3(&wblock
->block
->temponodes
->l
,&wblock
->block
->lasttemponode
->l
)
74 next_vel
=&temponode
->l
.p
;
77 prev
=ListPrevElement3(&wblock
->block
->temponodes
->l
,&temponode
->l
);
79 next_vel
=&(NextTempoNode(temponode
)->l
.p
);
80 realline
=GetReallineAndPlaceFromY(
81 window
,wblock
,y
,&place
,prev_vel
,
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
;
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
++){
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
);
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
;
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
){
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
);
172 wtemponode
=wtemponode
->next
;
175 if(firstringinwindowtitle
[0]!=0){
176 firstringinwindowtitle
[0]=0;
177 GFX_DrawWindowTitle(window
,window
->wblock
);
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
);