zoomedit: Fixed some scrolling bugs.
This commit is contained in:
parent
8cd0c8914d
commit
4afb308180
2 changed files with 18 additions and 18 deletions
34
Drawer.cpp
34
Drawer.cpp
|
@ -93,21 +93,23 @@ void Drawer::updateViewport() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer::updateScrolling() {
|
void Drawer::updateScrolling() {
|
||||||
if(getImageWidth()*scale < getWidth())
|
if((getImageWidth())*scale < getWidth())
|
||||||
xCenter = 0;
|
xCenter = 0;
|
||||||
else
|
else
|
||||||
xCenter = gtk_adjustment_get_value(hAdjustment);
|
xCenter = gtk_adjustment_get_value(hAdjustment);
|
||||||
|
|
||||||
if(getImageHeight()*scale < getHeight())
|
if((getImageHeight())*scale < getHeight())
|
||||||
yCenter = 0;
|
yCenter = 0;
|
||||||
else
|
else
|
||||||
yCenter = gtk_adjustment_get_value(vAdjustment);
|
yCenter = gtk_adjustment_get_value(vAdjustment);
|
||||||
|
|
||||||
update();
|
gtk_widget_queue_draw(drawingArea);
|
||||||
}
|
}
|
||||||
|
|
||||||
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 minX = -imageWidth/2, maxX = imageWidth/2;
|
||||||
|
const gdouble minY = -imageHeight/2, maxY = imageHeight/2;
|
||||||
const gdouble width = getWidth()/scale, height = getHeight()/scale;
|
const gdouble width = getWidth()/scale, height = getHeight()/scale;
|
||||||
gdouble lower, upper, pageSize, value;
|
gdouble lower, upper, pageSize, value;
|
||||||
|
|
||||||
|
@ -115,24 +117,24 @@ void Drawer::updateScrollbars(float x, float y) {
|
||||||
gdk_window_freeze_updates(drawingArea->window);
|
gdk_window_freeze_updates(drawingArea->window);
|
||||||
|
|
||||||
g_object_get(G_OBJECT(hAdjustment), "lower", &lower, "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), "lower", (-imageWidth+width)/2, "upper", (imageWidth+width)/2, "page_size", width, NULL);
|
g_object_set(G_OBJECT(hAdjustment), "lower", minX + width/2, "upper", maxX + width/2, "page_size", width, NULL);
|
||||||
gtk_adjustment_changed(hAdjustment);
|
gtk_adjustment_changed(hAdjustment);
|
||||||
|
|
||||||
if((pageSize > (upper-lower) && width < imageWidth) || upper == lower)
|
if(pageSize > (upper-lower) && width < imageWidth)
|
||||||
value = 0;
|
value = 0;
|
||||||
else
|
else
|
||||||
value = gtk_adjustment_get_value(hAdjustment) + (x-0.5)*pageSize*(pageSize/width-1);
|
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));
|
gtk_adjustment_set_value(hAdjustment, MAX(MIN(value, maxX - width/2), minX + width/2));
|
||||||
|
|
||||||
g_object_get(G_OBJECT(vAdjustment), "lower", &lower, "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), "lower", (-imageHeight+height)/2, "upper", (imageHeight+height)/2, "page_size", height, NULL);
|
g_object_set(G_OBJECT(vAdjustment), "lower", minY + height/2, "upper", maxY + height/2, "page_size", height, NULL);
|
||||||
gtk_adjustment_changed(vAdjustment);
|
gtk_adjustment_changed(vAdjustment);
|
||||||
|
|
||||||
if((pageSize > upper && height < imageHeight) || upper == lower)
|
if(pageSize > (upper-lower) && height < imageHeight)
|
||||||
value = 0;
|
value = 0;
|
||||||
else
|
else
|
||||||
value = gtk_adjustment_get_value(vAdjustment) + (y-0.5)*pageSize*(pageSize/height-1);
|
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));
|
gtk_adjustment_set_value(vAdjustment, MAX(MIN(value, maxY - height/2), minY + height/2));
|
||||||
|
|
||||||
gdk_window_thaw_updates(drawingArea->window);
|
gdk_window_thaw_updates(drawingArea->window);
|
||||||
|
|
||||||
|
@ -234,27 +236,25 @@ void Drawer::viewToImage(Vertex *v) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
float Drawer::getImageWidth() const {
|
float Drawer::getImageWidth() const {
|
||||||
float min = 0, max = 0;
|
float max = 0;
|
||||||
|
|
||||||
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||||
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
||||||
min = fminf(min, v->getX());
|
max = fmaxf(max, fabsf(v->getX()));
|
||||||
max = fmaxf(max, v->getX());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (max-min+10);
|
return (2*max+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
float Drawer::getImageHeight() const {
|
float Drawer::getImageHeight() const {
|
||||||
float min = 0, max = 0;
|
float max = 0;
|
||||||
|
|
||||||
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||||
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
||||||
min = fminf(min, v->getY());
|
max = fmaxf(max, fabsf(v->getY()));
|
||||||
max = fmaxf(max, v->getY());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (max-min+10);
|
return (2*max+1);
|
||||||
}
|
}
|
||||||
|
|
2
Drawer.h
2
Drawer.h
|
@ -76,7 +76,7 @@ class Drawer {
|
||||||
}
|
}
|
||||||
|
|
||||||
void update() {
|
void update() {
|
||||||
gtk_widget_queue_draw(drawingArea);
|
updateScrollbars();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Reference in a new issue