rework resource wdw preview mode
authorGood Guy <good1.2guy@gmail.com>
Mon, 11 Mar 2019 03:45:45 +0000 (21:45 -0600)
committerGood Guy <good1.2guy@gmail.com>
Mon, 11 Mar 2019 03:45:45 +0000 (21:45 -0600)
cinelerra-5.1/cinelerra/awindowgui.C
cinelerra-5.1/cinelerra/awindowgui.h
cinelerra-5.1/cinelerra/zoombar.C
cinelerra-5.1/guicast/bcpopup.C
cinelerra-5.1/guicast/bcpopup.h
cinelerra-5.1/guicast/bcpopupmenu.C
cinelerra-5.1/guicast/bcpopupmenu.h
cinelerra-5.1/guicast/bcwindowbase.C
cinelerra-5.1/guicast/vicon.C
cinelerra-5.1/guicast/vicon.h

index b949e9c..fc8adea 100644 (file)
@@ -332,6 +332,12 @@ AssetViewPopup::~AssetViewPopup()
 {
 }
 
+int AssetViewPopup::reposition_window(int x, int y, int w, int h)
+{
+       this->bar_h = (VIEW_POPUP_BAR_H * h) / 200;
+       return ViewPopup::reposition_window(x, y, w, h);
+}
+
 int AssetViewPopup::button_press_event()
 {
        if( !is_event_win() ) return 0;
@@ -342,6 +348,9 @@ int AssetViewPopup::button_press_event()
        switch( get_buttonpress() ) {
        case LEFT_BUTTON:
                break;
+       case MIDDLE_BUTTON:
+               avt->set_view_popup(0);
+               return 1;
        case WHEEL_DOWN:
                dir = -1; // fall thru
        case WHEEL_UP:
@@ -556,6 +565,7 @@ void AssetViewPopup::draw_vframe(VFrame *vframe)
 
 int AssetViewPopup::keypress_event()
 {
+       int result = 0;
        AssetVIconThread *avt = (AssetVIconThread *)vt;
        switch( avt->draw_mode ) {
        case ASSET_VIEW_MEDIA_MAP:
@@ -563,15 +573,15 @@ int AssetViewPopup::keypress_event()
                case 'f':
                case 'F':
                        avt->draw_mode = ASSET_VIEW_FULL;
-                       avt->viewing = 0;
-                       return 1;
+                       result = 1;
                }
                break;
        case ASSET_VIEW_FULL:
                avt->draw_mode = ASSET_VIEW_MEDIA_MAP;
-               avt->viewing = 0;
-               return 1;
+               result = 1;
        }
+       if( result ) // zero change for refresh
+               avt->zoom_scale(0);
        return ViewPopup::keypress_event();
 }
 
@@ -611,7 +621,7 @@ void AssetVIconThread::set_view_popup(AssetVIcon *v, int draw_mode)
 {
        gui->stop_vicon_drawing();
        this->draw_mode = draw_mode;
-       VIconThread::set_view_popup(v);
+       set_view_popup(v);
        gui->start_vicon_drawing();
 }
 
@@ -621,7 +631,7 @@ void AssetVIconThread::set_view_popup(AssetVIcon *v)
        VIconThread::set_view_popup(v);
 }
 
-ViewPopup *AssetVIconThread::new_view_window()
+ViewPopup *AssetVIconThread::new_view_window(ViewPopup *vpopup)
 {
        BC_WindowBase *parent = wdw->get_parent();
        int rx = 0, ry = 0, rw = 0, rh = 0;
@@ -637,26 +647,32 @@ ViewPopup *AssetVIconThread::new_view_window()
        }
        else
                parent->get_fullscreen_geometry(rx, ry, rw, rh);
