X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fcwindowgui.C;h=4f899c57e7e9ba0c0c8df1e65c107b8d99f83899;hb=ed1cab1d6cbde6129bbd09b9609f7bba03ab610f;hp=d4e62eed5ea5e6b80b51768b305211ec36a54cc2;hpb=21c2e6b36d6a96c2f662a89459d607b5a387f4eb;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/cwindowgui.C b/cinelerra-5.1/cinelerra/cwindowgui.C index d4e62eed..4f899c57 100644 --- a/cinelerra-5.1/cinelerra/cwindowgui.C +++ b/cinelerra-5.1/cinelerra/cwindowgui.C @@ -109,6 +109,7 @@ CWindowGUI::CWindowGUI(MWindow *mwindow, CWindow *cwindow) inactive = 0; crop_translate = 0; eyedrop_visible = 0; + highlighted = 0; } CWindowGUI::~CWindowGUI() @@ -358,44 +359,50 @@ void CWindowGUI::draw_status(int flush) flush); } +float CWindowGUI::get_auto_zoom() +{ + float conformed_w, conformed_h; + mwindow->edl->calculate_conformed_dimensions(0, conformed_w, conformed_h); + float zoom_x = canvas->w / conformed_w; + float zoom_y = canvas->h / conformed_h; + return zoom_x < zoom_y ? zoom_x : zoom_y; +} void CWindowGUI::zoom_canvas(int do_auto, double value, int update_menu) { - if(do_auto) - mwindow->edl->session->cwindow_scrollbars = 0; - else - mwindow->edl->session->cwindow_scrollbars = 1; - + EDL *edl = mwindow->edl; + float x = 0, y = 0; float old_zoom = mwindow->edl->session->cwindow_zoom; float new_zoom = value; - float x = canvas->w / 2.0; - float y = canvas->h / 2.0; - canvas->canvas_to_output(mwindow->edl, - 0, - x, - y); - x -= canvas->w_visible / 2 * old_zoom / new_zoom; - y -= canvas->h_visible / 2 * old_zoom / new_zoom; - if(update_menu) - { - if(do_auto) - { - zoom_panel->update(auto_zoom); + edl->session->cwindow_scrollbars = do_auto ? 0 : 1; + if( !do_auto && canvas->scrollbars_exist() ) { + float z = 1 - old_zoom / new_zoom; + x = canvas->get_xscroll() + 0.5f*canvas->w_visible * z; + y = canvas->get_yscroll() + 0.5f*canvas->h_visible * z; + } + + if( update_menu ) { + if( !do_auto ) { + int frac = new_zoom >= 1.0f ? 1 : + new_zoom >= 0.1f ? 2 : + new_zoom >= .01f ? 3 : 4; + char string[BCSTRLEN]; + sprintf(string,"x %.*f", frac, new_zoom); + zoom_panel->update(string); } - else - { - zoom_panel->update(value); + else { + zoom_panel->update(auto_zoom); + composite_panel->cpanel_zoom->update(new_zoom); } } + else if( mwindow->edl->session->cwindow_operation == CWINDOW_ZOOM ) { + composite_panel->cpanel_zoom->update(new_zoom); + } - canvas->update_zoom((int)x, - (int)y, - new_zoom); + canvas->update_zoom((int)x, (int)y, new_zoom); canvas->reposition_window(mwindow->edl, - mwindow->theme->ccanvas_x, - mwindow->theme->ccanvas_y, - mwindow->theme->ccanvas_w, - mwindow->theme->ccanvas_h); + mwindow->theme->ccanvas_x, mwindow->theme->ccanvas_y, + mwindow->theme->ccanvas_w, mwindow->theme->ccanvas_h); canvas->draw_refresh(); } @@ -570,43 +577,26 @@ void CWindowGUI::drag_motion() { if(get_hidden()) return; - if(mwindow->session->current_operation == DRAG_ASSET || - mwindow->session->current_operation == DRAG_VTRANSITION || - mwindow->session->current_operation == DRAG_VEFFECT) - { - int old_status = mwindow->session->ccanvas_highlighted; - int cursor_x = get_relative_cursor_x(); - int cursor_y = get_relative_cursor_y(); - - mwindow->session->ccanvas_highlighted = get_cursor_over_window() && - cursor_x >= canvas->x && - cursor_x < canvas->x + canvas->w && - cursor_y >= canvas->y && - cursor_y < canvas->y + canvas->h; - - - if(old_status != mwindow->session->ccanvas_highlighted) - canvas->draw_refresh(); - } + if(mwindow->session->current_operation != DRAG_ASSET && + mwindow->session->current_operation != DRAG_VTRANSITION && + mwindow->session->current_operation != DRAG_VEFFECT) return; + int need_highlight = cursor_above() && get_cursor_over_window(); + if( highlighted == need_highlight ) return; + highlighted = need_highlight; + canvas->draw_refresh(); } int CWindowGUI::drag_stop() { int result = 0; if(get_hidden()) return 0; - - if((mwindow->session->current_operation == DRAG_ASSET || - mwindow->session->current_operation == DRAG_VTRANSITION || - mwindow->session->current_operation == DRAG_VEFFECT) && - mwindow->session->ccanvas_highlighted) - { -// Hide highlighting - mwindow->session->ccanvas_highlighted = 0; - canvas->draw_refresh(); - result = 1; - } - else - return 0; + if( !highlighted ) return 0; + if( mwindow->session->current_operation != DRAG_ASSET && + mwindow->session->current_operation != DRAG_VTRANSITION && + mwindow->session->current_operation != DRAG_VEFFECT) return 0; + highlighted = 0; + canvas->draw_refresh(); + result = 1; if(mwindow->session->current_operation == DRAG_ASSET) { @@ -779,15 +769,8 @@ int CWindowMeters::change_status_event(int new_status) CWindowZoom::CWindowZoom(MWindow *mwindow, CWindowGUI *gui, int x, int y, int w) - : ZoomPanel(mwindow, - gui, - (double)mwindow->edl->session->cwindow_zoom, - x, - y, - w, - my_zoom_table, - total_zooms, - ZOOM_PERCENTAGE) + : ZoomPanel(mwindow, gui, (double)mwindow->edl->session->cwindow_zoom, + x, y, w, my_zoom_table, total_zooms, ZOOM_PERCENTAGE) { this->mwindow = mwindow; this->gui = gui; @@ -799,15 +782,9 @@ CWindowZoom::~CWindowZoom() int CWindowZoom::handle_event() { - if(!strcasecmp(gui->auto_zoom, get_text())) - { - gui->zoom_canvas(1, get_value(), 0); - } - else - { - gui->zoom_canvas(0, get_value(), 0); - } - + int do_auto = !strcasecmp(gui->auto_zoom, get_text()) ? 1 : 0; + float zoom = do_auto ? gui->get_auto_zoom() : get_value(); + gui->zoom_canvas(do_auto, zoom, 0); return 1; } @@ -989,7 +966,7 @@ void CWindowCanvas::update_zoom(int x, int y, float zoom) void CWindowCanvas::zoom_auto() { - gui->zoom_canvas(1, 1.0, 1); + gui->zoom_canvas(1, gui->get_auto_zoom(), 1); } int CWindowCanvas::get_xscroll() @@ -2287,7 +2264,7 @@ void CWindowCanvas::draw_overlays() get_canvas()->set_opaque(); } - if(mwindow->session->ccanvas_highlighted) + if(gui->highlighted) { get_canvas()->set_color(WHITE); get_canvas()->set_inverse(); @@ -3034,6 +3011,9 @@ int CWindowCanvas::test_zoom(int &redraw) gui->zoom_panel->update(zoom); + if( gui->mwindow->edl->session->cwindow_operation == CWINDOW_ZOOM ) { + gui->composite_panel->cpanel_zoom->update(zoom); + } return result; }