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