-       AssetViewPopup *popup = new AssetViewPopup(this, draw_mode, rx, ry, rw, rh);
-       switch( draw_mode ) {
-       case ASSET_VIEW_NONE:
-       case ASSET_VIEW_ICON:
-       case ASSET_VIEW_MEDIA_MAP:
-       case ASSET_VIEW_FULL:
-               vicon->stop_audio();
-               vicon->playing_audio = -1;
-               break;
-       case ASSET_VIEW_MEDIA:
-               switch( gui->vicon_drawing ) {
-               case AVICON_FULL_PLAY:
-               case AVICON_MOUSE_OVER:
-                       vicon->playing_audio = 1;
-                       vicon->start_audio();
+       AssetViewPopup *av_popup = (AssetViewPopup *)vpopup;
+       if( av_popup )
+               av_popup->reposition_window(rx, ry, rw, rh);
+       else
+               av_popup = new AssetViewPopup(this, draw_mode, rx, ry, rw, rh);
+       int playing_audio = gui->play_off ? -1 : 0;
+       if( !playing_audio ) {
+               switch( draw_mode ) {
+               case ASSET_VIEW_NONE:
+               case ASSET_VIEW_ICON:
+               case ASSET_VIEW_MEDIA_MAP:
+               case ASSET_VIEW_FULL:
+                       playing_audio = -1;
                        break;
+               case ASSET_VIEW_MEDIA:
+                       switch( gui->vicon_drawing ) {
+                       case AVICON_SRC_TARGET:
+                       case AVICON_NO_PLAY:
+                               playing_audio = -1;
+                               break;
+                       }
                }
        }
-       wdw->set_active_subwindow(popup);
-       return popup;
+       vicon->playing_audio = playing_audio;
+       wdw->set_active_subwindow(av_popup);
+       return av_popup;
 }
 
 void AssetVIconThread::close_view_popup()
@@ -1270,6 +1286,7 @@ AWindowGUI::AWindowGUI(MWindow *mwindow, AWindow *awindow)
        vicon_thread = 0;
        vicon_audio = 0;
        vicon_drawing = AVICON_FULL_PLAY;
+       play_off = 0;
        displayed_folder = AW_NO_FOLDER;
        new_folder_thread = 0;
        modify_folder_thread = 0;
@@ -1467,9 +1484,14 @@ void AWindowGUI::create_objects()
 
        int fx = mwindow->theme->afolders_x, fy = mwindow->theme->afolders_y;
        int fw = mwindow->theme->afolders_w, fh = mwindow->theme->afolders_h;
-       const char *text = _("Preview");
-       int tw = get_text_width(MEDIUMFONT, text);
-       int pw = BC_PopupMenu::calculate_w(4, tw, -1);
+       int n = sizeof(AVIconDrawing::avicon_names)/sizeof(AVIconDrawing::avicon_names[0]);
+       int tw = 0;  const char **av_names = AVIconDrawing::avicon_names;
+       for( int i=0; i<n; ++i ) {
+               int nw = get_text_width(MEDIUMFONT, _(av_names[i]));
+               if( tw < nw )  tw = nw;
+       }
+       int pw = BC_PopupMenu::calculate_w(4, tw, -1) + 16;
+       const char *text = _(AVIconDrawing::avicon_names[vicon_drawing]);
        add_subwindow(avicon_drawing = new AVIconDrawing(this, fw, fy, pw, text));
        avicon_drawing->create_objects();
        add_subwindow(add_tools = new AddTools(mwindow, this, fx, fy, _("Visibility")));
@@ -1604,9 +1626,10 @@ int AWindowGUI::close_event()
        return 1;
 }
 
-void AWindowGUI::start_vicon_drawing()
+int AWindowGUI::start_vicon_drawing()
 {
-       if( !vicon_thread->interrupted ) return;
+       if( play_off ) return stop_vicon_drawing();
+       if( !vicon_thread->interrupted ) return 1;
        switch( vicon_drawing ) {
        case AVICON_FULL_PLAY:  // all vicons, viewing, target
                break;
@@ -1615,7 +1638,7 @@ void AWindowGUI::start_vicon_drawing()
        // fall thru
        case AVICON_SRC_TARGET: // no vicons, no view, target
        case AVICON_NO_PLAY:    // no vicons, no view, no target
-               return;
+               return 0;
        }
        if( mwindow->edl->session->awindow_folder == AW_MEDIA_FOLDER ||
            mwindow->edl->session->awindow_folder == AW_PROXY_FOLDER ||
@@ -1632,13 +1655,14 @@ void AWindowGUI::start_vicon_drawing()
                        break;
                }
        }
