From 8cd0c8914da0ce59fea81e4ed78241fa574c75c3 Mon Sep 17 00:00:00 2001 From: neoraider Date: Fri, 16 Nov 2007 01:29:04 +0000 Subject: zoomedit: Redesigned scroll-bar internals. --- Drawer.cpp | 63 +++++++++++++++++++++++++++++++------------------------------- Drawer.h | 10 +++++----- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/Drawer.cpp b/Drawer.cpp index 5b6a6d5..e3fe6e6 100644 --- a/Drawer.cpp +++ b/Drawer.cpp @@ -86,54 +86,53 @@ void Drawer::updateViewport() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); - if(getWidth() != 0 && getHeight() != 0) { - glTranslatef(-1, 1, 0); + if(getWidth() != 0 && getHeight() != 0) glScalef(2.0f/getWidth(), -2.0f/getHeight(), 1); - } gdk_gl_drawable_gl_end(drawable); } void Drawer::updateScrolling() { - if(getImageWidth() < getWidth()) - xTranslate = (getImageWidth()-getWidth())/2; + if(getImageWidth()*scale < getWidth()) + xCenter = 0; else - xTranslate = gtk_adjustment_get_value(hAdjustment); + xCenter = gtk_adjustment_get_value(hAdjustment); - if(getImageHeight() < getHeight()) - yTranslate = (getImageHeight()-getHeight())/2; + if(getImageHeight()*scale < getHeight()) + yCenter = 0; else - yTranslate = gtk_adjustment_get_value(vAdjustment); + yCenter = gtk_adjustment_get_value(vAdjustment); update(); } void Drawer::updateScrollbars(float x, float y) { const gdouble imageWidth = getImageWidth(), imageHeight = getImageHeight(); - const gdouble width = getWidth(), height = getHeight(); - gdouble upper, pageSize, value; + const gdouble width = getWidth()/scale, height = getHeight()/scale; + gdouble lower, upper, pageSize, value; + gdk_window_freeze_updates(drawingArea->window); - g_object_get(G_OBJECT(hAdjustment), "upper", &upper, "page_size", &pageSize, NULL); - g_object_set(G_OBJECT(hAdjustment), "upper", imageWidth, "page_size", width, NULL); + g_object_get(G_OBJECT(hAdjustment), "lower", &lower, "upper", &upper, "page_size", &pageSize, NULL); + g_object_set(G_OBJECT(hAdjustment), "lower", (-imageWidth+width)/2, "upper", (imageWidth+width)/2, "page_size", width, NULL); gtk_adjustment_changed(hAdjustment); - if((pageSize > upper && width < imageWidth) || upper == 0) - value = (imageWidth-width)/2; + if((pageSize > (upper-lower) && width < imageWidth) || upper == lower) + value = 0; else - value = (gtk_adjustment_get_value(hAdjustment)+pageSize*x)/upper*imageWidth-width*x; - gtk_adjustment_set_value(hAdjustment, MAX(MIN(value, imageWidth-width), 0)); + value = gtk_adjustment_get_value(hAdjustment) + (x-0.5)*pageSize*(pageSize/width-1); + gtk_adjustment_set_value(hAdjustment, MAX(MIN(value, imageWidth/2), -imageWidth/2)); - g_object_get(G_OBJECT(vAdjustment), "upper", &upper, "page_size", &pageSize, NULL); - g_object_set(G_OBJECT(vAdjustment), "upper", imageHeight, "page_size", height, NULL); + g_object_get(G_OBJECT(vAdjustment), "lower", &lower, "upper", &upper, "page_size", &pageSize, NULL); + g_object_set(G_OBJECT(vAdjustment), "lower", (-imageHeight+height)/2, "upper", (imageHeight+height)/2, "page_size", height, NULL); gtk_adjustment_changed(vAdjustment); - if((pageSize > upper && height < imageHeight) || upper == 0) - value = (imageHeight-height)/2; + if((pageSize > upper && height < imageHeight) || upper == lower) + value = 0; else - value = (gtk_adjustment_get_value(vAdjustment)+pageSize*y)/upper*imageHeight-height*y; - gtk_adjustment_set_value(vAdjustment, MAX(MIN(value, imageHeight-height), 0)); + value = gtk_adjustment_get_value(vAdjustment) + (y-0.5)*pageSize*(pageSize/height-1); + gtk_adjustment_set_value(vAdjustment, MAX(MIN(value, imageHeight/2), -imageHeight/2)); gdk_window_thaw_updates(drawingArea->window); @@ -161,8 +160,8 @@ void Drawer::render() { glMatrixMode(GL_MODELVIEW); glPushMatrix(); - glTranslatef(getImageWidth()/2-xTranslate, getImageHeight()/2-yTranslate, 0); glScalef(scale, scale, 1); + glTranslatef(-xCenter, -yCenter, 0); renderer.render(window->getLevel(), rect, scale); @@ -179,8 +178,8 @@ Drawer::Drawer(Window *window, GdkGLConfig *glconfig) this->window = window; zoomExp = 0; scale = 100; - xTranslate = 0; - yTranslate = 0; + xCenter = 0; + yCenter = 0; drawer = gtk_table_new(2, 2, FALSE); g_object_ref_sink(G_OBJECT(drawer)); @@ -225,13 +224,13 @@ void Drawer::zoom(int zoom, float x, float y) { } void Drawer::imageToView(Vertex *v) const { - v->setX(v->getX()*scale+getImageWidth()/2-xTranslate); - v->setY(v->getY()*scale+getImageHeight()/2-yTranslate); + v->setX((v->getX()-xCenter)*scale + getWidth()/2); + v->setY((v->getY()-yCenter)*scale + getHeight()/2); } void Drawer::viewToImage(Vertex *v) const { - v->setX((v->getX()-getImageWidth()/2+xTranslate)/scale); - v->setY((v->getY()-getImageHeight()/2+yTranslate)/scale); + v->setX((v->getX()-getWidth()/2)/scale+xCenter); + v->setY((v->getY()-getHeight()/2)/scale+yCenter); } float Drawer::getImageWidth() const { @@ -244,7 +243,7 @@ float Drawer::getImageWidth() const { } } - return (max-min+10)*scale; + return (max-min+10); } float Drawer::getImageHeight() const { @@ -257,5 +256,5 @@ float Drawer::getImageHeight() const { } } - return (max-min+10)*scale; + return (max-min+10); } diff --git a/Drawer.h b/Drawer.h index bfebe10..236c72a 100644 --- a/Drawer.h +++ b/Drawer.h @@ -21,7 +21,7 @@ class Drawer { Window *window; float scale; - float xTranslate, yTranslate; + float xCenter, yCenter; // prevent shallow copy Drawer(const Drawer &w); @@ -59,12 +59,12 @@ class Drawer { float getImageWidth() const; float getImageHeight() const; - float getXTranslate() const { - return xTranslate; + float getXCenter() const { + return xCenter; } - float getYTranslate() const { - return yTranslate; + float getYCenter() const { + return yCenter; } float getScale() const { -- cgit v1.2.3