add proxy quick switch, folder lock, shortcuts update, bsd GL tweak
[goodguy/history.git] / cinelerra-5.1 / cinelerra / awindowgui.C
index 7e97656929ae6787fd8e37d0c8d13de183502c8d..bffaa2d1268d9a1ebdc933ef5822a31fe2cf1b5c 100644 (file)
@@ -847,6 +847,7 @@ AWindowGUI::AWindowGUI(MWindow *mwindow, AWindow *awindow)
        vicon_audio = 0;
        vicon_drawing = 1;
        displayed_folder = AW_NO_FOLDER;
+       folder_lock = new Mutex("AWindowGUI::folder_lock");
 }
 
 AWindowGUI::~AWindowGUI()
@@ -889,6 +890,7 @@ AWindowGUI::~AWindowGUI()
        delete vtransition_vframe;      delete vtransition_icon;
        delete aeffect_vframe;          delete aeffect_icon;
        delete veffect_vframe;          delete veffect_icon;
+       delete folder_lock;
 }
 
 bool AWindowGUI::protected_pixmap(BC_Pixmap *icon)
@@ -998,7 +1000,7 @@ void AWindowGUI::create_objects()
        plugin_icon(ladspa_vframe, ladspa_icon, "lad_picon", lad_picon_png);
        plugin_icon(ff_aud_vframe, ff_aud_icon, "ff_audio",  ff_audio_png);
        plugin_icon(ff_vid_vframe, ff_vid_icon, "ff_video",  ff_video_png);
-
+       folder_lock->lock("AWindowGUI::create_objects");
 // Mandatory folders
        folders.append(new AssetPicon(mwindow, this, AW_AEFFECT_FOLDER, 1));
        folders.append(new AssetPicon(mwindow, this, AW_VEFFECT_FOLDER, 1));
@@ -1010,6 +1012,7 @@ void AWindowGUI::create_objects()
        folders.append(new AssetPicon(mwindow, this, AW_MEDIA_FOLDER, 1));
 
        create_label_folder();
+       folder_lock->unlock();
 
        mwindow->theme->get_awindow_sizes(this);
        load_defaults(mwindow->defaults);
@@ -1426,11 +1429,13 @@ void AWindowGUI::create_label_folder()
 
 void AWindowGUI::update_asset_list()
 {
+       ArrayList<AssetPicon *> new_assets;
        for( int i = 0; i < assets.total; i++ ) {
                AssetPicon *picon = (AssetPicon*)assets.values[i];
                picon->in_use = 0;
        }
 
+       mwindow->gui->lock_window("AWindowGUI::update_asset_list");
 // Synchronize EDL clips
        for( int i=0; i<mwindow->edl->clips.size(); ++i ) {
                int exists = 0;
@@ -1451,8 +1456,7 @@ void AWindowGUI::update_asset_list()
                if( !exists ) {
                        AssetPicon *picon = new AssetPicon(mwindow,
                                this, mwindow->edl->clips[i]);
-                       picon->create_objects();
-                       assets.append(picon);
+                       new_assets.append(picon);
                }
        }
 
@@ -1475,15 +1479,10 @@ void AWindowGUI::update_asset_list()
                if( !exists ) {
                        AssetPicon *picon = new AssetPicon(mwindow,
                                this, current);
-                       picon->create_objects();
-                       assets.append(picon);
+                       new_assets.append(picon);
                }
        }
 
-       mwindow->gui->lock_window("AWindowGUI::update_asset_list");
-       mwindow->gui->default_message();
-       mwindow->gui->unlock_window();
-
 // Synchronize nested EDLs
        for( int i=0; i<mwindow->edl->nested_edls.size(); ++i ) {
                int exists = 0;
@@ -1504,10 +1503,20 @@ void AWindowGUI::update_asset_list()
                if( !exists ) {
                        AssetPicon *picon = new AssetPicon(mwindow,
                                this, (Indexable*)nested_edl);
-                       picon->create_objects();
-                       assets.append(picon);
+                       new_assets.append(picon);
                }
        }
