add binfolder path relative filters, fix gbrp color model, vwdw timebar tweaks, title...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / awindowgui.C
index 9f966f75f6a8116087033dd530b7abd62979aa85..1ab6ea1affe3b65c6a63ad6a95a9ba8592a0cdd3 100644 (file)
@@ -153,6 +153,10 @@ VFrame *AssetVIcon::frame()
                if( !temp )
                        temp = new VFrame(0, -1, asset->width, asset->height, BC_RGB888, -1);
                while( seq_no >= images.size() ) {
+                       mwindow->video_cache->check_in(asset);
+                       Thread::yield();
+                       file = mwindow->video_cache->check_out(asset, mwindow->edl, 0);
+                       if( !file ) { usleep(1000);  continue; }
                        file->set_layer(0);
                        int64_t pos = images.size() / picon->gui->vicon_thread->refresh_rate * frame_rate;
                        file->set_video_position(pos,0);
@@ -173,12 +177,12 @@ int64_t AssetVIcon::set_seq_no(int64_t no)
 int AssetVIcon::get_vx()
 {
        BC_ListBox *lbox = picon->gui->asset_list;
-       return lbox->get_item_x(picon) + ICON_MARGIN;
+       return lbox->get_icon_x(picon);
 }
 int AssetVIcon::get_vy()
 {
        BC_ListBox *lbox = picon->gui->asset_list;
-       return lbox->get_item_y(picon) + ICON_MARGIN;
+       return lbox->get_icon_y(picon);
 }
 
 void AssetVIcon::load_audio()
@@ -371,6 +375,7 @@ AssetPicon::~AssetPicon()
 {
        if( vicon )
                gui->vicon_thread->del_vicon(vicon);
+       delete vicon_frame;
        if( indexable ) indexable->remove_user();
        if( edl ) edl->remove_user();
        if( icon && !gui->protected_pixmap(icon) ) {
@@ -436,6 +441,7 @@ void AssetPicon::reset()
        icon = 0;
        icon_vframe = 0;
        vicon = 0;
+       vicon_frame = 0;
        in_use = 1;
        comments_time = 0;
        id = 0;
@@ -1049,8 +1055,7 @@ void AWindowGUI::create_objects()
        add_subwindow(asset_list = new AWindowAssets(mwindow, this, x1, y1, w1, h1));
 
        vicon_thread = new VIconThread(asset_list);
-       int x0 = 0, y0 = asset_list->get_title_h();
-       vicon_thread->set_drawing_area(x0,y0, get_w(),get_h());
+       asset_list->update_vicon_area();
        vicon_thread->start();
        vicon_audio = new AssetVIconAudio(this);
 
@@ -1136,10 +1141,7 @@ int AWindowGUI::resize_event(int w, int h)
 //     view->reposition_window(x, y);
 
        BC_WindowBase::resize_event(w, h);
-       int x0 = 0, x1 = asset_list->get_w();
-       int y0 = asset_list->get_title_h();
-       int y1 = asset_list->get_h();
-       vicon_thread->set_drawing_area(x0,y0, x1,y1);
+       asset_list->update_vicon_area();
        return 1;
 }
 
@@ -1201,13 +1203,14 @@ int AWindowGUI::close_event()
 
 void AWindowGUI::start_vicon_drawing()
 {
-       if( !vicon_drawing ) return;
+       if( !vicon_drawing || !vicon_thread->interrupted ) return;
        if( mwindow->edl->session->awindow_folder == AW_MEDIA_FOLDER ||
            mwindow->edl->session->awindow_folder >= AWINDOW_USER_FOLDERS ) {
                switch( mwindow->edl->session->assetlist_format ) {
                case ASSETS_ICONS:
                case ASSETS_ICONS_PACKED:
                case ASSETS_ICON_LIST:
+                       asset_list->update_vicon_area();
                        vicon_thread->start_drawing();
                        break;
                default:
@@ -1218,9 +1221,22 @@ void AWindowGUI::start_vicon_drawing()
 
 void AWindowGUI::stop_vicon_drawing()
 {
+       if( vicon_thread->interrupted ) return;
        vicon_thread->stop_drawing();
 }
 
+VFrame *AssetPicon::get_vicon_frame()
+{
+       if( !vicon ) return 0;
+       if( gui->vicon_thread->interrupted ) return 0;
+       VFrame *frame = vicon->frame();
+       if( !frame ) return 0;
+       if( !vicon_frame )
+               vicon_frame = new VFrame(vicon->vw, vicon->vh, frame->get_color_model());
+       vicon_frame->transfer_from(frame);
+       return vicon_frame;
+}
+
 int AWindowGUI::cycle_assetlist_format()
 {
        EDLSession *session = mwindow->edl->session;
@@ -1244,11 +1260,6 @@ int AWindowGUI::cycle_assetlist_format()
        stop_vicon_drawing();
        session->assetlist_format = format;
        asset_list->update_format(session->assetlist_format, 0);
-       int x0 = 0;
-       int x1 = asset_list->get_w();
-       int y0 = asset_list->get_title_h();
-       int y1 = asset_list->get_h();
-       vicon_thread->set_drawing_area(x0,y0, x1,y1);
        async_update_assets();
        start_vicon_drawing();
        return 1;
@@ -1706,17 +1717,18 @@ EDL *AWindowGUI::collect_proxy(Indexable *indexable)
 }
 
 
-void AWindowGUI::collect_assets()
+void AWindowGUI::collect_assets(int proxy)
 {
        mwindow->session->drag_assets->remove_all();
        mwindow->session->drag_clips->remove_all();
        int i = 0;  AssetPicon *result;
        while( (result = (AssetPicon*)asset_list->get_selection(0, i++)) != 0 ) {
                Indexable *indexable = result->indexable;
-               if( indexable && indexable->is_asset &&
+               if( proxy && indexable && indexable->is_asset &&
                    indexable->awindow_folder == AW_PROXY_FOLDER ) {
                        EDL *drag_edl = collect_proxy(indexable);
                        if( drag_edl ) mwindow->session->drag_clips->append(drag_edl);
+                       continue;
                }
                if( indexable ) {
                        mwindow->session->drag_assets->append(indexable);
@@ -1744,10 +1756,13 @@ void AWindowGUI::copy_picons(ArrayList<BC_ListBoxItem*> *dst,
                AssetPicon *picon = (AssetPicon*)src->values[i];
                picon->sort_key = -1;
                if( !visible && bin_folder ) {
-                       Indexable *idxbl = bin_folder->is_clips ? picon->edl : picon->indexable;
+                       Indexable *idxbl = bin_folder->is_clips ? (Indexable *)picon->edl :
+                           picon->indexable ? picon->indexable :
+                           picon->edl ? picon->edl->get_proxy_asset() : 0;
                        if( idxbl ) {
                                picon->sort_key = mwindow->edl->folders.matches_indexable(folder, idxbl);
-                               if( picon->sort_key >= 0 ) visible = 1;
+                               if( picon->sort_key < 0 ) continue;
+                               visible = 1;
                        }
                }
                if( !visible && picon->indexable && picon->indexable->awindow_folder == folder )
@@ -1882,11 +1897,6 @@ void AWindowGUI::update_assets()
 
        if( mwindow->edl->session->assetlist_format != asset_list->get_format() ) {
                asset_list->update_format(mwindow->edl->session->assetlist_format, 0);
-               int x0 = 0;
-               int x1 = asset_list->get_w();
-               int y0 = asset_list->get_title_h();
-               int y1 = asset_list->get_h();
-               vicon_thread->set_drawing_area(x0,y0, x1,y1);
        }
        int asset_xposition = asset_list->get_xposition();
        int asset_yposition = asset_list->get_yposition();
@@ -2078,7 +2088,7 @@ int AWindowFolders::drag_stop()
                        ArrayList<Indexable *> *drags = folder->is_clips ?
                                ((ArrayList<Indexable *> *)mwindow->session->drag_clips) :
                                ((ArrayList<Indexable *> *)mwindow->session->drag_assets);
-                       if( folder && drags && !folder->add_patterns(drags) )
+                       if( folder && drags && !folder->add_patterns(drags, shift_down()) )
                                flicker(1,30);
                        mwindow->session->current_operation = ::NO_OPERATION;
                        result = 1;
@@ -2224,20 +2234,19 @@ int AWindowAssets::selection_changed()
                        break;
                }
 
-               BC_ListBox::deactivate_selection();
-               return 1;
+               deactivate_selection();
        }
-       else if( gui->vicon_drawing &&
-                get_button_down() && get_buttonpress() == 1 &&
-                (item = (AssetPicon*)get_selection(0, 0)) ) {
+       else if( gui->vicon_drawing && get_button_down() && get_buttonpress() == 1 &&
+                ( mwindow->edl->session->awindow_folder == AW_MEDIA_FOLDER ||
+                  mwindow->edl->session->awindow_folder >= AWINDOW_USER_FOLDERS ) &&
+                  (item = (AssetPicon*)get_selection(0, 0)) != 0 ) {
                VIcon *vicon = 0;
-               if( !gui->vicon_thread->viewing ) {
+               if( !gui->vicon_thread->vicon  ) {
                        vicon = item->vicon;
                }
                gui->vicon_thread->set_view_popup(vicon);
-
        }
-       return 0;
+       return 1;
 }
 
 void AWindowAssets::draw_background()
@@ -2254,7 +2263,7 @@ void AWindowAssets::draw_background()
 int AWindowAssets::drag_start_event()
 {
        int collect_pluginservers = 0;
-       int collect_assets = 0;
+       int collect_assets = 0, proxy = 0;
 
        if( BC_ListBox::drag_start_event() ) {
                switch( mwindow->edl->session->awindow_folder ) {
@@ -2277,6 +2286,8 @@ int AWindowAssets::drag_start_event()
                case AW_LABEL_FOLDER:
                        // do nothing!
                        break;
+               case AW_PROXY_FOLDER:
+                       proxy = 1; // fall thru
                case AW_MEDIA_FOLDER:
                default:
                        mwindow->session->current_operation = DRAG_ASSET;
@@ -2297,7 +2308,7 @@ int AWindowAssets::drag_start_event()
                }
 
                if( collect_assets ) {
-                       gui->collect_assets();
+                       gui->collect_assets(proxy);
                }
 
                return 1;
@@ -2402,8 +2413,9 @@ int AWindowAssets::column_resize_event()
 
 int AWindowAssets::focus_in_event()
 {
+       int ret = BC_ListBox::focus_in_event();
        gui->start_vicon_drawing();
-       return 0;
+       return ret;
 }
 
 int AWindowAssets::focus_out_event()
@@ -2412,6 +2424,43 @@ int AWindowAssets::focus_out_event()
        return BC_ListBox::focus_out_event();
 }
 
+int AWindowAssets::cursor_enter_event()
+{
+       int ret = BC_ListBox::cursor_enter_event();
+       gui->start_vicon_drawing();
+       return ret;
+}
+
+int AWindowAssets::cursor_leave_event()
+{
+       gui->stop_vicon_drawing();
+       return BC_ListBox::cursor_leave_event();
+}
+
+void AWindowAssets::update_vicon_area()
+{
+       int x0 = 0, x1 = get_w();
+       int y0 = get_title_h();
+       int y1 = get_h();
+       if( is_highlighted() ) {
+               x0 += LISTBOX_BORDER;  x1 -= LISTBOX_BORDER;
+               y0 += LISTBOX_BORDER;  y1 -= LISTBOX_BORDER;
+       }
+       gui->vicon_thread->set_drawing_area(x0,y0, x1,y1);
+}
+
+int AWindowAssets::mouse_over_event(int no)
+{
+       if( gui->vicon_thread->viewing &&
+           no >= 0 && no < gui->displayed_assets[0].size() ) {
+               AssetPicon *picon = (AssetPicon *)gui->displayed_assets[0][no];
+               VIcon *vicon = picon->vicon;
+               picon->gui->vicon_thread->set_view_popup(vicon);
+       }
+       return 0;
+}
+
+
 AWindowSearchTextBox::AWindowSearchTextBox(AWindowSearchText *search_text, int x, int y, int w)
  : BC_TextBox(x, y, w, 1, "")
 {
@@ -2645,7 +2694,7 @@ AVIconDrawing::AVIconDrawing(AWindowGUI *agui, int x, int y, VFrame **images)
  : BC_Toggle(x, y, images, agui->vicon_drawing)
 {
        this->agui = agui;
-       set_tooltip(_("draw vicons"));
+       set_tooltip(_("Preview"));
 }
 
 void AVIconDrawing::calculate_geometry(AWindowGUI *agui, VFrame **images, int *ww, int *hh)