r1009: Move the dependencies to newer package names
[cinelerra_cv/mob.git] / cinelerra / mwindowgui.C
blob9c17a147b273bc19ee8935d76d9f4568ee631141
1 #include "awindowgui.h"
2 #include "awindow.h"
3 #include "bcsignals.h"
4 #include "cwindowgui.h"
5 #include "cwindow.h"
6 #include "bchash.h"
7 #include "editpopup.h"
8 #include "edl.h"
9 #include "edlsession.h"
10 #include "filesystem.h"
11 #include "keyframepopup.h"
12 #include "keys.h"
13 #include "language.h"
14 #include "localsession.h"
15 #include "mainclock.h"
16 #include "maincursor.h"
17 #include "mainmenu.h"
18 #include "mainsession.h"
19 #include "mainundo.h"
20 #include "mbuttons.h"
21 #include "mtimebar.h"
22 #include "mwindowgui.h"
23 #include "mwindow.h"
24 #include "patchbay.h"
25 #include "pluginpopup.h"
26 #include "samplescroll.h"
27 #include "statusbar.h"
28 #include "theme.h"
29 #include "trackcanvas.h"
30 #include "trackscroll.h"
31 #include "tracks.h"
32 #include "transitionpopup.h"
33 #include "vwindowgui.h"
34 #include "vwindow.h"
35 #include "zoombar.h"
37 // the main window uses its own private colormap for video
38 MWindowGUI::MWindowGUI(MWindow *mwindow)
39  : BC_Window(PROGRAM_NAME ": Program", 
40                 mwindow->session->mwindow_x, 
41                 mwindow->session->mwindow_y, 
42                 mwindow->session->mwindow_w, 
43                 mwindow->session->mwindow_h, 
44                 100,
45                 100,
46                 1,
47                 1,
48                 1)
50         this->mwindow = mwindow;
51         samplescroll = 0;
52         trackscroll = 0;
53         cursor = 0;
54         canvas = 0;
58 MWindowGUI::~MWindowGUI()
60         delete mbuttons;
61         delete statusbar;
62         delete zoombar;
63         if(samplescroll) delete samplescroll;
64         if(trackscroll) delete trackscroll;
65         delete cursor;
66         delete patchbay;
67         delete timebar;
68         delete mainclock;
69         delete edit_menu;
70         delete plugin_menu;
71         delete keyframe_menu;
72         delete transition_menu;
75 void MWindowGUI::get_scrollbars()
77 //printf("MWindowGUI::get_scrollbars 1\n");
78         int64_t h_needed = mwindow->edl->get_tracks_height(mwindow->theme);
79         int64_t w_needed = mwindow->edl->get_tracks_width();
80         int need_xscroll = 0;
81         int need_yscroll = 0;
82         view_w = mwindow->theme->mcanvas_w;
83         view_h = mwindow->theme->mcanvas_h;
84 //printf("MWindowGUI::get_scrollbars 1\n");
86 // Scrollbars are constitutive
87         need_xscroll = need_yscroll = 1;
88         view_h = mwindow->theme->mcanvas_h;
89         view_w = mwindow->theme->mcanvas_w;
91 //      for(int i = 0; i < 2; i++)
92 //      {
93 //              if(w_needed > view_w)
94 //              {
95 //                      need_xscroll = 1;
96 //                      view_h = mwindow->theme->mcanvas_h - SCROLL_SPAN;
97 //              }
98 //              else
99 //                      need_xscroll = 0;
100 // 
101 //              if(h_needed > view_h)
102 //              {
103 //                      need_yscroll = 1;
104 //                      view_w = mwindow->theme->mcanvas_w - SCROLL_SPAN;
105 //              }
106 //              else
107 //                      need_yscroll = 0;
108 //      }
109 //printf("MWindowGUI::get_scrollbars 1\n");
111         if(canvas && (view_w != canvas->get_w() || view_h != canvas->get_h()))
112         {
113                 canvas->reposition_window(mwindow->theme->mcanvas_x,
114                         mwindow->theme->mcanvas_y,
115                         view_w,
116                         view_h);
117         }
118 //printf("MWindowGUI::get_scrollbars 1\n");
120         if(need_xscroll)
121         {
122                 if(!samplescroll)
123                         add_subwindow(samplescroll = new SampleScroll(mwindow, 
124                                 this, 
125                                 mwindow->theme->mhscroll_x, 
126                                 mwindow->theme->mhscroll_y, 
127                                 mwindow->theme->mhscroll_w));
128                 else
129                         samplescroll->resize_event();
131                 samplescroll->set_position();
132         }
133         else
134         {
135                 if(samplescroll) delete samplescroll;
136                 samplescroll = 0;
137                 mwindow->edl->local_session->view_start = 0;
138         }
139 //printf("MWindowGUI::get_scrollbars 1\n");
141         if(need_yscroll)
142         {
143 //printf("MWindowGUI::get_scrollbars 1.1 %p %p\n", this, canvas);
144                 if(!trackscroll)
145                         add_subwindow(trackscroll = new TrackScroll(mwindow, 
146                                 this,
147                                 mwindow->theme->mvscroll_x,
148                                 mwindow->theme->mvscroll_y,
149                                 mwindow->theme->mvscroll_h));
150                 else
151                         trackscroll->resize_event();
154 //printf("MWindowGUI::get_scrollbars 1.2\n");
155                 trackscroll->update_length(mwindow->edl->get_tracks_height(mwindow->theme),
156                         mwindow->edl->local_session->track_start,
157                         view_h);
158 //printf("MWindowGUI::get_scrollbars 1.3\n");
159         }
160         else
161         {
162                 if(trackscroll) delete trackscroll;
163                 trackscroll = 0;
164                 mwindow->edl->local_session->track_start = 0;
165         }
166 //printf("get_scrollbars 2 %d %d\n", need_xscroll, w_needed);
169 int MWindowGUI::create_objects()
171 SET_TRACE
172         set_icon(mwindow->theme->get_image("mwindow_icon"));
173         
174 SET_TRACE
176         cursor = 0;
177         add_subwindow(mainmenu = new MainMenu(mwindow, this));
178 SET_TRACE
180         mwindow->theme->get_mwindow_sizes(this, get_w(), get_h());
181 SET_TRACE
182         mwindow->theme->draw_mwindow_bg(this);
183 SET_TRACE
184         mainmenu->create_objects();
185 SET_TRACE
187         add_subwindow(mbuttons = new MButtons(mwindow, this));
188         mbuttons->create_objects();
189 SET_TRACE
191         add_subwindow(timebar = new MTimeBar(mwindow, 
192                 this,
193                 mwindow->theme->mtimebar_x,
194                 mwindow->theme->mtimebar_y,
195                 mwindow->theme->mtimebar_w,
196                 mwindow->theme->mtimebar_h));
197         timebar->create_objects();
198 SET_TRACE
200         add_subwindow(patchbay = new PatchBay(mwindow, this));
201         patchbay->create_objects();
202 SET_TRACE
204         get_scrollbars();
206 SET_TRACE
207         mwindow->gui->add_subwindow(canvas = new TrackCanvas(mwindow, this));
208         canvas->create_objects();
209 SET_TRACE
211         add_subwindow(zoombar = new ZoomBar(mwindow, this));
212         zoombar->create_objects();
213 SET_TRACE
215         add_subwindow(statusbar = new StatusBar(mwindow, this));
216         statusbar->create_objects();
217 SET_TRACE
219         add_subwindow(mainclock = new MainClock(mwindow, 
220                 mwindow->theme->mclock_x,
221                 mwindow->theme->mclock_y,
222                 mwindow->theme->mclock_w));
223         mainclock->set_frame_offset( (double) 
224                 (mwindow->edl->session->get_frame_offset() /
225                 mwindow->edl->session->frame_rate));
226         mainclock->update(0);
228 SET_TRACE
230         cursor = new MainCursor(mwindow, this);
231         cursor->create_objects();
232 SET_TRACE
234         add_subwindow(edit_menu = new EditPopup(mwindow, this));
235         edit_menu->create_objects();
236 SET_TRACE
238         add_subwindow(plugin_menu = new PluginPopup(mwindow, this));
239         plugin_menu->create_objects();
240 SET_TRACE
242         add_subwindow(keyframe_menu = new KeyframePopup(mwindow, this));
243         keyframe_menu->create_objects();
245         add_subwindow(transition_menu = new TransitionPopup(mwindow, this));
246         transition_menu->create_objects();
247 SET_TRACE
249         canvas->activate();
250 SET_TRACE
251         return 0;
254 void MWindowGUI::update_title(char *path)
256         FileSystem fs;
257         char filename[BCTEXTLEN], string[BCTEXTLEN];
258         fs.extract_name(filename, path);
259         sprintf(string, PROGRAM_NAME ": %s", filename);
260         set_title(string);
261 //printf("MWindowGUI::update_title %s\n", string);
262         flush();
265 void MWindowGUI::redraw_time_dependancies() 
267         zoombar->redraw_time_dependancies();
268         timebar->update();
269         mainclock->update(mwindow->edl->local_session->get_selectionstart(1));
272 int MWindowGUI::focus_in_event()
274         cursor->focus_in_event();
275         return 1;
278 int MWindowGUI::focus_out_event()
280         cursor->focus_out_event();
281         return 1;
285 int MWindowGUI::resize_event(int w, int h)
287         mwindow->session->mwindow_w = w;
288         mwindow->session->mwindow_h = h;
289         mwindow->theme->get_mwindow_sizes(this, w, h);
290         mwindow->theme->draw_mwindow_bg(this);
291         flash();
292         mainmenu->reposition_window(0, 0, w, mainmenu->get_h());
293         mbuttons->resize_event();
294         statusbar->resize_event();
295         timebar->resize_event();
296         patchbay->resize_event();
297         zoombar->resize_event();
298         get_scrollbars();
299         canvas->resize_event();
300         return 0;
304 void MWindowGUI::update(int scrollbars,
305         int canvas,
306         int timebar,
307         int zoombar,
308         int patchbay, 
309         int clock,
310         int buttonbar)
312         mwindow->edl->tracks->update_y_pixels(mwindow->theme);
313         if(scrollbars) this->get_scrollbars();
314         if(timebar) this->timebar->update();
315         if(zoombar) this->zoombar->update();
316         if(patchbay) this->patchbay->update();
317         if(clock) this->mainclock->update(
318                 mwindow->edl->local_session->get_selectionstart(1));
319         if(canvas)
320         {
321                 this->canvas->draw(canvas);
322                 this->cursor->show();
323                 this->canvas->flash();
324 // Activate causes the menubar to deactivate.  Don't want this for
325 // picon thread.
326                 if(canvas != 3) this->canvas->activate();
327         }
328         if(buttonbar) mbuttons->update();
330 // Can't age if the cache called this to draw missing picons
331         if(canvas != 2 && canvas != 3)
332                 mwindow->age_caches();
335 int MWindowGUI::visible(int64_t x1, int64_t x2, int64_t view_x1, int64_t view_x2)
337         return (x1 >= view_x1 && x1 < view_x2) ||
338                 (x2 > view_x1 && x2 <= view_x2) ||
339                 (x1 <= view_x1 && x2 >= view_x2);
343 int MWindowGUI::show_message(char *message, int color)
345 //printf("MWindowGUI::show_message %s %d\n", message, color);
346         if(color < 0) color = mwindow->theme->message_normal;
347         statusbar->status_text->set_color(color);
348         statusbar->status_text->update(message);
349         return 0;
352 // Drag motion called from other window
353 int MWindowGUI::drag_motion()
355         if(get_hidden()) return 0;
357         canvas->drag_motion();
358         return 0;
361 int MWindowGUI::drag_stop()
363         if(get_hidden()) return 0;
365         int result = canvas->drag_stop();
366         return result;
369 void MWindowGUI::default_positions()
371 //printf("MWindowGUI::default_positions 1\n");
372         mwindow->vwindow->gui->lock_window("MWindowGUI::default_positions");
373         mwindow->cwindow->gui->lock_window("MWindowGUI::default_positions");
374         mwindow->awindow->gui->lock_window("MWindowGUI::default_positions");
376 // printf("MWindowGUI::default_positions 1 %d %d %d %d\n", mwindow->session->vwindow_x, 
377 // mwindow->session->vwindow_y,
378 // mwindow->session->vwindow_w, 
379 // mwindow->session->vwindow_h);
380         reposition_window(mwindow->session->mwindow_x, 
381                 mwindow->session->mwindow_y,
382                 mwindow->session->mwindow_w, 
383                 mwindow->session->mwindow_h);
384         mwindow->vwindow->gui->reposition_window(mwindow->session->vwindow_x, 
385                 mwindow->session->vwindow_y,
386                 mwindow->session->vwindow_w, 
387                 mwindow->session->vwindow_h);
388         mwindow->cwindow->gui->reposition_window(mwindow->session->cwindow_x, 
389                 mwindow->session->cwindow_y,
390                 mwindow->session->cwindow_w, 
391                 mwindow->session->cwindow_h);
392         mwindow->awindow->gui->reposition_window(mwindow->session->awindow_x, 
393                 mwindow->session->awindow_y,
394                 mwindow->session->awindow_w, 
395                 mwindow->session->awindow_h);
396 //printf("MWindowGUI::default_positions 1\n");
398         resize_event(mwindow->session->mwindow_w, 
399                 mwindow->session->mwindow_h);
400 //printf("MWindowGUI::default_positions 1\n");
401         mwindow->vwindow->gui->resize_event(mwindow->session->vwindow_w, 
402                 mwindow->session->vwindow_h);
403 //printf("MWindowGUI::default_positions 1\n");
404         mwindow->cwindow->gui->resize_event(mwindow->session->cwindow_w, 
405                 mwindow->session->cwindow_h);
406 //printf("MWindowGUI::default_positions 1\n");
407         mwindow->awindow->gui->resize_event(mwindow->session->awindow_w, 
408                 mwindow->session->awindow_h);
410 //printf("MWindowGUI::default_positions 1\n");
412         flush();
413         mwindow->vwindow->gui->flush();
414         mwindow->cwindow->gui->flush();
415         mwindow->awindow->gui->flush();
417         mwindow->vwindow->gui->unlock_window();
418         mwindow->cwindow->gui->unlock_window();
419         mwindow->awindow->gui->unlock_window();
420 //printf("MWindowGUI::default_positions 2\n");
439 int MWindowGUI::repeat_event(int64_t duration)
441 // if(duration == 100)
442 // mwindow->sync_parameters(CHANGE_ALL);
443         return cursor->repeat_event(duration);
447 int MWindowGUI::translation_event()
449 //printf("MWindowGUI::translation_event 1 %d %d\n", get_x(), get_y());
450         mwindow->session->mwindow_x = get_x();
451         mwindow->session->mwindow_y = get_y();
452         return 0;
456 int MWindowGUI::save_defaults(BC_Hash *defaults)
458         defaults->update("MWINDOWWIDTH", get_w());
459         defaults->update("MWINDOWHEIGHT", get_h());
460         mainmenu->save_defaults(defaults);
461         BC_WindowBase::save_defaults(defaults);
464 int MWindowGUI::keypress_event()
466 //printf("MWindowGUI::keypress_event 1 %d\n", get_keypress());
467         int result = 0;
468         result = mbuttons->keypress_event();
470         if(!result)
471         {
472                 switch(get_keypress())
473                 {
474                         case LEFT:
475                                 if(!ctrl_down()) 
476                                 { 
477                                         if (alt_down())
478                                         {
479                                                 unlock_window();
480                                                 mbuttons->transport->handle_transport(STOP, 1, 0, 0);
481                                                 lock_window("MWindowGUI::keypress_event 1");
482                                                 mwindow->prev_edit_handle(shift_down());
483                                         }
484                                         else
485                                                 mwindow->move_left(); 
486                                         result = 1; 
487                                 }
488                                 break;
489                         case RIGHT:
490                                 if(!ctrl_down()) 
491                                 { 
492                                         if (alt_down())
493                                         {
494                                                 unlock_window();
495                                                 mbuttons->transport->handle_transport(STOP, 1, 0, 0);
496                                                 lock_window("MWindowGUI::keypress_event 2");
497                                                 mwindow->next_edit_handle(shift_down());
498                                         }
499                                         else
500                                                 mwindow->move_right(); 
501                                         result = 1; 
502                                 }
503                                 break;
505                         case UP:
506                                 if(ctrl_down() && !alt_down())
507                                 {
508                                         mwindow->expand_y();
509                                         result = 1;
510                                 }
511                                 else
512                                 if(!ctrl_down() && alt_down())
513                                 {
514                                         mwindow->expand_autos(0,1,1);
515                                         result = 1;
516                                 }
517                                 else
518                                 if(ctrl_down() && alt_down())
519                                 {
520                                         mwindow->expand_autos(1,1,1);
521                                         result = 1;
522                                 }
523                                 else
524                                 {
525                                         mwindow->expand_sample();
526                                         result = 1;
527                                 }
528                                 break;
530                         case DOWN:
531                                 if(ctrl_down() && !alt_down())
532                                 {
533                                         mwindow->zoom_in_y();
534                                         result = 1;
535                                 }
536                                 else
537                                 if(!ctrl_down() && alt_down())
538                                 {
539                                         mwindow->shrink_autos(0,1,1);
540                                         result = 1;
541                                 }
542                                 else
543                                 if(ctrl_down() && alt_down())
544                                 {
545                                         mwindow->shrink_autos(1,1,1);
546                                         result = 1;
547                                 }
548                                 else
549                                 {
550                                         mwindow->zoom_in_sample();
551                                         result = 1;
552                                 }
553                                 break;
555                         case PGUP:
556                                 if(!ctrl_down())
557                                 {
558                                         mwindow->move_up();
559                                         result = 1;
560                                 }
561                                 else
562                                 {
563                                         mwindow->expand_t();
564                                         result = 1;
565                                 }
566                                 break;
568                         case PGDN:
569                                 if(!ctrl_down())
570                                 {
571                                         mwindow->move_down();
572                                         result = 1;
573                                 }
574                                 else
575                                 {
576                                         mwindow->zoom_in_t();
577                                         result = 1;
578                                 }
579                                 break;
581                         case TAB:
582                         case LEFTTAB:
583                                 int cursor_x = canvas->get_relative_cursor_x();
584                                 int cursor_y = canvas->get_relative_cursor_y();
586                                 if(get_keypress() == TAB)
587                                 {
588 // Switch the record button
589                                         for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
590                                         {
591                                                 int64_t track_x, track_y, track_w, track_h;
592                                                 canvas->track_dimensions(track, track_x, track_y, track_w, track_h);
594                                                 if(cursor_y >= track_y && 
595                                                         cursor_y < track_y + track_h)
596                                                 {
597                                                         if (track->record)
598                                                                 track->record = 0;
599                                                         else
600                                                                 track->record = 1;
601                                                         result = 1; 
602                                                         break;
603                                                 }
604                                         }
605                                 } 
606                                 else 
607                                 {
608                                         Track *this_track = 0;
609                                         for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
610                                         {
611                                                 int64_t track_x, track_y, track_w, track_h;
612                                                 canvas->track_dimensions(track, track_x, track_y, track_w, track_h);
614                                                 if(cursor_y >= track_y && 
615                                                         cursor_y < track_y + track_h)
616                                                 {
617                                                         // This is our track
618                                                         this_track = track;
619                                                         break;
620                                                 }
621                                         }
623                                         int total_selected = mwindow->edl->tracks->total_of(Tracks::RECORD);
625         // nothing previously selected
626                                         if(total_selected == 0)
627                                         {
628                                                 mwindow->edl->tracks->select_all(Tracks::RECORD,
629                                                         1);
630                                         }
631                                         else
632                                         if(total_selected == 1)
633                                         {
634         // this patch was previously the only one on
635                                                 if(this_track && this_track->record)
636                                                 {
637                                                         mwindow->edl->tracks->select_all(Tracks::RECORD,
638                                                                 1);
639                                                 }
640         // another patch was previously the only one on
641                                                 else
642                                                 {
643                                                         mwindow->edl->tracks->select_all(Tracks::RECORD,
644                                                                 0);
645                                                         if (this_track) 
646                                                                 this_track->record = 1;
648                                                 }
649                                         }
650                                         else
651                                         if(total_selected > 1)
652                                         {
653                                                 mwindow->edl->tracks->select_all(Tracks::RECORD,
654                                                         0);
655                                                 if (this_track) 
656                                                         this_track->record = 1;
657                                         }
659                                 }
661                                 update (0,
662                                                 1,
663                                                 0,
664                                                 0,
665                                                 1,
666                                                 0,
667                                                 1);
668                                 unlock_window();
669                                 mwindow->cwindow->update(0, 1, 1);
670                                 lock_window("TrackCanvas::keypress_event 3");
672                                 result = 1;
673                                 break;
674                 }
676 // since things under cursor have changed...
677                 if(result) 
678                         cursor_motion_event(); 
679         }
681         return result;
685 int MWindowGUI::close_event() 
687         mainmenu->quit(); 
690 int MWindowGUI::menu_h()
692         return mainmenu->get_h();