prevent popup deactivation while button_down
[goodguy/history.git] / cinelerra-5.0 / cinelerra / theme.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 1997-2011 Adam Williams <broadcast at earthling dot net>
5  * 
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (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
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  * 
20  */
21
22 #include "awindowgui.h"
23 #include "bcsignals.h"
24 #include "clip.h"
25 #include "colors.h"
26 #include "cwindowgui.h"
27 #include "edl.h"
28 #include "edlsession.h"
29 #include "keyframegui.h"
30 #include "language.h"
31 #include "levelwindowgui.h"
32 #include "loadmode.h"
33 #include "localsession.h"
34 #include "mainmenu.h"
35 #include "mainsession.h"
36 #include "mbuttons.h"
37 #include "meterpanel.h"
38 #include "mwindowgui.h"
39 #include "mwindow.h"
40 #include "overlayframe.h"
41 #include "patchbay.h"
42 #include "playtransport.h"
43 #include "presetsgui.h"
44 #include "recordgui.h"
45 #include "recordmonitor.h"
46 #include "resourcepixmap.h"
47 #include "statusbar.h"
48 #include "theme.h"
49 #include "timebar.h"
50 #include "trackcanvas.h"
51 #include "vframe.h"
52 #include "vwindowgui.h"
53 #include "zoombar.h"
54
55
56 #include <errno.h>
57 #include <string.h>
58
59 #define NEW_VFRAME \
60 new VFrame(0, -1, default_data.get_w(), default_data.get_h(), BC_RGBA8888, -1)
61
62 Theme::Theme()
63  : BC_Theme()
64 {
65         window_border = 10;
66         widget_border = 5;
67         this->mwindow = 0;
68         theme_title = DEFAULT_THEME;
69         data_buffer = 0;
70         contents_buffer = 0;
71         last_image = 0;
72         mtransport_margin = 0;
73         toggle_margin = 0;
74         control_pixels = 50;
75         timebar_cursor_color = RED;
76
77         BC_WindowBase::get_resources()->bg_color = BLOND;
78         BC_WindowBase::get_resources()->button_up = 0xffc000;
79         BC_WindowBase::get_resources()->button_highlighted = 0xffe000;
80         BC_WindowBase::get_resources()->recursive_resizing = 0;
81         audio_color = BLACK;
82         fade_h = 22;
83         meter_h = 17;
84         mode_h = 30;
85         pan_h = 32;
86         pan_x = 50;
87         play_h = 22;
88         title_h = 23;
89         clock_bg_color = BLACK;
90         assetedit_color = YELLOW;
91         const char *cp = getenv("BC_USE_COMMERCIALS");
92         use_commercials = !cp ? 0 : atoi(cp);
93
94         preferences_category_overlap = 0;
95
96         loadmode_w = 350;
97         czoom_w = 80;
98
99 #include "data/about_png.h"
100         about_bg = new VFramePng(about_png);
101
102         pane_color = BLACK;
103         drag_pane_color = WHITE;
104
105         appendasset_data = 0;
106         append_data = 0;
107         asset_append_data = 0;
108         asset_disk_data = 0;
109         asset_index_data = 0;
110         asset_info_data = 0;
111         asset_project_data = 0;
112         browse_data = 0;
113         calibrate_data = 0;
114         camerakeyframe_data = 0;
115         cancel_data = 0;
116         chain_data = 0;
117         channel_bg_data = 0;
118         channel_position_data = 0;
119         delete_all_indexes_data = 0;
120         deletebin_data = 0;
121         delete_data = 0;
122         deletedisk_data = 0;
123         deleteproject_data = 0;
124         detach_data = 0;
125         dntriangle_data = 0;
126
127         edit_data = 0;
128         edithandlein_data = 0;
129         edithandleout_data = 0;
130         extract_data = 0;
131         ffmpeg_toggle = 0;
132         infoasset_data = 0;
133         in_point = 0;
134         insert_data = 0;
135         keyframe_data = 0;
136         label_toggle = 0;
137         lift_data = 0;
138         maskkeyframe_data = 0;
139         modekeyframe_data = 0;
140         movedn_data = 0;
141         moveup_data = 0;
142         newbin_data = 0;
143         no_data = 0;
144         options_data = 0;
145         out_point = 0;
146         over_button = 0;
147         overwrite_data = 0;
148         pankeyframe_data = 0;
149         pasteasset_data = 0;
150         paused_data = 0;
151         picture_data = 0;
152         presentation_data = 0;
153         presentation_loop = 0;
154         presentation_stop = 0;
155         projectorkeyframe_data = 0;
156         redrawindex_data = 0;
157         renamebin_data = 0;
158         reset_data = 0;
159         reverse_data = 0;
160         rewind_data = 0;
161         select_data = 0;
162         shbtn_data = 0;
163         splice_data = 0;
164         start_over_data = 0;
165         statusbar_cancel_data = 0;
166         timebar_view_data = 0;
167         transition_data = 0;
168         uptriangle_data = 0;
169         viewasset_data = 0;
170         vtimebar_bg_data = 0;
171 }
172
173
174 // Need to delete everything here
175 Theme::~Theme()
176 {
177         flush_images(); 
178
179         aspect_ratios.remove_all_objects();
180         frame_rates.remove_all_objects();
181         frame_sizes.remove_all_objects();
182         sample_rates.remove_all_objects();
183         zoom_values.remove_all_objects();
184
185         delete about_bg;
186 }
187
188 void Theme::flush_images()
189 {
190         if(data_buffer) delete [] data_buffer;
191         if(contents_buffer) delete [] contents_buffer;
192         data_buffer = 0;
193         contents_buffer = 0;
194         contents.remove_all();
195 }
196
197 void Theme::initialize()
198 {
199         message_normal = BLACK;
200         message_error = RED;
201
202 // Force to use local data for images
203         extern unsigned char _binary_theme_data_start[];
204         set_data(_binary_theme_data_start);
205
206 // Set images which weren't set by subclass
207         new_image("mode_normal", "mode_normal.png");
208         new_image("mode_add", "mode_add.png");
209         new_image("mode_subtract", "mode_subtract.png");
210         new_image("mode_multiply", "mode_multiply.png");
211         new_image("mode_divide", "mode_divide.png");
212         new_image("mode_replace", "mode_replace.png");
213         new_image("mode_max", "mode_max.png");
214         new_image("mode_min", "mode_min.png");
215         new_image("mode_average", "mode_average.png");
216         new_image("mode_darken", "mode_darken.png");
217         new_image("mode_lighten", "mode_lighten.png");
218         new_image("mode_dst", "mode_dst.png");
219         new_image("mode_dstatop", "mode_dstatop.png");
220         new_image("mode_dstin", "mode_dstin.png");
221         new_image("mode_dstout", "mode_dstout.png");
222         new_image("mode_dstover", "mode_dstover.png");
223         new_image("mode_src", "mode_src.png");
224         new_image("mode_srcatop", "mode_srcatop.png");
225         new_image("mode_srcin", "mode_srcin.png");
226         new_image("mode_srcout", "mode_srcout.png");
227         new_image("mode_srcover", "mode_srcover.png");
228         new_image("mode_or", "mode_or.png");
229         new_image("mode_xor", "mode_xor.png");
230
231         new_image_set("mode_popup", 3, "mode_up.png", "mode_hi.png", "mode_dn.png");
232
233 // Images all themes have
234         new_image("mwindow_icon", "heroine_icon.png");
235         new_image("vwindow_icon", "heroine_icon.png");
236         new_image("cwindow_icon", "heroine_icon.png");
237         new_image("awindow_icon", "heroine_icon.png");
238         new_image("record_icon", "heroine_icon.png");
239         new_image("clip_icon", "clip_icon.png");
240
241
242         new_image("aeffect_icon", "aeffect_icon.png");
243         new_image("veffect_icon", "veffect_icon.png");
244         new_image("atransition_icon", "atransition_icon.png");
245         new_image("vtransition_icon", "atransition_icon.png");
246 }
247
248
249
250
251
252
253 void Theme::build_menus()
254 {
255         aspect_ratios.append(new BC_ListBoxItem("3:2"));
256         aspect_ratios.append(new BC_ListBoxItem("4:3"));
257         aspect_ratios.append(new BC_ListBoxItem("16:9"));
258         aspect_ratios.append(new BC_ListBoxItem("2.10:1"));
259         aspect_ratios.append(new BC_ListBoxItem("2.20:1"));
260         aspect_ratios.append(new BC_ListBoxItem("2.25:1"));
261         aspect_ratios.append(new BC_ListBoxItem("2.30:1"));
262         aspect_ratios.append(new BC_ListBoxItem("2.35:1"));
263         aspect_ratios.append(new BC_ListBoxItem("2.66:1"));
264
265         frame_sizes.append(new BC_ListBoxItem("128x96"));
266         frame_sizes.append(new BC_ListBoxItem("160x120"));
267         frame_sizes.append(new BC_ListBoxItem("176x144"));
268         frame_sizes.append(new BC_ListBoxItem("240x180"));
269         frame_sizes.append(new BC_ListBoxItem("320x200"));
270         frame_sizes.append(new BC_ListBoxItem("320x240"));
271         frame_sizes.append(new BC_ListBoxItem("352x288"));
272         frame_sizes.append(new BC_ListBoxItem("360x240"));
273         frame_sizes.append(new BC_ListBoxItem("400x300"));
274         frame_sizes.append(new BC_ListBoxItem("424x318"));
275         frame_sizes.append(new BC_ListBoxItem("512x384"));
276         frame_sizes.append(new BC_ListBoxItem("640x350"));
277         frame_sizes.append(new BC_ListBoxItem("640x480"));
278         frame_sizes.append(new BC_ListBoxItem("704x576"));
279         frame_sizes.append(new BC_ListBoxItem("720x480"));
280         frame_sizes.append(new BC_ListBoxItem("720x576"));
281         frame_sizes.append(new BC_ListBoxItem("800x600"));
282         frame_sizes.append(new BC_ListBoxItem("852x480"));
283         frame_sizes.append(new BC_ListBoxItem("852x480"));
284         frame_sizes.append(new BC_ListBoxItem("960x540"));
285         frame_sizes.append(new BC_ListBoxItem("960x1080"));
286         frame_sizes.append(new BC_ListBoxItem("1024x768"));
287         frame_sizes.append(new BC_ListBoxItem("1280x720"));
288         frame_sizes.append(new BC_ListBoxItem("1280x1024"));
289         frame_sizes.append(new BC_ListBoxItem("1366x768"));
290         frame_sizes.append(new BC_ListBoxItem("1408x1152"));
291         frame_sizes.append(new BC_ListBoxItem("1600x1024"));
292         frame_sizes.append(new BC_ListBoxItem("1600x1200"));
293         frame_sizes.append(new BC_ListBoxItem("1920x1080"));
294         frame_sizes.append(new BC_ListBoxItem("1920x1088"));
295         frame_sizes.append(new BC_ListBoxItem("1920x1200"));
296         frame_sizes.append(new BC_ListBoxItem("2048x1536"));
297         frame_sizes.append(new BC_ListBoxItem("2560x1600"));
298         frame_sizes.append(new BC_ListBoxItem("2560x2048"));
299         frame_sizes.append(new BC_ListBoxItem("3200x2048"));
300         frame_sizes.append(new BC_ListBoxItem("3840x2400"));
301         frame_sizes.append(new BC_ListBoxItem("5120x4096"));
302         frame_sizes.append(new BC_ListBoxItem("6400x4096"));
303         frame_sizes.append(new BC_ListBoxItem("7680x4800"));
304
305         sample_rates.append(new BC_ListBoxItem("8000"));
306         sample_rates.append(new BC_ListBoxItem("16000"));
307         sample_rates.append(new BC_ListBoxItem("22050"));
308         sample_rates.append(new BC_ListBoxItem("32000"));
309         sample_rates.append(new BC_ListBoxItem("44100"));
310         sample_rates.append(new BC_ListBoxItem("48000"));
311         sample_rates.append(new BC_ListBoxItem("96000"));
312         sample_rates.append(new BC_ListBoxItem("192000"));
313
314         frame_rates.append(new BC_ListBoxItem("1"));
315         frame_rates.append(new BC_ListBoxItem("5"));
316         frame_rates.append(new BC_ListBoxItem("10"));
317         frame_rates.append(new BC_ListBoxItem("12"));
318         frame_rates.append(new BC_ListBoxItem("15"));
319         frame_rates.append(new BC_ListBoxItem("23.976"));
320         frame_rates.append(new BC_ListBoxItem("24"));
321         frame_rates.append(new BC_ListBoxItem("25"));
322         frame_rates.append(new BC_ListBoxItem("29.97"));
323         frame_rates.append(new BC_ListBoxItem("30"));
324         frame_rates.append(new BC_ListBoxItem("50"));
325         frame_rates.append(new BC_ListBoxItem("59.94"));
326         frame_rates.append(new BC_ListBoxItem("60"));
327
328         char string[BCTEXTLEN];
329         for(int i = 1; i < 17; i++)
330         {
331                 sprintf(string, "%d", (int)pow(2, i));
332                 zoom_values.append(new BC_ListBoxItem(string));
333         }
334 }
335
336
337 void Theme::overlay(VFrame *dst, VFrame *src, int in_x1, int in_x2)
338 {
339         int w;
340         int h;
341         unsigned char **in_rows;
342         unsigned char **out_rows;
343
344         if(in_x1 < 0)
345         {
346                 w = MIN(src->get_w(), dst->get_w());
347                 h = MIN(dst->get_h(), src->get_h());
348                 in_x1 = 0;
349                 in_x2 = w;
350         }
351         else
352         {
353                 w = in_x2 - in_x1;
354                 h = MIN(dst->get_h(), src->get_h());
355         }
356         in_rows = src->get_rows();
357         out_rows = dst->get_rows();
358
359         switch(src->get_color_model())
360         {
361                 case BC_RGBA8888:
362                         switch(dst->get_color_model())
363                         {
364                                 case BC_RGBA8888:
365                                         for(int i = 0; i < h; i++)
366                                         {
367                                                 unsigned char *in_row = in_rows[i] + in_x1 * 4;
368                                                 unsigned char *out_row = out_rows[i];
369                                                 for(int j = 0; j < w; j++)
370                                                 {
371                                                         int opacity = in_row[3];
372                                                         int transparency = out_row[3] * (0xff - opacity) / 0xff;
373                                                         out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
374                                                         out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
375                                                         out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
376                                                         out_row[3] = MAX(in_row[3], out_row[3]);
377                                                         out_row += 4;
378                                                         in_row += 4;
379                                                 }
380                                         }
381                                         break;
382                                 case BC_RGB888:
383                                         for(int i = 0; i < h; i++)
384                                         {
385                                                 unsigned char *in_row = in_rows[i] + in_x1 * 4;
386                                                 unsigned char *out_row = out_rows[i];
387                                                 for(int j = 0; j < w; j++)
388                                                 {
389                                                         int opacity = in_row[3];
390                                                         int transparency = 0xff - opacity;
391                                                         out_row[0] = (in_row[0] * opacity + out_row[0] * transparency) / 0xff;
392                                                         out_row[1] = (in_row[1] * opacity + out_row[1] * transparency) / 0xff;
393                                                         out_row[2] = (in_row[2] * opacity + out_row[2] * transparency) / 0xff;
394                                                         out_row += 3;
395                                                         in_row += 4;
396                                                 }
397                                         }
398                                         break;
399                         }
400                         break;
401         }
402 }
403
404 void Theme::build_transport(char *title,
405         unsigned char *png_overlay,
406         VFrame **bg_data,
407         int third)
408 {
409         if(!png_overlay) return;
410         VFramePng default_data(png_overlay);
411         VFrame *data[3];
412         data[0] = NEW_VFRAME;
413         data[1] = NEW_VFRAME;
414         data[2] = NEW_VFRAME;
415         data[0]->clear_frame();
416         data[1]->clear_frame();
417         data[2]->clear_frame();
418
419         for(int i = 0; i < 3; i++)
420         {
421                 int in_x1 = 0;
422                 int in_x2 = 0;
423                 if(!bg_data[i]) break;
424
425                 switch(third)
426                 {
427                         case 0:
428                                 in_x1 = 0;
429                                 in_x2 = default_data.get_w();
430                                 break;
431
432                         case 1:
433                                 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
434                                 in_x2 = in_x1 + default_data.get_w();
435                                 break;
436
437                         case 2:
438                                 in_x1 = bg_data[i]->get_w() - default_data.get_w();
439                                 in_x2 = in_x1 + default_data.get_w();
440                                 break;
441                 }
442
443                 overlay(data[i], bg_data[i], in_x1, in_x2);
444                 overlay(data[i], &default_data);
445         }
446
447         new_image_set_images(title, 3, data[0], data[1], data[2]);
448 }
449
450
451
452
453
454
455
456
457
458 void Theme::build_patches(VFrame** &data,
459         unsigned char *png_overlay,
460         VFrame **bg_data,
461         int region)
462 {
463         if(!png_overlay || !bg_data) return;
464         VFramePng default_data(png_overlay);
465         data = new VFrame*[5];
466         data[0] = NEW_VFRAME;
467         data[1] = NEW_VFRAME;
468         data[2] = NEW_VFRAME;
469         data[3] = NEW_VFRAME;
470         data[4] = NEW_VFRAME;
471
472         for(int i = 0; i < 5; i++)
473         {
474 #if 0
475                 int in_x1;
476                 int in_x2;
477
478                 switch(region)
479                 {
480                         case 0:
481                                 in_x1 = 0;
482                                 in_x2 = default_data.get_w();
483                                 break;
484
485                         case 1:
486                                 in_x1 = (int)(bg_data[i]->get_w() * 0.33);
487                                 in_x2 = in_x1 + default_data.get_w();
488                                 break;
489
490                         case 2:
491                                 in_x1 = bg_data[i]->get_w() - default_data.get_w();
492                                 in_x2 = in_x1 + default_data.get_w();
493                                 break;
494                 }
495 #endif
496                 overlay(data[i], 
497                         bg_data[i]);
498                 overlay(data[i], 
499                         &default_data);
500         }
501 }
502
503
504
505
506
507
508
509
510 void Theme::build_button(VFrame** &data,
511         unsigned char *png_overlay,
512         VFrame *up_vframe,
513         VFrame *hi_vframe,
514         VFrame *dn_vframe)
515 {
516         if(!png_overlay) return;
517         VFramePng default_data(png_overlay);
518
519         if(!up_vframe || !hi_vframe || !dn_vframe) return;
520         data = new VFrame*[3];
521         data[0] = NEW_VFRAME;
522         data[1] = NEW_VFRAME;
523         data[2] = NEW_VFRAME;
524         data[0]->copy_from(up_vframe);
525         data[1]->copy_from(hi_vframe);
526         data[2]->copy_from(dn_vframe);
527         for(int i = 0; i < 3; i++)
528                 overlay(data[i], 
529                         &default_data);
530 }
531
532 void Theme::build_button(VFrame** &data,
533         unsigned char *png_overlay,
534         VFrame *up_vframe,
535         VFrame *hi_vframe,
536         VFrame *dn_vframe,
537         VFrame *at_vframe)
538 {
539         if(!png_overlay) return;
540         VFramePng default_data(png_overlay);
541
542         if(!up_vframe || !hi_vframe || !dn_vframe) return;
543         data = new VFrame*[4];
544         data[0] = NEW_VFRAME;
545         data[1] = NEW_VFRAME;
546         data[2] = NEW_VFRAME;
547         data[3] = NEW_VFRAME;
548         data[0]->copy_from(up_vframe);
549         data[1]->copy_from(hi_vframe);
550         data[2]->copy_from(dn_vframe);
551         data[2]->copy_from(at_vframe);
552         for(int i = 0; i < 4; i++)
553                 overlay(data[i], 
554                         &default_data);
555 }
556
557 void Theme::build_toggle(VFrame** &data,
558         unsigned char *png_overlay,
559         VFrame *up_vframe,
560         VFrame *hi_vframe,
561         VFrame *checked_vframe,
562         VFrame *dn_vframe,
563         VFrame *checkedhi_vframe)
564 {
565         if(!png_overlay || 
566                 !up_vframe || 
567                 !hi_vframe || 
568                 !checked_vframe || 
569                 !dn_vframe || 
570                 !checkedhi_vframe) return;
571         VFramePng default_data(png_overlay);
572         data = new VFrame*[5];
573         data[0] = NEW_VFRAME;
574         data[1] = NEW_VFRAME;
575         data[2] = NEW_VFRAME;
576         data[3] = NEW_VFRAME;
577         data[4] = NEW_VFRAME;
578         data[0]->copy_from(up_vframe);
579         data[1]->copy_from(hi_vframe);
580         data[2]->copy_from(checked_vframe);
581         data[3]->copy_from(dn_vframe);
582         data[4]->copy_from(checkedhi_vframe);
583         for(int i = 0; i < 5; i++)
584                 overlay(data[i], 
585                         &default_data);
586 }
587
588
589 void Theme::get_mwindow_sizes(MWindowGUI *gui, int w, int h)
590 {
591         mbuttons_x = 0;
592         mbuttons_y = gui->menu_h() + 1;
593         mbuttons_w = gui->menu_w();
594         mbuttons_h = get_image("mbutton_bg")->get_h();
595         mclock_x = 10;
596         mclock_y = mbuttons_y - 1 + mbuttons_h + widget_border;
597         mclock_w = get_image("clock_bg")->get_w() - 40;
598         mclock_h = get_image("clock_bg")->get_h();
599         mtimebar_x = get_image("patchbay_bg")->get_w();
600         mtimebar_y = mbuttons_y - 1 + mbuttons_h;
601         mtimebar_w = w - mtimebar_x;
602         mtimebar_h = get_image("timebar_bg")->get_h();
603         mzoom_h = 25;
604         mzoom_x = 0;
605         mzoom_y = h - get_image("statusbar")->get_h();
606         mzoom_w = w;
607         mstatus_x = 0;
608         mstatus_y = mzoom_y + mzoom_h;
609         mstatus_w = w;
610         mstatus_h = h - mstatus_y;
611         mstatus_message_x = 10;
612         mstatus_message_y = 5;
613         mstatus_progress_x = mstatus_w - statusbar_cancel_data[0]->get_w() - 240;
614         mstatus_progress_y = mstatus_h - BC_WindowBase::get_resources()->progress_images[0]->get_h() - 3;
615         mstatus_progress_w = 230;
616         mstatus_cancel_x = mstatus_w - statusbar_cancel_data[0]->get_w();
617         mstatus_cancel_y = mstatus_h - statusbar_cancel_data[0]->get_h();
618         mcanvas_x = 0;
619         mcanvas_y = mbuttons_y - 1 + mbuttons_h;
620         mcanvas_w = w;
621         mcanvas_h = mzoom_y - mtimebar_y;
622         patchbay_x = 0;
623         patchbay_y = mcanvas_y + mclock_h;
624         patchbay_w = get_image("patchbay_bg")->get_w();
625         patchbay_h = mcanvas_h - mclock_h;
626         pane_w = get_image_set("xpane")[0]->get_w();
627         pane_h = get_image_set("ypane")[0]->get_h();
628         pane_x = mcanvas_x + mcanvas_w;
629         pane_y = mcanvas_y + mcanvas_h;
630         mhscroll_x = 0;
631         mhscroll_y = mcanvas_y + mcanvas_h - BC_ScrollBar::get_span(SCROLL_HORIZ);
632         mhscroll_w = w - BC_ScrollBar::get_span(SCROLL_VERT);
633         mvscroll_x = mcanvas_x + mcanvas_w;
634         mvscroll_y = mcanvas_y;
635         mvscroll_h = mcanvas_h;
636 }
637
638 void Theme::get_pane_sizes(MWindowGUI *gui, 
639         int *view_x,
640         int *view_y,
641         int *view_w, 
642         int *view_h, 
643         int number,
644         int x,
645         int y,
646         int w, 
647         int h)
648 {
649         *view_x = x;
650         *view_y = y;
651         *view_w = w;
652         *view_h = h;
653         
654 // patchbay
655         if(number == TOP_LEFT_PANE ||
656                 number == BOTTOM_LEFT_PANE)
657         {
658                 *view_x += patchbay_w;
659                 *view_w -= patchbay_w;
660         }
661
662 // timebar
663         if(number == TOP_LEFT_PANE || 
664                 number == TOP_RIGHT_PANE)
665         {
666                 *view_y += mtimebar_h;
667                 *view_h -= mtimebar_h;
668         }
669
670 // samplescroll
671         if(number == BOTTOM_LEFT_PANE ||
672                 number == BOTTOM_RIGHT_PANE ||
673                 gui->horizontal_panes() ||
674                 gui->total_panes() == 1)
675         {
676                 *view_h -= BC_ScrollBar::get_span(SCROLL_HORIZ);
677         }
678
679 // trackscroll
680         if(number == TOP_RIGHT_PANE ||
681                 number == BOTTOM_RIGHT_PANE ||
682                 gui->vertical_panes() ||
683                 gui->total_panes() == 1)
684         {
685                 *view_w -= BC_ScrollBar::get_span(SCROLL_VERT);
686         }
687 }
688
689 void Theme::draw_mwindow_bg(MWindowGUI *gui)
690 {
691 }
692
693
694 void Theme::get_cwindow_sizes(CWindowGUI *gui, int cwindow_controls)
695 {
696         int edit_w = EditPanel::calculate_w(mwindow, 1, 14);
697         int transport_w = PlayTransport::get_transport_width(mwindow) + toggle_margin;
698         int zoom_w = ZoomPanel::calculate_w(czoom_w);
699         int status_w = get_image("cwindow_active")->get_w();
700 // Space between buttons & status icon
701         int division_w = 40;
702
703         ctimebar_h = 16;
704
705         if(cwindow_controls)
706         {
707 SET_TRACE
708                 if(mwindow->edl->session->cwindow_meter)
709                 {
710                         cmeter_x = mwindow->session->cwindow_w - 
711                                 MeterPanel::get_meters_width(this,
712                                         mwindow->edl->session->audio_channels, 
713                                         mwindow->edl->session->cwindow_meter);
714                 }
715                 else
716                 {
717                         cmeter_x = mwindow->session->cwindow_w + widget_border;
718                 }
719
720                 int buttons_h;
721
722                 if(edit_w + 
723                         widget_border * 2 + 
724                         transport_w + widget_border + 
725                         zoom_w + widget_border + 
726                         division_w +
727                         status_w > cmeter_x)
728                 {
729                         buttons_h = get_image("cbuttons_left")->get_h();
730
731                         cedit_x = widget_border;
732                         cedit_y = mwindow->session->cwindow_h - 
733                                 buttons_h + 
734                                 ctimebar_h + 
735                                 widget_border;
736
737                         ctransport_x = widget_border;
738                         ctransport_y = mwindow->session->cwindow_h - 
739                                 get_image_set("autokeyframe")[0]->get_h() - 
740                                 widget_border;
741
742                         czoom_x = ctransport_x + transport_w + widget_border;
743                         czoom_y = ctransport_y + widget_border;
744
745                         cstatus_x = 426;
746                         cstatus_y = mwindow->session->cwindow_h - 
747                                 get_image("cwindow_active")->get_h() - 30;
748                 }
749                 else
750                 {
751                         buttons_h = ctimebar_h + 
752                                 widget_border +
753                                 EditPanel::calculate_h(mwindow) +
754                                 widget_border;
755                         ctransport_x = widget_border;
756                         ctransport_y = mwindow->session->cwindow_h - 
757                                 buttons_h + 
758                                 ctimebar_h + 
759                                 widget_border;
760                         
761                         cedit_x = ctransport_x + transport_w + widget_border;
762                         cedit_y = ctransport_y;
763
764                         czoom_x = cedit_x + edit_w + widget_border;
765                         czoom_y = cedit_y + widget_border;
766 //printf("Theme::get_cwindow_sizes %d %d %d\n", __LINE__, czoom_x, zoom_w);
767                         cstatus_x = czoom_x + zoom_w + division_w;
768                         cstatus_y = ctransport_y;
769                 }
770
771
772                 ccomposite_x = 0;
773                 ccomposite_y = 5;
774                 ccomposite_w = get_image("cpanel_bg")->get_w();
775                 ccomposite_h = mwindow->session->cwindow_h - buttons_h;
776
777
778
779
780
781
782
783                 ccanvas_x = ccomposite_x + ccomposite_w;
784                 ccanvas_y = 0;
785                 ccanvas_h = ccomposite_h;
786
787
788                 ccanvas_w = cmeter_x - ccanvas_x - widget_border;
789 SET_TRACE
790         }
791         else
792 // no controls
793         {
794 SET_TRACE
795                 ccomposite_x = -get_image("cpanel_bg")->get_w();
796                 ccomposite_y = 0;
797                 ccomposite_w = get_image("cpanel_bg")->get_w();
798                 ccomposite_h = mwindow->session->cwindow_h - get_image("cbuttons_left")->get_h();
799
800                 cedit_x = 10;
801                 cedit_y = mwindow->session->cwindow_h + 17;
802                 ctransport_x = 10;
803                 ctransport_y = cedit_y + 40;
804                 ccanvas_x = 0;
805                 ccanvas_y = 0;
806                 ccanvas_w = mwindow->session->cwindow_w;
807                 ccanvas_h = mwindow->session->cwindow_h;
808                 cmeter_x = mwindow->session->cwindow_w;
809                 cstatus_x = mwindow->session->cwindow_w;
810                 cstatus_y = mwindow->session->cwindow_h;
811                 czoom_x = mwindow->session->cwindow_w;
812                 czoom_y = mwindow->session->cwindow_h;
813 SET_TRACE
814         }
815
816 SET_TRACE
817
818
819         cmeter_y = widget_border;
820         cmeter_h = mwindow->session->cwindow_h - cmeter_y - widget_border;
821
822 //      ctimebar_x = ccanvas_x;
823 //      ctimebar_y = ccanvas_y + ccanvas_h;
824 //      ctimebar_w = ccanvas_w;
825         ctimebar_x = 0;
826         ctimebar_y = ccanvas_y + ccanvas_h;
827         ctimebar_w = mwindow->session->cwindow_w;
828         if(mwindow->edl->session->cwindow_meter)
829         {
830                 ctimebar_w = cmeter_x - widget_border;
831         }
832
833 SET_TRACE
834 }
835
836
837
838
839
840 void Theme::draw_awindow_bg(AWindowGUI *gui)
841 {
842         gui->clear_box(0, 0, mwindow->session->awindow_w, mwindow->session->awindow_h);
843         gui->flash();
844 }
845
846 void Theme::draw_vwindow_bg(VWindowGUI *gui)
847 {
848 //      gui->clear_box(0, 
849 //              0, 
850 //              mwindow->session->vwindow_w, 
851 //              mwindow->session->vwindow_h);
852 // // Timebar
853 //      gui->draw_3segmenth(vtimebar_x, 
854 //              vtimebar_y, 
855 //              vtimebar_w, 
856 //              vtimebar_bg_data,
857 //              0);
858 //      gui->flash();
859 }
860
861
862 void Theme::draw_cwindow_bg(CWindowGUI *gui)
863 {
864         gui->clear_box(0, 0, mwindow->session->cwindow_w, mwindow->session->cwindow_h);
865         gui->flash();
866 }
867
868 void Theme::draw_lwindow_bg(LevelWindowGUI *gui)
869 {
870         gui->clear_box(0, 0, mwindow->session->lwindow_w, mwindow->session->lwindow_h);
871         gui->flash();
872 }
873
874
875 void Theme::draw_rmonitor_bg(RecordMonitorGUI *gui)
876 {
877         gui->clear_box(0, 0, mwindow->session->rmonitor_w, mwindow->session->rmonitor_h);
878         gui->flash();
879 }
880
881
882 void Theme::draw_rwindow_bg(RecordGUI *gui)
883 {
884         gui->clear_box(0, 0, mwindow->session->rwindow_w, mwindow->session->rwindow_h);
885 }
886
887
888 void Theme::draw_resource_bg(TrackCanvas *canvas,
889         ResourcePixmap *pixmap, 
890         int edit_x,
891         int edit_w,
892         int pixmap_x,
893         int x1, 
894         int y1, 
895         int x2,
896         int y2)
897 {
898         VFrame *image;
899
900         switch(mwindow->edl->local_session->zoom_track)
901         {
902                 case 1024: image = get_image("resource1024");  break;
903                 case 512: image = get_image("resource512");  break;
904                 case 256: image = get_image("resource256");  break;
905                 case 128: image = get_image("resource128");  break;
906                 case 64:  image = get_image("resource64");   break;
907                 default:
908                 case 32:  image = get_image("resource32");   break;
909         }
910
911         canvas->draw_3segmenth(x1, 
912                 y1, 
913                 x2 - x1, 
914                 edit_x - pixmap_x,
915                 edit_w,
916                 image,
917                 pixmap);
918 }
919
920
921 void Theme::get_vwindow_sizes(VWindowGUI *gui)
922 {
923         int edit_w = EditPanel::calculate_w(mwindow, 0, 10);
924         int transport_w = PlayTransport::get_transport_width(mwindow) + toggle_margin;
925 // Space between buttons & time
926         int division_w = 30;
927         vtime_w = 150;
928         vtimebar_h = 16;
929         int vtime_border = 15;
930
931         vmeter_y = widget_border;
932         vmeter_h = mwindow->session->vwindow_h - cmeter_y - widget_border;
933
934         int buttons_h;
935         if(mwindow->edl->session->vwindow_meter)
936         {
937                 vmeter_x = mwindow->session->vwindow_w - 
938                         MeterPanel::get_meters_width(this,
939                                 mwindow->edl->session->audio_channels, 
940                                 mwindow->edl->session->vwindow_meter);
941         }
942         else
943         {
944                 vmeter_x = mwindow->session->vwindow_w + widget_border;
945         }
946
947         vcanvas_x = 0;
948         vcanvas_y = 0;
949         vcanvas_w = vmeter_x - vcanvas_x - widget_border;
950
951         if(edit_w +
952                 widget_border * 2 +
953                 transport_w + widget_border +
954                 vtime_w + division_w +
955                 vtime_border > vmeter_x)
956         {
957                 buttons_h = get_image("vbuttons_left")->get_h();
958                 vedit_x = widget_border;
959                 vedit_y = mwindow->session->vwindow_h -
960                         buttons_h + 
961                         vtimebar_h + 
962                         widget_border;
963                 
964                 vtransport_x = widget_border;
965                 vtransport_y = mwindow->session->vwindow_h - 
966                         get_image_set("autokeyframe")[0]->get_h() - 
967                         widget_border;
968
969                 vdivision_x = 280;
970                 vtime_x = vdivision_x;
971                 vtime_y = vedit_y + 20;
972         }
973         else
974         {
975                 buttons_h = vtimebar_h + 
976                         widget_border + 
977                         EditPanel::calculate_h(mwindow) +
978                         widget_border;
979                 vtransport_x = widget_border;
980                 vtransport_y = mwindow->session->vwindow_h - 
981                         buttons_h +
982                         vtimebar_h + 
983                         widget_border;
984                 
985                 vedit_x = vtransport_x + transport_w + widget_border;
986                 vedit_y = vtransport_y;
987                 
988                 vdivision_x = vedit_x + edit_w + division_w;
989                 vtime_x = vdivision_x + vtime_border;
990                 vtime_y = vedit_y + widget_border;
991         }
992
993
994 //      vtimebar_x = vcanvas_x;
995 //      vtimebar_y = vcanvas_y + vcanvas_h;
996 //      vtimebar_w = vcanvas_w;
997
998         vcanvas_h = mwindow->session->vwindow_h - buttons_h;
999         vtimebar_x = 0;
1000         vtimebar_y = vcanvas_y + vcanvas_h;
1001         vtimebar_w = vmeter_x - widget_border;
1002
1003 }
1004
1005
1006 void Theme::get_awindow_sizes(AWindowGUI *gui)
1007 {
1008         abuttons_x = 0; 
1009         abuttons_y = 0;
1010         afolders_x = 0;
1011 //      afolders_y = deletedisk_data[0]->get_h();
1012         afolders_y = 0;
1013         afolders_w = mwindow->session->afolders_w;
1014         afolders_h = mwindow->session->awindow_h - afolders_y;
1015         adivider_x = afolders_x + afolders_w;
1016         adivider_y = 0;
1017         adivider_w = 5;
1018         adivider_h = afolders_h;
1019         alist_x = afolders_x + afolders_w + 5;
1020         alist_y = afolders_y;
1021         alist_w = mwindow->session->awindow_w - alist_x;
1022         alist_h = afolders_h;
1023 }
1024
1025 void Theme::get_rmonitor_sizes(int do_audio, 
1026         int do_video,
1027         int do_channel,
1028         int do_interlace,
1029         int do_avc,
1030         int audio_channels)
1031 {
1032         int x = 10;
1033         int y = 3;
1034
1035
1036         if(do_avc)
1037         {
1038                 rmonitor_canvas_y = 30;
1039                 rmonitor_tx_x = 10;
1040                 rmonitor_tx_y = 0;
1041         }
1042         else
1043         {
1044                 rmonitor_canvas_y = 0;
1045                 rmonitor_tx_x = 0;
1046                 rmonitor_tx_y = 0;
1047         }
1048
1049
1050         if(do_channel)
1051         {
1052                 y = 5;
1053                 rmonitor_channel_x = x;
1054                 rmonitor_channel_y = 5;
1055                 x += 280;
1056                 rmonitor_canvas_y = 35;
1057         }
1058
1059         if(do_interlace)
1060         {
1061                 y = 4;
1062                 rmonitor_interlace_x = x;
1063                 rmonitor_interlace_y = y;
1064         }
1065
1066
1067         if(do_audio)
1068         {
1069                 if(do_video)
1070                 {
1071                         rmonitor_meter_x = mwindow->session->rmonitor_w - 
1072                                 MeterPanel::get_meters_width(this, audio_channels, 1);
1073                         rmonitor_meter_w = mwindow->session->rmonitor_w;
1074                 }
1075                 else
1076                 {
1077                         rmonitor_meter_x = widget_border;
1078                         rmonitor_meter_w = mwindow->session->rmonitor_w - widget_border * 2;
1079                 }
1080
1081                 rmonitor_meter_y = 40;
1082                 rmonitor_meter_h = mwindow->session->rmonitor_h - 10 - rmonitor_meter_y;
1083         }
1084         else
1085         {
1086                 rmonitor_meter_x = mwindow->session->rmonitor_w;
1087         }
1088
1089         rmonitor_canvas_x = 0;
1090         rmonitor_canvas_w = rmonitor_meter_x - rmonitor_canvas_x;
1091         if(do_audio) rmonitor_canvas_w -= 10;
1092         rmonitor_canvas_h = mwindow->session->rmonitor_h - rmonitor_canvas_y;
1093
1094         if(!do_video && do_audio)
1095         {
1096                 rmonitor_meter_y -= 30;
1097                 rmonitor_meter_h += 30;
1098         }
1099
1100 }
1101
1102 void Theme::get_recordgui_sizes(RecordGUI *gui, int w, int h)
1103 {
1104 }
1105
1106 void Theme::get_batchrender_sizes(BatchRenderGUI *gui,
1107         int w, 
1108         int h)
1109 {
1110         batchrender_x1 = 10;
1111         batchrender_x2 = 300;
1112         batchrender_x3 = 400;
1113 }
1114
1115 void Theme::get_plugindialog_sizes()
1116 {
1117         int x = 10, y = 30;
1118         plugindialog_new_x = x;
1119         plugindialog_new_y = y;
1120         plugindialog_shared_x = mwindow->session->plugindialog_w / 3;
1121         plugindialog_shared_y = y;
1122         plugindialog_module_x = mwindow->session->plugindialog_w * 2 / 3;
1123         plugindialog_module_y = y;
1124
1125         plugindialog_new_w = plugindialog_shared_x - plugindialog_new_x - 10;
1126         plugindialog_new_h = mwindow->session->plugindialog_h - 100;
1127         plugindialog_shared_w = plugindialog_module_x - plugindialog_shared_x - 10;
1128         plugindialog_shared_h = mwindow->session->plugindialog_h - 100;
1129         plugindialog_module_w = mwindow->session->plugindialog_w - plugindialog_module_x - 10;
1130         plugindialog_module_h = mwindow->session->plugindialog_h - 100;
1131
1132         plugindialog_newattach_x = plugindialog_new_x + 20;
1133         plugindialog_newattach_y = plugindialog_new_y + plugindialog_new_h + 10;
1134         plugindialog_sharedattach_x = plugindialog_shared_x + 20;
1135         plugindialog_sharedattach_y = plugindialog_shared_y + plugindialog_shared_h + 10;
1136         plugindialog_moduleattach_x = plugindialog_module_x + 20;
1137         plugindialog_moduleattach_y = plugindialog_module_y + plugindialog_module_h + 10;
1138 }
1139
1140 // void Theme::get_presetdialog_sizes(PresetsWindow *gui)
1141 // {
1142 //      int x = window_border;
1143 //      int y = window_border + BC_Title::calculate_h(gui, "P") + widget_border;
1144 // 
1145 //      presets_list_x = x;
1146 //      presets_list_y = y;
1147 //      presets_list_w = mwindow->session->presetdialog_w / 2;
1148 //      presets_list_h = mwindow->session->presetdialog_h - 
1149 //              BC_OKButton::calculate_h() - 
1150 //              presets_list_y -
1151 //              widget_border -
1152 //              window_border;
1153 //      presets_text_x = presets_list_x + presets_list_w + widget_border;
1154 //      presets_text_y = y;
1155 //      presets_text_w = mwindow->session->presetdialog_w - presets_text_x - window_border;
1156 //      y += BC_TextBox::calculate_h(gui, 
1157 //              MEDIUMFONT, 
1158 //              1, 
1159 //              1) + widget_border;
1160 // 
1161 //      presets_delete_x = presets_text_x;
1162 //      presets_delete_y = y;
1163 //      y += BC_GenericButton::calculate_h() + widget_border;
1164 // 
1165 //      presets_save_x = presets_text_x;
1166 //      presets_save_y = y;
1167 //      y += BC_GenericButton::calculate_h() + widget_border;
1168 // 
1169 //      presets_apply_x = presets_text_x;
1170 //      presets_apply_y = y;
1171 //      y += BC_GenericButton::calculate_h();
1172 // }
1173
1174 void Theme::get_keyframedialog_sizes(KeyFrameWindow *gui)
1175 {
1176         int x = window_border;
1177         int y = window_border + 
1178                 BC_Title::calculate_h(gui, "P", LARGEFONT) + 
1179                 widget_border;
1180
1181         presets_list_x = x;
1182         presets_list_y = y;
1183 #ifdef EDIT_KEYFRAME
1184         presets_list_w = mwindow->session->keyframedialog_w / 2 - 
1185                 widget_border - 
1186                 window_border;
1187 #else
1188         presets_list_w = mwindow->session->keyframedialog_w - 
1189                 presets_list_x -
1190                 window_border;
1191 #endif
1192         presets_list_h = mwindow->session->keyframedialog_h - 
1193                 BC_OKButton::calculate_h() - 
1194                 presets_list_y -
1195                 widget_border -
1196                 widget_border -
1197                 BC_Title::calculate_h(gui, "P") - 
1198                 widget_border -
1199                 BC_TextBox::calculate_h(gui, 
1200                         MEDIUMFONT, 
1201                         1, 
1202                         1) -
1203                 widget_border -
1204                 (BC_GenericButton::calculate_h() + widget_border) * 3 - 
1205                 window_border;
1206         y += presets_list_h + widget_border + widget_border + BC_Title::calculate_h(gui, "P");
1207         presets_text_x = x;
1208         presets_text_y = y;
1209         presets_text_w = presets_list_w;
1210         y += BC_TextBox::calculate_h(gui, 
1211                 MEDIUMFONT, 
1212                 1, 
1213                 1) + widget_border;
1214
1215         presets_delete_x = presets_text_x;
1216         presets_delete_y = y;
1217         y += BC_GenericButton::calculate_h() + widget_border;
1218
1219         presets_save_x = presets_text_x;
1220         presets_save_y = y;
1221         y += BC_GenericButton::calculate_h() + widget_border;
1222
1223         presets_apply_x = presets_text_x;
1224         presets_apply_y = y;
1225         y += BC_GenericButton::calculate_h();
1226
1227 #ifdef EDIT_KEYFRAME
1228         x = mwindow->session->keyframedialog_w / 2 + widget_border;
1229         y = window_border + 
1230                 BC_Title::calculate_h(gui, "P", LARGEFONT) + 
1231                 widget_border;
1232
1233         keyframe_list_x = x;
1234         keyframe_list_y = y;
1235         keyframe_list_w = mwindow->session->keyframedialog_w / 2 - 
1236                 widget_border - 
1237                 window_border;
1238         keyframe_list_h = mwindow->session->keyframedialog_h - 
1239                 keyframe_list_y -
1240                 widget_border -
1241                 widget_border -
1242                 BC_Title::calculate_h(gui, "P") -
1243                 widget_border - 
1244                 BC_TextBox::calculate_h(gui,
1245                         MEDIUMFONT,
1246                         1,
1247                         1) -
1248                 widget_border - 
1249                 BC_Title::calculate_h(gui, "P") -
1250                 widget_border -
1251                 BC_OKButton::calculate_h() - 
1252                 window_border;
1253 //      keyframe_text_x = keyframe_list_x + keyframe_list_w + widget_border;
1254 //      keyframe_text_y = y;
1255 //      keyframe_text_w = mwindow->session->keyframedialog_w - keyframe_text_x - window_border;
1256 //      y += BC_TextBox::calculate_h(gui, 
1257 //              MEDIUMFONT, 
1258 //              1, 
1259 //              1) + widget_border;
1260 // 
1261
1262         y += keyframe_list_h + BC_Title::calculate_h(gui, "P") + widget_border + widget_border;
1263         keyframe_value_x = keyframe_list_x;
1264         keyframe_value_y = y;
1265         keyframe_value_w = keyframe_list_w;
1266         y += BC_TextBox::calculate_h(gui, 
1267                 MEDIUMFONT, 
1268                 1, 
1269                 1) + widget_border;
1270
1271         keyframe_all_x = keyframe_value_x;
1272         keyframe_all_y = y;
1273
1274 #endif
1275
1276 }
1277
1278
1279 void Theme::get_menueffect_sizes(int use_list)
1280 {
1281         if(use_list)
1282         {
1283                 menueffect_list_x = 10;
1284                 menueffect_list_y = 10;
1285                 menueffect_list_w = mwindow->session->menueffect_w - 400;
1286                 menueffect_list_h = mwindow->session->menueffect_h - 
1287                         menueffect_list_y -
1288                         BC_OKButton::calculate_h() - 10;
1289         }
1290         else
1291         {
1292                 menueffect_list_x = 0;
1293                 menueffect_list_y = 10;
1294                 menueffect_list_w = 0;
1295                 menueffect_list_h = 0;
1296         }
1297
1298         menueffect_file_x = menueffect_list_x + menueffect_list_w + 10;
1299         menueffect_file_y = 10;
1300
1301         menueffect_tools_x = menueffect_file_x;
1302         menueffect_tools_y = menueffect_file_y + 20;
1303 }
1304
1305 void Theme::get_preferences_sizes()
1306 {
1307 }
1308
1309 void Theme::draw_preferences_bg(PreferencesWindow *gui)
1310 {
1311 }
1312
1313 void Theme::get_new_sizes(NewWindow *gui)
1314 {
1315 }
1316
1317 void Theme::draw_new_bg(NewWindow *gui)
1318 {
1319 }
1320
1321 void Theme::draw_setformat_bg(SetFormatWindow *window)
1322 {
1323 }
1324
1325
1326
1327
1328
1329
1330