From: Good Guy Date: Mon, 11 Mar 2019 03:45:45 +0000 (-0600) Subject: rework resource wdw preview mode X-Git-Tag: 2019-08~86 X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=commitdiff_plain;h=6c5258a9791775f706e55c280da75ed6f6ef1720;ds=sidebyside rework resource wdw preview mode --- diff --git a/cinelerra-5.1/cinelerra/awindowgui.C b/cinelerra-5.1/cinelerra/awindowgui.C index b949e9cd..fc8adea9 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.C +++ b/cinelerra-5.1/cinelerra/awindowgui.C @@ -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; icreate_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') { diff --git a/cinelerra-5.1/cinelerra/awindowgui.h b/cinelerra-5.1/cinelerra/awindowgui.h index 878aa455..fc920070 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.h +++ b/cinelerra-5.1/cinelerra/awindowgui.h @@ -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; }; diff --git a/cinelerra-5.1/cinelerra/zoombar.C b/cinelerra-5.1/cinelerra/zoombar.C index 6ed44a6d..f99a7976 100644 --- a/cinelerra-5.1/cinelerra/zoombar.C +++ b/cinelerra-5.1/cinelerra/zoombar.C @@ -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); diff --git a/cinelerra-5.1/guicast/bcpopup.C b/cinelerra-5.1/guicast/bcpopup.C index 7df9f84e..3194264c 100644 --- a/cinelerra-5.1/guicast/bcpopup.C +++ b/cinelerra-5.1/guicast/bcpopup.C @@ -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() { diff --git a/cinelerra-5.1/guicast/bcpopup.h b/cinelerra-5.1/guicast/bcpopup.h index fc72df69..0fd3a3e8 100644 --- a/cinelerra-5.1/guicast/bcpopup.h +++ b/cinelerra-5.1/guicast/bcpopup.h @@ -29,15 +29,10 @@ 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 diff --git a/cinelerra-5.1/guicast/bcpopupmenu.C b/cinelerra-5.1/guicast/bcpopupmenu.C index 5a792af0..13cc6816 100644 --- a/cinelerra-5.1/guicast/bcpopupmenu.C +++ b/cinelerra-5.1/guicast/bcpopupmenu.C @@ -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; } diff --git a/cinelerra-5.1/guicast/bcpopupmenu.h b/cinelerra-5.1/guicast/bcpopupmenu.h index 9ebef28a..298c6a1d 100644 --- a/cinelerra-5.1/guicast/bcpopupmenu.h +++ b/cinelerra-5.1/guicast/bcpopupmenu.h @@ -35,19 +35,12 @@ 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(); diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index 23e5bec4..583caac6 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -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 && iwin == event_win ) + result = popups[i]->dispatch_expose_event(); + } + if( !result ) + result = dispatch_expose_event(); break; case MotionNotify: diff --git a/cinelerra-5.1/guicast/vicon.C b/cinelerra-5.1/guicast/vicon.C index 9535aa9a..5ebec485 100644 --- a/cinelerra-5.1/guicast/vicon.C +++ b/cinelerra-5.1/guicast/vicon.C @@ -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(); diff --git a/cinelerra-5.1/guicast/vicon.h b/cinelerra-5.1/guicast/vicon.h index 69cdb362..8688d4c4 100644 --- a/cinelerra-5.1/guicast/vicon.h +++ b/cinelerra-5.1/guicast/vicon.h @@ -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() {}