X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fawindowgui.C;h=4688e7bc04cead9a205e6a0fd67288640dc10b25;hp=d71d1588715e1e58e4d0f69028d38c5ba95e3edc;hb=HEAD;hpb=9ffdfbe8e6fa7daaad4dcfdd46b6ac7b6e7a47e8 diff --git a/cinelerra-5.1/cinelerra/awindowgui.C b/cinelerra-5.1/cinelerra/awindowgui.C index d71d1588..dfe0163a 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.C +++ b/cinelerra-5.1/cinelerra/awindowgui.C @@ -2,6 +2,7 @@ /* * CINELERRA * Copyright (C) 1997-2012 Adam Williams + * Copyright (C) 2003-2016 Cinelerra CV contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,6 +30,7 @@ #include "awindow.h" #include "awindowgui.h" #include "bccmodels.h" +#include "bcdisplayinfo.h" #include "bchash.h" #include "bcsignals.h" #include "bctimer.h" @@ -127,7 +129,7 @@ VFrame *AssetVIcon::frame() AssetVIconThread *avt = picon->gui->vicon_thread; Indexable *idxbl = picon->indexable; Asset *asset = idxbl && idxbl->is_asset ? (Asset *)idxbl : 0; - if( !asset ) return vframes()>0 ? (VFrame*)*images[0] : 0; + if( !asset ) return vframes()>0 ? images[0]->vfrm : 0; if( !asset->video_data && audio_data && audio_size && length > 0 ) { if( !temp ) temp = new VFrame(0, -1, w, h, BC_RGB888, -1); temp->clear_frame(); @@ -173,15 +175,17 @@ VFrame *AssetVIcon::frame() File *file = mwindow->video_cache->check_out(asset, mwindow->edl, 1); if( !file ) { broken = 1; return 0; } Timer timer; - while( file && seq_no >= images.size() && !avt->interrupted ) { + while( file && seq_no >= images.size() ) { int64_t pos = images.size() / picon->gui->vicon_thread->refresh_rate * frame_rate; file->set_video_position(pos,0); file->set_layer(0); if( file->read_frame(temp) ) temp->clear_frame(); add_image(temp, vw, vh, vicon_cmodel); + if( seq_no < images.size() ) break; mwindow->video_cache->check_in(asset); if( timer.get_difference() > 500 ) return 0; Thread::yield(); + if( avt->interrupted ) return 0; file = mwindow->video_cache->check_out(asset, mwindow->edl, 0); for( int retries=10; !file && --retries>=0; usleep(1000) ) { if( avt->interrupted ) return 0; @@ -192,7 +196,7 @@ VFrame *AssetVIcon::frame() mwindow->video_cache->check_in(asset); } if( seq_no >= images.size() ) return 0; - return *images[seq_no]; + return images[seq_no]->vfrm; } int64_t AssetVIcon::set_seq_no(int64_t no) @@ -612,22 +616,10 @@ AssetVIconThread::AssetVIconThread(AWindowGUI *gui, Preferences *preferences) case VICON_COLOR_MODE_HIGH: vicon_cmodel = BC_RGB888; break; } this->vicon_cmodel = vicon_cmodel; - this->draw_lock = new Mutex("AssetVIconThread::draw_lock"); } AssetVIconThread::~AssetVIconThread() { - delete draw_lock; -} - -void AssetVIconThread::drawing_started() -{ - draw_lock->lock("AssetVIconThread::drawing_started"); -} - -void AssetVIconThread::drawing_stopped() -{ - draw_lock->unlock(); } void AssetVIconThread::set_view_popup(AssetVIcon *v, int draw_mode) @@ -691,10 +683,8 @@ ViewPopup *AssetVIconThread::new_view_window(ViewPopup *vpopup) void AssetVIconThread::stop_vicon_drawing(int wait) { stop_drawing(); - if( wait ) { - drawing_started(); // waits for draw lock - drawing_stopped(); - } + gui->lock_window("AssetVIconThread::stop_vicon_drawing"); + gui->unlock_window(); } @@ -893,7 +883,7 @@ void AssetPicon::reset() void AssetPicon::open_render_engine(EDL *edl, int is_audio) { - TransportCommand command; + TransportCommand command(mwindow->preferences); command.command = is_audio ? NORMAL_FWD : CURRENT_FRAME; command.get_edl()->copy_all(edl); command.change_type = CHANGE_ALL; @@ -959,6 +949,11 @@ void AssetPicon::create_objects() if( asset->video_data ) { if( mwindow->preferences->use_thumbnails ) { gui->unlock_window(); + char string[BCTEXTLEN]; + sprintf(string, _("Reading %s"), name); + mwindow->gui->lock_window("AssetPicon::create_objects"); + mwindow->gui->show_message(string); + mwindow->gui->unlock_window(); File *file = mwindow->video_cache->check_out(asset, mwindow->edl, 1); @@ -982,11 +977,6 @@ void AssetPicon::create_objects() asset->width, asset->height, BC_RGB888, -1); } - { char string[BCTEXTLEN]; - sprintf(string, _("Reading %s"), name); - mwindow->gui->lock_window("AssetPicon::create_objects"); - mwindow->gui->show_message(string); - mwindow->gui->unlock_window(); } file->read_frame(gui->temp_picon); mwindow->video_cache->check_in(asset); @@ -1333,6 +1323,8 @@ AWindowGUI::AWindowGUI(MWindow *mwindow, AWindow *awindow) new_folder_thread = 0; modify_folder_thread = 0; folder_lock = new Mutex("AWindowGUI::folder_lock"); +// *** CONTEXT_HELP *** + context_help_set_keyword("Resources Window"); } AWindowGUI::~AWindowGUI() @@ -1770,6 +1762,8 @@ AWindowRemovePluginGUI(AWindow *awindow, AWindowRemovePlugin *thread, VFrame *vframe = plugin->get_picon(); icon = vframe ? create_pixmap(vframe) : 0; plugin_list.append(new BC_ListBoxItem(plugin->title, icon)); +// *** CONTEXT_HELP *** + context_help_set_keyword("Delete Plugins to save Resources Space"); } AWindowRemovePluginGUI:: @@ -1883,6 +1877,8 @@ BC_Window* AWindowRemovePlugin::new_gui() int AWindowGUI::keypress_event() { + char title[BCTEXTLEN]; + PluginServer* plugin = 0; switch( get_keypress() ) { case 'w': case 'W': if( ctrl_down() ) { @@ -1904,7 +1900,7 @@ int AWindowGUI::keypress_event() return cycle_assetlist_format(); case DELETE: if( shift_down() && ctrl_down() ) { - PluginServer* plugin = selected_plugin(); + plugin = selected_plugin(); if( !plugin ) break; remove_plugin = new AWindowRemovePlugin(awindow, plugin); unlock_window(); @@ -1933,7 +1929,30 @@ int AWindowGUI::keypress_event() } break; } - return 0; +// *** CONTEXT_HELP *** + if( get_keypress() != 'h' || ! alt_down() ) return 0; + if( ! is_tooltip_event_win() || ! cursor_inside() ) return 0; + // If some plugin is selected, show its help + // Otherwise show general help + plugin = selected_plugin(); + if( plugin ) { + strcpy(title, plugin->title); + if( ! strcmp(title, "Overlay") ) { + // "Overlay" plugin title is ambiguous + if( plugin->audio ) strcat(title, " \\(Audio\\)"); + if( plugin->video ) strcat(title, " \\(Video\\)"); + } + if( plugin->is_ffmpeg() ) { + // FFmpeg plugins can be audio or video + if( plugin->audio ) + strcpy(title, "FFmpeg Audio Plugins"); + if( plugin->video ) + strcpy(title, "FFmpeg Video Plugins"); + } + context_help_show(title); + } + else context_help_show("Resources Window"); + return 1; } @@ -2087,6 +2106,21 @@ void AWindowGUI::update_asset_list() AssetPicon *picon = new AssetPicon(mwindow, this, current); new_assets.append(picon); + if( current->width > ASSET_MAX_WIDTH || current->height > ASSET_MAX_HEIGHT ) { + eprintf(_("Warning: %s\n" + " dimensions %dx%d exceed asset maximum limits %dx%d\n"), + current->path, current->width, current->height, + ASSET_MAX_WIDTH, ASSET_MAX_HEIGHT); + } + else if( mwindow->edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL ) { + int texture_limit = BC_DisplayInfo::get_gl_max_texture_size(); + if( texture_limit >= 0 && + (current->width >= texture_limit || current->height >= texture_limit) ) { + eprintf(_("Warning: %s\n" + " dimensions %dx%d exceed OpenGL texture limit %d\n"), + current->path, current->width, current->height, texture_limit); + } + } } } @@ -2877,6 +2911,18 @@ int AWindowAssets::selection_changed() deactivate_selection(); } + else if( get_button_down() && get_buttonpress() == LEFT_BUTTON && + get_double_click() ) { + item = (AssetPicon*)get_selection(0, 0); + if( item ) { + switch( folder ) { + case AW_LABEL_FOLDER: + if( !item->label ) break; + mwindow->set_position(item->label->position); + break; + } + } + } else if( get_button_down() && !gui->play_off && mwindow->edl->session->assetlist_format != ASSETS_TEXT ) { item = (AssetPicon*)get_selection(0, 0); @@ -3181,6 +3227,102 @@ void AWindowAssets::hide_tip_info() info_tip = -1; } +// *** CONTEXT_HELP *** +int AWindowAssets::keypress_event() +{ + int item; + char title[BCTEXTLEN]; + AssetPicon *picon = 0; + PluginServer *plugin = 0; + +// printf("AWindowAssets::keypress_event: %d\n", get_keypress()); + + // If not our context help keystroke, redispatch it + // to the event handler of the base class + if (get_keypress() != 'h' || ! alt_down() || + ! is_tooltip_event_win() || ! cursor_inside()) + return BC_ListBox::keypress_event(); + + switch (mwindow->edl->session->awindow_folder) { + + case AW_AEFFECT_FOLDER: + case AW_VEFFECT_FOLDER: + case AW_ATRANSITION_FOLDER: + case AW_VTRANSITION_FOLDER: + // If plugin tips activated, show help for plugin under mouse + // Otherwise show help for the selected plugin + if (gui->tip_info) { + item = BC_ListBox::get_highlighted_item(); + if (item >= 0 && item < gui->displayed_assets[0].size()) { + picon = (AssetPicon *) gui->displayed_assets[0][item]; + if (picon) plugin = picon->plugin; + } + } + else plugin = gui->selected_plugin(); + // If some plugin is highlighted or selected, show its help + // Otherwise show more general help + if (plugin) { + strcpy(title, plugin->title); + if (! strcmp(title, "Overlay")) { + // "Overlay" plugin title is ambiguous + if (plugin->audio) + strcat(title, " \\(Audio\\)"); + if (plugin->video) + strcat(title, " \\(Video\\)"); + } + if (plugin->is_ffmpeg()) { + // FFmpeg plugins can be audio or video + if (plugin->audio) + strcpy(title, "FFmpeg Audio Plugins"); + if (plugin->video) + strcpy(title, "FFmpeg Video Plugins"); + } + context_help_show(title); + return 1; + } + else { + switch (mwindow->edl->session->awindow_folder) { + case AW_AEFFECT_FOLDER: + context_help_show("Audio Effects"); + return 1; + case AW_VEFFECT_FOLDER: + context_help_show("Video Effects"); + return 1; + case AW_ATRANSITION_FOLDER: + context_help_show("Audio Transitions"); + return 1; + case AW_VTRANSITION_FOLDER: + context_help_show("Video Transitions"); + return 1; + default: + context_help_show("Resources Window"); + return 1; + } + context_help_show("Resources Window"); + return 1; + } + + case AW_LABEL_FOLDER: + context_help_show("Labels"); + return 1; + + case AW_CLIP_FOLDER: + context_help_show("Nested Clips"); + return 1; + + case AW_PROXY_FOLDER: + context_help_show("Proxy"); + return 1; + + default: + context_help_show("Resources Window"); + return 1; + } + + context_help_show("Resources Window"); + return 1; +} + AWindowSearchTextBox::AWindowSearchTextBox(AWindowSearchText *search_text, int x, int y, int w) : BC_TextBox(x, y, w, 1, "")