00001 #include "awindowgui.h"
00002 #include "awindow.h"
00003 #include "bcsignals.h"
00004 #include "cwindowgui.h"
00005 #include "cwindow.h"
00006 #include "bchash.h"
00007 #include "editpopup.h"
00008 #include "edl.h"
00009 #include "edlsession.h"
00010 #include "filesystem.h"
00011 #include "keyframepopup.h"
00012 #include "keys.h"
00013 #include "language.h"
00014 #include "localsession.h"
00015 #include "mainclock.h"
00016 #include "maincursor.h"
00017 #include "mainmenu.h"
00018 #include "mainsession.h"
00019 #include "mainundo.h"
00020 #include "mbuttons.h"
00021 #include "mtimebar.h"
00022 #include "mwindowgui.h"
00023 #include "mwindow.h"
00024 #include "patchbay.h"
00025 #include "pluginpopup.h"
00026 #include "samplescroll.h"
00027 #include "statusbar.h"
00028 #include "theme.h"
00029 #include "trackcanvas.h"
00030 #include "trackscroll.h"
00031 #include "tracks.h"
00032 #include "transitionpopup.h"
00033 #include "vwindowgui.h"
00034 #include "vwindow.h"
00035 #include "zoombar.h"
00036
00037
00038 MWindowGUI::MWindowGUI(MWindow *mwindow)
00039 : BC_Window(PROGRAM_NAME ": Program",
00040 mwindow->session->mwindow_x,
00041 mwindow->session->mwindow_y,
00042 mwindow->session->mwindow_w,
00043 mwindow->session->mwindow_h,
00044 100,
00045 100,
00046 1,
00047 1,
00048 1)
00049 {
00050 this->mwindow = mwindow;
00051 samplescroll = 0;
00052 trackscroll = 0;
00053 cursor = 0;
00054 canvas = 0;
00055 }
00056
00057
00058 MWindowGUI::~MWindowGUI()
00059 {
00060 delete mbuttons;
00061 delete statusbar;
00062 delete zoombar;
00063 if(samplescroll) delete samplescroll;
00064 if(trackscroll) delete trackscroll;
00065 delete cursor;
00066 delete patchbay;
00067 delete timebar;
00068 delete mainclock;
00069 delete edit_menu;
00070 delete plugin_menu;
00071 delete keyframe_menu;
00072 delete transition_menu;
00073 }
00074
00075 void MWindowGUI::get_scrollbars()
00076 {
00077
00078 int64_t h_needed = mwindow->edl->get_tracks_height(mwindow->theme);
00079 int64_t w_needed = mwindow->edl->get_tracks_width();
00080 int need_xscroll = 0;
00081 int need_yscroll = 0;
00082 view_w = mwindow->theme->mcanvas_w;
00083 view_h = mwindow->theme->mcanvas_h;
00084
00085
00086
00087 need_xscroll = need_yscroll = 1;
00088 view_h = mwindow->theme->mcanvas_h;
00089 view_w = mwindow->theme->mcanvas_w;
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 if(canvas && (view_w != canvas->get_w() || view_h != canvas->get_h()))
00112 {
00113 canvas->reposition_window(mwindow->theme->mcanvas_x,
00114 mwindow->theme->mcanvas_y,
00115 view_w,
00116 view_h);
00117 }
00118
00119
00120 if(need_xscroll)
00121 {
00122 if(!samplescroll)
00123 add_subwindow(samplescroll = new SampleScroll(mwindow,
00124 this,
00125 mwindow->theme->mhscroll_x,
00126 mwindow->theme->mhscroll_y,
00127 mwindow->theme->mhscroll_w));
00128 else
00129 samplescroll->resize_event();
00130
00131 samplescroll->set_position();
00132 }
00133 else
00134 {
00135 if(samplescroll) delete samplescroll;
00136 samplescroll = 0;
00137 mwindow->edl->local_session->view_start = 0;
00138 }
00139
00140
00141 if(need_yscroll)
00142 {
00143
00144 if(!trackscroll)
00145 add_subwindow(trackscroll = new TrackScroll(mwindow,
00146 this,
00147 mwindow->theme->mvscroll_x,
00148 mwindow->theme->mvscroll_y,
00149 mwindow->theme->mvscroll_h));
00150 else
00151 trackscroll->resize_event();
00152
00153
00154
00155 trackscroll->update_length(mwindow->edl->get_tracks_height(mwindow->theme),
00156 mwindow->edl->local_session->track_start,
00157 view_h);
00158
00159 }
00160 else
00161 {
00162 if(trackscroll) delete trackscroll;
00163 trackscroll = 0;
00164 mwindow->edl->local_session->track_start = 0;
00165 }
00166
00167 }
00168
00169 int MWindowGUI::create_objects()
00170 {
00171 SET_TRACE
00172 set_icon(mwindow->theme->get_image("mwindow_icon"));
00173
00174 SET_TRACE
00175
00176 cursor = 0;
00177 add_subwindow(mainmenu = new MainMenu(mwindow, this));
00178 SET_TRACE
00179
00180 mwindow->theme->get_mwindow_sizes(this, get_w(), get_h());
00181 SET_TRACE
00182 mwindow->theme->draw_mwindow_bg(this);
00183 SET_TRACE
00184 mainmenu->create_objects();
00185 SET_TRACE
00186
00187 add_subwindow(mbuttons = new MButtons(mwindow, this));
00188 mbuttons->create_objects();
00189 SET_TRACE
00190
00191 add_subwindow(timebar = new MTimeBar(mwindow,
00192 this,
00193 mwindow->theme->mtimebar_x,
00194 mwindow->theme->mtimebar_y,
00195 mwindow->theme->mtimebar_w,
00196 mwindow->theme->mtimebar_h));
00197 timebar->create_objects();
00198 SET_TRACE
00199
00200 add_subwindow(patchbay = new PatchBay(mwindow, this));
00201 patchbay->create_objects();
00202 SET_TRACE
00203
00204 get_scrollbars();
00205
00206 SET_TRACE
00207 mwindow->gui->add_subwindow(canvas = new TrackCanvas(mwindow, this));
00208 canvas->create_objects();
00209 SET_TRACE
00210
00211 add_subwindow(zoombar = new ZoomBar(mwindow, this));
00212 zoombar->create_objects();
00213 SET_TRACE
00214
00215 add_subwindow(statusbar = new StatusBar(mwindow, this));
00216 statusbar->create_objects();
00217 SET_TRACE
00218
00219 add_subwindow(mainclock = new MainClock(mwindow,
00220 mwindow->theme->mclock_x,
00221 mwindow->theme->mclock_y,
00222 mwindow->theme->mclock_w));
00223 mainclock->set_frame_offset( (double)
00224 (mwindow->edl->session->get_frame_offset() /
00225 mwindow->edl->session->frame_rate));
00226 mainclock->update(0);
00227
00228 SET_TRACE
00229
00230 cursor = new MainCursor(mwindow, this);
00231 cursor->create_objects();
00232 SET_TRACE
00233
00234 add_subwindow(edit_menu = new EditPopup(mwindow, this));
00235 edit_menu->create_objects();
00236 SET_TRACE
00237
00238 add_subwindow(plugin_menu = new PluginPopup(mwindow, this));
00239 plugin_menu->create_objects();
00240 SET_TRACE
00241
00242 add_subwindow(keyframe_menu = new KeyframePopup(mwindow, this));
00243 keyframe_menu->create_objects();
00244
00245 add_subwindow(transition_menu = new TransitionPopup(mwindow, this));
00246 transition_menu->create_objects();
00247 SET_TRACE
00248
00249 canvas->activate();
00250 SET_TRACE
00251 return 0;
00252 }
00253
00254 void MWindowGUI::update_title(char *path)
00255 {
00256 FileSystem fs;
00257 char filename[BCTEXTLEN], string[BCTEXTLEN];
00258 fs.extract_name(filename, path);
00259 sprintf(string, PROGRAM_NAME ": %s", filename);
00260 set_title(string);
00261
00262 flush();
00263 }
00264
00265 void MWindowGUI::redraw_time_dependancies()
00266 {
00267 zoombar->redraw_time_dependancies();
00268 timebar->update();
00269 mainclock->update(mwindow->edl->local_session->get_selectionstart(1));
00270 }
00271
00272 int MWindowGUI::focus_in_event()
00273 {
00274 cursor->focus_in_event();
00275 return 1;
00276 }
00277
00278 int MWindowGUI::focus_out_event()
00279 {
00280 cursor->focus_out_event();
00281 return 1;
00282 }
00283
00284
00285 int MWindowGUI::resize_event(int w, int h)
00286 {
00287 mwindow->session->mwindow_w = w;
00288 mwindow->session->mwindow_h = h;
00289 mwindow->theme->get_mwindow_sizes(this, w, h);
00290 mwindow->theme->draw_mwindow_bg(this);
00291 flash();
00292 mainmenu->reposition_window(0, 0, w, mainmenu->get_h());
00293 mbuttons->resize_event();
00294 statusbar->resize_event();
00295 timebar->resize_event();
00296 patchbay->resize_event();
00297 zoombar->resize_event();
00298 get_scrollbars();
00299 canvas->resize_event();
00300 return 0;
00301 }
00302
00303
00304 void MWindowGUI::update(int scrollbars,
00305 int canvas,
00306 int timebar,
00307 int zoombar,
00308 int patchbay,
00309 int clock,
00310 int buttonbar)
00311 {
00312 mwindow->edl->tracks->update_y_pixels(mwindow->theme);
00313 if(scrollbars) this->get_scrollbars();
00314 if(timebar) this->timebar->update();
00315 if(zoombar) this->zoombar->update();
00316 if(patchbay) this->patchbay->update();
00317 if(clock) this->mainclock->update(
00318 mwindow->edl->local_session->get_selectionstart(1));
00319 if(canvas)
00320 {
00321 this->canvas->draw(canvas);
00322 this->cursor->show();
00323 this->canvas->flash();
00324
00325
00326 if(canvas != 3) this->canvas->activate();
00327 }
00328 if(buttonbar) mbuttons->update();
00329
00330
00331 if(canvas != 2 && canvas != 3)
00332 mwindow->age_caches();
00333 }
00334
00335 int MWindowGUI::visible(int64_t x1, int64_t x2, int64_t view_x1, int64_t view_x2)
00336 {
00337 return (x1 >= view_x1 && x1 < view_x2) ||
00338 (x2 > view_x1 && x2 <= view_x2) ||
00339 (x1 <= view_x1 && x2 >= view_x2);
00340 }
00341
00342
00343 int MWindowGUI::show_message(char *message, int color)
00344 {
00345
00346 if(color < 0) color = mwindow->theme->message_normal;
00347 statusbar->status_text->set_color(color);
00348 statusbar->status_text->update(message);
00349 return 0;
00350 }
00351
00352
00353 int MWindowGUI::drag_motion()
00354 {
00355 if(get_hidden()) return 0;
00356
00357 canvas->drag_motion();
00358 return 0;
00359 }
00360
00361 int MWindowGUI::drag_stop()
00362 {
00363 if(get_hidden()) return 0;
00364
00365 int result = canvas->drag_stop();
00366 return result;
00367 }
00368
00369 void MWindowGUI::default_positions()
00370 {
00371
00372 mwindow->vwindow->gui->lock_window("MWindowGUI::default_positions");
00373 mwindow->cwindow->gui->lock_window("MWindowGUI::default_positions");
00374 mwindow->awindow->gui->lock_window("MWindowGUI::default_positions");
00375
00376
00377
00378
00379
00380 reposition_window(mwindow->session->mwindow_x,
00381 mwindow->session->mwindow_y,
00382 mwindow->session->mwindow_w,
00383 mwindow->session->mwindow_h);
00384 mwindow->vwindow->gui->reposition_window(mwindow->session->vwindow_x,
00385 mwindow->session->vwindow_y,
00386 mwindow->session->vwindow_w,
00387 mwindow->session->vwindow_h);
00388 mwindow->cwindow->gui->reposition_window(mwindow->session->cwindow_x,
00389 mwindow->session->cwindow_y,
00390 mwindow->session->cwindow_w,
00391 mwindow->session->cwindow_h);
00392 mwindow->awindow->gui->reposition_window(mwindow->session->awindow_x,
00393 mwindow->session->awindow_y,
00394 mwindow->session->awindow_w,
00395 mwindow->session->awindow_h);
00396
00397
00398 resize_event(mwindow->session->mwindow_w,
00399 mwindow->session->mwindow_h);
00400
00401 mwindow->vwindow->gui->resize_event(mwindow->session->vwindow_w,
00402 mwindow->session->vwindow_h);
00403
00404 mwindow->cwindow->gui->resize_event(mwindow->session->cwindow_w,
00405 mwindow->session->cwindow_h);
00406
00407 mwindow->awindow->gui->resize_event(mwindow->session->awindow_w,
00408 mwindow->session->awindow_h);
00409
00410
00411
00412 flush();
00413 mwindow->vwindow->gui->flush();
00414 mwindow->cwindow->gui->flush();
00415 mwindow->awindow->gui->flush();
00416
00417 mwindow->vwindow->gui->unlock_window();
00418 mwindow->cwindow->gui->unlock_window();
00419 mwindow->awindow->gui->unlock_window();
00420
00421 }
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439 int MWindowGUI::repeat_event(int64_t duration)
00440 {
00441
00442
00443 return cursor->repeat_event(duration);
00444 }
00445
00446
00447 int MWindowGUI::translation_event()
00448 {
00449
00450 mwindow->session->mwindow_x = get_x();
00451 mwindow->session->mwindow_y = get_y();
00452 return 0;
00453 }
00454
00455
00456 int MWindowGUI::save_defaults(BC_Hash *defaults)
00457 {
00458 defaults->update("MWINDOWWIDTH", get_w());
00459 defaults->update("MWINDOWHEIGHT", get_h());
00460 mainmenu->save_defaults(defaults);
00461 BC_WindowBase::save_defaults(defaults);
00462 }
00463
00464 int MWindowGUI::keypress_event()
00465 {
00466
00467 int result = 0;
00468 result = mbuttons->keypress_event();
00469
00470 if(!result)
00471 {
00472 switch(get_keypress())
00473 {
00474 case 'e':
00475 mwindow->toggle_editing_mode();
00476 result = 1;
00477 break;
00478 case LEFT:
00479 if(!ctrl_down())
00480 {
00481 if (alt_down())
00482 {
00483 unlock_window();
00484 mbuttons->transport->handle_transport(STOP, 1, 0, 0);
00485 lock_window("MWindowGUI::keypress_event 1");
00486 mwindow->prev_edit_handle(shift_down());
00487 }
00488 else
00489 mwindow->move_left();
00490 result = 1;
00491 }
00492 break;
00493 case RIGHT:
00494 if(!ctrl_down())
00495 {
00496 if (alt_down())
00497 {
00498 unlock_window();
00499 mbuttons->transport->handle_transport(STOP, 1, 0, 0);
00500 lock_window("MWindowGUI::keypress_event 2");
00501 mwindow->next_edit_handle(shift_down());
00502 }
00503 else
00504 mwindow->move_right();
00505 result = 1;
00506 }
00507 break;
00508
00509 case UP:
00510 if(ctrl_down() && !alt_down())
00511 {
00512 mwindow->expand_y();
00513 result = 1;
00514 }
00515 else
00516 if(!ctrl_down() && alt_down())
00517 {
00518 mwindow->expand_autos(0,1,1);
00519 result = 1;
00520 }
00521 else
00522 if(ctrl_down() && alt_down())
00523 {
00524 mwindow->expand_autos(1,1,1);
00525 result = 1;
00526 }
00527 else
00528 {
00529 mwindow->expand_sample();
00530 result = 1;
00531 }
00532 break;
00533
00534 case DOWN:
00535 if(ctrl_down() && !alt_down())
00536 {
00537 mwindow->zoom_in_y();
00538 result = 1;
00539 }
00540 else
00541 if(!ctrl_down() && alt_down())
00542 {
00543 mwindow->shrink_autos(0,1,1);
00544 result = 1;
00545 }
00546 else
00547 if(ctrl_down() && alt_down())
00548 {
00549 mwindow->shrink_autos(1,1,1);
00550 result = 1;
00551 }
00552 else
00553 {
00554 mwindow->zoom_in_sample();
00555 result = 1;
00556 }
00557 break;
00558
00559 case PGUP:
00560 if(!ctrl_down())
00561 {
00562 mwindow->move_up();
00563 result = 1;
00564 }
00565 else
00566 {
00567 mwindow->expand_t();
00568 result = 1;
00569 }
00570 break;
00571
00572 case PGDN:
00573 if(!ctrl_down())
00574 {
00575 mwindow->move_down();
00576 result = 1;
00577 }
00578 else
00579 {
00580 mwindow->zoom_in_t();
00581 result = 1;
00582 }
00583 break;
00584
00585 case TAB:
00586 case LEFTTAB:
00587 int cursor_x = canvas->get_relative_cursor_x();
00588 int cursor_y = canvas->get_relative_cursor_y();
00589
00590 if(get_keypress() == TAB)
00591 {
00592
00593 for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
00594 {
00595 int64_t track_x, track_y, track_w, track_h;
00596 canvas->track_dimensions(track, track_x, track_y, track_w, track_h);
00597
00598 if(cursor_y >= track_y &&
00599 cursor_y < track_y + track_h)
00600 {
00601 if (track->record)
00602 track->record = 0;
00603 else
00604 track->record = 1;
00605 result = 1;
00606 break;
00607 }
00608 }
00609 }
00610 else
00611 {
00612 Track *this_track = 0;
00613 for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
00614 {
00615 int64_t track_x, track_y, track_w, track_h;
00616 canvas->track_dimensions(track, track_x, track_y, track_w, track_h);
00617
00618 if(cursor_y >= track_y &&
00619 cursor_y < track_y + track_h)
00620 {
00621
00622 this_track = track;
00623 break;
00624 }
00625 }
00626
00627 int total_selected = mwindow->edl->tracks->total_of(Tracks::RECORD);
00628
00629
00630 if(total_selected == 0)
00631 {
00632 mwindow->edl->tracks->select_all(Tracks::RECORD,
00633 1);
00634 }
00635 else
00636 if(total_selected == 1)
00637 {
00638
00639 if(this_track && this_track->record)
00640 {
00641 mwindow->edl->tracks->select_all(Tracks::RECORD,
00642 1);
00643 }
00644
00645 else
00646 {
00647 mwindow->edl->tracks->select_all(Tracks::RECORD,
00648 0);
00649 if (this_track)
00650 this_track->record = 1;
00651
00652 }
00653 }
00654 else
00655 if(total_selected > 1)
00656 {
00657 mwindow->edl->tracks->select_all(Tracks::RECORD,
00658 0);
00659 if (this_track)
00660 this_track->record = 1;
00661 }
00662
00663 }
00664
00665 update (0,
00666 1,
00667 0,
00668 0,
00669 1,
00670 0,
00671 1);
00672 unlock_window();
00673 mwindow->cwindow->update(0, 1, 1);
00674 lock_window("TrackCanvas::keypress_event 3");
00675
00676 result = 1;
00677 break;
00678 }
00679
00680
00681 if(result)
00682 cursor_motion_event();
00683 }
00684
00685 return result;
00686 }
00687
00688
00689 int MWindowGUI::close_event()
00690 {
00691 mainmenu->quit();
00692 }
00693
00694 int MWindowGUI::menu_h()
00695 {
00696 return mainmenu->get_h();
00697 }