X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fawindowgui.C;h=e7f8e7bee9daf24980b67d1314079838394ab733;hp=7e97656929ae6787fd8e37d0c8d13de183502c8d;hb=bd40a11178ed791d8c163877d3c28e5045148c62;hpb=32294ae14f17c867a39f638112cbec12d59b32d6 diff --git a/cinelerra-5.1/cinelerra/awindowgui.C b/cinelerra-5.1/cinelerra/awindowgui.C index 7e976569..e7f8e7be 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.C +++ b/cinelerra-5.1/cinelerra/awindowgui.C @@ -171,7 +171,7 @@ int AssetVIcon::get_vx() int AssetVIcon::get_vy() { BC_ListBox *lbox = picon->gui->asset_list; - return lbox->get_item_y(picon) + lbox->get_title_h(); + return lbox->get_item_y(picon); } void AssetVIcon::load_audio() @@ -651,7 +651,6 @@ void AssetPicon::create_objects() open_render_engine(edl, 0); render_video(0, gui->temp_picon); close_render_engine(); - gui->lock_window("AssetPicon::create_objects 0"); icon_vframe = new VFrame(0, -1, pixmap_w, pixmap_h, BC_RGB888, -1); icon_vframe->transfer_from(gui->temp_picon); @@ -661,6 +660,7 @@ void AssetPicon::create_objects() pixmap_w = icon_vframe->get_w(); pixmap_h = icon_vframe->get_h(); } + gui->lock_window("AssetPicon::create_objects 0"); icon = new BC_Pixmap(gui, pixmap_w, pixmap_h); icon->draw_vframe(icon_vframe, 0, 0, pixmap_w, pixmap_h, 0, 0); @@ -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); @@ -1023,6 +1026,8 @@ 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()); vicon_thread->start(); vicon_audio = new AssetVIconAudio(this); @@ -1174,8 +1179,15 @@ void AWindowGUI::start_vicon_drawing() { if( !vicon_drawing ) return; if( mwindow->edl->session->awindow_folder != AW_MEDIA_FOLDER ) return; - if( mwindow->edl->session->assetlist_format != ASSETS_ICONS ) return; - vicon_thread->start_drawing(); + switch( mwindow->edl->session->assetlist_format ) { + case ASSETS_ICONS: + case ASSETS_ICONS_PACKED: + case ASSETS_ICON_LIST: + vicon_thread->start_drawing(); + break; + default: + break; + } } void AWindowGUI::stop_vicon_drawing() @@ -1206,6 +1218,7 @@ AWindowRemovePluginGUI:: void AWindowRemovePluginGUI::create_objects() { + lock_window("AWindowRemovePluginGUI::create_objects"); BC_Button *ok_button = new BC_OKButton(this); add_subwindow(ok_button); BC_Button *cancel_button = new BC_CancelButton(this); @@ -1219,6 +1232,7 @@ void AWindowRemovePluginGUI::create_objects() 0, 0, 1, 0, 0, LISTBOX_SINGLE, ICON_LEFT, 0); add_subwindow(list); show_window(); + unlock_window(); } int AWindowRemovePlugin::remove_plugin(PluginServer *plugin, ArrayList &folder) @@ -1426,11 +1440,13 @@ void AWindowGUI::create_label_folder() void AWindowGUI::update_asset_list() { + ArrayList 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; iedl->clips.size(); ++i ) { int exists = 0; @@ -1451,8 +1467,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 +1490,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; iedl->nested_edls.size(); ++i ) { int exists = 0; @@ -1504,10 +1514,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; icreate_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 +1567,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 +1586,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 +1685,7 @@ void AWindowGUI::copy_picons(ArrayList *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 +1772,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 +1781,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); @@ -1765,6 +1792,11 @@ 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(); @@ -1892,7 +1924,7 @@ int AWindowDivider::button_release_event() AWindowFolders::AWindowFolders(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h) : BC_ListBox(x, y, w, h, - mwindow->edl->session->folderlist_format == ASSETS_ICONS ? + mwindow->edl->session->folderlist_format == FOLDERS_ICONS ? LISTBOX_ICONS : LISTBOX_TEXT, &gui->folders, // Each column has an ArrayList of BC_ListBoxItems. 0, // Titles for columns. Set to 0 for no titles @@ -1958,9 +1990,11 @@ int AWindowFolders::button_press_event() AWindowAssets::AWindowAssets(MWindow *mwindow, AWindowGUI *gui, int x, int y, int w, int h) - : BC_ListBox(x, y, w, h, - (mwindow->edl->session->assetlist_format == ASSETS_ICONS && gui->allow_iconlisting ) ? - LISTBOX_ICONS : LISTBOX_TEXT, + : BC_ListBox(x, y, w, h, !gui->allow_iconlisting ? LISTBOX_TEXT : + mwindow->edl->session->assetlist_format == ASSETS_ICONS ? LISTBOX_ICONS : + mwindow->edl->session->assetlist_format == ASSETS_ICONS_PACKED ? LISTBOX_ICONS_PACKED : + mwindow->edl->session->assetlist_format == ASSETS_ICON_LIST ? LISTBOX_ICON_LIST : + LISTBOX_TEXT, &gui->assets, // Each column has an ArrayList of BC_ListBoxItems. gui->asset_titles,// Titles for columns. Set to 0 for no titles mwindow->edl->session->asset_columns, // width of each column @@ -2026,20 +2060,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; } @@ -2572,28 +2616,55 @@ int AWindowListFormat::handle_event() gui->stop_vicon_drawing(); EDLSession *session = mwindow->edl->session; - switch( session->assetlist_format ) { - case ASSETS_TEXT: - session->assetlist_format = ASSETS_ICONS; - break; - case ASSETS_ICONS: - session->assetlist_format = ASSETS_TEXT; - break; + if( mwindow->awindow->gui->allow_iconlisting ) { + switch( session->assetlist_format ) { + case ASSETS_TEXT: + session->assetlist_format = ASSETS_ICONS; + break; + case ASSETS_ICONS: + session->assetlist_format = ASSETS_ICONS_PACKED; + break; + case ASSETS_ICONS_PACKED: + session->assetlist_format = ASSETS_ICON_LIST; + break; + case ASSETS_ICON_LIST: + session->assetlist_format = ASSETS_TEXT; + break; + } } - - gui->asset_list->update_format(session->assetlist_format, 1); - if( !mwindow->awindow->gui->allow_iconlisting ) { + else mwindow->edl->session->assetlist_format = ASSETS_TEXT; - } + gui->asset_list->update_format(session->assetlist_format, 0); + int x0 = 0; + int x1 = gui->asset_list->get_w(); + int y0 = gui->asset_list->get_title_h(); + int y1 = gui->asset_list->get_h(); + gui->vicon_thread->set_drawing_area(x0,y0, x1,y1); + gui->async_update_assets(); gui->start_vicon_drawing(); return 1; } void AWindowListFormat::update() { - set_text(mwindow->edl->session->assetlist_format == ASSETS_TEXT ? - (char*)_("Display icons") : (char*)_("Display text")); + EDLSession *session = mwindow->edl->session; + const char *text = 0; + switch( session->assetlist_format ) { + case ASSETS_TEXT: + text = _("Display icons"); + break; + case ASSETS_ICONS: + text = _("Display icons packed"); + break; + case ASSETS_ICONS_PACKED: + text = _("Display icon list"); + break; + case ASSETS_ICON_LIST: + text = _("Display text"); + break; + } + set_text(text); } AWindowListSort::AWindowListSort(MWindow *mwindow, AWindowGUI *gui)