wintv remote control + kernel patch, add codec fileref, amp up OpenEDL, add loadmode...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / loadmode.C
index 04b35ee60451ac9e6a954104e4c49cf97eb78e67..04193b23d00797858a48e3fa9269e95988f985d9 100644 (file)
@@ -25,6 +25,9 @@
 #include "mwindow.h"
 #include "theme.h"
 
+#define LOADMODE_LOAD_TEXT _("Load strategy:")
+#define LOADMODE_EDL_TEXT _("EDL strategy:")
+
 // Must match macros
 static const char *mode_images[] =
 {
@@ -35,7 +38,9 @@ static const char *mode_images[] =
        "loadmode_cat",
        "loadmode_paste",
        "loadmode_resource",
-       "loadmode_nested"
+       "loadmode_edl_clip",
+       "loadmode_edl_nested",
+       "loadmode_edl_fileref",
 };
 
 static const char *mode_text[] =
@@ -47,7 +52,9 @@ static const char *mode_text[] =
        N_("Concatenate to existing tracks"),
        N_("Paste over selection/at insertion point"),
        N_("Create new resources only"),
-       N_("Nest sequence")
+       N_("EDL as Clip"),
+       N_("EDL as Nested"),
+       N_("EDL as Reference"),
 };
 
 
@@ -58,53 +65,52 @@ LoadModeItem::LoadModeItem(const char *text, int value)
 }
 
 
-LoadModeToggle::LoadModeToggle(int x, int y, LoadMode *window,
-               int value, const char *images, const char *tooltip)
- : BC_Toggle(x, y, window->mwindow->theme->get_image_set(images),
-               *window->output == value)
+LoadModeToggle::LoadModeToggle(int x, int y, LoadMode *window, int id,
+               int *output, const char *images, const char *tooltip)
+ : BC_Toggle(x, y, window->mwindow->theme->get_image_set(images), *output)
 {
        this->window = window;
-       this->value = value;
+       this->id = id;
+       this->output = output;
        set_tooltip(tooltip);
 }
 
 int LoadModeToggle::handle_event()
 {
-       *window->output = value;
+       *output = id;
        window->update();
        return 1;
 }
 
 
 
-LoadMode::LoadMode(MWindow *mwindow,
-               BC_WindowBase *window, int x, int y, int *output,
-               int use_nothing, int use_nested, int line_wrap)
+LoadMode::LoadMode(MWindow *mwindow, BC_WindowBase *window,
+               int x, int y, int *load_mode, int *edl_mode,
+               int use_nothing, int line_wrap)
 {
        this->mwindow = mwindow;
        this->window = window;
        this->x = x;
        this->y = y;
-       this->output = output;
+       this->load_mode = load_mode;
+       this->edl_mode = edl_mode;
        this->use_nothing = use_nothing;
-       this->use_nested = use_nested;
        this->line_wrap = line_wrap;
        for( int i=0; i<TOTAL_LOADMODES; ++i ) mode[i] = 0;
+       load_title = 0;
+       edl_title = 0;
 }
 
 LoadMode::~LoadMode()
 {
-       delete title;
-       delete textbox;
-       delete listbox;
        load_modes.remove_all_objects();
        for( int i=0; i<TOTAL_LOADMODES; ++i ) delete mode[i];
 }
 
