vicon drag tweaks, proxy drag fix, vicon mouseover, binfolder around sort fix, draw_r...
authorGood Guy <good1.2guy@gmail.com>
Sat, 25 Aug 2018 21:47:36 +0000 (15:47 -0600)
committerGood Guy <good1.2guy@gmail.com>
Sat, 25 Aug 2018 21:47:36 +0000 (15:47 -0600)
16 files changed:
cinelerra-5.1/cinelerra/assetpopup.C
cinelerra-5.1/cinelerra/awindowgui.C
cinelerra-5.1/cinelerra/awindowgui.h
cinelerra-5.1/cinelerra/binfolder.C
cinelerra-5.1/cinelerra/cwindowgui.C
cinelerra-5.1/cinelerra/edl.C
cinelerra-5.1/cinelerra/edl.h
cinelerra-5.1/cinelerra/proxypopup.C
cinelerra-5.1/cinelerra/vdevicex11.C
cinelerra-5.1/cinelerra/vwindowgui.C
cinelerra-5.1/cinelerra/vwindowgui.h
cinelerra-5.1/guicast/bclistbox.C
cinelerra-5.1/guicast/bclistbox.h
cinelerra-5.1/guicast/bcwindowbase.C
cinelerra-5.1/guicast/vicon.C
cinelerra-5.1/guicast/vicon.h

index 59e13131507e0b2cbcb685078069de58cd25744c..fe52bbd6936336a0ac2a848ae37606f0cac296e7 100644 (file)
@@ -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;
 }
 
index d7f6268b3cbc4a49ba7968c70fc33675dc65d60b..cfdfb6dd03006c877f96df70833979dd684d1eed 100644 (file)
@@ -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<BC_ListBoxItem*> *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, "")
 {
index 6aade3ca6925d03a09e8b199ae0dfe165decb221..c26d4e87dc2e809a124e7fc23c4040c58fc4b6ea 100644 (file)
@@ -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<BC_ListBoxItem*> *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;
index 32fd02aa82fb41a632de925d9d488b66619cb240..593bfdab1fe041b27ba15a9caf15a0b30de40421 100644 (file)
@@ -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
index ea957147637ff434eb2234f4ef164302391aaadd..d8c09e055692e8b0587fb9d7dc9f106dfe21337c 100644 (file)
@@ -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);
                }
        }
 
index ebab4cd7ed3ea496273f600420b2f9995bf4f22b..2f0d6e20a78bed8b53f780f8d4788f6f2c53cbb0 100644 (file)
@@ -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 +
index 76ad03715034e9bc1c8f70ad8d2dc431035a66bb..8a96155e1933338cc11d3a83e80dacf29f019745 100644 (file)
@@ -261,6 +261,7 @@ public:
                ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets);
        void add_proxy(int use_scaler,
                ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets);
+       Asset *get_proxy_asset();
 
 // Titles of all subfolders
        BinFolders folders;
index 40a29ded973a3f3bcb3523bb6730c9ea3940d45e..04a1bdae736bb02678d912d5730ca5499e7241f9 100644 (file)
@@ -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;
 }
 
index fc9e84097a0bc2c44f9e99c3510fb755746a1dbc..9db8bb831c45e24e332de2b3f75dc54887ae3997 100644 (file)
@@ -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();
index 92505781fac1330d60857aaf3f4afb50d77efc45..d13197b4869f7f679b26f83acfc660de0bd2c67f 100644 (file)
@@ -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 )
index da10c484a9934bcfd3514f55e90c2a537b0baf41..e09eb4c3fe72510fa88d38dd78c765409d7d0372 100644 (file)
@@ -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();
index e52d42fa49a1dd4a43f9174d043457a0eefa71cb..54bab352a6f7a6b12db02067a4b21c36b5831db3 100644 (file)
@@ -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);
index a10446d9a52f1ce572fdf36011adc3033cf8274a..ce867ef88ecc196efd0dfd3b6d9f2c79a881a11f 100644 (file)
@@ -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();
index a18d155944cce4b3b4267d89d2b2baee1e5913f7..421a26fe7663e2470aba2f52d0265fb15c0560e4 100644 (file)
@@ -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);
index 8ae7a7c0ba667a10ad2978113b1b6fc52bde14db..f9978b26ebf0e917b1d7f6852a26b72dbf670c6d 100644 (file)
@@ -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();
index e1dd04c5629a41577fe8783c416e7aa83ab47dd4..6ffe3b174de09e310241f71bed895a0b5e4c2bcc 100644 (file)
@@ -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);