From 17b4e5a06157865391c2d07b552b81d84665bcae Mon Sep 17 00:00:00 2001 From: Good Guy Date: Sat, 25 Aug 2018 15:47:36 -0600 Subject: [PATCH] vicon drag tweaks, proxy drag fix, vicon mouseover, binfolder around sort fix, draw_refresh tweaks --- cinelerra-5.1/cinelerra/assetpopup.C | 6 ++- cinelerra-5.1/cinelerra/awindowgui.C | 63 ++++++++++++++++++++++------ cinelerra-5.1/cinelerra/awindowgui.h | 5 ++- cinelerra-5.1/cinelerra/binfolder.C | 7 ++-- cinelerra-5.1/cinelerra/cwindowgui.C | 7 +--- cinelerra-5.1/cinelerra/edl.C | 6 +++ cinelerra-5.1/cinelerra/edl.h | 1 + cinelerra-5.1/cinelerra/proxypopup.C | 4 +- cinelerra-5.1/cinelerra/vdevicex11.C | 46 ++++++++++---------- cinelerra-5.1/cinelerra/vwindowgui.C | 12 ++++-- cinelerra-5.1/cinelerra/vwindowgui.h | 1 + cinelerra-5.1/guicast/bclistbox.C | 3 +- cinelerra-5.1/guicast/bclistbox.h | 2 + cinelerra-5.1/guicast/bcwindowbase.C | 2 + cinelerra-5.1/guicast/vicon.C | 10 +---- cinelerra-5.1/guicast/vicon.h | 1 - 16 files changed, 114 insertions(+), 62 deletions(-) diff --git a/cinelerra-5.1/cinelerra/assetpopup.C b/cinelerra-5.1/cinelerra/assetpopup.C index 59e13131..fe52bbd6 100644 --- a/cinelerra-5.1/cinelerra/assetpopup.C +++ b/cinelerra-5.1/cinelerra/assetpopup.C @@ -100,7 +100,8 @@ void AssetPopup::paste_assets() mwindow->gui->lock_window("AssetPopup::paste_assets"); mwindow->cwindow->gui->lock_window("AssetPopup::paste_assets"); - gui->collect_assets(); + int proxy = mwindow->edl->session->awindow_folder == AW_PROXY_FOLDER ? 1 : 0; + gui->collect_assets(proxy); mwindow->paste_assets(mwindow->edl->local_session->get_selectionstart(1), mwindow->edl->tracks->first, 0); // do not overwrite @@ -139,7 +140,8 @@ void AssetPopup::match_all() int AssetPopup::update() { format->update(); - gui->collect_assets(); + int proxy = mwindow->edl->session->awindow_folder == AW_PROXY_FOLDER ? 1 : 0; + gui->collect_assets(proxy); return 0; } diff --git a/cinelerra-5.1/cinelerra/awindowgui.C b/cinelerra-5.1/cinelerra/awindowgui.C index d7f6268b..cfdfb6dd 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.C +++ b/cinelerra-5.1/cinelerra/awindowgui.C @@ -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); @@ -1713,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); @@ -1751,10 +1756,13 @@ void AWindowGUI::copy_picons(ArrayList *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 ) @@ -2226,17 +2234,18 @@ int AWindowAssets::selection_changed() break; } - BC_ListBox::deactivate_selection(); + 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; + deactivate_selection(); } gui->vicon_thread->set_view_popup(vicon); - } return 1; } @@ -2255,7 +2264,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 ) { @@ -2278,6 +2287,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; @@ -2298,7 +2309,7 @@ int AWindowAssets::drag_start_event() } if( collect_assets ) { - gui->collect_assets(); + gui->collect_assets(proxy); } return 1; @@ -2403,8 +2414,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() @@ -2413,6 +2425,19 @@ 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(); @@ -2425,6 +2450,18 @@ void AWindowAssets::update_vicon_area() 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, "") { diff --git a/cinelerra-5.1/cinelerra/awindowgui.h b/cinelerra-5.1/cinelerra/awindowgui.h index 6aade3ca..c26d4e87 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.h +++ b/cinelerra-5.1/cinelerra/awindowgui.h @@ -183,7 +183,7 @@ public: int drag_motion(); int drag_stop(); // Collect items into the drag vectors of MainSession - void collect_assets(); + void collect_assets(int proxy=0); EDL *collect_proxy(Indexable *indexable); void create_persistent_folder(ArrayList *output, int do_audio, @@ -321,7 +321,10 @@ public: int column_resize_event(); int focus_in_event(); int focus_out_event(); + int cursor_enter_event(); + int cursor_leave_event(); void update_vicon_area(); + int mouse_over_event(int no); MWindow *mwindow; AWindowGUI *gui; diff --git a/cinelerra-5.1/cinelerra/binfolder.C b/cinelerra-5.1/cinelerra/binfolder.C index 32fd02aa..593bfdab 100644 --- a/cinelerra-5.1/cinelerra/binfolder.C +++ b/cinelerra-5.1/cinelerra/binfolder.C @@ -239,7 +239,6 @@ static int64_t scan_date(const char *cp, char *&bp) struct tm ttm; memset(&ttm, 0, sizeof(ttm)); ttm.tm_year = year-1900; ttm.tm_mon = mon-1; ttm.tm_mday = day; ttm.tm_hour = hour; ttm.tm_min = min; ttm.tm_sec = secs; - ttm.tm_wday = ttm.tm_yday = 0; ttm.tm_isdst = daylight; /* tzset in main */ time_t t = mktime(&ttm); return (int64_t)t; } @@ -539,9 +538,9 @@ void BinFolderFilters::copy_from(BinFolderFilters *that) double BinFolderOp::around(double v, double a) { - if( type != FOLDER_OP_AROUND || a <= 0 ) return v; - if( (v=fabs(v)) > a ) return -1; - return v / a; + if( type != FOLDER_OP_AROUND ) return v; + v = fabs(v); + return a>0 ? v/a : v; } // string theory: Feynman, Einstein and Schrodinger string compare diff --git a/cinelerra-5.1/cinelerra/cwindowgui.C b/cinelerra-5.1/cinelerra/cwindowgui.C index ea957147..d8c09e05 100644 --- a/cinelerra-5.1/cinelerra/cwindowgui.C +++ b/cinelerra-5.1/cinelerra/cwindowgui.C @@ -646,14 +646,12 @@ int CWindowGUI::drag_stop() if(mwindow->session->drag_assets->total || mwindow->session->drag_clips->total) { - mwindow->gui->lock_window("CWindowGUI::drag_stop 5"); + mwindow->gui->lock_window("CWindowGUI::drag_stop 1"); mwindow->undo->update_undo_before(_("insert assets"), 0); - mwindow->gui->unlock_window(); } if(mwindow->session->drag_assets->total) { - mwindow->gui->lock_window("CWindowGUI::drag_stop 1"); mwindow->clear(0); mwindow->load_assets(mwindow->session->drag_assets, mwindow->edl->local_session->get_selectionstart(), @@ -668,7 +666,6 @@ int CWindowGUI::drag_stop() if(mwindow->session->drag_clips->total) { - mwindow->gui->lock_window("CWindowGUI::drag_stop 2"); mwindow->clear(0); mwindow->paste_edls(mwindow->session->drag_clips, LOADMODE_PASTE, @@ -688,7 +685,7 @@ int CWindowGUI::drag_stop() mwindow->gui->update(1, 1, 1, 1, 0, 1, 0); mwindow->undo->update_undo_after(_("insert assets"), LOAD_ALL); mwindow->gui->unlock_window(); - mwindow->sync_parameters(LOAD_ALL); + mwindow->sync_parameters(CHANGE_ALL); } } diff --git a/cinelerra-5.1/cinelerra/edl.C b/cinelerra-5.1/cinelerra/edl.C index ebab4cd7..2f0d6e20 100644 --- a/cinelerra-5.1/cinelerra/edl.C +++ b/cinelerra-5.1/cinelerra/edl.C @@ -1608,6 +1608,12 @@ void EDL::add_proxy(int use_scaler, } } +Asset *EDL::get_proxy_asset() +{ + return awindow_folder == AW_PROXY_FOLDER ? + tracks->first->edits->first->asset : 0; +} + double EDL::get_cursor_position(int cursor_x, int pane_no) { return (double)cursor_x * local_session->zoom_sample / session->sample_rate + diff --git a/cinelerra-5.1/cinelerra/edl.h b/cinelerra-5.1/cinelerra/edl.h index 76ad0371..8a96155e 100644 --- a/cinelerra-5.1/cinelerra/edl.h +++ b/cinelerra-5.1/cinelerra/edl.h @@ -261,6 +261,7 @@ public: ArrayList *orig_assets, ArrayList *proxy_assets); void add_proxy(int use_scaler, ArrayList *orig_assets, ArrayList *proxy_assets); + Asset *get_proxy_asset(); // Titles of all subfolders BinFolders folders; diff --git a/cinelerra-5.1/cinelerra/proxypopup.C b/cinelerra-5.1/cinelerra/proxypopup.C index 40a29ded..04a1bdae 100644 --- a/cinelerra-5.1/cinelerra/proxypopup.C +++ b/cinelerra-5.1/cinelerra/proxypopup.C @@ -80,7 +80,7 @@ void ProxyPopup::paste_assets() mwindow->gui->lock_window("ProxyPopup::paste_assets"); mwindow->cwindow->gui->lock_window("ProxyPopup::paste_assets"); - gui->collect_assets(); + gui->collect_assets(1); mwindow->paste_assets(mwindow->edl->local_session->get_selectionstart(1), mwindow->edl->tracks->first, 0); // do not overwrite @@ -92,7 +92,7 @@ void ProxyPopup::paste_assets() int ProxyPopup::update() { format->update(); - gui->collect_assets(); + gui->collect_assets(1); return 0; } diff --git a/cinelerra-5.1/cinelerra/vdevicex11.C b/cinelerra-5.1/cinelerra/vdevicex11.C index fc9e8409..9db8bb83 100644 --- a/cinelerra-5.1/cinelerra/vdevicex11.C +++ b/cinelerra-5.1/cinelerra/vdevicex11.C @@ -161,6 +161,7 @@ int VDeviceX11::close_all() if( output ) { output->lock_canvas("VDeviceX11::close_all 1"); output->get_canvas()->lock_window("VDeviceX11::close_all 1"); + int video_on = output->get_canvas()->get_video_on(); // Update the status bug if( !device->single_frame ) { output->stop_video(); @@ -168,13 +169,12 @@ int VDeviceX11::close_all() else { output->stop_single(); } - } - - if( output && output_frame ) { - output->update_refresh(device, output_frame); + if( output_frame ) { + output->update_refresh(device, output_frame); // if the last frame is good, don't draw over it - if( output->need_overlays() ) - output->draw_refresh(1); + if( !video_on || output->need_overlays() ) + output->draw_refresh(1); + } } delete bitmap; bitmap = 0; @@ -576,27 +576,29 @@ int VDeviceX11::write_buffer(VFrame *output_channels, EDL *edl) output->get_canvas()->lock_window("VDeviceX11::write_buffer 2"); } } - else - if( bitmap->hardware_scaling() ) { - output->get_canvas()->draw_bitmap(bitmap, !device->single_frame, - (int)canvas_x1, (int)canvas_y1, - (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), - (int)output_x1, (int)output_y1, - (int)(output_x2 - output_x1), (int)(output_y2 - output_y1), - 0); - } else { + if( bitmap->hardware_scaling() ) { + output->get_canvas()->draw_bitmap(bitmap, !device->single_frame, + (int)canvas_x1, (int)canvas_y1, + (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), + (int)output_x1, (int)output_y1, + (int)(output_x2 - output_x1), (int)(output_y2 - output_y1), + 0); + } + else { //printf("VDeviceX11::write_buffer %d x=%d y=%d w=%d h=%d\n", // __LINE__, (int)canvas_x1, (int)canvas_y1, // output->get_canvas()->get_w(), output->get_canvas()->get_h()); - - output->get_canvas()->draw_bitmap(bitmap, !device->single_frame, - (int)canvas_x1, (int)canvas_y1, - (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), - 0, 0, - (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), - 0); + output->get_canvas()->draw_bitmap(bitmap, !device->single_frame, + (int)canvas_x1, (int)canvas_y1, + (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), + 0, 0, + (int)(canvas_x2 - canvas_x1), (int)(canvas_y2 - canvas_y1), + 0); //printf("VDeviceX11::write_buffer %d bitmap=%p\n", __LINE__, bitmap); + } + if( !output->get_canvas()->get_video_on() ) + output->get_canvas()->flash(0); } output->get_canvas()->unlock_window(); diff --git a/cinelerra-5.1/cinelerra/vwindowgui.C b/cinelerra-5.1/cinelerra/vwindowgui.C index 92505781..d13197b4 100644 --- a/cinelerra-5.1/cinelerra/vwindowgui.C +++ b/cinelerra-5.1/cinelerra/vwindowgui.C @@ -471,10 +471,10 @@ int VWindowGUI::drag_stop() unlock_window(); Indexable *indexable = - mwindow->session->drag_clips->size() > 0 ? - (Indexable *)mwindow->session->drag_clips->get(0) : mwindow->session->drag_assets->size() > 0 ? - (Indexable *)mwindow->session->drag_assets->get(0) : 0; + (Indexable *)mwindow->session->drag_assets->get(0) : + mwindow->session->drag_clips->size() > 0 ? + (Indexable *)mwindow->session->drag_clips->get(0) : 0; if( indexable ) vwindow->change_source(indexable); @@ -857,6 +857,12 @@ void VWindowCanvas::draw_refresh(int flush) } } +int VWindowCanvas::need_overlays() +{ + if( gui->highlighted ) return 1; + return 0; +} + void VWindowCanvas::draw_overlays() { if( gui->highlighted ) diff --git a/cinelerra-5.1/cinelerra/vwindowgui.h b/cinelerra-5.1/cinelerra/vwindowgui.h index da10c484..e09eb4c3 100644 --- a/cinelerra-5.1/cinelerra/vwindowgui.h +++ b/cinelerra-5.1/cinelerra/vwindowgui.h @@ -119,6 +119,7 @@ public: void zoom_resize_window(float percentage); void draw_refresh(int flush = 1); + int need_overlays(); void draw_overlays(); void close_source(); int get_fullscreen(); diff --git a/cinelerra-5.1/guicast/bclistbox.C b/cinelerra-5.1/guicast/bclistbox.C index e52d42fa..54bab352 100644 --- a/cinelerra-5.1/guicast/bclistbox.C +++ b/cinelerra-5.1/guicast/bclistbox.C @@ -3152,7 +3152,8 @@ int BC_ListBox::cursor_motion_event() // Moved out of item area if( old_highlighted_item != highlighted_item ) { - redraw_items = 1; + if( !mouse_over_event(highlighted_item) ) + redraw_items = 1; } //printf("BC_ListBox::cursor_motion_event 1 %d\n", highlighted_item); diff --git a/cinelerra-5.1/guicast/bclistbox.h b/cinelerra-5.1/guicast/bclistbox.h index a10446d9..ce867ef8 100644 --- a/cinelerra-5.1/guicast/bclistbox.h +++ b/cinelerra-5.1/guicast/bclistbox.h @@ -123,6 +123,8 @@ public: virtual int sort_order_event() { return 0; }; // Column moved virtual int move_column_event() { return 0; }; +// item highlight changed + virtual int mouse_over_event(int no) { return 0; } int enable(); int disable(); diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index a18d1559..421a26fe 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -1338,6 +1338,7 @@ locking_message = event->xclient.message_type; break; case LeaveNotify: + if( event->xcrossing.mode != NotifyNormal ) break; if( cursor_entered && event->xcrossing.window == win ) { cursor_entered = 0; } @@ -1346,6 +1347,7 @@ locking_message = event->xclient.message_type; break; case EnterNotify: + if( event->xcrossing.mode != NotifyNormal ) break; if( !cursor_entered && event->xcrossing.window == win ) { if( !event->xcrossing.focus && get_resources()->grab_input_focus ) { XSetInputFocus(display, win, RevertToParent, CurrentTime); diff --git a/cinelerra-5.1/guicast/vicon.C b/cinelerra-5.1/guicast/vicon.C index 8ae7a7c0..f9978b26 100644 --- a/cinelerra-5.1/guicast/vicon.C +++ b/cinelerra-5.1/guicast/vicon.C @@ -155,12 +155,6 @@ int VIconThread::keypress_event(int key) return 1; } -int ViewPopup::button_press_event() -{ - vt->set_view_popup(0); - return 1; -} - bool VIconThread:: visible(VIcon *vicon, int x, int y) { @@ -177,6 +171,7 @@ int ViewPopup::keypress_event() int key = get_keypress(); return vt->keypress_event(key); } + ViewPopup::ViewPopup(VIconThread *vt, VFrame *frame, int x, int y, int w, int h) : BC_Popup(vt->wdw, x, y, w, h, BLACK) { @@ -239,14 +234,13 @@ int VIconThread::del_vicon(VIcon *&vicon) void VIconThread::set_view_popup(VIcon *vicon) { - if( !vicon && this->vicon ) - this->vicon->stop_audio(); this->vicon = vicon; } int VIconThread:: update_view() { + if( viewing ) viewing->stop_audio(); delete view_win; view_win = 0; if( (viewing=vicon) != 0 ) { VFrame *frame = viewing->frame(); diff --git a/cinelerra-5.1/guicast/vicon.h b/cinelerra-5.1/guicast/vicon.h index e1dd04c5..6ffe3b17 100644 --- a/cinelerra-5.1/guicast/vicon.h +++ b/cinelerra-5.1/guicast/vicon.h @@ -13,7 +13,6 @@ class ViewPopup : public BC_Popup { public: VIconThread *vt; int keypress_event(); - int button_press_event(); void draw_vframe(VFrame *frame); ViewPopup(VIconThread *vt, VFrame *frame, int x, int y, int w, int h); -- 2.26.2