+       return 1;
 }
 
 int AWindowGUI::stop_vicon_drawing()
 {
-       if( vicon_thread->interrupted ) return 0;
-       vicon_thread->stop_drawing();
-       return 1;
+       if( !vicon_thread->interrupted )
+               vicon_thread->stop_drawing();
+       return 0;
 }
 
 void AWindowGUI::close_view_popup()
@@ -2778,8 +2802,9 @@ int AWindowAssets::selection_changed()
                deactivate_selection();
        }
        else if( get_button_down() &&
-                 mwindow->edl->session->assetlist_format != ASSETS_TEXT ) {
-               if( (item = (AssetPicon*)get_selection(0, 0)) != 0 ) {
+                mwindow->edl->session->assetlist_format != ASSETS_TEXT ) {
+               item = (AssetPicon*)get_selection(0, 0);
+               if( item && !get_selection(0, 1) ) {
                        switch( folder ) {
                        case AW_MEDIA_FOLDER:
                        case AW_PROXY_FOLDER:
@@ -2999,6 +3024,7 @@ int AWindowAssets::cursor_enter_event()
 
 int AWindowAssets::cursor_leave_event()
 {
+       if( !is_event_win() ) return 0;
        if( !gui->vicon_thread->viewing )
                gui->stop_vicon_drawing();
        return BC_ListBox::cursor_leave_event();
@@ -3210,7 +3236,7 @@ int AWindowView::handle_event()
 }
 
 AddTools::AddTools(MWindow *mwindow, AWindowGUI *gui, int x, int y, const char *title)
- : BC_PopupMenu(x, y, gui->get_text_width(MEDIUMFONT, title)+8, title, -1, 0, 4)
+ : BC_PopupMenu(x, y, title, -1, 0)
 {
        this->mwindow = mwindow;
        this->gui = gui;
@@ -3295,6 +3321,8 @@ int AVIconDrawingItem::handle_event()
                item->set_checked(id == i);
        }
        AWindowGUI *agui = avicon->agui;
+       agui->play_off = 0;
+       avicon->set_text(get_text());
        agui->stop_vicon_drawing();
        agui->vicon_thread->set_view_popup(0);
        agui->vicon_thread->solo = 0;
@@ -3303,6 +3331,16 @@ int AVIconDrawingItem::handle_event()
        return 1;
 }
 
+int AVIconDrawing::draw_face(int dx, int color)
+{
+       int ret = BC_PopupMenu::draw_face(dx, color);
+       if( agui->play_off ) {
+               int lx = get_margin(), ly = get_h()/2;
+               draw_line(lx,ly, get_w()-2*lx,ly);
+       }
+       return ret;
+}
+
 AVIconDrawing::AVIconDrawing(AWindowGUI *agui, int x, int y, int w, const char *text)
  : BC_PopupMenu(x-w, y, w, text, -1, 0, 4)
 {
@@ -3322,6 +3360,19 @@ void AVIconDrawing::create_objects()
        }
 }
 
+int AVIconDrawing::button_press_event()
+{
+       if( !is_event_win() ) return 0;
+       if( get_buttonpress() == MIDDLE_BUTTON ) {
+               agui->play_off = !agui->play_off ? 1 : 0;
+               draw_face(0, -1);
+               flash(1);
+               agui->start_vicon_drawing();
+               return 1;
+       }
+       return BC_PopupMenu::button_press_event();
+}
+
 AWindowListFormat::AWindowListFormat(MWindow *mwindow, AWindowGUI *gui)
  : BC_MenuItem("","v",'v')
 {
index 878aa45..fc92007 100644 (file)
@@ -182,6 +182,7 @@ public:
                        int x, int y, int w, int h);
        ~AssetViewPopup();
 
+       int reposition_window(int x, int y, int w, int h);
        int button_press_event();
        int button_release_event();
        int cursor_motion_event();
@@ -202,7 +203,7 @@ public:
 
        void set_view_popup(AssetVIcon *v, int draw_mode);
        void set_view_popup(AssetVIcon *v);
-       ViewPopup *new_view_window();
+       ViewPopup *new_view_window(ViewPopup *popup);
        void drawing_started();
        void drawing_stopped();
        void close_view_popup();
@@ -282,7 +283,7 @@ public:
        bool protected_pixmap(BC_Pixmap *pixmap);
        int save_defaults(BC_Hash *defaults);
        int load_defaults(BC_Hash *defaults);
-       void start_vicon_drawing();
+       int start_vicon_drawing();
        int stop_vicon_drawing();
        void close_view_popup();
        void update_picon(Indexable *indexable);
@@ -368,7 +369,7 @@ public:
 
        AVIconDrawing *avicon_drawing;
        int avicon_w, avicon_h;
-       int vicon_drawing;
+       int vicon_drawing, play_off;
        int allow_iconlisting;
 
 // Create custom atoms to be used for async messages between windows
@@ -594,8 +595,10 @@ public:
        AVIconDrawing(AWindowGUI *agui, int x, int y, int w, const char *text);
        ~AVIconDrawing();
 
-       void create_objects();
        static const char *avicon_names[];
+       void create_objects();
+       int button_press_event();
+       int draw_face(int dx, int color);
 
        AWindowGUI *agui;
 };
index 6ed44a6..f99a797 100644 (file)
@@ -483,7 +483,7 @@ int AutoTypeMenu::from_text(char *text)
 
 int AutoTypeMenu::draw_face(int dx)
 {
-       BC_PopupMenu::draw_face(dx);
+       BC_PopupMenu::draw_face(dx, -1);
        int color = mwindow->edl->local_session->zoombar_showautocolor;
        if( color >= 0 ) {
                set_color(color);
index 7df9f84..3194264 100644 (file)
@@ -46,6 +46,12 @@ BC_FullScreen::~BC_FullScreen()
 {
 }
 
+int BC_FullScreen::expose_event()
+{
+       focus();
+       return 1;
+}
+
 
 BC_Popup::BC_Popup(BC_WindowBase *parent_window,
                int x, int y, int w, int h, int bg_color, int hide, BC_Pixmap *bg_pixmap)
@@ -62,6 +68,11 @@ BC_Popup::~BC_Popup()
 {
 }
 
+int BC_Popup::expose_event()
+{
+       focus();
+       return 1;
+}
 
 void BC_Popup::grab_keyboard()
 {
index fc72df6..0fd3a3e 100644 (file)
 class BC_Popup : public BC_WindowBase
 {
 public:
-       BC_Popup(BC_WindowBase *parent_window,
-                               int x,
-                               int y,
-                               int w,
-                               int h,
-                               int bg_color,
-                               int hide = 0,
-                               BC_Pixmap *bg_pixmap = 0);
+       BC_Popup(BC_WindowBase *parent_window, int x, int y, int w, int h,
+               int bg_color, int hide = 0, BC_Pixmap *bg_pixmap = 0);
        virtual ~BC_Popup();
+       virtual int expose_event();
 
        int initialize() { return 0; };
        void grab_keyboard();
@@ -48,15 +43,10 @@ private:
 
 class BC_FullScreen : public BC_WindowBase
 {
-public:
-   BC_FullScreen(BC_WindowBase *parent_window,
-                          int w,
-                          int h,
-                          int bg_color,
-                          int vm_scale,
-                          int hide = 0,
-                          BC_Pixmap *bg_pixmap = 0);
-   virtual ~BC_FullScreen();
+public: BC_FullScreen(BC_WindowBase *parent_window, int w, int h,
+               int bg_color, int vm_scale, int hide = 0, BC_Pixmap *bg_pixmap = 0);
+       virtual ~BC_FullScreen();
+       virtual int expose_event();
 };
 
 #endif
index 5a792af..13cc681 100644 (file)
@@ -200,7 +200,7 @@ int BC_PopupMenu::get_margin()
        return margin;
 }
 
-int BC_PopupMenu::draw_face(int dx)
+int BC_PopupMenu::draw_face(int dx, int color)
 {
        if( !use_title ) return 0;
 
@@ -209,7 +209,9 @@ int BC_PopupMenu::draw_face(int dx)
        draw_3segmenth(0, 0, w, images[status]);
 
 // Overlay text
-       set_color(get_resources()->popup_title_text);
+       if( color < 0 ) color = get_resources()->popup_title_text;
+       set_color(color);
+
        int offset = status == BUTTON_DN ? 1 : 0;
        int available_w = get_w() - calculate_w(margin, 0, use_title);
 
@@ -237,7 +239,7 @@ int BC_PopupMenu::draw_face(int dx)
 
 int BC_PopupMenu::draw_title(int flush)
 {
-       draw_face(0);
+       draw_face(0, -1);
        flash(flush);
        return 0;
 }
index 9ebef28..298c6a1 100644 (file)
 class BC_PopupMenu : public BC_SubWindow
 {
 public:
-       BC_PopupMenu(int x,
-               int y,
-               int w,
-               const char *text,
-               int use_title = 1,
+       BC_PopupMenu(int x, int y, int w, const char *text, int use_title = 1,
 // Data for alternative title images
                VFrame **data = 0,
 // Alternative text margin
                int margin = -1);
-       BC_PopupMenu(int x,
-               int y,
-               const char *text,
-               int use_title = 1,
+       BC_PopupMenu(int x, int y, const char *text, int use_title = 1,
 // Data for alternative title images
                VFrame **data = 0);
        virtual ~BC_PopupMenu();
@@ -57,7 +50,7 @@ public:
        static int calculate_w(int text_width);
        static int calculate_h(VFrame **data = 0);
        virtual int handle_event() { return 0; };
-       virtual int draw_face(int dx);
+       virtual int draw_face(int dx, int color);
        char* get_text();
        int initialize();
        int add_item(BC_MenuItem *item);
@@ -79,8 +72,8 @@ public:
        int deactivate_menu();
        int focus_out_event();
        int repeat_event(int64_t duration);
-       int button_press_event();
-       int button_release_event();
+       virtual int button_press_event();
+       virtual int button_release_event();
        int cursor_leave_event();
        int cursor_enter_event();
        int cursor_motion_event();
index 23e5bec..583caac 100644 (file)
@@ -566,9 +566,8 @@ int BC_WindowBase::create_window(BC_WindowBase *parent_window, const char *title
                mask = CWEventMask | CWBackPixel | CWColormap |
                        CWOverrideRedirect | CWSaveUnder | CWCursor;
 
-               attr.event_mask = DEFAULT_EVENT_MASKS |
-                       KeyPressMask |
-                       KeyReleaseMask;
+               attr.event_mask = DEFAULT_EVENT_MASKS | ExposureMask |
+                       KeyPressMask | KeyReleaseMask;
 
                if(this->bg_color == -1)
                        this->bg_color = resources.get_bg_color();
@@ -1066,7 +1065,13 @@ if( debug && event->type != ClientMessage ) {
 
        case Expose:
                event_win = event->xany.window;
-               dispatch_expose_event();
+               result = 0;
+               for( int i=0; !result && i<popups.size(); ++i ) {  // popups take focus
+                       if( popups[i]->win == event_win )
+                               result = popups[i]->dispatch_expose_event();
+               }
+               if( !result )
+                       result = dispatch_expose_event();
                break;
 
        case MotionNotify:
index 9535aa9..5ebec48 100644 (file)
@@ -209,7 +209,7 @@ ViewPopup::~ViewPopup()
        vt->wdw->set_active_subwindow(0);
 }
 
-ViewPopup *VIconThread::new_view_window()
+ViewPopup *VIconThread::new_view_window(ViewPopup *vpopup)
 {
        BC_WindowBase *parent = wdw->get_parent();
        XineramaScreenInfo *info = parent->get_xinerama_info(-1);
@@ -220,9 +220,12 @@ ViewPopup *VIconThread::new_view_window()
        wdw->get_root_coordinates(vx, vy, &rx, &ry);
        rx += (rx >= cx ? -view_w+viewing->w/4 : viewing->w-viewing->w/4);
        ry += (ry >= cy ? -view_h+viewing->h/4 : viewing->h-viewing->h/4);
-       ViewPopup *vwin = new ViewPopup(this, rx, ry, view_w, view_h);
-       wdw->set_active_subwindow(vwin);
-       return vwin;
+       if( vpopup )
+               vpopup->reposition_window(rx, ry, view_w, view_h);
+       else
+               vpopup = new ViewPopup(this, rx, ry, view_w, view_h);
+       wdw->set_active_subwindow(vpopup);
+       return vpopup;
 }
 
 
@@ -262,8 +265,7 @@ void VIconThread::set_view_popup(VIcon *vicon)
 {
        if( viewing == vicon && !this->vicon ) return;
        this->vicon = vicon;
-       if( interrupted )
-               update_view(0);
+       if( interrupted ) update_view(vicon ? 1 : 0);
 
 }
 
@@ -278,7 +280,7 @@ update_view(int do_audio)
        if( viewing ) viewing->stop_audio();
        delete view_win;  view_win = 0;
        if( (viewing=vicon) != 0 ) {
-               view_win = new_view_window();
+               view_win = new_view_window(0);
                view_win->draw_vframe(viewing->frame());
                view_win->flash(0);
                view_win->show_window();
@@ -290,12 +292,15 @@ update_view(int do_audio)
 
 int VIconThread::zoom_scale(int dir)
 {
+       if( !viewing || !view_win ) return 0;
        int view_h = this->view_h;
        view_h += dir*view_h/10 + dir;
        bclamp(view_h, 16,512);
        this->view_h = view_h;
        this->view_w = view_h * vw/vh;
-       stop_viewing();
+       new_view_window(view_win);
+       view_win->draw_vframe(viewing->frame());
+       view_win->flash(1);
        return 1;
 }
 
@@ -376,7 +381,7 @@ run()
                seq_no = 0;  now = 0;
                while( !interrupted ) {
                        if( viewing != vicon )
-                               update_view();
+                               update_view(1);
                        if( !solo ) {
                                VIcon *next = low_vicon();
                                while( next && next->age < draw_flash ) {
@@ -410,7 +415,7 @@ run()
                        draw_flash = seq_no * 1000. / refresh_rate;
                }
                if( viewing != vicon )
-                       update_view();
+                       update_view(1);
                drawing_stopped();
                interrupted = -1;
                wdw->unlock_window();
index 69cdb36..8688d4c 100644 (file)
@@ -94,7 +94,7 @@ public:
        void run();
        void flash();
        int draw(VIcon *vicon);
-       int update_view(int do_audio=1);
+       int update_view(int do_audio);
        void draw_images();
        void start_drawing();
        void stop_drawing();
@@ -109,7 +109,7 @@ public:
        void close_view_popup();
        void hide_vicons(int v=1);
        int show_vicon(VIcon *next);
-       virtual ViewPopup *new_view_window();
+       virtual ViewPopup *new_view_window(ViewPopup *vpopup);
 
        virtual bool visible(VIcon *vicon, int x, int y);
        virtual void drawing_started() {}