-const char *LoadMode::mode_to_text()
+const char *LoadMode::mode_to_text(int mode)
 {
        for( int i=0; i<load_modes.total; ++i ) {
-               if( load_modes[i]->value == *output )
+               if( load_modes[i]->value == mode )
                        return load_modes[i]->get_text();
        }
        return _("Unknown");
@@ -115,16 +121,29 @@ void LoadMode::load_mode_geometry(BC_WindowBase *gui, Theme *theme,
                int *pw, int *ph)
 {
        int pad = 5;
-       const char *title_text = _("Insertion strategy:");
-       int mw = BC_Title::calculate_w(gui, title_text);
-       int mh = BC_Title::calculate_h(gui, title_text);
+       const char *load_text = LOADMODE_LOAD_TEXT;
+       int mw = BC_Title::calculate_w(gui, load_text);
+       int mh = BC_Title::calculate_h(gui, load_text);
        int ix = mw + 2*pad, iy = 0, x1 = ix;
        int ww = theme->loadmode_w + 24;
        if( mw < ww ) mw = ww;
 
        for( int i=0; i<TOTAL_LOADMODES; ++i ) {
-               if( i == LOADMODE_NOTHING && !use_nothing) continue;
-               if( i == LOADMODE_NESTED && !use_nested) continue;
+               switch( i ) {
+               case LOADMODE_NOTHING:
+                       if( !use_nothing) continue;
+                       break;
+               case LOADMODE_EDL_CLIP:
+               case LOADMODE_EDL_NESTED:
+               case LOADMODE_EDL_FILEREF:
+                       if( !use_nested ) continue;
+                       if( iy ) break;
+                       ix = 0;  iy = mh + pad;
+                       const char *edl_text = LOADMODE_EDL_TEXT;
+                       ix += bmax(BC_Title::calculate_w(gui, load_text),
+                                  BC_Title::calculate_w(gui, edl_text)) + 2*pad;
+                       break;
+               }
                int text_line, w, h, toggle_x, toggle_y;
                int text_x, text_y, text_w, text_h;
                BC_Toggle::calculate_extents(gui,
@@ -164,16 +183,31 @@ int LoadMode::calculate_h(BC_WindowBase *gui, Theme *theme,
 void LoadMode::create_objects()
 {
        int pad = 5;
-       const char *title_text = _("Insertion strategy:");
-       window->add_subwindow(title = new BC_Title(x, y, title_text));
-       int mw = title->get_w(), mh = title->get_h();
+       load_title = new BC_Title(x, y, LOADMODE_LOAD_TEXT);
+       window->add_subwindow(load_title);
+       int mw = load_title->get_w(), mh = load_title->get_h();
        int ix = mw + 2*pad, iy = 0, x1 = ix;
        int ww = mwindow->theme->loadmode_w + 24;
        if( mw < ww ) mw = ww;
 
        for( int i=0; i<TOTAL_LOADMODES; ++i ) {
-               if( i == LOADMODE_NOTHING && !use_nothing) continue;
-               if( i == LOADMODE_NESTED && !use_nested) continue;
+               int *mode_set = load_mode;
+               switch( i ) {
+               case LOADMODE_NOTHING:
+                       if( !use_nothing) continue;
+                       break;
+               case LOADMODE_EDL_CLIP:
+               case LOADMODE_EDL_NESTED:
+               case LOADMODE_EDL_FILEREF:
+                       if( !edl_mode ) continue;
+                       mode_set = edl_mode;
+                       if( iy ) break;
+                       ix = 0;  iy = mh + pad;
+                       edl_title = new BC_Title(x+ix, y+iy, LOADMODE_EDL_TEXT);
+                       window->add_subwindow(edl_title);
+                       ix += bmax(load_title->get_w(), edl_title->get_w()) + 2*pad;
+                       break;
+               }
                load_modes.append(new LoadModeItem(_(mode_text[i]), i));
                int text_line, w, h, toggle_x, toggle_y;
                int text_x, text_y, text_w, text_h;
@@ -182,8 +216,8 @@ void LoadMode::create_objects()
                        &text_line, &w, &h, &toggle_x, &toggle_y,
                        &text_x, &text_y, &text_w, &text_h, 0, MEDIUMFONT);
                if( line_wrap && ix+w > ww ) { ix = x1;  iy += h+pad; }
-               mode[i] = new LoadModeToggle(x+ix, y+iy, this,
-                       i, mode_images[i], _(mode_text[i]));
+               mode[i] = new LoadModeToggle(x+ix, y+iy, this, i,
+                       mode_set, mode_images[i], _(mode_text[i]));
                window->add_subwindow(mode[i]);
                if( (ix+=w) > mw ) mw = ix;
                if( (h+=iy) > mh ) mh = h;
@@ -191,7 +225,7 @@ void LoadMode::create_objects()
        }
 
        ix = 0;  iy = mh+pad;
-       const char *mode_text = mode_to_text();
+       const char *mode_text = mode_to_text(*load_mode);
        textbox = new BC_TextBox(x+ix, y+iy,
                mwindow->theme->loadmode_w, 1, mode_text);
        window->add_subwindow(textbox);
@@ -199,21 +233,34 @@ void LoadMode::create_objects()
        listbox = new LoadModeListBox(window, this, x+ix, y+iy);
        window->add_subwindow(listbox);
        mh = iy + textbox->get_h();
+       update();
 }
 
 int LoadMode::reposition_window(int x, int y)
 {
        this->x = x;  this->y = y;
-       title->reposition_window(x, y);
-       int mw = title->get_w(), mh = title->get_h();
-       int pad = 5;
+       load_title->reposition_window(x, y);
+       int mw = load_title->get_w(), mh = load_title->get_h();
+       int pad = xS(5);
        int ix = mw + 2*pad, iy = 0, x1 = ix;
-       int ww = mwindow->theme->loadmode_w + 24;
+       int ww = mwindow->theme->loadmode_w + xS(24);
        if( mw < ww ) mw = ww;
 
        for( int i=0; i<TOTAL_LOADMODES; ++i ) {
-               if( i == LOADMODE_NOTHING && !use_nothing) continue;
-               if( i == LOADMODE_NESTED && !use_nested) continue;
+               switch( i ) {
+               case LOADMODE_NOTHING:
+                       if( !use_nothing) continue;
+                       break;
+               case LOADMODE_EDL_CLIP:
+               case LOADMODE_EDL_NESTED:
+               case LOADMODE_EDL_FILEREF:
+                       if( !edl_mode ) continue;
+                       if( iy ) break;
+                       ix = 0;  iy = mh + pad;
+                       edl_title->reposition_window(x+ix, y+iy);
+                       ix += bmax(load_title->get_w(), edl_title->get_w()) + 2*pad;
+                       break;
+               }
                int text_line, w, h, toggle_x, toggle_y;
                int text_x, text_y, text_w, text_h;
                BC_Toggle::calculate_extents(window,
@@ -238,7 +285,7 @@ int LoadMode::get_h()
 {
        int result = 0;
        load_mode_geometry(window, mwindow->theme,
-                       use_nothing, use_nested, line_wrap, 0, &result);
+                       use_nothing, edl_mode!=0, line_wrap, 0, &result);
        return result;
 }
 
@@ -256,9 +303,18 @@ void LoadMode::update()
 {
        for( int i=0; i<TOTAL_LOADMODES; ++i ) {
                if( !mode[i] ) continue;
-               mode[i]->set_value(*output == i);
+               int v = 0;
+               if( *load_mode == i ) v = 1;
+               if( edl_mode && *edl_mode == i ) v = 1;
+               mode[i]->set_value(v);
        }
-       textbox->update(mode_to_text());
+       for( int k=0; k<load_modes.total; ++k ) {
+               int i = load_modes[k]->value, v = 0;
+               if( *load_mode == i ) v = 1;
+               if( edl_mode && *edl_mode == i ) v = 1;
+               load_modes[k]->set_selected(v);
+       }
+       textbox->update(mode_to_text(*load_mode));
 }
 
 int LoadMode::set_line_wrap(int v)
@@ -270,7 +326,7 @@ int LoadMode::set_line_wrap(int v)
 
 LoadModeListBox::LoadModeListBox(BC_WindowBase *window, LoadMode *loadmode,
                int x, int y)
- : BC_ListBox(x, y, loadmode->mwindow->theme->loadmode_w, 150, LISTBOX_TEXT,
+ : BC_ListBox(x, y, loadmode->mwindow->theme->loadmode_w, yS(150), LISTBOX_TEXT,
        (ArrayList<BC_ListBoxItem *>*)&loadmode->load_modes, 0, 0, 1, 0, 1)
 {
        this->window = window;
@@ -284,10 +340,13 @@ LoadModeListBox::~LoadModeListBox()
 int LoadModeListBox::handle_event()
 {
        LoadModeItem *item = (LoadModeItem *)get_selection(0, 0);
-       if( item ) {
-               *(loadmode->output) = item->value;
-               loadmode->update();
-       }
+       if( !item ) return 1;
+       int mode = item->value;
+       if( mode < LOADMODE_EDL_CLIP )
+               *loadmode->load_mode = mode;
+       else if( loadmode->edl_mode )
+               *loadmode->edl_mode = mode;
+       loadmode->update();
        return 1;
 }