4 * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
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.
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.
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
22 #include "androidcontrol.h"
23 #include "awindowgui.h"
25 #include "bcdisplayinfo.h"
27 #include "bcsignals.h"
29 #include "cwindowgui.h"
31 #include "channelinfo.h"
34 #include "editpopup.h"
37 #include "edlsession.h"
38 #include "filesystem.h"
39 #include "keyframepopup.h"
42 #include "localsession.h"
43 #include "mainclock.h"
44 #include "maincursor.h"
46 #include "mainsession.h"
50 #include "mwindowgui.h"
52 #include "panedividers.h"
55 #include "pluginpopup.h"
56 #include "pluginset.h"
57 #include "preferences.h"
59 #include "recordgui.h"
60 #include "renderengine.h"
61 #include "resourcethread.h"
62 #include "samplescroll.h"
63 #include "shbtnprefs.h"
64 #include "statusbar.h"
67 #include "trackcanvas.h"
68 #include "trackscroll.h"
70 #include "transitionpopup.h"
71 #include "vwindowgui.h"
75 #define PANE_DRAG_MARGIN MAX(mwindow->theme->pane_w, mwindow->theme->pane_h)
78 // the main window uses its own private colormap for video
79 MWindowGUI::MWindowGUI(MWindow *mwindow)
80 : BC_Window(_(PROGRAM_NAME ": Program"),
81 mwindow->session->mwindow_x,
82 mwindow->session->mwindow_y,
83 mwindow->session->mwindow_w,
84 mwindow->session->mwindow_h,
91 this->mwindow = mwindow;
98 focused_pane = TOP_LEFT_PANE;
107 for(int i = 0; i < TOTAL_PANES; i++)
125 cwindow_remote_handler = 0;
126 record_remote_handler = 0;
131 MWindowGUI::~MWindowGUI()
133 delete android_control;
134 delete cwindow_remote_handler;
135 delete record_remote_handler;
136 delete remote_control;
137 // delete samplescroll;
138 // delete trackscroll;
139 for(int i = 0; i < TOTAL_PANES; i++)
140 if(pane[i]) delete pane[i];
142 delete render_engine;
143 delete resource_thread;
144 resource_pixmaps.remove_all_objects();
153 void MWindowGUI::get_scrollbars(int flush)
155 //int64_t h_needed = mwindow->edl->get_tracks_height(mwindow->theme);
156 //int64_t w_needed = mwindow->edl->get_tracks_width();
157 int need_xscroll = 0;
158 int need_yscroll = 0;
159 view_w = mwindow->theme->mcanvas_w;
160 view_h = mwindow->theme->mcanvas_h;
162 // Scrollbars are constitutive
163 need_xscroll = need_yscroll = 1;
164 view_h = mwindow->theme->mcanvas_h;
165 view_w = mwindow->theme->mcanvas_w;
167 // for(int i = 0; i < 2; i++)
169 // if(w_needed > view_w)
172 // view_h = mwindow->theme->mcanvas_h - SCROLL_SPAN;
177 // if(h_needed > view_h)
180 // view_w = mwindow->theme->mcanvas_w - SCROLL_SPAN;
185 //printf("MWindowGUI::get_scrollbars 1\n");
187 if(canvas && (view_w != canvas->get_w() || view_h != canvas->get_h()))
189 canvas->reposition_window(mwindow->theme->mcanvas_x,
190 mwindow->theme->mcanvas_y,
198 add_subwindow(samplescroll = new SampleScroll(mwindow,
200 mwindow->theme->mhscroll_x,
201 mwindow->theme->mhscroll_y,
202 mwindow->theme->mhscroll_w));
204 samplescroll->resize_event();
206 samplescroll->set_position(0);
210 if(samplescroll) delete samplescroll;
212 mwindow->edl->local_session->view_start = 0;
218 //printf("MWindowGUI::get_scrollbars 1.1 %p %p\n", this, canvas);
220 add_subwindow(trackscroll = new TrackScroll(mwindow,
222 mwindow->theme->mvscroll_x,
223 mwindow->theme->mvscroll_y,
224 mwindow->theme->mvscroll_h));
226 trackscroll->resize_event();
229 //printf("MWindowGUI::get_scrollbars 1.2\n");
230 trackscroll->update_length(mwindow->edl->get_tracks_height(mwindow->theme),
231 mwindow->edl->local_session->track_start,
234 //printf("MWindowGUI::get_scrollbars 1.3\n");
238 if(trackscroll) delete trackscroll;
240 mwindow->edl->local_session->track_start = 0;
243 if(flush) this->flush();
248 void MWindowGUI::create_objects()
252 resource_thread = new ResourceThread(mwindow, this);
253 resource_thread->create_objects();
256 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
257 set_icon(mwindow->theme->get_image("mwindow_icon"));
258 remote_control = new RemoteControl(this);
259 cwindow_remote_handler = new CWindowRemoteHandler(remote_control);
260 record_remote_handler = new RecordRemoteHandler(remote_control);
261 mwindow->reset_android_remote();
263 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
265 int x = get_w() - MainShBtns::calculate_w(0);
266 add_subwindow(mainmenu = new MainMenu(mwindow, this, x));
267 mainmenu->create_objects();
268 add_subwindow(mainshbtns = new MainShBtns(mwindow, x, -1));
269 mainshbtns->load(mwindow->preferences);
270 mwindow->theme->get_mwindow_sizes(this, get_w(), get_h());
271 mwindow->theme->draw_mwindow_bg(this);
272 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
274 add_subwindow(mbuttons = new MButtons(mwindow, this));
275 mbuttons->create_objects();
276 add_subwindow(ffmpeg_toggle = new FFMpegToggle(mwindow, mbuttons, menu_w(), menu_h()+2));
278 pane[TOP_LEFT_PANE] = new TimelinePane(mwindow,
280 mwindow->theme->mcanvas_x,
281 mwindow->theme->mcanvas_y,
282 mwindow->theme->mcanvas_w,
283 mwindow->theme->mcanvas_h);
284 pane[TOP_LEFT_PANE]->create_objects();
286 // add_subwindow(timebar = new MTimeBar(mwindow,
288 // mwindow->theme->mtimebar_x,
289 // mwindow->theme->mtimebar_y,
290 // mwindow->theme->mtimebar_w,
291 // mwindow->theme->mtimebar_h));
292 // timebar->create_objects();
294 // if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
295 // add_subwindow(patchbay = new PatchBay(mwindow, this));
296 // patchbay->create_objects();
298 // if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
299 // get_scrollbars(0);
301 // if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
302 // mwindow->gui->add_subwindow(canvas = new TrackCanvas(mwindow, this));
303 // canvas->create_objects();
306 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
307 add_subwindow(zoombar = new ZoomBar(mwindow, this));
308 zoombar->create_objects();
311 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
312 add_subwindow(statusbar = new StatusBar(mwindow, this));
313 statusbar->create_objects();
317 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
318 add_subwindow(mainclock = new MainClock(mwindow,
319 mwindow->theme->mclock_x,
320 mwindow->theme->mclock_y,
321 mwindow->theme->mclock_w));
322 mainclock->set_position_offset( (double)
323 (mwindow->edl->session->get_frame_offset() /
324 mwindow->edl->session->frame_rate));
325 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
326 mainclock->update(0);
330 // if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
331 // cursor = new MainCursor(mwindow, this);
332 // cursor->create_objects();
335 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
336 add_subwindow(edit_menu = new EditPopup(mwindow, this));
337 edit_menu->create_objects();
340 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
341 add_subwindow(plugin_menu = new PluginPopup(mwindow, this));
342 plugin_menu->create_objects();
345 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
346 add_subwindow(keyframe_menu = new KeyframePopup(mwindow, this));
347 keyframe_menu->create_objects();
348 add_subwindow(keyframe_hide = new KeyframeHidePopup(mwindow, this));
349 keyframe_hide->create_objects();
352 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
353 add_subwindow(transition_menu = new TransitionPopup(mwindow, this));
354 transition_menu->create_objects();
356 channel_info = new ChannelInfo(mwindow);
357 db_window = new DbWindow(mwindow);
358 swindow = new SWindow(mwindow);
360 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
362 add_subwindow(pane_button = new PaneButton(mwindow,
363 get_w() - mwindow->theme->get_image_set("pane")[0]->get_w(),
364 mwindow->theme->mzoom_y + 1 - mwindow->theme->get_image_set("pane")[0]->get_h()));
366 pane[TOP_LEFT_PANE]->canvas->activate();
368 if(debug) printf("MWindowGUI::create_objects %d\n", __LINE__);
371 void MWindowGUI::redraw_time_dependancies()
373 zoombar->redraw_time_dependancies();
374 for(int i = 0; i < TOTAL_PANES; i++)
375 if(pane[i] && pane[i]->timebar) pane[i]->timebar->update(0);
376 mainclock->update(mwindow->edl->local_session->get_selectionstart(1));
379 int MWindowGUI::focus_in_event()
381 for(int i = 0; i < TOTAL_PANES; i++)
382 if(pane[i]) pane[i]->cursor->focus_in_event();
386 int MWindowGUI::focus_out_event()
388 for(int i = 0; i < TOTAL_PANES; i++)
389 if(pane[i]) pane[i]->cursor->focus_out_event();
394 int MWindowGUI::resize_event(int w, int h)
396 //printf("MWindowGUI::resize_event %d\n", __LINE__);
397 mwindow->session->mwindow_w = w;
398 mwindow->session->mwindow_h = h;
399 int x = w - MainShBtns::calculate_w(0);
400 mainmenu->resize_event(x, mainmenu->get_h());
401 mainshbtns->reposition_window(x, -1);
402 mwindow->theme->get_mwindow_sizes(this, w, h);
403 mwindow->theme->draw_mwindow_bg(this);
404 mbuttons->resize_event();
405 ffmpeg_toggle->reposition_window(menu_w(), menu_h()+2);
406 statusbar->resize_event();
408 resource_thread->stop_draw(1);
410 if(total_panes() > 1)
412 if(horizontal_panes())
414 // printf("MWindowGUI::resize_event %d %d %d\n",
416 // pane[TOP_RIGHT_PANE]->x,
417 // mwindow->theme->mcanvas_w -
418 // BC_ScrollBar::get_span(SCROLL_VERT) -
419 // PANE_DRAG_MARGIN);
420 if(pane[TOP_RIGHT_PANE]->x >= mwindow->theme->mcanvas_w -
421 BC_ScrollBar::get_span(SCROLL_VERT) -
424 delete_x_pane(pane[TOP_RIGHT_PANE]->x);
425 mwindow->edl->local_session->x_pane = -1;
431 if(pane[BOTTOM_LEFT_PANE]->y >= mwindow->theme->mzoom_y -
432 BC_ScrollBar::get_span(SCROLL_HORIZ) -
435 delete_y_pane(pane[BOTTOM_LEFT_PANE]->y);
436 mwindow->edl->local_session->y_pane = -1;
441 if(pane[TOP_RIGHT_PANE]->x >= mwindow->theme->mcanvas_w -
442 BC_ScrollBar::get_span(SCROLL_VERT) -
445 delete_x_pane(pane[TOP_RIGHT_PANE]->x);
446 mwindow->edl->local_session->x_pane = -1;
449 if(pane[BOTTOM_LEFT_PANE]->y >= mwindow->theme->mzoom_y -
450 BC_ScrollBar::get_span(SCROLL_HORIZ) -
453 delete_y_pane(pane[BOTTOM_LEFT_PANE]->y);
454 mwindow->edl->local_session->y_pane = -1;
459 if(total_panes() == 1)
461 pane[TOP_LEFT_PANE]->resize_event(
462 mwindow->theme->mcanvas_x,
463 mwindow->theme->mcanvas_y,
464 mwindow->theme->mcanvas_w,
465 mwindow->theme->mcanvas_h);
468 if(horizontal_panes())
470 pane[TOP_LEFT_PANE]->resize_event(
471 pane[TOP_LEFT_PANE]->x,
472 pane[TOP_LEFT_PANE]->y,
473 pane[TOP_LEFT_PANE]->w,
474 mwindow->theme->mcanvas_h);
475 pane[TOP_RIGHT_PANE]->resize_event(
476 pane[TOP_RIGHT_PANE]->x,
477 pane[TOP_RIGHT_PANE]->y,
478 mwindow->theme->mcanvas_w - pane[TOP_RIGHT_PANE]->x,
479 mwindow->theme->mcanvas_h);
484 pane[TOP_LEFT_PANE]->resize_event(
485 pane[TOP_LEFT_PANE]->x,
486 pane[TOP_LEFT_PANE]->y,
487 mwindow->theme->mcanvas_w,
488 pane[TOP_LEFT_PANE]->h);
489 pane[BOTTOM_LEFT_PANE]->resize_event(
490 pane[BOTTOM_LEFT_PANE]->x,
491 pane[BOTTOM_LEFT_PANE]->y,
492 mwindow->theme->mcanvas_w,
493 mwindow->theme->mcanvas_y +
494 mwindow->theme->mcanvas_h -
495 pane[BOTTOM_LEFT_PANE]->y);
499 pane[TOP_LEFT_PANE]->resize_event(
500 pane[TOP_LEFT_PANE]->x,
501 pane[TOP_LEFT_PANE]->y,
502 pane[TOP_LEFT_PANE]->w,
503 pane[TOP_LEFT_PANE]->h);
504 pane[TOP_RIGHT_PANE]->resize_event(
505 pane[TOP_RIGHT_PANE]->x,
506 pane[TOP_RIGHT_PANE]->y,
507 mwindow->theme->mcanvas_w - pane[TOP_RIGHT_PANE]->x,
508 pane[TOP_RIGHT_PANE]->h);
509 pane[BOTTOM_LEFT_PANE]->resize_event(
510 pane[BOTTOM_LEFT_PANE]->x,
511 pane[BOTTOM_LEFT_PANE]->y,
512 pane[BOTTOM_LEFT_PANE]->w,
513 mwindow->theme->mcanvas_y +
514 mwindow->theme->mcanvas_h -
515 pane[BOTTOM_LEFT_PANE]->y);
516 pane[BOTTOM_RIGHT_PANE]->resize_event(
517 pane[BOTTOM_RIGHT_PANE]->x,
518 pane[BOTTOM_RIGHT_PANE]->y,
519 mwindow->theme->mcanvas_w -
520 pane[BOTTOM_RIGHT_PANE]->x,
521 mwindow->theme->mcanvas_y +
522 mwindow->theme->mcanvas_h -
523 pane[BOTTOM_RIGHT_PANE]->y);
526 resource_thread->start_draw();
528 update_pane_dividers();
529 zoombar->resize_event();
530 pane_button->reposition_window(w - mwindow->theme->get_image_set("pane")[0]->get_w(),
531 mwindow->theme->mzoom_y + 1 - mwindow->theme->get_image_set("pane")[0]->get_h());
532 // get_scrollbars(0);
533 // canvas->resize_event();
534 //printf("MWindowGUI::resize_event %d\n", __LINE__);
535 // required to get new widgets to appear after a pane deletion
540 int MWindowGUI::total_panes()
543 for(int i = 0; i < TOTAL_PANES; i++)
548 int MWindowGUI::vertical_panes()
550 return total_panes() == 2 &&
551 pane[TOP_LEFT_PANE] &&
552 pane[BOTTOM_LEFT_PANE];
555 int MWindowGUI::horizontal_panes()
557 return total_panes() == 2 &&
558 pane[TOP_LEFT_PANE] &&
559 pane[TOP_RIGHT_PANE];
562 TimelinePane* MWindowGUI::get_focused_pane()
564 if(pane[focused_pane]) return pane[focused_pane];
565 for(int i = 0; i < TOTAL_PANES; i++)
567 if(pane[i]) return pane[i];
572 void MWindowGUI::activate_timeline()
574 if(pane[focused_pane])
576 pane[focused_pane]->activate();
580 for(int i = 0; i < TOTAL_PANES; i++)
591 void MWindowGUI::deactivate_timeline()
593 for(int i = 0; i < TOTAL_PANES; i++)
597 pane[i]->canvas->deactivate();
602 void MWindowGUI::update_title(char *path)
605 char filename[BCTEXTLEN], string[BCTEXTLEN];
606 fs.extract_name(filename, path);
607 sprintf(string, _(PROGRAM_NAME ": %s"), filename);
609 //printf("MWindowGUI::update_title %s\n", string);
613 void MWindowGUI::draw_overlays(int flash_it)
615 for(int i = 0; i < TOTAL_PANES; i++)
619 pane[i]->canvas->draw_overlays();
620 if(flash_it) pane[i]->canvas->flash();
625 void MWindowGUI::update_timebar(int flush_it)
627 for(int i = 0; i < TOTAL_PANES; i++)
629 if(pane[i] && pane[i]->timebar)
631 pane[i]->timebar->update(flush_it);
636 void MWindowGUI::update_timebar_highlights()
638 for(int i = 0; i < TOTAL_PANES; i++)
640 if(pane[i] && pane[i]->timebar)
642 pane[i]->timebar->update_highlights();
648 void MWindowGUI::update_patchbay()
650 for(int i = 0; i < TOTAL_PANES; i++)
652 if(pane[i] && pane[i]->patchbay)
654 pane[i]->patchbay->update();
659 void MWindowGUI::draw_indexes(Indexable *indexable)
661 for(int i = 0; i < TOTAL_PANES; i++)
665 pane[i]->canvas->draw_indexes(indexable);
670 void MWindowGUI::draw_canvas(int mode /* = 0 */, int hide_cursor /* = 1 */)
672 if(mode != IGNORE_THREAD)
674 resource_thread->stop_draw(1);
678 for(int i = 0; i < TOTAL_PANES; i++)
682 pane[i]->canvas->draw(mode, hide_cursor);
687 if(mode != IGNORE_THREAD)
689 resource_thread->start_draw();
694 void MWindowGUI::flash_canvas(int flush)
696 for(int i = 0; i < TOTAL_PANES; i++)
700 pane[i]->canvas->flash(flush);
705 void MWindowGUI::draw_cursor(int do_plugintoggles)
707 for(int i = 0; i < TOTAL_PANES; i++)
711 pane[i]->cursor->draw(do_plugintoggles);
716 void MWindowGUI::show_cursor(int do_plugintoggles)
718 for(int i = 0; i < TOTAL_PANES; i++)
722 pane[i]->cursor->show(do_plugintoggles);
727 void MWindowGUI::hide_cursor(int do_plugintoggles)
729 for(int i = 0; i < TOTAL_PANES; i++)
733 pane[i]->cursor->hide(do_plugintoggles);
738 void MWindowGUI::update_cursor()
740 for(int i = 0; i < TOTAL_PANES; i++)
744 pane[i]->cursor->update();
749 void MWindowGUI::set_playing_back(int value)
751 for(int i = 0; i < TOTAL_PANES; i++)
755 pane[i]->cursor->playing_back = value;
760 void MWindowGUI::update_plugintoggles()
762 for(int i = 0; i < TOTAL_PANES; i++)
766 pane[i]->canvas->refresh_plugintoggles();
772 void MWindowGUI::update_scrollbars(int flush)
774 for(int i = 0; i < TOTAL_PANES; i++)
778 pane[i]->update(1, 0, 0, 0);
781 if(flush) this->flush();
784 void MWindowGUI::reset_meters()
786 for(int i = 0; i < TOTAL_PANES; i++)
788 if(pane[i] && pane[i]->patchbay)
790 pane[i]->patchbay->reset_meters();
795 void MWindowGUI::stop_meters()
797 for(int i = 0; i < TOTAL_PANES; i++)
799 if(pane[i] && pane[i]->patchbay)
801 pane[i]->patchbay->stop_meters();
806 void MWindowGUI::update_meters(ArrayList<double> *module_levels)
808 for(int i = 0; i < TOTAL_PANES; i++)
810 if(pane[i] && pane[i]->patchbay)
812 pane[i]->patchbay->update_meters(module_levels);
817 void MWindowGUI::set_editing_mode(int flush)
819 for(int i = 0; i < TOTAL_PANES; i++)
823 pane[i]->canvas->update_cursor(flush);
828 void MWindowGUI::set_meter_format(int mode, int min, int max)
830 for(int i = 0; i < TOTAL_PANES; i++)
832 if(pane[i] && pane[i]->patchbay)
834 pane[i]->patchbay->set_meter_format(mode, min, max);
839 void MWindowGUI::update(int scrollbars,
848 if(debug) PRINT_TRACE
852 mwindow->edl->tracks->update_y_pixels(mwindow->theme);
854 if(do_canvas && do_canvas != IGNORE_THREAD)
856 resource_thread->stop_draw(1);
859 for(int i = 0; i < TOTAL_PANES; i++)
861 if(pane[i]) pane[i]->update(scrollbars,
867 if(do_canvas && do_canvas != IGNORE_THREAD)
869 resource_thread->start_draw();
872 // if(scrollbars) this->get_scrollbars(0);
873 // if(timebar) this->timebar->update(0);
874 if(zoombar) this->zoombar->update();
875 // if(patchbay) this->patchbay->update();
876 if(clock) this->mainclock->update(
877 mwindow->edl->local_session->get_selectionstart(1));
878 if(debug) PRINT_TRACE
884 // this->canvas->draw(do_canvas);
885 // this->cursor->show();
886 // this->canvas->flash(0);
887 // Activate causes the menubar to deactivate. Don't want this for
889 // if(canvas != IGNORE_THREAD) this->canvas->activate();
891 if(debug) PRINT_TRACE
895 if(buttonbar) mbuttons->update();
896 if(debug) PRINT_TRACE
898 // Can't age if the cache called this to draw missing picons
899 // or the GUI is updating the status of the draw toggle.
900 if(do_canvas != FORCE_REDRAW && do_canvas != IGNORE_THREAD)
903 mwindow->age_caches();
904 lock_window("MWindowGUI::update");
908 if(debug) PRINT_TRACE
911 int MWindowGUI::visible(int64_t x1, int64_t x2, int64_t view_x1, int64_t view_x2)
913 return (x1 >= view_x1 && x1 < view_x2) ||
914 (x2 > view_x1 && x2 <= view_x2) ||
915 (x1 <= view_x1 && x2 >= view_x2);
919 int MWindowGUI::show_message(char *message, int color)
921 // printf("MWindowGUI::show_message %d: %s 0x%08x 0x%08x\n",
922 // __LINE__, message, color, mwindow->theme->message_normal);
923 if(color < 0) color = mwindow->theme->message_normal;
924 statusbar->status_text->set_color(color);
925 statusbar->status_text->update(message);
930 // Drag motion called from other window
931 int MWindowGUI::drag_motion()
933 if(get_hidden()) return 0;
935 Track *over_track = 0;
937 PluginSet *over_pluginset = 0;
938 Plugin *over_plugin = 0;
943 drag_popup->cursor_motion_event();
947 // there's no point in drawing highlights has until drag operation has been set
948 if (!mwindow->session->current_operation)
951 for(int i = 0; i < TOTAL_PANES; i++)
953 if(pane[i]) pane[i]->canvas->drag_motion(
960 if(mwindow->session->track_highlighted != over_track)
962 mwindow->session->track_highlighted = over_track;
966 if(mwindow->session->edit_highlighted != over_edit)
968 mwindow->session->edit_highlighted = over_edit;
972 if(mwindow->session->pluginset_highlighted != over_pluginset)
974 mwindow->session->pluginset_highlighted = over_pluginset;
978 if(mwindow->session->plugin_highlighted != over_plugin)
980 mwindow->session->plugin_highlighted = over_plugin;
984 if( mwindow->session->current_operation == DRAG_ASSET ||
985 mwindow->session->current_operation == DRAG_EDIT ||
986 mwindow->session->current_operation == DRAG_AEFFECT_COPY ||
987 mwindow->session->current_operation == DRAG_VEFFECT_COPY )
993 // printf("drag_motion %d %d over_track=%p over_edit=%p\n",
1000 lock_window("MWindowGUI::drag_motion");
1007 int MWindowGUI::drag_stop()
1009 if(get_hidden()) return 0;
1010 int result = 0, redraw = 0;
1012 for(int i = 0; i < TOTAL_PANES; i++)
1014 if(pane[i]) result |= pane[i]->canvas->drag_stop(
1019 // since we don't have subwindows we have to terminate any drag operation
1022 if (mwindow->session->track_highlighted
1023 || mwindow->session->edit_highlighted
1024 || mwindow->session->plugin_highlighted
1025 || mwindow->session->pluginset_highlighted)
1027 mwindow->session->track_highlighted = 0;
1028 mwindow->session->edit_highlighted = 0;
1029 mwindow->session->plugin_highlighted = 0;
1030 mwindow->session->pluginset_highlighted = 0;
1031 mwindow->session->current_operation = NO_OPERATION;
1035 //printf("TrackCanvas::drag_stop %d %d\n", redraw, mwindow->session->current_operation);
1038 mwindow->edl->tracks->update_y_pixels(mwindow->theme);
1039 update_scrollbars(0);
1054 void MWindowGUI::default_positions()
1056 //printf("MWindowGUI::default_positions 1\n");
1057 VWindow *vwindow = mwindow->vwindows.size() > DEFAULT_VWINDOW ?
1058 mwindow->vwindows.get(0) : 0;
1059 if( vwindow ) vwindow->gui->lock_window("MWindowGUI::default_positions");
1060 mwindow->cwindow->gui->lock_window("MWindowGUI::default_positions");
1061 mwindow->awindow->gui->lock_window("MWindowGUI::default_positions");
1063 // printf("MWindowGUI::default_positions 1 %d %d %d %d\n", mwindow->session->vwindow_x,
1064 // mwindow->session->vwindow_y,
1065 // mwindow->session->vwindow_w,
1066 // mwindow->session->vwindow_h);
1067 reposition_window(mwindow->session->mwindow_x,
1068 mwindow->session->mwindow_y,
1069 mwindow->session->mwindow_w,
1070 mwindow->session->mwindow_h);
1071 if( vwindow ) vwindow->gui->reposition_window(mwindow->session->vwindow_x,
1072 mwindow->session->vwindow_y,
1073 mwindow->session->vwindow_w,
1074 mwindow->session->vwindow_h);
1075 mwindow->cwindow->gui->reposition_window(mwindow->session->cwindow_x,
1076 mwindow->session->cwindow_y,
1077 mwindow->session->cwindow_w,
1078 mwindow->session->cwindow_h);
1079 mwindow->awindow->gui->reposition_window(mwindow->session->awindow_x,
1080 mwindow->session->awindow_y,
1081 mwindow->session->awindow_w,
1082 mwindow->session->awindow_h);
1083 //printf("MWindowGUI::default_positions 1\n");
1085 resize_event(mwindow->session->mwindow_w,
1086 mwindow->session->mwindow_h);
1087 //printf("MWindowGUI::default_positions 1\n");
1088 if( vwindow ) vwindow->gui->resize_event(mwindow->session->vwindow_w,
1089 mwindow->session->vwindow_h);
1090 //printf("MWindowGUI::default_positions 1\n");
1091 mwindow->cwindow->gui->resize_event(mwindow->session->cwindow_w,
1092 mwindow->session->cwindow_h);
1093 //printf("MWindowGUI::default_positions 1\n");
1094 mwindow->awindow->gui->resize_event(mwindow->session->awindow_w,
1095 mwindow->session->awindow_h);
1097 //printf("MWindowGUI::default_positions 1\n");
1100 if( vwindow ) vwindow->gui->flush();
1101 mwindow->cwindow->gui->flush();
1102 mwindow->awindow->gui->flush();
1104 if( vwindow ) vwindow->gui->unlock_window();
1105 mwindow->cwindow->gui->unlock_window();
1106 mwindow->awindow->gui->unlock_window();
1107 //printf("MWindowGUI::default_positions 2\n");
1126 int MWindowGUI::repeat_event(int64_t duration)
1128 // if(duration == 100)
1129 // mwindow->sync_parameters(CHANGE_ALL);
1131 for(int i = 0; i < TOTAL_PANES; i++)
1133 if(pane[i]) result = pane[i]->cursor->repeat_event(duration);
1139 int MWindowGUI::translation_event()
1141 //printf("MWindowGUI::translation_event 1 %d %d\n", get_x(), get_y());
1142 mwindow->session->mwindow_x = get_x();
1143 mwindow->session->mwindow_y = get_y();
1148 int MWindowGUI::save_defaults(BC_Hash *defaults)
1150 defaults->update("MWINDOWWIDTH", get_w());
1151 defaults->update("MWINDOWHEIGHT", get_h());
1152 mainmenu->save_defaults(defaults);
1153 BC_WindowBase::save_defaults(defaults);
1157 int MWindowGUI::keypress_event()
1159 //printf("MWindowGUI::keypress_event 1 %d\n", get_keypress());
1161 result = mbuttons->keypress_event();
1165 switch(get_keypress())
1168 mwindow->toggle_editing_mode();
1171 case '1': case '2': case '3': case '4':
1172 case '5': case '6': case '7': case '8':
1173 if( !alt_down() || shift_down() ) break;
1174 if( !mwindow->select_asset(get_keypress()-'1',1) )
1183 mbuttons->transport->handle_transport(STOP, 1, 0, 0);
1184 lock_window("MWindowGUI::keypress_event 1");
1185 mwindow->prev_edit_handle(shift_down());
1188 mwindow->move_left();
1198 mbuttons->transport->handle_transport(STOP, 1, 0, 0);
1199 lock_window("MWindowGUI::keypress_event 2");
1200 mwindow->next_edit_handle(shift_down());
1203 mwindow->move_right();
1209 if(ctrl_down() && !alt_down())
1211 mwindow->expand_y();
1215 if(!ctrl_down() && alt_down())
1217 mwindow->expand_autos(0,1,1);
1221 if(ctrl_down() && alt_down())
1223 mwindow->expand_autos(1,1,1);
1228 mwindow->expand_sample();
1234 if(ctrl_down() && !alt_down())
1236 mwindow->zoom_in_y();
1240 if(!ctrl_down() && alt_down())
1242 mwindow->shrink_autos(0,1,1);
1246 if(ctrl_down() && alt_down())
1248 mwindow->shrink_autos(1,1,1);
1253 mwindow->zoom_in_sample();
1266 mwindow->expand_t();
1274 mwindow->move_down();
1279 mwindow->zoom_in_t();
1286 // //int cursor_x = 0;
1287 // int cursor_y = 0;
1288 // for(int i = 0; i < TOTAL_PANES; i++)
1292 // //cursor_x = pane[i]->canvas->get_relative_cursor_x();
1293 // cursor_y = pane[i]->canvas->get_relative_cursor_y();
1298 // if(get_keypress() == TAB)
1300 // // Switch the record button
1301 // for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
1303 // int64_t track_x, track_y, track_w, track_h;
1304 // canvas->track_dimensions(track, track_x, track_y, track_w, track_h);
1306 // if(cursor_y >= track_y &&
1307 // cursor_y < track_y + track_h)
1309 // if (track->record)
1310 // track->record = 0;
1312 // track->record = 1;
1320 // Track *this_track = 0;
1321 // for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
1323 // int64_t track_x, track_y, track_w, track_h;
1324 // canvas->track_dimensions(track, track_x, track_y, track_w, track_h);
1326 // if(cursor_y >= track_y &&
1327 // cursor_y < track_y + track_h)
1329 // // This is our track
1330 // this_track = track;
1335 // int total_selected = mwindow->edl->tracks->total_of(Tracks::RECORD);
1337 // // nothing previously selected
1338 // if(total_selected == 0)
1340 // mwindow->edl->tracks->select_all(Tracks::RECORD,
1344 // if(total_selected == 1)
1346 // // this patch was previously the only one on
1347 // if(this_track && this_track->record)
1349 // mwindow->edl->tracks->select_all(Tracks::RECORD,
1352 // // another patch was previously the only one on
1355 // mwindow->edl->tracks->select_all(Tracks::RECORD,
1358 // this_track->record = 1;
1363 // if(total_selected > 1)
1365 // mwindow->edl->tracks->select_all(Tracks::RECORD,
1368 // this_track->record = 1;
1381 // mwindow->cwindow->update(0, 1, 1);
1382 // lock_window("TrackCanvas::keypress_event 3");
1388 // since things under cursor have changed...
1390 cursor_motion_event();
1397 int MWindowGUI::keyboard_listener(BC_WindowBase *wp)
1399 return keyboard_listener(wp->get_keypress());
1402 int MWindowGUI::keyboard_listener(int key)
1407 if( !record->running() )
1410 record->record_gui->interrupt_thread->start(0);
1416 channel_info->toggle_scan();
1419 if( !remote_control->deactivate() )
1420 remote_control->activate();
1430 void MWindowGUI::use_android_remote(int on)
1433 delete android_control;
1434 android_control = 0;
1437 if( android_control ) return;
1438 android_control = new AndroidControl(this);
1441 int MWindowGUI::close_event()
1447 void MWindowGUI::stop_drawing()
1449 resource_thread->stop_draw(1);
1452 int MWindowGUI::menu_w()
1454 return mainmenu->get_w();
1457 int MWindowGUI::menu_h()
1459 return mainmenu->get_h();
1462 void MWindowGUI::start_x_pane_drag()
1466 x_pane_drag = new BC_Popup(this,
1467 get_abs_cursor_x(0) - mwindow->theme->pane_w,
1468 BC_DisplayInfo::get_top_border() +
1470 mwindow->theme->mcanvas_y,
1471 mwindow->theme->pane_w,
1472 mwindow->theme->mcanvas_h,
1473 mwindow->theme->drag_pane_color);
1474 x_pane_drag->draw_3segmentv(0,
1476 x_pane_drag->get_h(),
1477 mwindow->theme->get_image_set("xpane")[BUTTON_DOWNHI]);
1478 x_pane_drag->flash(1);
1483 void MWindowGUI::start_y_pane_drag()
1487 //printf("MWindowGUI::start_y_pane_drag %d %d %d\n", __LINE__, get_x(), get_y());
1488 y_pane_drag = new BC_Popup(this,
1489 BC_DisplayInfo::get_left_border() +
1491 mwindow->theme->mcanvas_x,
1492 get_abs_cursor_y(0) - mwindow->theme->pane_h,
1493 mwindow->theme->mcanvas_w,
1494 mwindow->theme->pane_h,
1495 mwindow->theme->drag_pane_color);
1496 y_pane_drag->draw_3segmenth(0,
1498 y_pane_drag->get_w(),
1499 mwindow->theme->get_image_set("ypane")[BUTTON_DOWNHI]);
1500 y_pane_drag->flash(1);
1505 void MWindowGUI::handle_pane_drag()
1511 x_pane_drag->reposition_window(
1512 get_abs_cursor_x(0) - mwindow->theme->pane_w,
1513 x_pane_drag->get_y());
1518 y_pane_drag->reposition_window(
1519 y_pane_drag->get_x(),
1520 get_abs_cursor_y(0) - mwindow->theme->pane_h);
1526 void MWindowGUI::create_x_pane(int cursor_x)
1528 if(total_panes() == 1)
1530 // create a horizontal pane
1531 // do this 1st so the resize_event knows there are 2 panes
1532 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] =
1533 mwindow->edl->local_session->view_start[TOP_LEFT_PANE] +
1535 mwindow->theme->patchbay_w;
1536 pane[TOP_RIGHT_PANE] = new TimelinePane(mwindow,
1538 mwindow->theme->mcanvas_x +
1540 mwindow->theme->mcanvas_y,
1541 mwindow->theme->mcanvas_x +
1542 mwindow->theme->mcanvas_w -
1544 mwindow->theme->mcanvas_h);
1545 pane[TOP_LEFT_PANE]->resize_event(
1546 mwindow->theme->mcanvas_x,
1547 mwindow->theme->mcanvas_y,
1548 cursor_x - mwindow->theme->pane_w,
1549 mwindow->theme->mcanvas_h);
1550 pane[TOP_RIGHT_PANE]->create_objects();
1553 if(vertical_panes())
1555 // create 2 horizontal panes
1556 mwindow->edl->local_session->track_start[TOP_RIGHT_PANE] =
1557 mwindow->edl->local_session->track_start[TOP_LEFT_PANE];
1558 mwindow->edl->local_session->track_start[BOTTOM_RIGHT_PANE] =
1559 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE];
1560 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] =
1561 mwindow->edl->local_session->view_start[BOTTOM_RIGHT_PANE] =
1562 mwindow->edl->local_session->view_start[TOP_LEFT_PANE] +
1564 mwindow->theme->patchbay_w;
1565 pane[TOP_RIGHT_PANE] = new TimelinePane(mwindow,
1567 mwindow->theme->mcanvas_x +
1569 pane[TOP_LEFT_PANE]->y,
1570 mwindow->theme->mcanvas_x +
1571 mwindow->theme->mcanvas_w -
1573 pane[TOP_LEFT_PANE]->h);
1574 pane[BOTTOM_RIGHT_PANE] = new TimelinePane(mwindow,
1576 mwindow->theme->mcanvas_x +
1578 pane[BOTTOM_LEFT_PANE]->y,
1579 mwindow->theme->mcanvas_x +
1580 mwindow->theme->mcanvas_w -
1582 pane[BOTTOM_LEFT_PANE]->h);
1583 pane[TOP_LEFT_PANE]->resize_event(
1584 pane[TOP_LEFT_PANE]->x,
1585 pane[TOP_LEFT_PANE]->y,
1586 cursor_x - mwindow->theme->pane_w,
1587 pane[TOP_LEFT_PANE]->h);
1588 pane[BOTTOM_LEFT_PANE]->resize_event(
1589 pane[BOTTOM_LEFT_PANE]->x,
1590 pane[BOTTOM_LEFT_PANE]->y,
1591 cursor_x - mwindow->theme->pane_w,
1592 pane[BOTTOM_LEFT_PANE]->h);
1593 pane[TOP_RIGHT_PANE]->create_objects();
1594 pane[BOTTOM_RIGHT_PANE]->create_objects();
1597 if(horizontal_panes())
1599 // resize a horizontal pane
1600 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] +=
1602 pane[TOP_RIGHT_PANE]->x;
1603 if(mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] < 0)
1604 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] = 0;
1605 pane[TOP_LEFT_PANE]->resize_event(
1606 mwindow->theme->mcanvas_x,
1607 mwindow->theme->mcanvas_y,
1608 cursor_x - mwindow->theme->pane_w,
1609 mwindow->theme->mcanvas_h);
1610 pane[TOP_RIGHT_PANE]->resize_event(
1611 mwindow->theme->mcanvas_x +
1613 pane[TOP_RIGHT_PANE]->y,
1614 mwindow->theme->mcanvas_x +
1615 mwindow->theme->mcanvas_w -
1617 mwindow->theme->mcanvas_h);
1621 // resize 2 horizontal panes
1622 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] +=
1624 pane[TOP_RIGHT_PANE]->x;
1625 if(mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] < 0)
1626 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] = 0;
1627 mwindow->edl->local_session->view_start[BOTTOM_RIGHT_PANE] =
1628 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE];
1630 pane[TOP_LEFT_PANE]->resize_event(
1631 mwindow->theme->mcanvas_x,
1632 pane[TOP_LEFT_PANE]->y,
1633 cursor_x - mwindow->theme->pane_w,
1634 pane[TOP_LEFT_PANE]->h);
1635 pane[TOP_RIGHT_PANE]->resize_event(
1636 mwindow->theme->mcanvas_x +
1638 pane[TOP_RIGHT_PANE]->y,
1639 mwindow->theme->mcanvas_x +
1640 mwindow->theme->mcanvas_w -
1642 pane[TOP_RIGHT_PANE]->h);
1643 pane[BOTTOM_LEFT_PANE]->resize_event(
1644 mwindow->theme->mcanvas_x,
1645 pane[BOTTOM_LEFT_PANE]->y,
1646 cursor_x - mwindow->theme->pane_w,
1647 pane[BOTTOM_LEFT_PANE]->h);
1648 pane[BOTTOM_RIGHT_PANE]->resize_event(
1649 mwindow->theme->mcanvas_x +
1651 pane[BOTTOM_RIGHT_PANE]->y,
1652 mwindow->theme->mcanvas_x +
1653 mwindow->theme->mcanvas_w -
1655 pane[BOTTOM_RIGHT_PANE]->h);
1661 void MWindowGUI::delete_x_pane(int cursor_x)
1663 // give left panes coordinates of right pane
1664 if(cursor_x < mwindow->theme->patchbay_w + PANE_DRAG_MARGIN &&
1665 pane[TOP_RIGHT_PANE])
1667 mwindow->edl->local_session->view_start[TOP_LEFT_PANE] =
1668 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE] -
1669 pane[TOP_RIGHT_PANE]->x + mwindow->theme->patchbay_w;
1670 if(mwindow->edl->local_session->view_start[TOP_LEFT_PANE] < 0)
1671 mwindow->edl->local_session->view_start[TOP_LEFT_PANE] = 0;
1672 mwindow->edl->local_session->view_start[BOTTOM_LEFT_PANE] =
1673 mwindow->edl->local_session->view_start[TOP_LEFT_PANE];
1676 switch(total_panes())
1679 if(pane[TOP_LEFT_PANE] && pane[TOP_RIGHT_PANE])
1681 // delete right pane
1682 delete pane[TOP_RIGHT_PANE];
1683 pane[TOP_RIGHT_PANE] = 0;
1684 pane[TOP_LEFT_PANE]->resize_event(
1685 mwindow->theme->mcanvas_x,
1686 mwindow->theme->mcanvas_y,
1687 mwindow->theme->mcanvas_w,
1688 mwindow->theme->mcanvas_h);
1694 // delete right panes
1695 delete pane[TOP_RIGHT_PANE];
1696 pane[TOP_RIGHT_PANE] = 0;
1697 delete pane[BOTTOM_RIGHT_PANE];
1698 pane[BOTTOM_RIGHT_PANE] = 0;
1699 pane[TOP_LEFT_PANE]->resize_event(
1700 mwindow->theme->mcanvas_x,
1701 pane[TOP_LEFT_PANE]->y,
1702 mwindow->theme->mcanvas_w,
1703 pane[TOP_LEFT_PANE]->h);
1704 pane[BOTTOM_LEFT_PANE]->resize_event(
1705 mwindow->theme->mcanvas_x,
1706 pane[BOTTOM_LEFT_PANE]->y,
1707 mwindow->theme->mcanvas_w,
1708 pane[BOTTOM_LEFT_PANE]->h);
1713 void MWindowGUI::create_y_pane(int cursor_y)
1715 if(total_panes() == 1)
1717 mwindow->edl->local_session->view_start[BOTTOM_LEFT_PANE] =
1718 mwindow->edl->local_session->view_start[TOP_LEFT_PANE];
1719 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] =
1720 mwindow->edl->local_session->track_start[TOP_LEFT_PANE] +
1722 mwindow->theme->mtimebar_h;
1723 // do this 1st so the resize_event knows there are 2 panes
1724 pane[BOTTOM_LEFT_PANE] = new TimelinePane(mwindow,
1726 mwindow->theme->mcanvas_x,
1727 mwindow->theme->mcanvas_y +
1729 mwindow->theme->mcanvas_w,
1730 mwindow->theme->mcanvas_h -
1732 pane[TOP_LEFT_PANE]->resize_event(
1733 mwindow->theme->mcanvas_x,
1734 mwindow->theme->mcanvas_y,
1735 mwindow->theme->mcanvas_w,
1736 pane[BOTTOM_LEFT_PANE]->y -
1737 mwindow->theme->mcanvas_y -
1738 mwindow->theme->pane_h);
1739 pane[BOTTOM_LEFT_PANE]->create_objects();
1742 if(horizontal_panes())
1745 mwindow->edl->local_session->view_start[BOTTOM_LEFT_PANE] =
1746 mwindow->edl->local_session->view_start[TOP_LEFT_PANE];
1747 mwindow->edl->local_session->view_start[BOTTOM_RIGHT_PANE] =
1748 mwindow->edl->local_session->view_start[TOP_RIGHT_PANE];
1749 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] =
1750 mwindow->edl->local_session->track_start[BOTTOM_RIGHT_PANE] =
1751 mwindow->edl->local_session->track_start[TOP_LEFT_PANE] +
1753 mwindow->theme->mtimebar_h;
1755 pane[BOTTOM_LEFT_PANE] = new TimelinePane(mwindow,
1757 pane[TOP_LEFT_PANE]->x,
1758 mwindow->theme->mcanvas_y +
1760 pane[TOP_LEFT_PANE]->w,
1761 mwindow->theme->mcanvas_h -
1763 pane[BOTTOM_RIGHT_PANE] = new TimelinePane(mwindow,
1765 pane[TOP_RIGHT_PANE]->x,
1766 mwindow->theme->mcanvas_y +
1768 pane[TOP_RIGHT_PANE]->w,
1769 mwindow->theme->mcanvas_h -
1772 pane[TOP_LEFT_PANE]->resize_event(
1773 pane[TOP_LEFT_PANE]->x,
1774 pane[TOP_LEFT_PANE]->y,
1775 pane[TOP_LEFT_PANE]->w,
1776 pane[BOTTOM_LEFT_PANE]->y -
1777 mwindow->theme->mcanvas_y -
1778 mwindow->theme->pane_h);
1779 pane[TOP_RIGHT_PANE]->resize_event(
1780 pane[TOP_RIGHT_PANE]->x,
1781 pane[TOP_RIGHT_PANE]->y,
1782 pane[TOP_RIGHT_PANE]->w,
1783 pane[BOTTOM_RIGHT_PANE]->y -
1784 mwindow->theme->mcanvas_y -
1785 mwindow->theme->pane_h);
1787 pane[BOTTOM_LEFT_PANE]->create_objects();
1788 pane[BOTTOM_RIGHT_PANE]->create_objects();
1791 if(vertical_panes())
1794 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] +=
1796 (pane[BOTTOM_LEFT_PANE]->y - mwindow->theme->mcanvas_y);
1797 if(mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] < 0)
1798 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] = 0;
1799 pane[TOP_LEFT_PANE]->resize_event(
1800 mwindow->theme->mcanvas_x,
1801 mwindow->theme->mcanvas_y,
1802 mwindow->theme->mcanvas_w,
1803 cursor_y - mwindow->theme->pane_h);
1804 pane[BOTTOM_LEFT_PANE]->resize_event(
1805 pane[BOTTOM_LEFT_PANE]->x,
1807 mwindow->theme->mcanvas_y,
1808 mwindow->theme->mcanvas_w,
1809 mwindow->theme->mcanvas_h -
1815 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] +=
1817 (pane[BOTTOM_LEFT_PANE]->y - mwindow->theme->mcanvas_y);
1818 if(mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] < 0)
1819 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] = 0;
1820 mwindow->edl->local_session->track_start[BOTTOM_RIGHT_PANE] =
1821 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE];
1822 pane[TOP_LEFT_PANE]->resize_event(
1823 pane[TOP_LEFT_PANE]->x,
1824 pane[TOP_LEFT_PANE]->y,
1825 pane[TOP_LEFT_PANE]->w,
1826 cursor_y - mwindow->theme->pane_h);
1827 pane[BOTTOM_LEFT_PANE]->resize_event(
1828 pane[BOTTOM_LEFT_PANE]->x,
1830 mwindow->theme->mcanvas_y,
1831 pane[BOTTOM_LEFT_PANE]->w,
1832 mwindow->theme->mcanvas_h -
1834 pane[TOP_RIGHT_PANE]->resize_event(
1835 pane[TOP_RIGHT_PANE]->x,
1836 pane[TOP_RIGHT_PANE]->y,
1837 pane[TOP_RIGHT_PANE]->w,
1838 cursor_y - mwindow->theme->pane_h);
1839 pane[BOTTOM_RIGHT_PANE]->resize_event(
1840 pane[BOTTOM_RIGHT_PANE]->x,
1842 mwindow->theme->mcanvas_y,
1843 pane[BOTTOM_RIGHT_PANE]->w,
1844 mwindow->theme->mcanvas_h -
1849 void MWindowGUI::delete_y_pane(int cursor_y)
1851 if(cursor_y < mwindow->theme->mtimebar_h +
1853 pane[BOTTOM_LEFT_PANE])
1855 // give top pane coordinates of bottom pane
1856 mwindow->edl->local_session->track_start[TOP_LEFT_PANE] =
1857 mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] -
1858 pane[BOTTOM_LEFT_PANE]->y;
1859 if(mwindow->edl->local_session->track_start[TOP_LEFT_PANE] < 0)
1860 mwindow->edl->local_session->track_start[TOP_LEFT_PANE] = 0;
1861 mwindow->edl->local_session->track_start[TOP_RIGHT_PANE] =
1862 mwindow->edl->local_session->track_start[TOP_LEFT_PANE];
1866 switch(total_panes())
1869 delete pane[BOTTOM_LEFT_PANE];
1870 pane[BOTTOM_LEFT_PANE] = 0;
1871 pane[TOP_LEFT_PANE]->resize_event(
1872 mwindow->theme->mcanvas_x,
1873 mwindow->theme->mcanvas_y,
1874 mwindow->theme->mcanvas_w,
1875 mwindow->theme->mcanvas_h);
1879 // delete bottom 2 panes
1881 delete pane[BOTTOM_LEFT_PANE];
1882 pane[BOTTOM_LEFT_PANE] = 0;
1883 delete pane[BOTTOM_RIGHT_PANE];
1884 pane[BOTTOM_RIGHT_PANE] = 0;
1885 pane[TOP_LEFT_PANE]->resize_event(
1886 pane[TOP_LEFT_PANE]->x,
1887 mwindow->theme->mcanvas_y,
1888 pane[TOP_LEFT_PANE]->w,
1889 mwindow->theme->mcanvas_h);
1890 pane[TOP_RIGHT_PANE]->resize_event(
1891 pane[TOP_RIGHT_PANE]->x,
1892 mwindow->theme->mcanvas_y,
1893 pane[TOP_RIGHT_PANE]->w,
1894 mwindow->theme->mcanvas_h);
1899 void MWindowGUI::stop_pane_drag()
1902 resource_thread->stop_draw(1);
1906 // cursor position relative to canvas
1907 int cursor_x = x_pane_drag->get_x() -
1909 BC_DisplayInfo::get_left_border() -
1910 mwindow->theme->mcanvas_x +
1911 mwindow->theme->pane_w;
1916 if(cursor_x >= mwindow->theme->patchbay_w + PANE_DRAG_MARGIN &&
1917 cursor_x < mwindow->theme->mcanvas_w -
1918 BC_ScrollBar::get_span(SCROLL_VERT) -
1921 create_x_pane(cursor_x);
1922 mwindow->edl->local_session->x_pane = cursor_x;
1927 delete_x_pane(cursor_x);
1928 mwindow->edl->local_session->x_pane = -1;
1936 // cursor position relative to canvas
1937 int cursor_y = y_pane_drag->get_y() -
1939 BC_DisplayInfo::get_top_border() -
1940 mwindow->theme->mcanvas_y +
1941 mwindow->theme->pane_h;
1947 if(cursor_y >= mwindow->theme->mtimebar_h +
1949 cursor_y < mwindow->theme->mcanvas_h -
1950 BC_ScrollBar::get_span(SCROLL_HORIZ) -
1953 create_y_pane(cursor_y);
1954 mwindow->edl->local_session->y_pane = cursor_y;
1958 delete_y_pane(cursor_y);
1959 mwindow->edl->local_session->y_pane = -1;
1963 update_pane_dividers();
1965 // required to get new widgets to appear
1967 resource_thread->start_draw();
1970 // create panes from EDL
1971 void MWindowGUI::load_panes()
1973 int need_x_panes = 0;
1974 int need_y_panes = 0;
1975 // use names from create functions
1976 int cursor_x = mwindow->edl->local_session->x_pane;
1977 int cursor_y = mwindow->edl->local_session->y_pane;
1979 resource_thread->stop_draw(1);
1981 mwindow->theme->patchbay_w + PANE_DRAG_MARGIN &&
1983 mwindow->theme->mcanvas_w -
1984 BC_ScrollBar::get_span(SCROLL_VERT) -
1991 mwindow->theme->mtimebar_h + PANE_DRAG_MARGIN &&
1993 mwindow->theme->mcanvas_h -
1994 BC_ScrollBar::get_span(SCROLL_HORIZ) -
2000 //printf("MWindowGUI::load_panes %d %d %d\n", __LINE__, need_x_panes, need_y_panes);
2008 if(total_panes() == 1)
2011 //printf("MWindowGUI::load_panes %d\n", __LINE__);
2012 pane[TOP_RIGHT_PANE] = new TimelinePane(mwindow,
2014 mwindow->theme->mcanvas_x +
2016 mwindow->theme->mcanvas_y,
2017 mwindow->theme->mcanvas_x +
2018 mwindow->theme->mcanvas_w -
2020 cursor_y - mwindow->theme->pane_h);
2021 pane[BOTTOM_LEFT_PANE] = new TimelinePane(mwindow,
2023 mwindow->theme->mcanvas_x,
2024 mwindow->theme->mcanvas_y +
2026 cursor_x - mwindow->theme->pane_w,
2027 mwindow->theme->mcanvas_h -
2029 pane[BOTTOM_RIGHT_PANE] = new TimelinePane(mwindow,
2031 pane[TOP_RIGHT_PANE]->x,
2032 mwindow->theme->mcanvas_y +
2034 pane[TOP_RIGHT_PANE]->w,
2035 mwindow->theme->mcanvas_h -
2037 pane[TOP_LEFT_PANE]->resize_event(
2038 pane[TOP_LEFT_PANE]->x,
2039 pane[TOP_LEFT_PANE]->y,
2040 cursor_x - mwindow->theme->pane_w,
2041 cursor_y - mwindow->theme->pane_h);
2042 pane[TOP_RIGHT_PANE]->create_objects();
2043 pane[BOTTOM_LEFT_PANE]->create_objects();
2044 pane[BOTTOM_RIGHT_PANE]->create_objects();
2047 if(horizontal_panes())
2049 // create vertical panes
2050 //printf("MWindowGUI::load_panes %d\n", __LINE__);
2051 pane[BOTTOM_LEFT_PANE] = new TimelinePane(mwindow,
2053 mwindow->theme->mcanvas_x,
2054 mwindow->theme->mcanvas_y +
2056 cursor_x - mwindow->theme->pane_w,
2057 mwindow->theme->mcanvas_h -
2059 pane[BOTTOM_RIGHT_PANE] = new TimelinePane(mwindow,
2061 pane[TOP_RIGHT_PANE]->x,
2062 mwindow->theme->mcanvas_y +
2064 pane[TOP_RIGHT_PANE]->w,
2065 mwindow->theme->mcanvas_h -
2067 pane[TOP_LEFT_PANE]->resize_event(
2068 pane[TOP_LEFT_PANE]->x,
2069 pane[TOP_LEFT_PANE]->y,
2070 cursor_x - mwindow->theme->pane_w,
2071 cursor_y - mwindow->theme->pane_h);
2072 pane[TOP_RIGHT_PANE]->resize_event(
2073 mwindow->theme->mcanvas_x +
2075 mwindow->theme->mcanvas_y,
2076 mwindow->theme->mcanvas_x +
2077 mwindow->theme->mcanvas_w -
2079 cursor_y - mwindow->theme->pane_h);
2080 pane[BOTTOM_LEFT_PANE]->create_objects();
2081 pane[BOTTOM_RIGHT_PANE]->create_objects();
2084 if(vertical_panes())
2086 // create horizontal panes
2087 //printf("MWindowGUI::load_panes %d\n", __LINE__);
2088 pane[TOP_RIGHT_PANE] = new TimelinePane(mwindow,
2090 mwindow->theme->mcanvas_x +
2092 mwindow->theme->mcanvas_y,
2093 mwindow->theme->mcanvas_x +
2094 mwindow->theme->mcanvas_w -
2096 cursor_y - mwindow->theme->pane_h);
2097 pane[BOTTOM_RIGHT_PANE] = new TimelinePane(mwindow,
2099 pane[TOP_RIGHT_PANE]->x,
2100 mwindow->theme->mcanvas_y +
2102 pane[TOP_RIGHT_PANE]->w,
2103 mwindow->theme->mcanvas_h -
2105 pane[TOP_LEFT_PANE]->resize_event(
2106 pane[TOP_LEFT_PANE]->x,
2107 pane[TOP_LEFT_PANE]->y,
2108 cursor_x - mwindow->theme->pane_w,
2109 cursor_y - mwindow->theme->pane_h);
2110 pane[BOTTOM_LEFT_PANE]->resize_event(
2111 pane[TOP_LEFT_PANE]->x,
2112 mwindow->theme->mcanvas_y +
2114 mwindow->theme->mcanvas_x +
2115 mwindow->theme->mcanvas_w -
2117 mwindow->theme->mcanvas_h -
2119 pane[TOP_RIGHT_PANE]->create_objects();
2120 pane[BOTTOM_RIGHT_PANE]->create_objects();
2127 //printf("MWindowGUI::load_panes %d\n", __LINE__);
2128 pane[TOP_LEFT_PANE]->resize_event(
2129 pane[TOP_LEFT_PANE]->x,
2130 pane[TOP_LEFT_PANE]->y,
2131 cursor_x - mwindow->theme->pane_w,
2132 cursor_y - mwindow->theme->pane_h);
2133 pane[TOP_RIGHT_PANE]->resize_event(
2134 mwindow->theme->mcanvas_x +
2136 mwindow->theme->mcanvas_y,
2137 mwindow->theme->mcanvas_x +
2138 mwindow->theme->mcanvas_w -
2140 cursor_y - mwindow->theme->pane_h);
2141 pane[BOTTOM_LEFT_PANE]->resize_event(
2142 pane[TOP_LEFT_PANE]->x,
2143 mwindow->theme->mcanvas_y +
2145 mwindow->theme->mcanvas_x +
2146 mwindow->theme->mcanvas_w -
2148 mwindow->theme->mcanvas_h -
2150 pane[BOTTOM_RIGHT_PANE]->resize_event(
2151 pane[TOP_RIGHT_PANE]->x,
2152 mwindow->theme->mcanvas_y +
2154 pane[TOP_RIGHT_PANE]->w,
2155 mwindow->theme->mcanvas_h -
2164 if(pane[BOTTOM_LEFT_PANE]) delete pane[BOTTOM_LEFT_PANE];
2165 if(pane[BOTTOM_RIGHT_PANE]) delete pane[BOTTOM_RIGHT_PANE];
2166 pane[BOTTOM_LEFT_PANE] = 0;
2167 pane[BOTTOM_RIGHT_PANE] = 0;
2169 if(!pane[TOP_RIGHT_PANE])
2171 pane[TOP_RIGHT_PANE] = new TimelinePane(mwindow,
2173 mwindow->theme->mcanvas_x +
2175 mwindow->theme->mcanvas_y,
2176 mwindow->theme->mcanvas_x +
2177 mwindow->theme->mcanvas_w -
2179 mwindow->theme->mcanvas_h);
2180 pane[TOP_LEFT_PANE]->resize_event(
2181 mwindow->theme->mcanvas_x,
2182 mwindow->theme->mcanvas_y,
2183 cursor_x - mwindow->theme->pane_w,
2184 mwindow->theme->mcanvas_h);
2185 pane[TOP_RIGHT_PANE]->create_objects();
2189 pane[TOP_LEFT_PANE]->resize_event(
2190 mwindow->theme->mcanvas_x,
2191 mwindow->theme->mcanvas_y,
2192 cursor_x - mwindow->theme->pane_w,
2193 mwindow->theme->mcanvas_h);
2194 pane[TOP_RIGHT_PANE]->resize_event(
2195 mwindow->theme->mcanvas_x +
2197 pane[TOP_RIGHT_PANE]->y,
2198 mwindow->theme->mcanvas_x +
2199 mwindow->theme->mcanvas_w -
2201 mwindow->theme->mcanvas_h);
2209 if(pane[TOP_RIGHT_PANE]) delete pane[TOP_RIGHT_PANE];
2210 if(pane[BOTTOM_RIGHT_PANE]) delete pane[BOTTOM_RIGHT_PANE];
2211 pane[TOP_RIGHT_PANE] = 0;
2212 pane[BOTTOM_RIGHT_PANE] = 0;
2214 if(!pane[BOTTOM_LEFT_PANE])
2216 //printf("MWindowGUI::load_panes %d\n", __LINE__);
2217 pane[BOTTOM_LEFT_PANE] = new TimelinePane(mwindow,
2219 mwindow->theme->mcanvas_x,
2220 mwindow->theme->mcanvas_y +
2222 mwindow->theme->mcanvas_w,
2223 mwindow->theme->mcanvas_h -
2225 pane[TOP_LEFT_PANE]->resize_event(
2226 mwindow->theme->mcanvas_x,
2227 mwindow->theme->mcanvas_y,
2228 mwindow->theme->mcanvas_w,
2229 pane[BOTTOM_LEFT_PANE]->y -
2230 mwindow->theme->mcanvas_y -
2231 mwindow->theme->pane_h);
2232 pane[BOTTOM_LEFT_PANE]->create_objects();
2236 pane[TOP_LEFT_PANE]->resize_event(
2237 mwindow->theme->mcanvas_x,
2238 mwindow->theme->mcanvas_y,
2239 mwindow->theme->mcanvas_w,
2240 cursor_y - mwindow->theme->pane_h);
2241 pane[BOTTOM_LEFT_PANE]->resize_event(
2242 pane[BOTTOM_LEFT_PANE]->x,
2244 mwindow->theme->mcanvas_y,
2245 mwindow->theme->mcanvas_w,
2246 mwindow->theme->mcanvas_h -
2253 if(pane[TOP_RIGHT_PANE]) delete pane[TOP_RIGHT_PANE];
2254 if(pane[BOTTOM_RIGHT_PANE]) delete pane[BOTTOM_RIGHT_PANE];
2255 if(pane[BOTTOM_LEFT_PANE]) delete pane[BOTTOM_LEFT_PANE];
2256 pane[TOP_RIGHT_PANE] = 0;
2257 pane[BOTTOM_RIGHT_PANE] = 0;
2258 pane[BOTTOM_LEFT_PANE] = 0;
2259 pane[TOP_LEFT_PANE]->resize_event(
2260 mwindow->theme->mcanvas_x,
2261 mwindow->theme->mcanvas_y,
2262 mwindow->theme->mcanvas_w,
2263 mwindow->theme->mcanvas_h);
2266 update_pane_dividers();
2269 resource_thread->start_draw();
2272 void MWindowGUI::update_pane_dividers()
2275 if(horizontal_panes() || total_panes() == 4)
2277 int x = pane[TOP_RIGHT_PANE]->x - mwindow->theme->pane_w;
2278 int y = mwindow->theme->mcanvas_y;
2279 int h = mwindow->theme->mcanvas_h;
2283 add_subwindow(x_divider = new PaneDivider(
2284 mwindow, x, y, h, 1));
2285 x_divider->create_objects();
2289 x_divider->reposition_window(x, y, h);
2302 if(vertical_panes() || total_panes() == 4)
2304 int x = mwindow->theme->mcanvas_x;
2305 int y = pane[BOTTOM_LEFT_PANE]->y -
2306 mwindow->theme->pane_h;
2307 int w = mwindow->theme->mcanvas_w;
2310 add_subwindow(y_divider = new PaneDivider(
2311 mwindow, x, y, w, 0));
2312 y_divider->create_objects();
2316 y_divider->reposition_window(x, y, w);
2330 void MWindowGUI::draw_samplemovement()
2337 update_scrollbars(1);
2340 void MWindowGUI::draw_trackmovement()
2342 update_scrollbars(0);
2349 PaneButton::PaneButton(MWindow *mwindow, int x, int y)
2350 : BC_Button(x, y, mwindow->theme->get_image_set("pane"))
2352 this->mwindow = mwindow;
2355 int PaneButton::cursor_motion_event()
2357 if(get_top_level()->get_button_down() &&
2359 get_status() == BUTTON_DOWNHI &&
2362 // printf("PaneButton::cursor_motion_event %d\n", __LINE__);
2364 if(get_cursor_x() < 0 && !mwindow->gui->dragging_pane)
2366 mwindow->gui->start_x_pane_drag();
2369 if(get_cursor_y() < 0 && !mwindow->gui->dragging_pane)
2371 mwindow->gui->start_y_pane_drag();
2375 mwindow->gui->handle_pane_drag();
2377 int result = BC_Button::cursor_motion_event();
2381 int PaneButton::button_release_event()
2383 mwindow->gui->stop_pane_drag();
2385 int result = BC_Button::button_release_event();
2390 FFMpegToggle::FFMpegToggle(MWindow *mwindow, MButtons *mbuttons, int x, int y)
2391 : BC_Toggle(x, y, mwindow->theme->ffmpeg_toggle, mwindow->preferences->ffmpeg_early_probe)
2393 this->mwindow = mwindow;
2394 this->mbuttons = mbuttons;
2395 set_tooltip( mwindow->preferences->ffmpeg_early_probe ?
2396 _("Try FFMpeg first") : _("Try FFMpeg last"));
2399 FFMpegToggle::~FFMpegToggle()
2403 int FFMpegToggle::handle_event()
2405 mwindow->preferences->ffmpeg_early_probe = get_value();
2406 set_tooltip( mwindow->preferences->ffmpeg_early_probe ?
2407 _("Try FFMpeg first") : _("Try FFMpeg last"));
2408 mwindow->show_warning(&mwindow->preferences->warn_indexes,
2409 _("Changing the base codecs may require rebuilding indexes."));