zoomedit:
* Can grab level view now to change view position.
This commit is contained in:
parent
1464f33677
commit
c771232b74
6 changed files with 43 additions and 48 deletions
|
@ -32,7 +32,8 @@ namespace Gui {
|
||||||
GdkGLConfig *RenderArea::glconfig = 0;
|
GdkGLConfig *RenderArea::glconfig = 0;
|
||||||
|
|
||||||
RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml)
|
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) {
|
if(!glconfig) {
|
||||||
glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DOUBLE));
|
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
|
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_configure_event().connect(sigc::mem_fun(this, &RenderArea::onConfigureEvent));
|
||||||
signal_expose_event().connect(sigc::mem_fun(this, &RenderArea::onExposeEvent));
|
signal_expose_event().connect(sigc::mem_fun(this, &RenderArea::onExposeEvent));
|
||||||
signal_scroll_event().connect(sigc::mem_fun(this, &RenderArea::onScrollEvent));
|
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;
|
Gtk::ToolButton *button;
|
||||||
xml->get_widget("ToolButtonZoomIn", 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) {
|
void RenderArea::zoom(int zoom, float x, float y) {
|
||||||
zoomLevel = std::max(std::min(zoomLevel + zoom, 50), -100);
|
zoomLevel = std::max(std::min(zoomLevel + zoom, 50), -100);
|
||||||
scale = 100*std::pow(1.1f, zoomLevel);
|
scale = 100*std::pow(1.1f, zoomLevel);
|
||||||
|
|
|
@ -67,10 +67,16 @@ class RenderArea : public Gtk::DrawingArea {
|
||||||
int zoomLevel;
|
int zoomLevel;
|
||||||
float scale;
|
float scale;
|
||||||
|
|
||||||
|
bool inWindow;
|
||||||
|
float xHover, yHover;
|
||||||
|
|
||||||
void onRealize();
|
void onRealize();
|
||||||
bool onConfigureEvent(GdkEventConfigure*);
|
bool onConfigureEvent(GdkEventConfigure*);
|
||||||
bool onExposeEvent(GdkEventExpose*);
|
bool onExposeEvent(GdkEventExpose*);
|
||||||
bool onScrollEvent(GdkEventScroll *event);
|
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);
|
void zoom(int zoom, float x = 0.5f, float y = 0.5f);
|
||||||
|
|
||||||
|
|
|
@ -154,47 +154,5 @@ void TopView::render(Gui::RenderArea *renderArea) {
|
||||||
renderRoom(*room);
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,8 +55,6 @@ class TopView : public View {
|
||||||
void setLevel(Data::Level *level0) {level = level0;}
|
void setLevel(Data::Level *level0) {level = level0;}
|
||||||
|
|
||||||
virtual void render(Gui::RenderArea *renderArea);
|
virtual void render(Gui::RenderArea *renderArea);
|
||||||
|
|
||||||
virtual void getBounds(float *minX, float *maxX, float *minY, float *maxY);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,6 @@ class View {
|
||||||
virtual ~View() {}
|
virtual ~View() {}
|
||||||
|
|
||||||
virtual void render(Gui::RenderArea *renderArea) = 0;
|
virtual void render(Gui::RenderArea *renderArea) = 0;
|
||||||
virtual void getBounds(float *minX, float *maxX, float *minY, float *maxY) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
|
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
|
||||||
<!--Generated with glade3 3.4.0 on Wed Apr 16 11:06:45 2008 -->
|
<!--Generated with glade3 3.4.0 on Thu Apr 17 10:41:01 2008 -->
|
||||||
<glade-interface>
|
<glade-interface>
|
||||||
<widget class="GtkWindow" id="WindowMain">
|
<widget class="GtkWindow" id="WindowMain">
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
@ -203,7 +203,7 @@
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkDrawingArea" id="RenderArea">
|
<widget class="GtkDrawingArea" id="RenderArea">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK</property>
|
||||||
</widget>
|
</widget>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="resize">True</property>
|
<property name="resize">True</property>
|
||||||
|
|
Reference in a new issue