+ drag_box = 0;
+}
+
+DragTileMixers::~DragTileMixers()
+{
+ delete drag_box;
+}
+
+int DragTileMixers::handle_event()
+{
+ if( !drag_box ) {
+ MWindow *mwindow = mixer_items->mwindow;
+ drag_box = new TileMixersDragBox(mwindow->gui);
+ }
+ if( !drag_box->running() )
+ drag_box->start(this);
+ return 1;
+}
+
+TileMixersDragBox::TileMixersDragBox(MWindowGUI *gui)
+ : BC_DragBox(gui)
+{
+ tile_mixers = 0;
+}
+
+void TileMixersDragBox::start(DragTileMixers *tile_mixers)
+{
+ this->tile_mixers = tile_mixers;
+ start_drag();
+}
+
+int TileMixersDragBox::handle_done_event(int x0, int y0, int x1, int y1)
+{
+ MWindow *mwindow = tile_mixers->mixer_items->mwindow;
+ if( x0 >= x1 || y0 >= y1 ) x0 = x1 = y0 = y1 = 0;
+ mwindow->session->tile_mixers_x = x0;
+ mwindow->session->tile_mixers_y = y0;
+ mwindow->session->tile_mixers_w = x1 - x0;
+ mwindow->session->tile_mixers_h = y1 - y0;
+ mwindow->tile_mixers(x0, y0, x1, y1);
+ tile_mixers = 0;
+ return 1;
+}
+
+AlignMixers::AlignMixers(MixerItems *mixer_items)
+ : MixerItem(mixer_items, _("Align mixers"), "", 0)
+{
+}
+
+int AlignMixers::handle_event()
+{
+ MWindow *mwindow = mixer_items->mwindow;
+ int wx, wy;
+ mwindow->gui->get_abs_cursor(wx, wy);
+ mwindow->mixers_align->start_dialog(wx, wy);
+ return 1;
+}
+
+MixMasters::MixMasters(MixerItems *mixer_items)
+ : MixerItem(mixer_items, _("Mix masters"), "", 0)
+{
+}
+
+int MixMasters::handle_event()
+{
+ MWindow *mwindow = mixer_items->mwindow;
+ mwindow->mix_masters();
+ return 1;
+}
+
+
+AlignTimecodes::AlignTimecodes(MWindow *mwindow)
+ : BC_MenuItem(_("Align Timecodes"))
+{
+ this->mwindow = mwindow;
+}
+
+int AlignTimecodes::handle_event()
+{
+ mwindow->align_timecodes();
+ return 1;
+}
+
+
+LoadLayoutItem::LoadLayoutItem(LoadLayout *load_layout, const char *text, int idx, int hotkey)
+ : BC_MenuItem(text, "", hotkey)
+{
+ this->idx = idx;
+ this->load_layout = load_layout;
+ if( hotkey ) {
+ char hot_txt[BCSTRLEN];
+ sprintf(hot_txt, _("Ctrl-Shift+F%d"), hotkey-KEY_F1+1);
+ set_ctrl(); set_shift();
+ set_hotkey_text(hot_txt);
+ }
+}
+
+
+int LoadLayoutItem::handle_event()
+{
+// key_press hotkey skips over activate_submenu
+ load_layout->update();
+ MWindow *mwindow = load_layout->mwindow;
+ switch( load_layout->action ) {
+ case LAYOUT_LOAD:
+ mwindow->load_layout(layout_file);
+ break;
+ case LAYOUT_SAVE: {
+ int wx = 0, wy = 0;
+ mwindow->gui->get_abs_cursor(wx, wy);
+ load_layout->layout_dialog->start_confirm_dialog(wx, wy, idx);
+ break; }
+ }
+ return 1;
+}
+
+LoadLayout::LoadLayout(MWindow *mwindow, const char *text, int action)
+ : BC_MenuItem(text)
+{
+ this->mwindow = mwindow;
+ this->action = action;
+ this->layout_dialog = new LoadLayoutDialog(this);
+}
+
+LoadLayout::~LoadLayout()
+{
+ delete layout_dialog;
+}
+
+void LoadLayout::create_objects()
+{
+ BC_SubMenu *layout_submenu = new BC_SubMenu();
+ add_submenu(layout_submenu);
+
+ for( int i=0; i<LAYOUTS_MAX; ++i ) {
+ char text[BCSTRLEN];
+ sprintf(text, _("Layout %d"), i+1);
+ LoadLayoutItem *item = new LoadLayoutItem(this, text, i,
+ action==LAYOUT_LOAD ? KEY_F1+i : 0);
+ layout_submenu->add_submenuitem(item);
+ }
+}
+
+int LoadLayout::activate_submenu()
+{
+ update();
+ return BC_MenuItem::activate_submenu();
+}
+
+void LoadLayout::update()
+{
+ FileSystem fs;
+ fs.set_filter("layout*_rc");
+ int ret = fs.update(File::get_config_path());
+ int sz = !ret ? fs.dir_list.size() : 0;
+ BC_SubMenu *layout_submenu = get_submenu();
+
+ for( int i=0; i<LAYOUTS_MAX; ++i ) {
+ LoadLayoutItem* item = (LoadLayoutItem *)
+ layout_submenu->get_item(i);
+ char layout_text[BCSTRLEN]; layout_text[0] = 0;
+ int n = sz, id = i+1;
+ while( --n >= 0 ) {
+ char *np = fs.dir_list[n]->name;
+ char *cp = strrchr(np, '_'), *bp = 0;
+ int no = strtol(np+6, &bp, 10);
+ if( no != id || !bp ) continue;
+ if( bp == cp ) { n = -1; break; }
+ if( *bp++ == '_' && bp < cp && !strcmp(cp, "_rc") ) {
+ int k = cp - bp; char *tp = layout_text;
+ if( k > LAYOUT_NAME_LEN ) k = LAYOUT_NAME_LEN;
+ while( --k >= 0 ) *tp++ = *bp++;
+ *tp = 0;
+ break;
+ }
+ }
+ strcpy(item->layout_text, layout_text);
+ char *lp = item->layout_file;
+ int k = sprintf(lp, LAYOUT_FILE, id);
+ if( n >= 0 && layout_text[0] )
+ sprintf(lp + k-2, "%s_rc", layout_text);
+ else
+ sprintf(layout_text, _("Layout %d"), id);
+ item->set_text(layout_text);
+ }
+}
+
+LoadLayoutDialog::LoadLayoutDialog(LoadLayout *load_layout)
+{
+ this->load_layout = load_layout;
+ wx = 0; wy = 0;
+ idx = -1;
+ lgui = 0;
+}
+
+LoadLayoutDialog::~LoadLayoutDialog()
+{
+ close_window();
+}
+
+void LoadLayoutDialog::handle_done_event(int result)
+{
+ if( result ) return;
+ char layout_file[BCSTRLEN];
+ BC_SubMenu *layout_submenu = load_layout->get_submenu();
+ LoadLayoutItem* item =
+ (LoadLayoutItem *) layout_submenu->get_item(idx);
+ snprintf(layout_file, sizeof(layout_file), "%s", item->layout_file);
+ load_layout->mwindow->delete_layout(layout_file);
+ int k = sprintf(layout_file, LAYOUT_FILE, idx+1);
+ const char *text = lgui->name_text->get_text();
+ if( text[0] )
+ snprintf(layout_file + k-2, sizeof(layout_file)-k+2, "%s_rc", text);
+ load_layout->mwindow->save_layout(layout_file);
+}
+
+void LoadLayoutDialog::handle_close_event(int result)
+{
+ lgui = 0;
+}
+
+BC_Window *LoadLayoutDialog::new_gui()
+{
+ lgui = new LoadLayoutConfirm(this, wx, wy);
+ lgui->create_objects();
+ return lgui;
+}
+
+void LoadLayoutDialog::start_confirm_dialog(int wx, int wy, int idx)
+{
+ close_window();
+ this->wx = wx; this->wy = wy;
+ this->idx = idx;
+ start();