More testing with new system:
[blender.git] / source / blender / editors / space_time / ed_markers.c
1 /**
2  * $Id:
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2008 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <stdlib.h>
30
31 #include "MEM_guardedalloc.h"
32
33 #include "DNA_scene_types.h"
34 #include "DNA_screen_types.h"
35 #include "DNA_space_types.h"
36 #include "DNA_view2d_types.h"
37 #include "DNA_windowmanager_types.h"
38
39 #include "RNA_access.h"
40 #include "RNA_define.h"
41
42 #include "BLI_blenlib.h"
43
44 #include "BKE_global.h"
45
46 #include "WM_api.h"
47 #include "WM_types.h"
48
49 #include "BIF_gl.h"
50 #include "BIF_glutil.h"
51
52 #include "UI_interface.h"
53 #include "UI_view2d.h"
54 #include "UI_resources.h"
55
56 #include "ED_markers.h"
57 #include "ED_types.h"
58
59 /* ************* Marker Drawing ************ */
60
61 /* XXX */
62 extern void ui_rasterpos_safe(float x, float y, float aspect);
63
64 /* function to draw markers */
65 static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
66 {
67         float xpos, ypixels, xscale, yscale;
68         int icon_id= 0;
69         
70         xpos = marker->frame;
71         /* no time correction for framelen! space is drawn with old values */
72         
73         ypixels= v2d->mask.ymax-v2d->mask.ymin;
74         UI_view2d_getscale(v2d, &xscale, &yscale);
75         
76         glScalef( 1.0/xscale, 1.0/yscale, 1.0);
77         
78         glEnable(GL_BLEND);
79         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);                      
80         
81         /* verticle line */
82         if (flag & DRAW_MARKERS_LINES) {
83                 setlinestyle(3);
84                 if(marker->flag & SELECT)
85                         glColor4ub(255,255,255, 96);
86                 else
87                         glColor4ub(0,0,0, 96);
88                 
89                 glBegin(GL_LINES);
90                 glVertex2f((xpos*xscale)+0.5, 12);
91                 glVertex2f((xpos*xscale)+0.5, 34*yscale); /* a bit lazy but we know it cant be greater then 34 strips high*/
92                 glEnd();
93                 setlinestyle(0);
94         }
95         
96         /* 5 px to offset icon to align properly, space / pixels corrects for zoom */
97         if (flag & DRAW_MARKERS_LOCAL) {
98                 icon_id= (marker->flag & ACTIVE) ? ICON_PMARKER_ACT : 
99                 (marker->flag & SELECT) ? ICON_PMARKER_SEL : 
100                 ICON_PMARKER;
101         }
102         else {
103                 icon_id= (marker->flag & SELECT) ? ICON_MARKER_HLT : 
104                 ICON_MARKER;
105         }
106         
107         //BIF_icon_draw(xpos*xscale-5.0, 12.0, icon_id);
108         glColor3ub(0, 100, 0);
109         glRectf(xpos*xscale-5.0f, 12.0f, xpos*xscale, 17.0f);
110         
111         glBlendFunc(GL_ONE, GL_ZERO);
112         glDisable(GL_BLEND);
113         
114         /* and the marker name too, shifted slightly to the top-right */
115         if(marker->name && marker->name[0]) {
116                 if(marker->flag & SELECT) {
117                         //BIF_ThemeColor(TH_TEXT_HI);
118                         ui_rasterpos_safe(xpos*xscale+4.0, (ypixels<=39.0)?(ypixels-10.0):29.0, 1.0);
119                 }
120                 else {
121                         // BIF_ThemeColor(TH_TEXT);
122                         if((marker->frame <= cfra) && (marker->frame+5 > cfra))
123                                 ui_rasterpos_safe(xpos*xscale+4.0, (ypixels<=39.0)?(ypixels-10.0):29.0, 1.0);
124                         else
125                                 ui_rasterpos_safe(xpos*xscale+4.0, 17.0, 1.0);
126                 }
127 //              BIF_DrawString(G.font, marker->name, 0);
128         }
129         glScalef(xscale, yscale, 1.0);
130 }
131
132 /* Draw Scene-Markers in time window (XXX make generic) */
133 void draw_markers_time(const bContext *C, int flag)
134 {
135         TimeMarker *marker;
136         SpaceTime *stime= C->area->spacedata.first;
137         View2D *v2d= &stime->v2d;
138         
139         /* unselected markers are drawn at the first time */
140         for (marker= C->scene->markers.first; marker; marker= marker->next) {
141                 if (!(marker->flag & SELECT)) draw_marker(v2d, marker, C->scene->r.cfra, flag);
142         }
143         
144         /* selected markers are drawn later */
145         for (marker= C->scene->markers.first; marker; marker= marker->next) {
146                 if (marker->flag & SELECT) draw_marker(v2d, marker, C->scene->r.cfra, flag);
147         }
148 }
149
150
151
152 /* ************* Marker API **************** */
153
154 /* add TimeMarker at curent frame */
155 static int ed_marker_add(bContext *C, wmOperator *op)
156 {
157         TimeMarker *marker;
158         int frame= C->scene->r.cfra;
159         
160         /* two markers can't be at the same place */
161         for(marker= C->scene->markers.first; marker; marker= marker->next)
162                 if(marker->frame == frame) 
163                         return OPERATOR_CANCELLED;
164         
165         /* deselect all */
166         for(marker= C->scene->markers.first; marker; marker= marker->next)
167                 marker->flag &= ~SELECT;
168         
169         marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
170         marker->flag= SELECT;
171         marker->frame= frame;
172         BLI_addtail(&(C->scene->markers), marker);
173         
174         //BIF_undo_push("Add Marker");
175         
176         return OPERATOR_FINISHED;
177 }
178
179
180 /* remove selected TimeMarkers */
181 void ed_marker_remove(bContext *C)
182 {
183         TimeMarker *marker, *nmarker;
184         short changed= 0;
185         
186         for(marker= C->scene->markers.first; marker; marker= nmarker) {
187                 nmarker= marker->next;
188                 if(marker->flag & SELECT) {
189                         BLI_freelinkN(&(C->scene->markers), marker);
190                         changed= 1;
191                 }
192         }
193         
194 //      if (changed)
195 //              BIF_undo_push("Remove Marker");
196 }
197
198
199 /* duplicate selected TimeMarkers */
200 void ed_marker_duplicate(bContext *C)
201 {
202         TimeMarker *marker, *newmarker;
203         
204         /* go through the list of markers, duplicate selected markers and add duplicated copies
205         * to the begining of the list (unselect original markers) */
206         for(marker= C->scene->markers.first; marker; marker= marker->next) {
207                 if(marker->flag & SELECT){
208                         /* unselect selected marker */
209                         marker->flag &= ~SELECT;
210                         /* create and set up new marker */
211                         newmarker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
212                         newmarker->flag= SELECT;
213                         newmarker->frame= marker->frame;
214                         BLI_strncpy(newmarker->name, marker->name, sizeof(marker->name));
215                         /* new marker is added to the begining of list */
216                         BLI_addhead(&(C->scene->markers), newmarker);
217                 }
218         }
219         
220 //      transform_markers('g', 0);
221 }
222
223 void ED_MARKER_OT_add(wmOperatorType *ot)
224 {
225         /* identifiers */
226         ot->name= "Add Time Marker";
227         ot->idname= "ED_MARKER_OT_add";
228         
229         /* api callbacks */
230         ot->exec= ed_marker_add;
231         
232 }
233
234
235 /* ************************** registration **********************************/
236
237 void marker_operatortypes(void)
238 {
239         WM_operatortype_append(ED_MARKER_OT_add);
240 }
241
242