+       mwindow->gui->unlock_window();
+
+       for( int i=0; i<new_assets.size(); ++i ) {
+               AssetPicon *picon = new_assets[i];
+               picon->create_objects();
+               assets.append(picon);
+       }
+
+       mwindow->gui->lock_window();
+       mwindow->gui->default_message();
+       mwindow->gui->unlock_window();
 
        for( int i = assets.size() - 1; i >= 0; i-- ) {
                AssetPicon *picon = (AssetPicon*)assets.get(i);
@@ -1547,6 +1556,7 @@ void AWindowGUI::update_picon(Indexable *indexable)
 
 void AWindowGUI::sort_assets(int use_mtime)
 {
+       folder_lock->lock("AWindowGUI::sort_assets");
        switch( mwindow->edl->session->awindow_folder ) {
        case AW_AEFFECT_FOLDER:
                sort_picons(&aeffects);
@@ -1565,16 +1575,20 @@ void AWindowGUI::sort_assets(int use_mtime)
                break;
        default:
                sort_picons(&assets, use_mtime);
+               break;
        }
 // reset xyposition
        asset_list->update_format(asset_list->get_format(), 0);
+       folder_lock->unlock();
        update_assets();
 }
 
 void AWindowGUI::sort_folders()
 {
+       folder_lock->lock("AWindowGUI::update_assets");
        sort_picons(&folders);
        folder_list->update_format(folder_list->get_format(), 0);
+       folder_lock->unlock();
        update_assets();
 }
 
@@ -1660,7 +1674,7 @@ void AWindowGUI::copy_picons(ArrayList<BC_ListBoxItem*> *dst,
                        if( picon->edl )
                                dst[1].append(item2 = new BC_ListBoxItem(picon->edl->local_session->clip_notes));
                        else
-                       if( picon->label && picon->label->textstr )
+                       if( picon->label )
                                dst[1].append(item2 = new BC_ListBoxItem(picon->label->textstr));
                        else if( picon->mtime ) {
                                char date_time[BCSTRLEN];
@@ -1747,6 +1761,7 @@ void AWindowGUI::filter_displayed_assets()
 void AWindowGUI::update_assets()
 {
        stop_vicon_drawing();
+       folder_lock->lock("AWindowGUI::update_assets");
        update_folder_list();
        update_asset_list();
        labellist.remove_all_objects();
@@ -1755,6 +1770,7 @@ void AWindowGUI::update_assets()
        if( displayed_folder != mwindow->edl->session->awindow_folder )
                search_text->clear();
        filter_displayed_assets();
+       folder_lock->unlock();
 
        if( mwindow->edl->session->folderlist_format != folder_list->get_format() ) {
                folder_list->update_format(mwindow->edl->session->folderlist_format, 0);
@@ -2026,20 +2042,30 @@ int AWindowAssets::handle_event()
 {
        AssetPicon *asset_picon = (AssetPicon *)get_selection(0, 0);
        if( !asset_picon ) return 0;
+       Indexable *picon_idxbl = asset_picon->indexable;
+       EDL *picon_edl = asset_picon->edl;
+       int proxy = 0;
+       VWindow *vwindow = 0;
        switch( mwindow->edl->session->awindow_folder ) {
        case AW_AEFFECT_FOLDER:
        case AW_VEFFECT_FOLDER:
        case AW_ATRANSITION_FOLDER:
        case AW_VTRANSITION_FOLDER: return 1;
+       case AW_PROXY_FOLDER:
+               proxy = 1; // fall thru
+       default:
+               if( mwindow->vwindows.size() > DEFAULT_VWINDOW )
+                       vwindow = mwindow->vwindows.get(DEFAULT_VWINDOW);
+               break;
        }
-       VWindow *vwindow = mwindow->vwindows.size() > DEFAULT_VWINDOW ?
-               mwindow->vwindows.get(DEFAULT_VWINDOW) : 0;
        if( !vwindow || !vwindow->is_running() ) return 1;
+       if( proxy && picon_idxbl ) {
+               picon_edl = gui->collect_proxy(picon_idxbl);
+               picon_idxbl = 0;
+       }
 
-       if( asset_picon->indexable )
-               vwindow->change_source(asset_picon->indexable);
-       else if( asset_picon->edl )
-               vwindow->change_source(asset_picon->edl);
+       if( picon_idxbl ) vwindow->change_source(picon_idxbl);
+       else if( picon_edl ) vwindow->change_source(picon_edl);
        return 1;
 }