summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Gui/RenderArea.cpp36
-rw-r--r--src/Gui/RenderArea.h6
-rw-r--r--src/View/TopView.cpp42
-rw-r--r--src/View/TopView.h2
-rw-r--r--src/View/View.h1
5 files changed, 41 insertions, 46 deletions
diff --git a/src/Gui/RenderArea.cpp b/src/Gui/RenderArea.cpp
index f27e009..1904aa8 100644
--- a/src/Gui/RenderArea.cpp
+++ b/src/Gui/RenderArea.cpp
@@ -32,7 +32,8 @@ namespace Gui {
GdkGLConfig *RenderArea::glconfig = 0;
RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml)
-: Gtk::DrawingArea(cobject), view(0), xCenter(0), yCenter(0), viewWidth(0), viewHeight(0), zoomLevel(0), scale(100) {
+: Gtk::DrawingArea(cobject), view(0), xCenter(0), yCenter(0), viewWidth(0), viewHeight(0), zoomLevel(0),
+scale(100), inWindow(false) {
if(!glconfig) {
glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DOUBLE));
if(!glconfig) glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB); // Hmm, can't find double buffered config
@@ -46,6 +47,9 @@ RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade:
signal_configure_event().connect(sigc::mem_fun(this, &RenderArea::onConfigureEvent));
signal_expose_event().connect(sigc::mem_fun(this, &RenderArea::onExposeEvent));
signal_scroll_event().connect(sigc::mem_fun(this, &RenderArea::onScrollEvent));
+ signal_enter_notify_event().connect(sigc::mem_fun(this, &RenderArea::onEnterNotifyEvent));
+ signal_leave_notify_event().connect(sigc::mem_fun(this, &RenderArea::onLeaveNotifyEvent));
+ signal_motion_notify_event().connect(sigc::mem_fun(this, &RenderArea::onMotionNotifyEvent));
Gtk::ToolButton *button;
xml->get_widget("ToolButtonZoomIn", button);
@@ -134,6 +138,36 @@ bool RenderArea::onScrollEvent(GdkEventScroll *event) {
}
}
+bool RenderArea::onEnterNotifyEvent(GdkEventCrossing *event) {
+ inWindow = true;
+ xHover = event->x/scale - getViewWidth()/2 + xCenter;
+ yHover = event->y/scale - getViewHeight()/2 + yCenter;
+
+ return true;
+}
+
+bool RenderArea::onLeaveNotifyEvent(GdkEventCrossing*) {
+ inWindow = false;
+
+ return true;
+}
+
+bool RenderArea::onMotionNotifyEvent(GdkEventMotion *event) {
+ inWindow = true;
+
+ if(event->state & GDK_BUTTON3_MASK) {
+ xCenter = xHover - event->x/scale + getViewWidth()/2;
+ yCenter = yHover - event->y/scale + getViewHeight()/2;
+ queue_draw();
+ }
+ else {
+ xHover = event->x/scale - getViewWidth()/2 + xCenter;
+ yHover = event->y/scale - getViewHeight()/2 + yCenter;
+ }
+
+ return true;
+}
+
void RenderArea::zoom(int zoom, float x, float y) {
zoomLevel = std::max(std::min(zoomLevel + zoom, 50), -100);
scale = 100*std::pow(1.1f, zoomLevel);
diff --git a/src/Gui/RenderArea.h b/src/Gui/RenderArea.h
index a757467..c8b6d6e 100644
--- a/src/Gui/RenderArea.h
+++ b/src/Gui/RenderArea.h
@@ -67,10 +67,16 @@ class RenderArea : public Gtk::DrawingArea {
int zoomLevel;
float scale;
+ bool inWindow;
+ float xHover, yHover;
+
void onRealize();
bool onConfigureEvent(GdkEventConfigure*);
bool onExposeEvent(GdkEventExpose*);
bool onScrollEvent(GdkEventScroll *event);
+ bool onEnterNotifyEvent(GdkEventCrossing *event);
+ bool onLeaveNotifyEvent(GdkEventCrossing*);
+ bool onMotionNotifyEvent(GdkEventMotion *event);
void zoom(int zoom, float x = 0.5f, float y = 0.5f);
diff --git a/src/View/TopView.cpp b/src/View/TopView.cpp
index 80f3f8e..8ca047f 100644
--- a/src/View/TopView.cpp
+++ b/src/View/TopView.cpp
@@ -154,47 +154,5 @@ 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 -= 2.5f;
- if(maxX)
- *maxX += 2.5f;
- if(minY)
- *minY -= 2.5f;
- if(maxY)
- *maxY += 2.5f;
-}
-
}
}
diff --git a/src/View/TopView.h b/src/View/TopView.h
index 82f5875..914b1e5 100644
--- a/src/View/TopView.h
+++ b/src/View/TopView.h
@@ -55,8 +55,6 @@ 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 cd4d5f5..ad0a6cd 100644
--- a/src/View/View.h
+++ b/src/View/View.h
@@ -33,7 +33,6 @@ class View {
virtual ~View() {}
virtual void render(Gui::RenderArea *renderArea) = 0;
- virtual void getBounds(float *minX, float *maxX, float *minY, float *maxY) = 0;
};
}