diff options
-rw-r--r-- | src/Gui/RenderArea.cpp | 96 | ||||
-rw-r--r-- | src/Gui/RenderArea.h | 4 | ||||
-rw-r--r-- | src/View/TopView.cpp | 42 | ||||
-rw-r--r-- | src/View/TopView.h | 3 | ||||
-rw-r--r-- | src/View/View.h | 1 |
5 files changed, 95 insertions, 51 deletions
diff --git a/src/Gui/RenderArea.cpp b/src/Gui/RenderArea.cpp index 6b6b8ed..4d250f8 100644 --- a/src/Gui/RenderArea.cpp +++ b/src/Gui/RenderArea.cpp @@ -49,20 +49,16 @@ RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade: Gtk::ToolButton *button; xml->get_widget("ToolButtonZoomIn", button); - if(button) - button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), 2, 0.5f, 0.5f)); + button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), 2, 0.5f, 0.5f)); xml->get_widget("ToolButtonZoomOut", button); - if(button) - button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), -2, 0.5f, 0.5f)); + button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), -2, 0.5f, 0.5f)); xml->get_widget("Hscrollbar", hScrollbar); - if(hScrollbar) - hScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling)); + hScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling)); xml->get_widget("Vscrollbar", vScrollbar); - if(vScrollbar) - vScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling)); + vScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling)); gtk_widget_set_gl_capability(GTK_WIDGET(cobject), glconfig, 0, TRUE, GDK_GL_RGBA_TYPE); } @@ -152,63 +148,69 @@ void RenderArea::updateViewport() { } void RenderArea::updateScrollbars(float x, float y) { - const gdouble imageWidth = getImageWidth(), imageHeight = getImageHeight(); - const gdouble minX = -imageWidth/2, maxX = imageWidth/2; - const gdouble minY = -imageHeight/2, maxY = imageHeight/2; + float minX, maxX, minY, maxY; const gdouble width = getViewWidth(), height = getViewHeight(); gdouble lower, upper, pageSize, value; - + + if(!view) + return; + + view->getBounds(&minX, &maxX, &minY, &maxY); + float xVal = std::max(std::fabs(minX), std::fabs(maxX)); + float yVal = std::max(std::fabs(minY), std::fabs(maxY)); + get_window()->freeze_updates(); - if(hScrollbar) { - lower = hScrollbar->get_adjustment()->get_lower(); - upper = hScrollbar->get_adjustment()->get_upper(); - pageSize = hScrollbar->get_adjustment()->get_page_size(); - - hScrollbar->get_adjustment()->set_lower(minX + width/2); - hScrollbar->get_adjustment()->set_upper(maxX + width/2); - hScrollbar->get_adjustment()->set_page_size(width); - - if(pageSize > (upper-lower) && width < imageWidth) - value = 0; - else - value = hScrollbar->get_value() + (x-0.5)*(pageSize-width); - - hScrollbar->set_value(std::max(std::min(value, maxX - width/2), minX + width/2)); - } + lower = hScrollbar->get_adjustment()->get_lower(); + upper = hScrollbar->get_adjustment()->get_upper(); + pageSize = hScrollbar->get_adjustment()->get_page_size(); - if(vScrollbar) { - lower = vScrollbar->get_adjustment()->get_lower(); - upper = vScrollbar->get_adjustment()->get_upper(); - pageSize = vScrollbar->get_adjustment()->get_page_size(); - - vScrollbar->get_adjustment()->set_lower(minY + height/2); - vScrollbar->get_adjustment()->set_upper(maxY + height/2); - vScrollbar->get_adjustment()->set_page_size(height); - - if(pageSize > (upper-lower) && height < imageHeight) - value = 0; - else - value = vScrollbar->get_value() + (y-0.5)*(pageSize-height); - - vScrollbar->set_value(std::max(std::min(value, maxY - height/2), minY + height/2)); - } + hScrollbar->get_adjustment()->set_lower(-xVal + width/2); + hScrollbar->get_adjustment()->set_upper(xVal + width/2); + hScrollbar->get_adjustment()->set_page_size(width); + + if(pageSize > (upper-lower) && width < 2*xVal) + value = 0; + else + value = hScrollbar->get_value() + (x-0.5)*(pageSize-width); + + hScrollbar->set_value(std::max(std::min(value, xVal - width/2), -xVal + width/2)); + + lower = vScrollbar->get_adjustment()->get_lower(); + upper = vScrollbar->get_adjustment()->get_upper(); + pageSize = vScrollbar->get_adjustment()->get_page_size(); + + vScrollbar->get_adjustment()->set_lower(-yVal + height/2); + vScrollbar->get_adjustment()->set_upper(yVal + height/2); + vScrollbar->get_adjustment()->set_page_size(height); + + if(pageSize > (upper-lower) && height < 2*yVal) + value = 0; + else + value = vScrollbar->get_value() + (y-0.5)*(pageSize-height); + + vScrollbar->set_value(std::max(std::min(value, yVal - height/2), -yVal + height/2)); get_window()->thaw_updates(); - updateScrolling(); + updateScrollingWithSize(2*xVal, 2*yVal); } void RenderArea::updateScrolling() { + updateScrollingWithSize(hScrollbar->get_adjustment()->get_upper()-hScrollbar->get_adjustment()->get_lower(), + vScrollbar->get_adjustment()->get_upper()-vScrollbar->get_adjustment()->get_lower()); +} + +void RenderArea::updateScrollingWithSize(float imageWidth, float imageHeight) { if(hScrollbar) { - if(getImageWidth() < getViewWidth()) + if(imageWidth < getViewWidth()) xCenter = 0; else xCenter = hScrollbar->get_value(); } if(vScrollbar) { - if(getImageHeight() < getViewHeight()) + if(imageHeight < getViewHeight()) yCenter = 0; else yCenter = vScrollbar->get_value(); diff --git a/src/Gui/RenderArea.h b/src/Gui/RenderArea.h index c47c56d..61e5291 100644 --- a/src/Gui/RenderArea.h +++ b/src/Gui/RenderArea.h @@ -51,9 +51,6 @@ class RenderArea : public Gtk::DrawingArea { return get_height()/scale; } - float getImageWidth() const {return 10;} - float getImageHeight() const {return 10;} - float getScale() const {return scale;} float getXCenter() const {return xCenter;} @@ -82,6 +79,7 @@ class RenderArea : public Gtk::DrawingArea { void updateViewport(); void updateScrollbars(float x = 0.5f, float y = 0.5f); void updateScrolling(); + void updateScrollingWithSize(float imageWidth, float imageHeight); bool gdkGLBegin() { GtkWidget *widget = GTK_WIDGET(gobj()); diff --git a/src/View/TopView.cpp b/src/View/TopView.cpp index 8ca047f..08074c9 100644 --- a/src/View/TopView.cpp +++ b/src/View/TopView.cpp @@ -154,5 +154,47 @@ void TopView::render(Gui::RenderArea *renderArea) { renderRoom(*room); } +void TopView::getBounds(float *minX, float *maxX, float *minY, float *maxY) { + if(!level) + return; + + if(minX) + *minX = 0; + if(maxX) + *maxX = 0; + if(minY) + *minY = 0; + if(maxY) + *maxY = 0; + + const std::list<Data::Room*> &rooms = level->getRooms(); + + for(std::list<Data::Room*>::const_iterator room = rooms.begin(); room != rooms.end(); ++room) { + const std::list<Data::Triangle*> &triangles = (*room)->getFloorTriangles(); + + for(std::list<Data::Triangle*>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) { + const Data::Vertex &v1 = (*t)->getVertex(0), &v2 = (*t)->getVertex(1), &v3 = (*t)->getVertex(2); + + if(minX) + *minX = std::min(std::min(*minX, v1.getX()), std::min(v2.getX(), v3.getX())); + if(maxX) + *maxX = std::max(std::max(*maxX, v1.getX()), std::max(v2.getX(), v3.getX())); + if(minY) + *minY = std::min(std::min(*minY, v1.getZ()), std::min(v2.getZ(), v3.getZ())); + if(maxY) + *maxY = std::max(std::max(*maxY, v1.getZ()), std::max(v2.getZ(), v3.getZ())); + } + } + + if(minX) + *minX -= 5; + if(maxX) + *maxX += 5; + if(minY) + *minY -= 5; + if(maxY) + *maxY += 5; +} + } } diff --git a/src/View/TopView.h b/src/View/TopView.h index bbb9394..0996ad3 100644 --- a/src/View/TopView.h +++ b/src/View/TopView.h @@ -48,7 +48,6 @@ class TopView : public View { bool edgeLess(const Edge &e1, const Edge &e2); void drawGrid(Gui::RenderArea *renderArea); - void renderRoom(Data::Room *room); public: @@ -58,6 +57,8 @@ class TopView : public View { void setLevel(Data::Level *level0) {level = level0;} virtual void render(Gui::RenderArea *renderArea); + + virtual void getBounds(float *minX, float *maxX, float *minY, float *maxY); }; } diff --git a/src/View/View.h b/src/View/View.h index cdf27aa..bb52032 100644 --- a/src/View/View.h +++ b/src/View/View.h @@ -33,6 +33,7 @@ class View { virtual ~View() {} virtual void render(Gui::RenderArea *renderArea) = 0; + virtual void getBounds(float *minX, float *maxX, float *minY, float *maxY) = 0; }; } |