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