New option; "Lock Time to Other Windows" for Ipo, Action, NLA and Time
[blender.git] / source / blender / src / header_nla.c
1 /**
2  * header_nla.c oct-2003
3  *
4  * Functions to draw the "NLA Editor" window header
5  * and handle user events sent to it.
6  * 
7  * $Id$
8  *
9  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version. The Blender
15  * Foundation also sells licenses for use in proprietary software under
16  * the Blender License.  See http://www.blender.org/BL/ for information
17  * about this.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA        02111-1307, USA.
27  *
28  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
29  * All rights reserved.
30  *
31  * The Original Code is: all of this file.
32  *
33  * Contributor(s): none yet.
34  *
35  * ***** END GPL/BL DUAL LICENSE BLOCK *****
36  */
37
38 #include <stdlib.h>
39 #include <string.h>
40 #include <stdio.h>
41
42 #ifdef HAVE_CONFIG_H
43 #include <config.h>
44 #endif
45
46 #include "DNA_ID.h"
47 #include "DNA_nla_types.h"
48 #include "DNA_scene_types.h"
49 #include "DNA_screen_types.h"
50 #include "DNA_space_types.h"
51
52 #include "BKE_global.h"
53 #include "BKE_main.h"
54 #include "BKE_utildefines.h"
55
56 #include "BIF_interface.h"
57 #include "BIF_resources.h"
58 #include "BIF_screen.h"
59 #include "BIF_space.h"
60 #include "BIF_editnla.h"
61
62 #include "BSE_drawipo.h"
63 #include "BSE_headerbuttons.h"
64
65 //#include "nla.h"
66
67 #include "blendef.h"
68 #include "mydevice.h"
69
70 void do_nla_buttons(unsigned short event)
71 {
72         View2D *v2d;
73
74         switch(event){
75         case B_NLAHOME:
76                 //      Find X extents
77                 v2d= &(G.snla->v2d);
78                 
79                 /* i tried to understand nla/action drawing to reveil a 'tot' rect, impossible code! (ton) */
80                 v2d->cur.xmin = G.scene->r.sfra-5;
81                 v2d->cur.xmax = G.scene->r.efra+5;
82                 v2d->cur.ymin= -SCROLLB;
83                 v2d->cur.ymax= 5; // at least stuff is visiable then?
84                 
85                 test_view2d(G.v2d, curarea->winx, curarea->winy);
86                 view2d_do_locks(curarea, V2D_LOCK_COPY);
87                 addqueue (curarea->win, REDRAW, 1);
88                 break;
89         }
90 }
91
92
93 static void do_nla_viewmenu(void *arg, int event)
94 {
95         extern int play_anim(int mode);
96         
97         switch(event) {
98         case 0: /* Update Automatically */
99                 if(BTST(G.snla->lock, 0)) G.snla->lock = BCLR(G.snla->lock, 0);
100                 else G.snla->lock = BSET(G.snla->lock, 0);
101                 break;
102         case 1: /* Play Back Animation */
103                 play_anim(0);
104                 break;
105         case 2: /* Play Back Animation in 3D View */
106                 play_anim(1);
107                 break;
108         case 3: /* View All */
109                 do_nla_buttons(B_NLAHOME);
110                 break;
111         case 4: /* Maximize Window */
112                 /* using event B_FULL */
113                 break;
114         case 5:
115                 G.v2d->flag ^= V2D_VIEWLOCK;
116                 if(G.v2d->flag & V2D_VIEWLOCK)
117                         view2d_do_locks(curarea, 0);
118                 break;                  
119         }
120 }
121
122 static uiBlock *nla_viewmenu(void *arg_unused)
123 {
124 /*      static short tog=0; */
125         uiBlock *block;
126         short yco= 0, menuwidth=120;
127         
128         block= uiNewBlock(&curarea->uiblocks, "nla_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
129         uiBlockSetButmFunc(block, do_nla_viewmenu, NULL);
130                 
131         if(BTST(G.snla->lock, 0)) {
132                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Update Automatically|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
133         } else {
134                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Update Automatically|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
135         }
136
137         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
138         
139         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
140         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation in 3D View|Alt Shift A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
141         
142         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
143         
144         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
145         uiDefIconTextBut(block, BUTM, 1, (G.v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT, 
146                                          "Lock Time to Other Windows|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
147         
148         if(!curarea->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
149         else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
150         
151         if(curarea->headertype==HEADERTOP) {
152                 uiBlockSetDirection(block, UI_DOWN);
153         }
154         else {
155                 uiBlockSetDirection(block, UI_TOP);
156                 uiBlockFlipOrder(block);
157         }
158
159         uiTextBoundsBlock(block, 50);
160         
161         return block;
162 }
163
164 static void do_nla_selectmenu(void *arg, int event)
165 {       
166
167         switch(event)
168         {
169         case 0: /* Border Select */
170                 borderselect_nla();
171                 break;
172         case 1: /* Select/Deselect All Keys */
173                 deselect_nlachannel_keys(1);
174                 allqueue (REDRAWNLA, 0);
175                 allqueue (REDRAWIPO, 0);
176                 break;
177         case 2: /* Select/Deselect All Channel */
178                 deselect_nlachannels(1);
179                 allqueue (REDRAWVIEW3D, 0);
180                 allqueue (REDRAWNLA, 0);
181                 allqueue (REDRAWIPO, 0);
182                 break;
183         }
184 }
185
186 static uiBlock *nla_selectmenu(void *arg_unused)
187 {
188         uiBlock *block;
189         short yco= 0, menuwidth=120;
190
191         block= uiNewBlock(&curarea->uiblocks, "nla_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
192         uiBlockSetButmFunc(block, do_nla_selectmenu, NULL);
193
194         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
195         
196         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
197         
198         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Keys|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
199         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Channels", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
200
201         if(curarea->headertype==HEADERTOP) {
202                 uiBlockSetDirection(block, UI_DOWN);
203         }
204         else {
205                 uiBlockSetDirection(block, UI_TOP);
206                 uiBlockFlipOrder(block);
207         }
208
209         uiTextBoundsBlock(block, 50);
210
211         return block;
212 }
213
214 static void do_nla_strip_transformmenu(void *arg, int event)
215 {
216         switch(event) {
217         case 0: /* grab/move */
218                 transform_nlachannel_keys ('g', 0);
219                         update_for_newframe_muted();
220                 break;
221         case 1: /* scale */
222                 transform_nlachannel_keys ('s', 0);
223                         update_for_newframe_muted();
224                 break;
225         }
226         allqueue(REDRAWVIEW3D, 0);
227 }
228
229 static uiBlock *nla_strip_transformmenu(void *arg_unused)
230 {
231         uiBlock *block;
232         short yco = 20, menuwidth = 120;
233
234         block= uiNewBlock(&curarea->uiblocks, "nla_strip_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
235         uiBlockSetButmFunc(block, do_nla_strip_transformmenu, NULL);
236         
237         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
238         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
239
240         uiBlockSetDirection(block, UI_RIGHT);
241         uiTextBoundsBlock(block, 60);
242         return block;
243 }
244
245 static void do_nla_stripmenu(void *arg, int event)
246 {       
247         switch(event)
248         {
249         case 0: /* Strip Properties */
250                 add_blockhandler(curarea, NLA_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
251                 break;
252         case 1: /* Add Action Strip */
253                 break;
254         case 2: /* Duplicate */
255                 duplicate_nlachannel_keys();
256                 update_for_newframe_muted();
257                 break;
258         case 3: /* Delete Strips */
259                 delete_nlachannel_keys ();
260                 update_for_newframe_muted();
261                 break;
262         case 5: /* Convert Action to NLA Strip */
263                 break;
264         case 6: /* Move Up */
265                 shift_nlastrips_up();
266                 break;
267         case 7: /* Move Down */
268                 shift_nlastrips_down();
269                 break;
270         }
271 }
272
273 static uiBlock *nla_stripmenu(void *arg_unused)
274 {
275         uiBlock *block;
276         short yco= 0, menuwidth=120;
277
278         block= uiNewBlock(&curarea->uiblocks, "nla_stripmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
279         uiBlockSetButmFunc(block, do_nla_stripmenu, NULL);
280
281         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strip Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
282         uiDefIconTextBlockBut(block, nla_strip_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
283         
284         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
285         
286         // uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Action Strip|Shift A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
287         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
288         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
289         // uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
290         
291         uiDefBut(block, SEPR, 0, "",        0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
292
293         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Up|Page Down", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
294         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Down|Page Up", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
295                 
296         // uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Action to NLA Strip|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
297
298         if(curarea->headertype==HEADERTOP) {
299                 uiBlockSetDirection(block, UI_DOWN);
300         }
301         else {
302                 uiBlockSetDirection(block, UI_TOP);
303                 uiBlockFlipOrder(block);
304         }
305
306         uiTextBoundsBlock(block, 50);
307
308         return block;
309 }
310
311 void nla_buttons(void)
312 {
313         SpaceNla *snla;
314         short xco, xmax;
315         char naam[20];
316         uiBlock *block;
317         
318         snla= curarea->spacedata.first;
319         
320         sprintf(naam, "header %d", curarea->headwin);
321         block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->headwin);
322
323         if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
324         else uiBlockSetCol(block, TH_HEADERDESEL);
325
326         curarea->butspacetype= SPACE_NLA;
327         
328         xco = 8;
329         
330         uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), xco,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types.");
331
332         xco+= XIC+14;
333
334         uiBlockSetEmboss(block, UI_EMBOSSN);
335         if(curarea->flag & HEADER_NO_PULLDOWN) {
336                 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
337                                 xco,2,XIC,YIC-2,
338                                 &(curarea->flag), 0, 0, 0, 0, "Show pulldown menus");
339         } else {
340                 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
341                                 xco,2,XIC,YIC-2,
342                                 &(curarea->flag), 0, 0, 0, 0, "Hide pulldown menus");
343         }
344         uiBlockSetEmboss(block, UI_EMBOSS);
345         xco+=XIC;
346
347         if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
348                 /* pull down menus */
349                 uiBlockSetEmboss(block, UI_EMBOSSP);
350         
351                 xmax= GetButStringLength("View");
352                 uiDefPulldownBut(block, nla_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
353                 xco+= xmax;
354                 
355                 xmax= GetButStringLength("Select");
356                 uiDefPulldownBut(block, nla_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
357                 xco+= xmax;
358
359                 xmax= GetButStringLength("Strip");
360                 uiDefPulldownBut(block, nla_stripmenu, NULL, "Strip", xco, -2, xmax-3, 24, "");
361                 xco+= xmax;
362
363         }
364
365         uiBlockSetEmboss(block, UI_EMBOSS);
366
367
368         /* FULL WINDOW */
369         
370         
371 //      xco = 8;
372         
373 //      uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), xco,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types.");
374
375 //      xco+= XIC+22;
376         
377         /* FULL WINDOW */
378 //      if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN,     xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Returns to multiple views window (CTRL+Up arrow)");
379 //      else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN,   xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Makes current window full screen (CTRL+Down arrow)");
380         
381         /* HOME */
382 //      uiDefIconBut(block, BUT, B_NLAHOME, ICON_HOME,  xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms window to home view showing all items (HOMEKEY)");    
383 //      xco+= XIC;
384         
385         /* IMAGE */
386 //      uiDefIconButS(block, TOG, B_REDR, ICON_IMAGE_COL,       xco+=XIC,0,XIC,YIC, &sseq->mainb, 0, 0, 0, 0, "Toggles image display");
387
388         /* ZOOM en BORDER */
389 //      xco+= XIC;
390 //      uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM,  xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)");
391 //      uiDefIconBut(block, BUT, B_NLABORDER, ICON_BORDERMOVE,  xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zoom view to area");
392
393         /* draw LOCK */
394 //      xco+= XIC/2;
395
396         xco += 8;
397
398         uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco,0,XIC,YIC, &(snla->lock), 0, 0, 0, 0, "Toggles forced redraw of other windows to reflect changes in real time");
399
400         uiDrawBlock(block);
401 }