zoomedit: Redesigned scroll-bar internals.
This commit is contained in:
parent
96edb8f490
commit
8cd0c8914d
2 changed files with 36 additions and 37 deletions
63
Drawer.cpp
63
Drawer.cpp
|
@ -86,54 +86,53 @@ void Drawer::updateViewport() {
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
if(getWidth() != 0 && getHeight() != 0) {
|
if(getWidth() != 0 && getHeight() != 0)
|
||||||
glTranslatef(-1, 1, 0);
|
|
||||||
glScalef(2.0f/getWidth(), -2.0f/getHeight(), 1);
|
glScalef(2.0f/getWidth(), -2.0f/getHeight(), 1);
|
||||||
}
|
|
||||||
|
|
||||||
gdk_gl_drawable_gl_end(drawable);
|
gdk_gl_drawable_gl_end(drawable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer::updateScrolling() {
|
void Drawer::updateScrolling() {
|
||||||
if(getImageWidth() < getWidth())
|
if(getImageWidth()*scale < getWidth())
|
||||||
xTranslate = (getImageWidth()-getWidth())/2;
|
xCenter = 0;
|
||||||
else
|
else
|
||||||
xTranslate = gtk_adjustment_get_value(hAdjustment);
|
xCenter = gtk_adjustment_get_value(hAdjustment);
|
||||||
|
|
||||||
if(getImageHeight() < getHeight())
|
if(getImageHeight()*scale < getHeight())
|
||||||
yTranslate = (getImageHeight()-getHeight())/2;
|
yCenter = 0;
|
||||||
else
|
else
|
||||||
yTranslate = gtk_adjustment_get_value(vAdjustment);
|
yCenter = gtk_adjustment_get_value(vAdjustment);
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer::updateScrollbars(float x, float y) {
|
void Drawer::updateScrollbars(float x, float y) {
|
||||||
const gdouble imageWidth = getImageWidth(), imageHeight = getImageHeight();
|
const gdouble imageWidth = getImageWidth(), imageHeight = getImageHeight();
|
||||||
const gdouble width = getWidth(), height = getHeight();
|
const gdouble width = getWidth()/scale, height = getHeight()/scale;
|
||||||
gdouble upper, pageSize, value;
|
gdouble lower, upper, pageSize, value;
|
||||||
|
|
||||||
|
|
||||||
gdk_window_freeze_updates(drawingArea->window);
|
gdk_window_freeze_updates(drawingArea->window);
|
||||||
|
|
||||||
g_object_get(G_OBJECT(hAdjustment), "upper", &upper, "page_size", &pageSize, NULL);
|
g_object_get(G_OBJECT(hAdjustment), "lower", &lower, "upper", &upper, "page_size", &pageSize, NULL);
|
||||||
g_object_set(G_OBJECT(hAdjustment), "upper", imageWidth, "page_size", width, NULL);
|
g_object_set(G_OBJECT(hAdjustment), "lower", (-imageWidth+width)/2, "upper", (imageWidth+width)/2, "page_size", width, NULL);
|
||||||
gtk_adjustment_changed(hAdjustment);
|
gtk_adjustment_changed(hAdjustment);
|
||||||
|
|
||||||
if((pageSize > upper && width < imageWidth) || upper == 0)
|
if((pageSize > (upper-lower) && width < imageWidth) || upper == lower)
|
||||||
value = (imageWidth-width)/2;
|
value = 0;
|
||||||
else
|
else
|
||||||
value = (gtk_adjustment_get_value(hAdjustment)+pageSize*x)/upper*imageWidth-width*x;
|
value = gtk_adjustment_get_value(hAdjustment) + (x-0.5)*pageSize*(pageSize/width-1);
|
||||||
gtk_adjustment_set_value(hAdjustment, MAX(MIN(value, imageWidth-width), 0));
|
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_get(G_OBJECT(vAdjustment), "lower", &lower, "upper", &upper, "page_size", &pageSize, NULL);
|
||||||
g_object_set(G_OBJECT(vAdjustment), "upper", imageHeight, "page_size", height, NULL);
|
g_object_set(G_OBJECT(vAdjustment), "lower", (-imageHeight+height)/2, "upper", (imageHeight+height)/2, "page_size", height, NULL);
|
||||||
gtk_adjustment_changed(vAdjustment);
|
gtk_adjustment_changed(vAdjustment);
|
||||||
|
|
||||||
if((pageSize > upper && height < imageHeight) || upper == 0)
|
if((pageSize > upper && height < imageHeight) || upper == lower)
|
||||||
value = (imageHeight-height)/2;
|
value = 0;
|
||||||
else
|
else
|
||||||
value = (gtk_adjustment_get_value(vAdjustment)+pageSize*y)/upper*imageHeight-height*y;
|
value = gtk_adjustment_get_value(vAdjustment) + (y-0.5)*pageSize*(pageSize/height-1);
|
||||||
gtk_adjustment_set_value(vAdjustment, MAX(MIN(value, imageHeight-height), 0));
|
gtk_adjustment_set_value(vAdjustment, MAX(MIN(value, imageHeight/2), -imageHeight/2));
|
||||||
|
|
||||||
gdk_window_thaw_updates(drawingArea->window);
|
gdk_window_thaw_updates(drawingArea->window);
|
||||||
|
|
||||||
|
@ -161,8 +160,8 @@ void Drawer::render() {
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
|
||||||
glTranslatef(getImageWidth()/2-xTranslate, getImageHeight()/2-yTranslate, 0);
|
|
||||||
glScalef(scale, scale, 1);
|
glScalef(scale, scale, 1);
|
||||||
|
glTranslatef(-xCenter, -yCenter, 0);
|
||||||
|
|
||||||
renderer.render(window->getLevel(), rect, scale);
|
renderer.render(window->getLevel(), rect, scale);
|
||||||
|
|
||||||
|
@ -179,8 +178,8 @@ Drawer::Drawer(Window *window, GdkGLConfig *glconfig)
|
||||||
this->window = window;
|
this->window = window;
|
||||||
zoomExp = 0;
|
zoomExp = 0;
|
||||||
scale = 100;
|
scale = 100;
|
||||||
xTranslate = 0;
|
xCenter = 0;
|
||||||
yTranslate = 0;
|
yCenter = 0;
|
||||||
|
|
||||||
drawer = gtk_table_new(2, 2, FALSE);
|
drawer = gtk_table_new(2, 2, FALSE);
|
||||||
g_object_ref_sink(G_OBJECT(drawer));
|
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 {
|
void Drawer::imageToView(Vertex *v) const {
|
||||||
v->setX(v->getX()*scale+getImageWidth()/2-xTranslate);
|
v->setX((v->getX()-xCenter)*scale + getWidth()/2);
|
||||||
v->setY(v->getY()*scale+getImageHeight()/2-yTranslate);
|
v->setY((v->getY()-yCenter)*scale + getHeight()/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer::viewToImage(Vertex *v) const {
|
void Drawer::viewToImage(Vertex *v) const {
|
||||||
v->setX((v->getX()-getImageWidth()/2+xTranslate)/scale);
|
v->setX((v->getX()-getWidth()/2)/scale+xCenter);
|
||||||
v->setY((v->getY()-getImageHeight()/2+yTranslate)/scale);
|
v->setY((v->getY()-getHeight()/2)/scale+yCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
float Drawer::getImageWidth() const {
|
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 {
|
float Drawer::getImageHeight() const {
|
||||||
|
@ -257,5 +256,5 @@ float Drawer::getImageHeight() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (max-min+10)*scale;
|
return (max-min+10);
|
||||||
}
|
}
|
||||||
|
|
10
Drawer.h
10
Drawer.h
|
@ -21,7 +21,7 @@ class Drawer {
|
||||||
Window *window;
|
Window *window;
|
||||||
|
|
||||||
float scale;
|
float scale;
|
||||||
float xTranslate, yTranslate;
|
float xCenter, yCenter;
|
||||||
|
|
||||||
// prevent shallow copy
|
// prevent shallow copy
|
||||||
Drawer(const Drawer &w);
|
Drawer(const Drawer &w);
|
||||||
|
@ -59,12 +59,12 @@ class Drawer {
|
||||||
float getImageWidth() const;
|
float getImageWidth() const;
|
||||||
float getImageHeight() const;
|
float getImageHeight() const;
|
||||||
|
|
||||||
float getXTranslate() const {
|
float getXCenter() const {
|
||||||
return xTranslate;
|
return xCenter;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getYTranslate() const {
|
float getYCenter() const {
|
||||||
return yTranslate;
|
return yCenter;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getScale() const {
|
float getScale() const {
|
||||||
|
|
Reference in a new issue