zoomedit:
* Implemented MapView
This commit is contained in:
parent
12ebbe18e1
commit
eb096e97d6
13 changed files with 187 additions and 15 deletions
|
@ -44,6 +44,7 @@ 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_button_press_event().connect(sigc::mem_fun(this, &RenderArea::onButtonPressEvent));
|
||||||
signal_enter_notify_event().connect(sigc::mem_fun(this, &RenderArea::onEnterNotifyEvent));
|
signal_enter_notify_event().connect(sigc::mem_fun(this, &RenderArea::onEnterNotifyEvent));
|
||||||
signal_leave_notify_event().connect(sigc::mem_fun(this, &RenderArea::onLeaveNotifyEvent));
|
signal_leave_notify_event().connect(sigc::mem_fun(this, &RenderArea::onLeaveNotifyEvent));
|
||||||
signal_motion_notify_event().connect(sigc::mem_fun(this, &RenderArea::onMotionNotifyEvent));
|
signal_motion_notify_event().connect(sigc::mem_fun(this, &RenderArea::onMotionNotifyEvent));
|
||||||
|
@ -118,6 +119,13 @@ bool RenderArea::onScrollEvent(GdkEventScroll *event) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RenderArea::onButtonPressEvent(GdkEventButton *event) {
|
||||||
|
if(view && event->button == 1)
|
||||||
|
view->click(this, event->x, event->y);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool RenderArea::onEnterNotifyEvent(GdkEventCrossing *event) {
|
bool RenderArea::onEnterNotifyEvent(GdkEventCrossing *event) {
|
||||||
inWindow = true;
|
inWindow = true;
|
||||||
xHover = event->x;
|
xHover = event->x;
|
||||||
|
|
|
@ -55,6 +55,7 @@ class RenderArea : public Gtk::DrawingArea {
|
||||||
bool onConfigureEvent(GdkEventConfigure*);
|
bool onConfigureEvent(GdkEventConfigure*);
|
||||||
bool onExposeEvent(GdkEventExpose*);
|
bool onExposeEvent(GdkEventExpose*);
|
||||||
bool onScrollEvent(GdkEventScroll *event);
|
bool onScrollEvent(GdkEventScroll *event);
|
||||||
|
bool onButtonPressEvent(GdkEventButton *event);
|
||||||
bool onEnterNotifyEvent(GdkEventCrossing *event);
|
bool onEnterNotifyEvent(GdkEventCrossing *event);
|
||||||
bool onLeaveNotifyEvent(GdkEventCrossing*);
|
bool onLeaveNotifyEvent(GdkEventCrossing*);
|
||||||
bool onMotionNotifyEvent(GdkEventMotion *event);
|
bool onMotionNotifyEvent(GdkEventMotion *event);
|
||||||
|
|
|
@ -28,11 +28,23 @@ Window::Window(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &x
|
||||||
xml->connect_clicked("MenuItemQuit", sigc::mem_fun(this, &Window::hide));
|
xml->connect_clicked("MenuItemQuit", sigc::mem_fun(this, &Window::hide));
|
||||||
|
|
||||||
xml->get_widget_derived("RenderArea", renderArea);
|
xml->get_widget_derived("RenderArea", renderArea);
|
||||||
|
xml->get_widget_derived("MapArea", mapArea);
|
||||||
|
|
||||||
|
if(renderArea)
|
||||||
|
renderArea->signal_expose_event().connect_notify(sigc::mem_fun(this, &Window::updateMap));
|
||||||
}
|
}
|
||||||
|
|
||||||
Window::~Window() {
|
Window::~Window() {
|
||||||
if(renderArea)
|
if(renderArea)
|
||||||
delete renderArea;
|
delete renderArea;
|
||||||
|
|
||||||
|
if(mapArea)
|
||||||
|
delete mapArea;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window::updateMap(GdkEventExpose*) {
|
||||||
|
if(mapArea)
|
||||||
|
mapArea->queue_draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,13 +30,16 @@ class RenderArea;
|
||||||
|
|
||||||
class Window : public Gtk::Window {
|
class Window : public Gtk::Window {
|
||||||
private:
|
private:
|
||||||
RenderArea *renderArea;
|
RenderArea *renderArea, *mapArea;
|
||||||
|
|
||||||
|
void updateMap(GdkEventExpose*);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Window(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml);
|
Window(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml);
|
||||||
virtual ~Window();
|
virtual ~Window();
|
||||||
|
|
||||||
RenderArea* getRenderArea() const {return renderArea;}
|
RenderArea* getRenderArea() const {return renderArea;}
|
||||||
|
RenderArea* getMapArea() const {return mapArea;}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <Gui/RenderArea.h>
|
#include <Gui/RenderArea.h>
|
||||||
#include <Data/Level.h>
|
#include <Data/Level.h>
|
||||||
#include <View/TopView.h>
|
#include <View/TopView.h>
|
||||||
|
#include <View/MapView.h>
|
||||||
|
|
||||||
namespace ZoomEdit {
|
namespace ZoomEdit {
|
||||||
|
|
||||||
|
@ -65,6 +66,9 @@ Instance::Instance(const Glib::ustring &file) : window(0), levelXml(0), level(0)
|
||||||
view = new View::TopView();
|
view = new View::TopView();
|
||||||
window->getRenderArea()->setView(view);
|
window->getRenderArea()->setView(view);
|
||||||
|
|
||||||
|
mapView = new View::MapView(window->getRenderArea());
|
||||||
|
window->getMapArea()->setView(mapView);
|
||||||
|
|
||||||
Gtk::ToolButton *button;
|
Gtk::ToolButton *button;
|
||||||
xml->get_widget("ToolButtonZoomIn", button);
|
xml->get_widget("ToolButtonZoomIn", button);
|
||||||
button->signal_clicked().connect(sigc::bind(sigc::mem_fun(view, &View::TopView::zoom), window->getRenderArea(), 2, 0, 0));
|
button->signal_clicked().connect(sigc::bind(sigc::mem_fun(view, &View::TopView::zoom), window->getRenderArea(), 2, 0, 0));
|
||||||
|
@ -84,6 +88,9 @@ Instance::~Instance() {
|
||||||
if(window)
|
if(window)
|
||||||
delete window;
|
delete window;
|
||||||
|
|
||||||
|
if(mapView)
|
||||||
|
delete mapView;
|
||||||
|
|
||||||
if(view)
|
if(view)
|
||||||
delete view;
|
delete view;
|
||||||
|
|
||||||
|
@ -129,11 +136,13 @@ void Instance::createLevel() {
|
||||||
level = new Data::Level(root);
|
level = new Data::Level(root);
|
||||||
|
|
||||||
view->setLevel(level);
|
view->setLevel(level);
|
||||||
|
mapView->setLevel(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Instance::loadLevel(const Glib::ustring &file) {
|
bool Instance::loadLevel(const Glib::ustring &file) {
|
||||||
if(level) {
|
if(level) {
|
||||||
view->setLevel(0);
|
view->setLevel(0);
|
||||||
|
mapView->setLevel(0);
|
||||||
delete level;
|
delete level;
|
||||||
level = 0;
|
level = 0;
|
||||||
}
|
}
|
||||||
|
@ -153,6 +162,7 @@ bool Instance::loadLevel(const Glib::ustring &file) {
|
||||||
level = new Data::Level(doc->get_root_node());
|
level = new Data::Level(doc->get_root_node());
|
||||||
|
|
||||||
view->setLevel(level);
|
view->setLevel(level);
|
||||||
|
mapView->setLevel(level);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ class Level;
|
||||||
|
|
||||||
namespace View {
|
namespace View {
|
||||||
class TopView;
|
class TopView;
|
||||||
|
class MapView;
|
||||||
}
|
}
|
||||||
|
|
||||||
class Instance {
|
class Instance {
|
||||||
|
@ -58,6 +59,7 @@ class Instance {
|
||||||
Data::Level *level;
|
Data::Level *level;
|
||||||
|
|
||||||
View::TopView *view;
|
View::TopView *view;
|
||||||
|
View::MapView *mapView;
|
||||||
|
|
||||||
Instance(const Glib::ustring &file);
|
Instance(const Glib::ustring &file);
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
noinst_LTLIBRARIES = libview.la
|
noinst_LTLIBRARIES = libview.la
|
||||||
|
|
||||||
libview_la_SOURCES = TopView.cpp
|
libview_la_SOURCES = TopView.cpp MapView.cpp
|
||||||
|
|
|
@ -43,7 +43,7 @@ CONFIG_HEADER = $(top_builddir)/src/config.h
|
||||||
CONFIG_CLEAN_FILES =
|
CONFIG_CLEAN_FILES =
|
||||||
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||||
libview_la_LIBADD =
|
libview_la_LIBADD =
|
||||||
am_libview_la_OBJECTS = TopView.lo
|
am_libview_la_OBJECTS = TopView.lo MapView.lo
|
||||||
libview_la_OBJECTS = $(am_libview_la_OBJECTS)
|
libview_la_OBJECTS = $(am_libview_la_OBJECTS)
|
||||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
|
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
|
||||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||||
|
@ -179,7 +179,7 @@ target_alias = @target_alias@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
noinst_LTLIBRARIES = libview.la
|
noinst_LTLIBRARIES = libview.la
|
||||||
libview_la_SOURCES = TopView.cpp
|
libview_la_SOURCES = TopView.cpp MapView.cpp
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -231,6 +231,7 @@ mostlyclean-compile:
|
||||||
distclean-compile:
|
distclean-compile:
|
||||||
-rm -f *.tab.c
|
-rm -f *.tab.c
|
||||||
|
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MapView.Plo@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TopView.Plo@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TopView.Plo@am__quote@
|
||||||
|
|
||||||
.cpp.o:
|
.cpp.o:
|
||||||
|
|
|
@ -18,13 +18,131 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "MapView.h"
|
#include "MapView.h"
|
||||||
|
#include "TopView.h"
|
||||||
|
#include <Data/Level.h>
|
||||||
|
#include <Data/Room.h>
|
||||||
|
#include <Data/Triangle.h>
|
||||||
|
#include <Gui/RenderArea.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <cmath>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
namespace ZoomEdit {
|
namespace ZoomEdit {
|
||||||
namespace View {
|
namespace View {
|
||||||
|
|
||||||
void MapView::render(Gui::RenderArea *renderArea) {
|
void MapView::click(Gui::RenderArea *renderArea, float x, float y) {
|
||||||
|
if(!mainArea)
|
||||||
|
return;
|
||||||
|
|
||||||
|
TopView *mainView = dynamic_cast<TopView*>(mainArea->getView());
|
||||||
|
if(!mainView)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mainView->setXCenter(xCenter + (x - renderArea->get_width()/2)/scale);
|
||||||
|
mainView->setYCenter(yCenter + (y - renderArea->get_height()/2)/scale);
|
||||||
|
|
||||||
|
mainArea->queue_draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapView::render(Gui::RenderArea *renderArea) {
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
if(!level)
|
||||||
|
return;
|
||||||
|
|
||||||
|
float minX, maxX, minY, maxY;
|
||||||
|
getBounds(&minX, &maxX, &minY, &maxY);
|
||||||
|
|
||||||
|
xCenter = (minX+maxX)/2; yCenter = (minY+maxY)/2;
|
||||||
|
float width = maxX-minX, height=maxY-minY;
|
||||||
|
|
||||||
|
if(width == 0 || height == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
scale = std::min(renderArea->get_width()/width, renderArea->get_height()/height)*0.75f;
|
||||||
|
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPushMatrix();
|
||||||
|
|
||||||
|
glScalef(scale, scale, 1);
|
||||||
|
glTranslatef(-xCenter, -yCenter, 0);
|
||||||
|
|
||||||
|
const std::list<Data::Room*> &rooms = level->getRooms();
|
||||||
|
|
||||||
|
for(std::list<Data::Room*>::const_iterator room = rooms.begin(); room != rooms.end(); ++room)
|
||||||
|
TopView::renderRoom(*room);
|
||||||
|
|
||||||
|
if(mainArea) {
|
||||||
|
TopView *mainView = dynamic_cast<TopView*>(mainArea->getView());
|
||||||
|
|
||||||
|
if(mainView) {
|
||||||
|
float mainXCenter = mainView->getXCenter(), mainYCenter = mainView->getYCenter();
|
||||||
|
float mainScale = mainView->getScale();
|
||||||
|
|
||||||
|
float mainWidth = mainArea->get_width()/mainScale, mainHeight = mainArea->get_height()/mainScale;
|
||||||
|
|
||||||
|
glColor4f(0.7f, 0.7f, 0.7f, 0.3f);
|
||||||
|
|
||||||
|
glBegin(GL_POLYGON);
|
||||||
|
|
||||||
|
glVertex2f(mainXCenter-mainWidth/2, mainYCenter-mainHeight/2);
|
||||||
|
glVertex2f(mainXCenter+mainWidth/2, mainYCenter-mainHeight/2);
|
||||||
|
glVertex2f(mainXCenter+mainWidth/2, mainYCenter+mainHeight/2);
|
||||||
|
glVertex2f(mainXCenter-mainWidth/2, mainYCenter+mainHeight/2);
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glColor4f(0.7f, 0.7f, 0.7f, 0.7f);
|
||||||
|
glLineWidth(1.0f);
|
||||||
|
|
||||||
|
glBegin(GL_LINE_LOOP);
|
||||||
|
|
||||||
|
glVertex2f(mainXCenter-mainWidth/2, mainYCenter-mainHeight/2);
|
||||||
|
glVertex2f(mainXCenter+mainWidth/2, mainYCenter-mainHeight/2);
|
||||||
|
glVertex2f(mainXCenter+mainWidth/2, mainYCenter+mainHeight/2);
|
||||||
|
glVertex2f(mainXCenter-mainWidth/2, mainYCenter+mainHeight/2);
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MapView::getBounds(float *minX, float *maxX, float *minY, float *maxY) {
|
||||||
|
if(minX)
|
||||||
|
*minX = 0;
|
||||||
|
if(maxX)
|
||||||
|
*maxX = 0;
|
||||||
|
if(minY)
|
||||||
|
*minY = 0;
|
||||||
|
if(maxY)
|
||||||
|
*maxY = 0;
|
||||||
|
|
||||||
|
if(!level)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,16 +30,30 @@ class Level;
|
||||||
|
|
||||||
namespace View {
|
namespace View {
|
||||||
|
|
||||||
|
class TopView;
|
||||||
|
|
||||||
class MapView : public View {
|
class MapView : public View {
|
||||||
private:
|
private:
|
||||||
Data::Level *level;
|
Data::Level *level;
|
||||||
|
|
||||||
|
Gui::RenderArea *mainArea;
|
||||||
|
|
||||||
|
float scale, xCenter, yCenter;
|
||||||
|
|
||||||
|
void getBounds(float *minX, float *maxX, float *minY, float *maxY);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MapView(Data::Level *level0 = 0) : level(level0) {}
|
MapView(Gui::RenderArea *mainArea0 = 0, Data::Level *level0 = 0)
|
||||||
|
: level(level0), mainArea(mainArea0), scale(1), xCenter(0), yCenter(0) {}
|
||||||
|
|
||||||
Data::Level* getLevel() {return level;}
|
Data::Level* getLevel() {return level;}
|
||||||
void setLevel(Data::Level *level0) {level = level0;}
|
void setLevel(Data::Level *level0) {level = level0;}
|
||||||
|
|
||||||
|
Gui::RenderArea* getMainArea() {return mainArea;}
|
||||||
|
void setMainArea(Gui::RenderArea *mainArea0) {mainArea = mainArea0;}
|
||||||
|
|
||||||
|
virtual void click(Gui::RenderArea *renderArea, float x, float y);
|
||||||
|
|
||||||
virtual void render(Gui::RenderArea *renderArea);
|
virtual void render(Gui::RenderArea *renderArea);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ void TopView::drawGrid(Gui::RenderArea *renderArea) {
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
|
|
||||||
for(int i = 0; 0.4f*(depth-depth2+i-1) < 0.5f; i++) {
|
for(int i = 0; 0.4f*(depth-depth2+i-1) < 0.5f; ++i) {
|
||||||
float f = std::min(0.4f*(depth-depth2+i), 0.5f);
|
float f = std::min(0.4f*(depth-depth2+i), 0.5f);
|
||||||
glColor3f(f, f, f);
|
glColor3f(f, f, f);
|
||||||
|
|
||||||
|
|
|
@ -50,25 +50,27 @@ class TopView : public View {
|
||||||
int zoomLevel;
|
int zoomLevel;
|
||||||
float scale;
|
float scale;
|
||||||
|
|
||||||
float getXCenter() const {return xCenter;}
|
|
||||||
float getYCenter() const {return yCenter;}
|
|
||||||
|
|
||||||
float getScale() const {return scale;}
|
|
||||||
|
|
||||||
void drawGrid(Gui::RenderArea *renderArea);
|
void drawGrid(Gui::RenderArea *renderArea);
|
||||||
void renderRoom(Data::Room *room);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TopView(Data::Level *level0 = 0) : level(level0), xCenter(0), yCenter(0), zoomLevel(0), scale(100) {}
|
TopView(Data::Level *level0 = 0) : level(level0), xCenter(0), yCenter(0), zoomLevel(0), scale(100) {}
|
||||||
|
|
||||||
|
float getXCenter() const {return xCenter;}
|
||||||
|
void setXCenter(float xCenter0) {xCenter = xCenter0;}
|
||||||
|
float getYCenter() const {return yCenter;}
|
||||||
|
void setYCenter(float yCenter0) {yCenter = yCenter0;}
|
||||||
|
|
||||||
|
float getScale() const {return scale;}
|
||||||
|
|
||||||
Data::Level* getLevel() {return level;}
|
Data::Level* getLevel() {return level;}
|
||||||
void setLevel(Data::Level *level0) {level = level0;}
|
void setLevel(Data::Level *level0) {level = level0;}
|
||||||
|
|
||||||
virtual void zoom(Gui::RenderArea *renderArea, int zoom, float x, float y);
|
virtual void zoom(Gui::RenderArea *renderArea, int zoom, float x, float y);
|
||||||
|
|
||||||
virtual void move(Gui::RenderArea *renderArea, float x, float y);
|
virtual void move(Gui::RenderArea *renderArea, float x, float y);
|
||||||
|
|
||||||
virtual void render(Gui::RenderArea *renderArea);
|
virtual void render(Gui::RenderArea *renderArea);
|
||||||
|
|
||||||
|
static void renderRoom(Data::Room *room);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ class View {
|
||||||
|
|
||||||
virtual void zoom(Gui::RenderArea*, int, float, float) {}
|
virtual void zoom(Gui::RenderArea*, int, float, float) {}
|
||||||
virtual void move(Gui::RenderArea*, float, float) {}
|
virtual void move(Gui::RenderArea*, float, float) {}
|
||||||
|
virtual void click(Gui::RenderArea*, float, float) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue