clip folder bug on reload, expander user folder drag/drop segv, remove libfdk src...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / awindowgui.C
index 3f9f9b2fa0a82161d150047d294b992c95c429c9..009647b3dbc7daeb084fd2fc56173be89e4f4ab5 100644 (file)
@@ -579,7 +579,7 @@ void AssetPicon::create_objects()
                                        icon_vframe = new VFrame(0,
                                                -1, pixmap_w, pixmap_h, BC_RGB888, -1);
                                        icon_vframe->transfer_from(gui->temp_picon);
-                                       if( asset->awindow_folder == AW_MEDIA_FOLDER ) {
+                                       if( asset->folder_no == AW_MEDIA_FOLDER ) {
 // vicon images
                                                double framerate = asset->get_frame_rate();
                                                if( !framerate ) framerate = VICON_RATE;
@@ -645,7 +645,7 @@ void AssetPicon::create_objects()
                                                        base_colors[i], line_colors[i]);
                                        }
                                        mwindow->audio_cache->check_in(asset);
-                                       if( asset->awindow_folder == AW_MEDIA_FOLDER ) {
+                                       if( asset->folder_no == AW_MEDIA_FOLDER ) {
                                                double secs = duration;
                                                if( secs > 5 ) secs = 5;
                                                double refresh_rate = gui->vicon_thread->refresh_rate;
@@ -1642,6 +1642,10 @@ void AWindowGUI::update_asset_list()
        for( int i=0; i<new_assets.size(); ++i ) {
                AssetPicon *picon = new_assets[i];
                picon->create_objects();
+               if( picon->indexable )
+                       picon->foldernum = AW_MEDIA_FOLDER;
+               else if( picon->edl )
+                       picon->foldernum = AW_CLIP_FOLDER;
                assets.append(picon);
        }
 
@@ -1763,7 +1767,7 @@ EDL *AWindowGUI::collect_proxy(Indexable *indexable)
                if( current->data_type != TRACK_AUDIO ) continue;
                current->insert_asset(unproxy_asset, 0, length, 0, atrack++);
        }
-       proxy_edl->awindow_folder = AW_PROXY_FOLDER;
+       proxy_edl->folder_no = AW_PROXY_FOLDER;
        return proxy_edl;
 }
 
@@ -1776,7 +1780,7 @@ void AWindowGUI::collect_assets(int proxy)
        while( (result = (AssetPicon*)asset_list->get_selection(0, i++)) != 0 ) {
                Indexable *indexable = result->indexable;
                if( proxy && indexable && indexable->is_asset &&
-                   indexable->awindow_folder == AW_PROXY_FOLDER ) {
+                   indexable->folder_no == AW_PROXY_FOLDER ) {
                        EDL *drag_edl = collect_proxy(indexable);
                        if( drag_edl ) mwindow->session->drag_clips->append(drag_edl);
                        continue;
@@ -1792,30 +1796,22 @@ void AWindowGUI::collect_assets(int proxy)
        }
 }
 
