diff --git a/src/zmapWindow/zmapWindowZoomControl.c b/src/zmapWindow/zmapWindowZoomControl.c new file mode 100755 index 0000000000000000000000000000000000000000..07228eb711eabcc1b38587ca7f906f5842472f52 --- /dev/null +++ b/src/zmapWindow/zmapWindowZoomControl.c @@ -0,0 +1,368 @@ +/* File: zmapWindowZoomControl.c + * Author: Roy Storey (rds@sanger.ac.uk) + * Copyright (c) Sanger Institute, 2005 + *------------------------------------------------------------------- + * ZMap is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * or see the on-line version at http://www.gnu.org/copyleft/gpl.txt + *------------------------------------------------------------------- + * This file is part of the ZMap genome database package + * originated by + * Ed Griffiths (Sanger Institute, UK) edgrif@sanger.ac.uk, + * Roy Storey (Sanger Institute, UK) rds@sanger.ac.uk, + * Rob Clack (Sanger Institute, UK) rnc@sanger.ac.uk + * + * Description: + * + * Exported functions: See XXXXXXXXXXXXX.h + * HISTORY: + * Last edited: Jul 14 14:49 2005 (rds) + * Created: Fri Jul 8 11:37:39 2005 (rds) + * CVS info: $Id: zmapWindowZoomControl.c,v 1.1 2005-07-14 15:23:04 rds Exp $ + *------------------------------------------------------------------- + */ + +#include <ZMap/zmapUtils.h> +#include <zmapWindow_P.h> +#include <zmapWindowZoomControl_P.h> + +static double getMinZoom(ZMapWindow window); +static void setZoomStatus(ZMapWindowZoomControl control); +static gboolean canZoomByFactor(ZMapWindowZoomControl control, double factor); +static ZMapWindowZoomControl controlFromWindow(ZMapWindow window); +static void printControl(ZMapWindowZoomControl control); + +/* =========================================================================== */ +/* PUBLIC */ +/* =========================================================================== */ +ZMapWindowZoomStatus zMapWindowGetZoomStatus(ZMapWindow window) +{ + ZMapWindowZoomStatus status = ZMAP_ZOOM_INIT; + ZMapWindowZoomControl control = NULL; + + control = controlFromWindow(window); + + status = control->status; + + return status; +} +double zMapWindowGetZoomFactor(ZMapWindow window) +{ + ZMapWindowZoomControl control = NULL; + + control = controlFromWindow(window); + + return control->zF; +} + +double zMapWindowGetZoomMagnification(ZMapWindow window) +{ + ZMapWindowZoomControl control = NULL; + double mag; + + control = controlFromWindow(window); + /* Not sure what this actually needs to be calculating, + * but a ratio might be nice rather than just random numbers */ + mag = control->maxZF / control->zF; + + return mag; +} +/* =========================================================================== */ +/* PRIVATE */ +/* =========================================================================== */ +/* Create the Controller... */ +ZMapWindowZoomControl zmapWindowZoomControlCreate(ZMapWindow window) +{ + ZMapWindowZoomControl num_cruncher = NULL; + double text_height; + int x_windows_limit = (2 >> 15) - 1; + int user_set_limit = (2 >> 15) - 1; /* possibly a parameter later?!? */ + int max_window_size = 0; + num_cruncher = g_new0(ZMapWindowZoomControlStruct, 1); + + /* Make sure this is the 1:1 text_height 14 on my machine*/ + foo_canvas_set_pixels_per_unit_xy(window->canvas, 1.0, 1.0); + zMapDrawGetTextDimensions(foo_canvas_root(window->canvas), NULL, &text_height) ; + + num_cruncher->maxZF = text_height + (double)(ZMAP_WINDOW_TEXT_BORDER * 2); + // num_cruncher->lineHeight = text_height; /* This will _NEED_ to change */ + num_cruncher->border = text_height; /* This should _NOT_ be changed */ + num_cruncher->status = ZMAP_ZOOM_INIT; + + // max_window_size = (user_set_limit ? user_set_limit : x_windows_limit) + // - ((num_cruncher->border * 2) * num_cruncher->maxZF); + + return num_cruncher; +} + +/* Because we need to create and then set it up later */ +void zmapWindowZoomControlInitialise(ZMapWindow window) +{ + ZMapWindowZoomControl control; + + control = controlFromWindow(window); + + control->minZF = getMinZoom(window); + if(control->status == ZMAP_ZOOM_INIT) + control->zF = control->minZF; + + /* Account for SHORT sequences (shorter than canvas height) */ + setZoomStatus(control); /* This alone probably doesn't do this!! */ + + return ; +} + +/* Should be called when either canvas height(size-allocate) or seq + length change. Does virtually the same as initialise... */ +void zmapWindowZoomControlHandleResize(ZMapWindow window) +{ + ZMapWindowZoomControl control; + double min; + + control = controlFromWindow(window); + + min = getMinZoom(window); + + /* Always need to reset this. */ + control->minZF = min; + + if(min > control->zF) + zMapWindowZoom(window, min / control->zF); + + setZoomStatus(control); + + return ; +} + +/* This just does the maths and sets zoom factor and status + * (Might need to work with setZoomStatus??? also ZMAP_ZOOM_FIXED) + */ +gboolean zmapWindowZoomControlZoomByFactor(ZMapWindow window, double factor) +{ + ZMapWindowZoomControl control; + gboolean did_zoom = FALSE; + double zoom; + + control = controlFromWindow(window); + + if(canZoomByFactor(control, factor)) + { + /* Calculate the zoom. */ + zoom = control->zF * factor ; + if (zoom <= control->minZF) + control->zF = control->minZF ; + else if (zoom >= control->maxZF) + control->zF = control->maxZF ; + else + control->zF = zoom ; + + setZoomStatus(control); + + did_zoom = TRUE; + } + + return did_zoom; +} + +double zmapWindowZoomControlLimitSpan(ZMapWindow window, double y1, double y2) +{ + ZMapWindowZoomControl control; + double max_span, seq_span, new_span; + double canv_span; + + control = controlFromWindow(window); + + max_span = (double)(window->canvas_maxwin_size); + seq_span = window->seqLength * control->zF; + + new_span = y2 - y1 + 1 ; + new_span *= control->zF ; + + new_span = (new_span >= max_span ? + max_span : (seq_span > max_span ? + max_span + : seq_span)) ; + + canv_span = new_span / control->zF; + + return canv_span; +} + +void zmapWindowZoomControlClampSpan(ZMapWindow window, double *top_inout, double *bot_inout) +{ + ZMapWindowZoomControl control; + double top, bot; + + top = *top_inout; + bot = *bot_inout; + control = controlFromWindow(window); + + if (top < window->seq_start) + { + if ((bot = bot + (window->seq_start - top)) > window->seq_end) + bot = window->seq_end ; + top = window->seq_start ; + } + else if (bot > window->seq_end) + { + if ((top = top - (bot - window->seq_end)) < window->seq_start) + top = window->seq_start ; + bot = window->seq_end ; + } + + *top_inout = top; + *bot_inout = bot; + + return ; +} + +void zmapWindowZoomControlCopyTo(ZMapWindowZoomControl orig, ZMapWindowZoomControl new) +{ + new->zF = orig->zF; + setZoomStatus(new); + return ; +} + +void zmapWindowGetBorderSize(ZMapWindow window, double *border) +{ + ZMapWindowZoomControl control = NULL; + double b = 0.0; + + control = controlFromWindow(window); + + b = control->border / control->zF; + + *border = b; + + return ; +} + +#ifdef BLAH_BLAH_BLAH +void zmapWindowDebugWindowCopy(ZMapWindow window) +{ + ZMapWindowZoomControl control; + double x1, x2, y1, y2; + foo_canvas_item_get_bounds(FOO_CANVAS_ITEM(foo_canvas_root(FOO_CANVAS(window->canvas))), + &x1, &y1, + &x2, &y2); + control = controlFromWindow(window); + printf("Window:\n" + " min_coord %f\n" + " max_coord %f\n" + " seqLength %f\n" + " x1 %f, y1 %f, x2 %f, y2 %f\n", + window->min_coord, + window->max_coord, + window->seqLength, + x1, y1, x2, y2 + ); + printControl(control); + return ; +} +#endif /* BLAH_BLAH_BLAH */ + +/* =========================================================================== */ +/* INTERNAL */ +/* =========================================================================== */ + +/* Exactly what it says */ +static double getMinZoom(ZMapWindow window) +{ + ZMapWindowZoomControl control; + double canvas_height, border_height, zf; + + control = controlFromWindow(window); + zMapAssert(control != NULL + && window->seqLength != 0 + ); + + /* These heights are in pixels */ + border_height = control->border * 2.0; + canvas_height = GTK_WIDGET(window->canvas)->allocation.height; + + zMapAssert(canvas_height >= border_height); + /* rearrangement of + * canvas height + * zf = ------------------------------ + * seqLength + (text_height / zf) + * could do with replacing allocation.height with adjuster->page_size + */ + /* canvas_height two borders length of sequence */ + zf = ( canvas_height - border_height ) / (window->seqLength + 1); + + return zf; +} + + +/* Private: from initialise and other public only? + * Public: ???? + */ +static void setZoomStatus(ZMapWindowZoomControl control) +{ + /* This needs to handle ZMAP_ZOOM_FIXED too!! */ + if (control->minZF >= control->maxZF) + { + control->status = ZMAP_ZOOM_FIXED ; + control->zF = control->maxZF ; + } + else if (control->zF <= control->minZF) + control->status = ZMAP_ZOOM_MIN ; + else if (control->zF >= control->maxZF) + control->status = ZMAP_ZOOM_MAX ; + else + control->status = ZMAP_ZOOM_MID ; + + return ; +} + +/* No point zooming if we can't */ +static gboolean canZoomByFactor(ZMapWindowZoomControl control, double factor) +{ + gboolean can_zoom = TRUE; + if (control->status == ZMAP_ZOOM_FIXED + || (factor > 1.0 && control->status == ZMAP_ZOOM_MAX) + || (factor < 1.0 && control->status == ZMAP_ZOOM_MIN)) + { + can_zoom = FALSE; + } + return can_zoom; +} +/* This is here incase window struct changes name of control; */ +static ZMapWindowZoomControl controlFromWindow(ZMapWindow window) +{ + ZMapWindowZoomControl control = NULL; + + zMapAssert(window->zoom); + + control = window->zoom; + + return control; +} + +#ifdef BLAH_BLAH_BLAH +static void printControl(ZMapWindowZoomControl control) +{ + printf("Control:\n" + " factor %f\n" + " min %f\n" + " max %f\n" + " status %d\n", + control->zF, + control->minZF, + control->maxZF, + control->status + ); + return ; +} +#endif /* BLAH_BLAH_BLAH */ diff --git a/src/zmapWindow/zmapWindowZoomControl_P.h b/src/zmapWindow/zmapWindowZoomControl_P.h new file mode 100755 index 0000000000000000000000000000000000000000..8f4d27cbe4bf834e1feeb7da63af31ddc487250f --- /dev/null +++ b/src/zmapWindow/zmapWindowZoomControl_P.h @@ -0,0 +1,51 @@ +/* File: zmapWindowZoomControl_P.h + * Author: Roy Storey (rds@sanger.ac.uk) + * Copyright (c) Sanger Institute, 2005 + *------------------------------------------------------------------- + * ZMap is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * or see the on-line version at http://www.gnu.org/copyleft/gpl.txt + *------------------------------------------------------------------- + * This file is part of the ZMap genome database package + * originated by + * Ed Griffiths (Sanger Institute, UK) edgrif@sanger.ac.uk, + * Roy Storey (Sanger Institute, UK) rds@sanger.ac.uk, + * Rob Clack (Sanger Institute, UK) rnc@sanger.ac.uk + * + * Description: + * + * Exported functions: See XXXXXXXXXXXXX.h + * HISTORY: + * Last edited: Jul 14 14:35 2005 (rds) + * Created: Tue Jul 12 16:02:52 2005 (rds) + * CVS info: $Id: zmapWindowZoomControl_P.h,v 1.1 2005-07-14 15:23:09 rds Exp $ + *------------------------------------------------------------------- + */ + +#ifndef ZMAPWINDOWZOOMCONTROL_P_H +#define ZMAPWINDOWZOOMCONTROL_P_H + +typedef struct _ZMapWindowZoomControlStruct +{ + double zF; + double minZF; + double maxZF; + double lineHeight; + + int border; + + ZMapWindowZoomStatus status; +} ZMapWindowZoomControlStruct; + +#endif