-void AWindowGUI::copy_picons(ArrayList<BC_ListBoxItem*> *dst,
-       ArrayList<BC_ListBoxItem*> *src, int folder)
+void AWindowGUI::copy_picons(AssetPicon *picon, ArrayList<BC_ListBoxItem*> *src)
 {
 // Remove current pointers
+       ArrayList<BC_ListBoxItem*> *dst = displayed_assets;
        dst[0].remove_all();
        dst[1].remove_all_objects();
-       AWindowFolderSubItems *sub_items = 0;
-       if( folder >= 0 && folder < AW_LABEL_FOLDER ) {
-               AssetPicon *picon = 0;
-               for( int k=folders.size(); --k>=0; ) {
-                       picon = (AssetPicon*)folders[k];
-                       if( picon->foldernum == folder ) break;
-               }
-               if( picon )
-                       sub_items = picon->sub_items;
-               folder = AW_NO_FOLDER;
-       }
+
+       AWindowFolderSubItems *sub_items = picon ? picon->sub_items : 0;
+       int folder = mwindow->edl->session->awindow_folder;
        BinFolder *bin_folder = folder < AWINDOW_USER_FOLDERS ? 0 :
                mwindow->edl->get_folder(folder);
 
 // Create new pointers
        for( int i = 0; i < src->total; i++ ) {
-               int visible = folder < 0 ? 1 : 0;
-               AssetPicon *picon = (AssetPicon*)src->values[i];
+               int visible = folder >= AW_CLIP_FOLDER ? 0 : 1;
+               picon = (AssetPicon*)src->values[i];
                picon->sort_key = -1;
                if( !visible && bin_folder ) {
                        Indexable *idxbl = bin_folder->is_clips ? (Indexable *)picon->edl :
@@ -1827,9 +1823,9 @@ void AWindowGUI::copy_picons(ArrayList<BC_ListBoxItem*> *dst,
                                visible = 1;
                        }
                }
-               if( !visible && picon->indexable && picon->indexable->awindow_folder == folder )
+               if( !visible && picon->indexable && picon->indexable->folder_no == folder )
                        visible = 1;
-               if( !visible && picon->edl && picon->edl->local_session->folder == folder )
+               if( !visible && picon->edl && picon->edl->folder_no == folder )
                        visible = 1;
                if( visible && sub_items ) {
                        if( !sub_items->matches(picon->get_text()) )
@@ -1904,39 +1900,29 @@ void AWindowGUI::filter_displayed_assets()
        //allow_iconlisting = 1;
        asset_titles[0] = C_("Title");
        asset_titles[1] = _("Comments");
-       int folder = mwindow->edl->session->awindow_folder;
-
-       switch( folder ) {
-       case AW_AEFFECT_FOLDER:
-               copy_picons(displayed_assets, &aeffects, folder);
-               break;
-       case AW_VEFFECT_FOLDER:
-               copy_picons(displayed_assets, &veffects, folder);
-               break;
-       case AW_ATRANSITION_FOLDER:
-               copy_picons(displayed_assets, &atransitions, folder);
-               break;
-       case AW_VTRANSITION_FOLDER:
-               copy_picons(displayed_assets, &vtransitions, folder);
-               break;
-       case AW_LABEL_FOLDER:
-               copy_picons(displayed_assets, &labellist, AW_NO_FOLDER);
-               asset_titles[0] = _("Time Stamps");
-               asset_titles[1] = C_("Title");
-               //allow_iconlisting = 0;
-               break;
-       default:
-               copy_picons(displayed_assets, &assets, mwindow->edl->session->awindow_folder);
-               break;
-       }
-
-       // Ensure the current folder icon is highlighted
+       AssetPicon *picon = 0;
        int selected_folder = mwindow->edl->session->awindow_folder;
+       // Ensure the current folder icon is highlighted
        for( int i = 0; i < folders.total; i++ ) {
                AssetPicon *folder_item = (AssetPicon *)folders.values[i];
                int selected = folder_item->foldernum == selected_folder ? 1 : 0;
                folder_item->set_selected(selected);
+               if( selected ) picon = folder_item;
+       }
+
+       ArrayList<BC_ListBoxItem*> *src = &assets;
+       switch( selected_folder ) {
+       case AW_AEFFECT_FOLDER:  src = &aeffects;  break;
+       case AW_VEFFECT_FOLDER:  src = &veffects;  break;
+       case AW_ATRANSITION_FOLDER:  src = &atransitions;  break;
+       case AW_VTRANSITION_FOLDER:  src = &vtransitions;  break;
+       case AW_LABEL_FOLDER:  src = &labellist;
+               asset_titles[0] = _("Time Stamps");
+               asset_titles[1] = C_("Title");
+               //allow_iconlisting = 0;
+               break;
        }
+       copy_picons(picon, src);
 }
 
 
@@ -2163,7 +2149,7 @@ int AWindowFolders::drag_stop()
        if( get_hidden() ) return 0;
        if( mwindow->session->current_operation == DRAG_ASSET &&
            gui->folder_list->cursor_above() ) { // check user folder
-               int item_no = gui->folder_list->get_cursor_item();
+               int item_no = gui->folder_list->get_cursor_data_item_no();
                AssetPicon *picon = (AssetPicon *)(item_no < 0 ? 0 : gui->folders[item_no]);
                if( picon && picon->foldernum >= AWINDOW_USER_FOLDERS ) {
                        BinFolder *folder = mwindow->edl->get_folder(picon->foldernum);
@@ -2488,11 +2474,14 @@ int AWindowAssets::drag_motion_event()
        lock_window("AWindowAssets::drag_motion_event");
        if( mwindow->session->current_operation == DRAG_ASSET &&
            gui->folder_list->cursor_above() ) { // highlight user folder
-               int item_no = gui->folder_list->get_cursor_item();
+               BC_ListBoxItem *item = 0;
+               int item_no = gui->folder_list->get_cursor_data_item_no(&item);
                if( item_no >= 0 ) {
                        AssetPicon *folder = (AssetPicon *)gui->folders[item_no];
                        if( folder->foldernum < AWINDOW_USER_FOLDERS ) item_no = -1;
                }
+               if( item_no >= 0 )
+                       item_no = gui->folder_list->item_to_index(&gui->folders, item);
                int folder_xposition = gui->folder_list->get_xposition();
                int folder_yposition = gui->folder_list->get_yposition();
                gui->folder_list->update(&gui->folders, 0, 0, 1,