zoomedit: Use tools for event handling and rendering
This commit is contained in:
parent
9b5296b04e
commit
953a6ff48a
18 changed files with 196 additions and 162 deletions
|
@ -49,7 +49,7 @@ gboolean Drawer::eventHandler(GtkWidget *widget, GdkEvent *event, Drawer *drawer
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
drawer->window->getEditManager().buttonPress(event->button.button);
|
drawer->window->getActiveTool()->getEventHandler()->buttonPress(event->button.button);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_SCROLL:
|
case GDK_SCROLL:
|
||||||
|
@ -168,6 +168,9 @@ void Drawer::render() {
|
||||||
|
|
||||||
renderer.render(window->getLevel(), rect, scale);
|
renderer.render(window->getLevel(), rect, scale);
|
||||||
|
|
||||||
|
if(window->getActiveTool()->getRenderer())
|
||||||
|
window->getActiveTool()->getRenderer()->render(window->getLevel(), rect, scale);
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
|
@ -175,9 +178,7 @@ void Drawer::render() {
|
||||||
gdk_gl_drawable_gl_end(drawable);
|
gdk_gl_drawable_gl_end(drawable);
|
||||||
}
|
}
|
||||||
|
|
||||||
Drawer::Drawer(Window *window, GdkGLConfig *glconfig)
|
Drawer::Drawer(Window *window, GdkGLConfig *glconfig) : renderer(&window->getEditManager()) {
|
||||||
: renderer(&window->getEditManager())
|
|
||||||
{
|
|
||||||
this->window = window;
|
this->window = window;
|
||||||
zoomExp = 0;
|
zoomExp = 0;
|
||||||
scale = 100;
|
scale = 100;
|
||||||
|
|
4
Drawer.h
4
Drawer.h
|
@ -16,10 +16,10 @@ class Drawer {
|
||||||
GtkAdjustment *hAdjustment, *vAdjustment;
|
GtkAdjustment *hAdjustment, *vAdjustment;
|
||||||
int zoomExp;
|
int zoomExp;
|
||||||
|
|
||||||
Renderer renderer;
|
|
||||||
|
|
||||||
Window *window;
|
Window *window;
|
||||||
|
|
||||||
|
Renderer renderer;
|
||||||
|
|
||||||
float scale;
|
float scale;
|
||||||
float xCenter, yCenter;
|
float xCenter, yCenter;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
|
|
||||||
|
|
||||||
bool EditManager::lineOk(const Line& l) const {
|
bool EditManager::lineOk(const Room &newRoom, const Line &l) const {
|
||||||
Line l2;
|
Line l2;
|
||||||
|
|
||||||
for(size_t i = 0; i+2 < newRoom.size(); i++) {
|
for(size_t i = 0; i+2 < newRoom.size(); i++) {
|
||||||
|
@ -30,10 +30,8 @@ bool EditManager::lineOk(const Line& l) const {
|
||||||
EditManager::EditManager(Window *window) {
|
EditManager::EditManager(Window *window) {
|
||||||
this->window = window;
|
this->window = window;
|
||||||
|
|
||||||
selectedObject = NULL;
|
|
||||||
mode = VIEW;
|
|
||||||
|
|
||||||
hoveredObject = NULL;
|
hoveredObject = NULL;
|
||||||
|
selectedObject = NULL;
|
||||||
|
|
||||||
hasHoveredVertex = false;
|
hasHoveredVertex = false;
|
||||||
}
|
}
|
||||||
|
@ -42,40 +40,18 @@ void EditManager::redraw() {
|
||||||
window->redraw();
|
window->redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditManager::addRoom() {
|
bool EditManager::addRoom(const Room &newRoom) {
|
||||||
if(mode == VIEW) {
|
|
||||||
newRoom = Room();
|
|
||||||
mode = ADD;
|
|
||||||
|
|
||||||
selectedObject = &newRoom;
|
|
||||||
|
|
||||||
window->update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditManager::finishRoom() {
|
|
||||||
if(mode == ADD) {
|
|
||||||
mode = VIEW;
|
|
||||||
|
|
||||||
if(newRoom.size() > 2 && polygonOk(newRoom)) {
|
if(newRoom.size() > 2 && polygonOk(newRoom)) {
|
||||||
newRoom.setName(idManager.generate("room"));
|
Room *room = new Room(newRoom);
|
||||||
window->getLevel().push_back(SharedPtr<LevelObject>(new Room(newRoom)));
|
room->setName(idManager.generate("room"));
|
||||||
|
|
||||||
|
window->getLevel().push_back(SharedPtr<LevelObject>(room));
|
||||||
selectedObject = &*window->getLevel().back();
|
selectedObject = &*window->getLevel().back();
|
||||||
}
|
|
||||||
else {
|
return true;
|
||||||
selectedObject = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window->update();
|
return false;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EditManager::addVertex(const Vertex &v) {
|
|
||||||
if(mode != ADD)
|
|
||||||
return;
|
|
||||||
|
|
||||||
newRoom.push_back(v);
|
|
||||||
window->update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Vertex* EditManager::getHoveredVertex() {
|
Vertex* EditManager::getHoveredVertex() {
|
||||||
|
@ -107,27 +83,7 @@ void EditManager::setHoveredVertex(Vertex *v) {
|
||||||
window->update();
|
window->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditManager::buttonPress(unsigned int button) {
|
bool EditManager::vertexOk(const Room &newRoom, const Vertex &v) const {
|
||||||
switch(button) {
|
|
||||||
case 1:
|
|
||||||
if(!hasHoveredVertex)
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch(mode) {
|
|
||||||
case VIEW:
|
|
||||||
selectedObject = hoveredObject;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ADD:
|
|
||||||
if(vertexOk(hoveredVertex))
|
|
||||||
addVertex(hoveredVertex);
|
|
||||||
}
|
|
||||||
|
|
||||||
window->update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EditManager::vertexOk(const Vertex& v) const {
|
|
||||||
Line l;
|
Line l;
|
||||||
|
|
||||||
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||||
|
@ -140,7 +96,7 @@ bool EditManager::vertexOk(const Vertex& v) const {
|
||||||
l.setVertex1(newRoom.back());
|
l.setVertex1(newRoom.back());
|
||||||
l.setVertex2(v);
|
l.setVertex2(v);
|
||||||
|
|
||||||
return lineOk(l);
|
return lineOk(newRoom, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EditManager::polygonOk(const Polygon& polygon) const {
|
bool EditManager::polygonOk(const Polygon& polygon) const {
|
||||||
|
|
|
@ -10,57 +10,43 @@ class Window;
|
||||||
|
|
||||||
|
|
||||||
class EditManager {
|
class EditManager {
|
||||||
public:
|
|
||||||
enum Mode {
|
|
||||||
VIEW, ADD
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Mode mode;
|
|
||||||
|
|
||||||
IdManager idManager;
|
IdManager idManager;
|
||||||
|
|
||||||
Window *window;
|
Window *window;
|
||||||
|
|
||||||
Room newRoom;
|
|
||||||
LevelObject *selectedObject;
|
|
||||||
|
|
||||||
LevelObject *hoveredObject;
|
LevelObject *hoveredObject;
|
||||||
|
LevelObject *selectedObject;
|
||||||
|
|
||||||
Vertex hoveredVertex;
|
Vertex hoveredVertex;
|
||||||
bool hasHoveredVertex;
|
bool hasHoveredVertex;
|
||||||
|
|
||||||
bool lineOk(const Line& l) const;
|
bool lineOk(const Room &newRoom, const Line &l) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EditManager(Window *window);
|
EditManager(Window *window);
|
||||||
|
|
||||||
void redraw();
|
void redraw();
|
||||||
|
|
||||||
void addRoom();
|
LevelObject* getHoveredObject() {
|
||||||
void finishRoom();
|
return hoveredObject;
|
||||||
|
}
|
||||||
|
|
||||||
void addVertex(const Vertex &v);
|
void setSelectedObject(LevelObject *object) {
|
||||||
|
selectedObject = object;
|
||||||
Mode getMode() const {
|
|
||||||
return mode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LevelObject* getSelectedObject() {
|
LevelObject* getSelectedObject() {
|
||||||
return selectedObject;
|
return selectedObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
LevelObject* getHoveredObject() {
|
bool addRoom(const Room &room);
|
||||||
return hoveredObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vertex* getHoveredVertex();
|
Vertex* getHoveredVertex();
|
||||||
void setHoveredVertex(Vertex *v);
|
void setHoveredVertex(Vertex *v);
|
||||||
|
|
||||||
void buttonPress(unsigned int button);
|
bool vertexOk(const Room &newRoom, const Vertex &v) const;
|
||||||
|
bool polygonOk(const Polygon &polygon) const;
|
||||||
bool vertexOk(const Vertex& v) const;
|
|
||||||
bool polygonOk(const Polygon& polygon) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*EDITMANAGER_H_*/
|
#endif /*EDITMANAGER_H_*/
|
||||||
|
|
11
EventHandler.h
Normal file
11
EventHandler.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef EVENTHANDLER_H_
|
||||||
|
#define EVENTHANDLER_H_
|
||||||
|
|
||||||
|
class EventHandler {
|
||||||
|
public:
|
||||||
|
virtual ~EventHandler() {}
|
||||||
|
|
||||||
|
virtual bool buttonPress(unsigned int button) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /*EVENTHANDLER_H_*/
|
31
Renderer.cpp
31
Renderer.cpp
|
@ -126,7 +126,7 @@ void Renderer::renderRoom(const Room &room, bool selected, bool hovered, float s
|
||||||
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
|
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
|
||||||
glLineWidth(2.0f);
|
glLineWidth(2.0f);
|
||||||
}
|
}
|
||||||
else if(hovered && editManager->getMode() == EditManager::VIEW) {
|
else if(hovered) {
|
||||||
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
||||||
glLineWidth(2.0f);
|
glLineWidth(2.0f);
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,7 @@ void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool h
|
||||||
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
|
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
|
||||||
glLineWidth(2.0f);
|
glLineWidth(2.0f);
|
||||||
}
|
}
|
||||||
else if(hovered && editManager->getMode() == EditManager::VIEW) {
|
else if(hovered) {
|
||||||
glColor4f(0.0f, 0.7f, 0.7f, 0.7f);
|
glColor4f(0.0f, 0.7f, 0.7f, 0.7f);
|
||||||
glLineWidth(2.0f);
|
glLineWidth(2.0f);
|
||||||
}
|
}
|
||||||
|
@ -170,31 +170,4 @@ void Renderer::render(const Level &level, const Rectangle &rect, float scale) {
|
||||||
renderObject(**object, (&**object == editManager->getSelectedObject()),
|
renderObject(**object, (&**object == editManager->getSelectedObject()),
|
||||||
(&**object == editManager->getHoveredObject()), scale);
|
(&**object == editManager->getHoveredObject()), scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(editManager->getMode() == EditManager::ADD) {
|
|
||||||
Room *activeRoom = (Room*)editManager->getSelectedObject();
|
|
||||||
|
|
||||||
if(editManager->polygonOk(*activeRoom))
|
|
||||||
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
|
||||||
else
|
|
||||||
glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
|
|
||||||
|
|
||||||
fillPolygon(*activeRoom);
|
|
||||||
|
|
||||||
glLineWidth(2.0f);
|
|
||||||
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
|
||||||
drawPolygon(*activeRoom, false);
|
|
||||||
|
|
||||||
if(!activeRoom->empty() && editManager->getHoveredVertex()) {
|
|
||||||
if(!editManager->vertexOk(*editManager->getHoveredVertex()))
|
|
||||||
glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
|
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
|
||||||
|
|
||||||
glVertex2f(activeRoom->back().getX(), activeRoom->back().getY());
|
|
||||||
glVertex2f(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY());
|
|
||||||
|
|
||||||
glEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@ class Renderer {
|
||||||
EditManager *editManager;
|
EditManager *editManager;
|
||||||
|
|
||||||
void drawGrid(const Rectangle &rect, float scale);
|
void drawGrid(const Rectangle &rect, float scale);
|
||||||
|
|
||||||
|
protected:
|
||||||
void fillPolygon(const Polygon &polygon);
|
void fillPolygon(const Polygon &polygon);
|
||||||
void drawPolygon(const Polygon &polygon, bool close = true);
|
void drawPolygon(const Polygon &polygon, bool close = true);
|
||||||
void drawCircle(const Vertex &m, float r, int n);
|
void drawCircle(const Vertex &m, float r, int n);
|
||||||
|
@ -29,7 +31,9 @@ class Renderer {
|
||||||
this->editManager = editManager;
|
this->editManager = editManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
void render(const Level &level, const Rectangle &rect, float scale);
|
virtual ~Renderer() {}
|
||||||
|
|
||||||
|
virtual void render(const Level &level, const Rectangle &rect, float scale);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*RENDERER_H_*/
|
#endif /*RENDERER_H_*/
|
||||||
|
|
|
@ -3,10 +3,9 @@
|
||||||
|
|
||||||
|
|
||||||
SidebarManager::SidebarManager(Window *window)
|
SidebarManager::SidebarManager(Window *window)
|
||||||
: sidebarToolbox(window), sidebarView(&window->getEditManager()),
|
: sidebarToolbox(window), toolAddPolygon(&window->getEditManager())
|
||||||
sidebarAdd(&window->getEditManager()), toolAddPolygon(&window->getEditManager())
|
|
||||||
{
|
{
|
||||||
this->editor = &window->getEditManager();
|
this->window = window;
|
||||||
activeSidebar = NULL;
|
activeSidebar = NULL;
|
||||||
|
|
||||||
sidebar = gtk_vbox_new(FALSE, 0);
|
sidebar = gtk_vbox_new(FALSE, 0);
|
||||||
|
@ -16,7 +15,7 @@ SidebarManager::SidebarManager(Window *window)
|
||||||
|
|
||||||
gtk_box_pack_start(GTK_BOX(sidebar), gtk_hseparator_new(), FALSE, FALSE, 5);
|
gtk_box_pack_start(GTK_BOX(sidebar), gtk_hseparator_new(), FALSE, FALSE, 5);
|
||||||
|
|
||||||
toolLabel = gtk_label_new(sidebarToolbox.getActiveTool()->getName());
|
toolLabel = gtk_label_new(sidebarToolbox.getActiveTool().getName());
|
||||||
|
|
||||||
gtk_box_pack_start(GTK_BOX(sidebar), toolLabel, FALSE, FALSE, 0);
|
gtk_box_pack_start(GTK_BOX(sidebar), toolLabel, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
@ -40,13 +39,7 @@ SidebarManager::~SidebarManager() {
|
||||||
void SidebarManager::update() {
|
void SidebarManager::update() {
|
||||||
Sidebar *newSidebar = activeSidebar;
|
Sidebar *newSidebar = activeSidebar;
|
||||||
|
|
||||||
switch(editor->getMode()) {
|
newSidebar = window->getActiveTool()->getSidebar();
|
||||||
case EditManager::VIEW:
|
|
||||||
newSidebar = &sidebarView;
|
|
||||||
break;
|
|
||||||
case EditManager::ADD:
|
|
||||||
newSidebar = &sidebarAdd;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(activeSidebar != newSidebar) {
|
if(activeSidebar != newSidebar) {
|
||||||
if(activeSidebar)
|
if(activeSidebar)
|
||||||
|
@ -57,7 +50,7 @@ void SidebarManager::update() {
|
||||||
activeSidebar = newSidebar;
|
activeSidebar = newSidebar;
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_label_set_text(GTK_LABEL(toolLabel), sidebarToolbox.getActiveTool()->getName());
|
gtk_label_set_text(GTK_LABEL(toolLabel), sidebarToolbox.getActiveTool().getName());
|
||||||
|
|
||||||
sidebarToolbox.update();
|
sidebarToolbox.update();
|
||||||
activeSidebar->update();
|
activeSidebar->update();
|
||||||
|
|
|
@ -20,12 +20,9 @@ class SidebarManager {
|
||||||
|
|
||||||
SidebarToolbox sidebarToolbox;
|
SidebarToolbox sidebarToolbox;
|
||||||
|
|
||||||
SidebarView sidebarView;
|
|
||||||
SidebarAdd sidebarAdd;
|
|
||||||
|
|
||||||
Sidebar *activeSidebar;
|
Sidebar *activeSidebar;
|
||||||
|
|
||||||
EditManager *editor;
|
Window *window;
|
||||||
|
|
||||||
ToolAddPolygon toolAddPolygon;
|
ToolAddPolygon toolAddPolygon;
|
||||||
|
|
||||||
|
@ -37,10 +34,14 @@ class SidebarManager {
|
||||||
SidebarManager(Window *window);
|
SidebarManager(Window *window);
|
||||||
virtual ~SidebarManager();
|
virtual ~SidebarManager();
|
||||||
|
|
||||||
GtkWidget *getWidget() {
|
GtkWidget* getWidget() {
|
||||||
return sidebar;
|
return sidebar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tool* getActiveTool() {
|
||||||
|
return &sidebarToolbox.getActiveTool();
|
||||||
|
}
|
||||||
|
|
||||||
void update();
|
void update();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -47,8 +47,8 @@ class SidebarToolbox : Sidebar {
|
||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tool *getActiveTool() {
|
Tool& getActiveTool() {
|
||||||
return activeTool;
|
return *activeTool;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addTool(Tool *tool);
|
void addTool(Tool *tool);
|
||||||
|
|
|
@ -1,29 +1,30 @@
|
||||||
#include "SidebarView.h"
|
#include "SidebarView.h"
|
||||||
#include "PlayerStart.h"
|
#include "PlayerStart.h"
|
||||||
|
#include "ToolSelector.h"
|
||||||
|
|
||||||
|
|
||||||
void SidebarView::spinButtonChanged(GtkWidget *spinbutton, SidebarView *view) {
|
void SidebarView::spinButtonChanged(GtkWidget *spinbutton, SidebarView *view) {
|
||||||
if(!view->editor->getSelectedObject())
|
if(!view->editManager->getSelectedObject())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(view->editor->getSelectedObject()->isOfType("Room")) {
|
if(view->editManager->getSelectedObject()->isOfType("Room")) {
|
||||||
if(spinbutton == view->spinButtonHeight)
|
if(spinbutton == view->spinButtonHeight)
|
||||||
((Room*)view->editor->getSelectedObject())->setHeight(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
|
((Room*)view->editManager->getSelectedObject())->setHeight(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
|
||||||
}
|
}
|
||||||
else if(view->editor->getSelectedObject()->isOfType("PlayerStart")) {
|
else if(view->editManager->getSelectedObject()->isOfType("PlayerStart")) {
|
||||||
if(spinbutton == view->spinButtonX)
|
if(spinbutton == view->spinButtonX)
|
||||||
((PlayerStart*)view->editor->getSelectedObject())->setX(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
|
((PlayerStart*)view->editManager->getSelectedObject())->setX(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
|
||||||
else if(spinbutton == view->spinButtonY)
|
else if(spinbutton == view->spinButtonY)
|
||||||
((PlayerStart*)view->editor->getSelectedObject())->setY(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
|
((PlayerStart*)view->editManager->getSelectedObject())->setY(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
|
||||||
else if(spinbutton == view->spinButtonZ)
|
else if(spinbutton == view->spinButtonZ)
|
||||||
((PlayerStart*)view->editor->getSelectedObject())->setZ(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
|
((PlayerStart*)view->editManager->getSelectedObject())->setZ(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
|
||||||
}
|
}
|
||||||
|
|
||||||
view->editor->redraw();
|
view->editManager->redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
SidebarView::SidebarView(EditManager *editor) {
|
SidebarView::SidebarView(EditManager *editManager) {
|
||||||
this->editor = editor;
|
this->editManager = editManager;
|
||||||
|
|
||||||
sidebar = gtk_vbox_new(FALSE, 0);
|
sidebar = gtk_vbox_new(FALSE, 0);
|
||||||
g_object_ref_sink(G_OBJECT(sidebar));
|
g_object_ref_sink(G_OBJECT(sidebar));
|
||||||
|
@ -154,9 +155,9 @@ void SidebarView::update() {
|
||||||
gtk_widget_hide(tableRoomData);
|
gtk_widget_hide(tableRoomData);
|
||||||
gtk_widget_hide(tablePlayerStart);
|
gtk_widget_hide(tablePlayerStart);
|
||||||
|
|
||||||
if(editor->getSelectedObject()) {
|
if(editManager->getSelectedObject()) {
|
||||||
if(editor->getSelectedObject()->isOfType("Room")) {
|
if(editManager->getSelectedObject()->isOfType("Room")) {
|
||||||
Room *room = (Room*)editor->getSelectedObject();
|
Room *room = (Room*)editManager->getSelectedObject();
|
||||||
|
|
||||||
gtk_label_set_markup(GTK_LABEL(labelType), "<b>Room info:</b>");
|
gtk_label_set_markup(GTK_LABEL(labelType), "<b>Room info:</b>");
|
||||||
|
|
||||||
|
@ -177,8 +178,8 @@ void SidebarView::update() {
|
||||||
|
|
||||||
gtk_widget_show(tableRoomData);
|
gtk_widget_show(tableRoomData);
|
||||||
}
|
}
|
||||||
else if(editor->getSelectedObject()->isOfType("PlayerStart")) {
|
else if(editManager->getSelectedObject()->isOfType("PlayerStart")) {
|
||||||
PlayerStart *playerStart = (PlayerStart*)editor->getSelectedObject();
|
PlayerStart *playerStart = (PlayerStart*)editManager->getSelectedObject();
|
||||||
|
|
||||||
gtk_label_set_markup(GTK_LABEL(labelType), "<b>Player start:</b>");
|
gtk_label_set_markup(GTK_LABEL(labelType), "<b>Player start:</b>");
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include "EditManager.h"
|
#include "EditManager.h"
|
||||||
|
|
||||||
|
|
||||||
|
class ToolSelector;
|
||||||
|
|
||||||
class SidebarView : public Sidebar {
|
class SidebarView : public Sidebar {
|
||||||
private:
|
private:
|
||||||
GtkWidget *sidebar;
|
GtkWidget *sidebar;
|
||||||
|
@ -12,7 +14,7 @@ class SidebarView : public Sidebar {
|
||||||
GtkWidget *tableRoomData, *labelArea, *labelPerimeter, *spinButtonHeight;
|
GtkWidget *tableRoomData, *labelArea, *labelPerimeter, *spinButtonHeight;
|
||||||
GtkWidget *tablePlayerStart, *spinButtonX, *spinButtonY, *spinButtonZ;
|
GtkWidget *tablePlayerStart, *spinButtonX, *spinButtonY, *spinButtonZ;
|
||||||
|
|
||||||
EditManager *editor;
|
EditManager *editManager;
|
||||||
|
|
||||||
// prevent shallow copy
|
// prevent shallow copy
|
||||||
SidebarView(const SidebarView &w);
|
SidebarView(const SidebarView &w);
|
||||||
|
@ -21,7 +23,7 @@ class SidebarView : public Sidebar {
|
||||||
static void spinButtonChanged(GtkWidget *spinbutton, SidebarView *view);
|
static void spinButtonChanged(GtkWidget *spinbutton, SidebarView *view);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SidebarView(EditManager *editor);
|
SidebarView(EditManager *editManager);
|
||||||
virtual ~SidebarView();
|
virtual ~SidebarView();
|
||||||
|
|
||||||
GtkWidget* getWidget();
|
GtkWidget* getWidget();
|
||||||
|
|
11
Tool.h
11
Tool.h
|
@ -2,6 +2,9 @@
|
||||||
#define TOOL_H_
|
#define TOOL_H_
|
||||||
|
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
|
#include "EventHandler.h"
|
||||||
|
#include "Sidebar.h"
|
||||||
|
#include "Renderer.h"
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,12 +15,16 @@ class Tool : public Object {
|
||||||
virtual void activate() {};
|
virtual void activate() {};
|
||||||
virtual void deactivate() {};
|
virtual void deactivate() {};
|
||||||
|
|
||||||
virtual const char *getName() const {
|
virtual const char* getName() const {
|
||||||
return getType();
|
return getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual GtkWidget *getImage() = 0;
|
virtual GtkWidget* getImage() = 0;
|
||||||
virtual bool isSensitive() = 0;
|
virtual bool isSensitive() = 0;
|
||||||
|
|
||||||
|
virtual EventHandler* getEventHandler() = 0;
|
||||||
|
virtual Sidebar* getSidebar() = 0;
|
||||||
|
virtual Renderer* getRenderer() {return NULL;}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*TOOL_H_*/
|
#endif /*TOOL_H_*/
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#include "ToolAddPolygon.h"
|
#include "ToolAddPolygon.h"
|
||||||
|
#include <GL/gl.h>
|
||||||
|
|
||||||
|
|
||||||
ToolAddPolygon::ToolAddPolygon(EditManager *editManager) {
|
ToolAddPolygon::ToolAddPolygon(EditManager *editManager) : Renderer(editManager), sidebar(editManager) {
|
||||||
this->editManager = editManager;
|
this->editManager = editManager;
|
||||||
|
|
||||||
image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON);
|
image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON);
|
||||||
|
@ -13,9 +14,54 @@ ToolAddPolygon::~ToolAddPolygon() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolAddPolygon::activate() {
|
void ToolAddPolygon::activate() {
|
||||||
editManager->addRoom();
|
newRoom = Room();
|
||||||
|
|
||||||
|
editManager->setSelectedObject(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolAddPolygon::deactivate() {
|
void ToolAddPolygon::deactivate() {
|
||||||
editManager->finishRoom();
|
editManager->addRoom(newRoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToolAddPolygon::render(const Level &level, const Rectangle &rect, float scale) {
|
||||||
|
if(editManager->polygonOk(newRoom))
|
||||||
|
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
||||||
|
else
|
||||||
|
glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
|
||||||
|
|
||||||
|
fillPolygon(newRoom);
|
||||||
|
|
||||||
|
glLineWidth(2.0f);
|
||||||
|
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
||||||
|
drawPolygon(newRoom, false);
|
||||||
|
|
||||||
|
if(!newRoom.empty() && editManager->getHoveredVertex()) {
|
||||||
|
if(!editManager->vertexOk(newRoom, *editManager->getHoveredVertex()))
|
||||||
|
glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
|
||||||
|
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
|
||||||
|
glVertex2f(newRoom.back().getX(), newRoom.back().getY());
|
||||||
|
glVertex2f(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY());
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ToolAddPolygon::buttonPress(unsigned int button) {
|
||||||
|
if(button != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(!editManager->getHoveredVertex())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(!editManager->vertexOk(newRoom, *editManager->getHoveredVertex()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
newRoom.push_back(*editManager->getHoveredVertex());
|
||||||
|
|
||||||
|
editManager->redraw();
|
||||||
|
sidebar.update();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,13 +3,19 @@
|
||||||
|
|
||||||
#include "Tool.h"
|
#include "Tool.h"
|
||||||
#include "EditManager.h"
|
#include "EditManager.h"
|
||||||
|
#include "SidebarAdd.h"
|
||||||
|
|
||||||
class ToolAddPolygon : public Tool {
|
|
||||||
|
class ToolAddPolygon : public Tool, public EventHandler, public Renderer {
|
||||||
private:
|
private:
|
||||||
GtkWidget *image;
|
GtkWidget *image;
|
||||||
|
|
||||||
EditManager *editManager;
|
EditManager *editManager;
|
||||||
|
|
||||||
|
SidebarAdd sidebar;
|
||||||
|
|
||||||
|
Room newRoom;
|
||||||
|
|
||||||
// prevent shallow copy
|
// prevent shallow copy
|
||||||
ToolAddPolygon(const ToolAddPolygon &t);
|
ToolAddPolygon(const ToolAddPolygon &t);
|
||||||
const ToolAddPolygon& operator=(const ToolAddPolygon &t);
|
const ToolAddPolygon& operator=(const ToolAddPolygon &t);
|
||||||
|
@ -29,13 +35,29 @@ class ToolAddPolygon : public Tool {
|
||||||
return "Add polygonal room";
|
return "Add polygonal room";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isSensitive() {
|
virtual bool isSensitive() {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual GtkWidget *getImage() {
|
virtual GtkWidget *getImage() {
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual EventHandler* getEventHandler() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual Renderer *getRenderer() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void render(const Level &level, const Rectangle &rect, float scale);
|
||||||
|
|
||||||
|
virtual bool buttonPress(unsigned int button);
|
||||||
|
|
||||||
|
virtual Sidebar* getSidebar() {
|
||||||
|
return &sidebar;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*TOOLADDPOLYGON_H_*/
|
#endif /*TOOLADDPOLYGON_H_*/
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "ToolSelector.h"
|
#include "ToolSelector.h"
|
||||||
|
|
||||||
|
|
||||||
ToolSelector::ToolSelector(EditManager *editManager) {
|
ToolSelector::ToolSelector(EditManager *editManager) : sidebar(editManager) {
|
||||||
this->editManager = editManager;
|
this->editManager = editManager;
|
||||||
|
|
||||||
image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON);
|
image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON);
|
||||||
|
@ -11,3 +11,15 @@ ToolSelector::ToolSelector(EditManager *editManager) {
|
||||||
ToolSelector::~ToolSelector() {
|
ToolSelector::~ToolSelector() {
|
||||||
g_object_unref(G_OBJECT(image));
|
g_object_unref(G_OBJECT(image));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ToolSelector::buttonPress(unsigned int button) {
|
||||||
|
if(button != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
editManager->setSelectedObject(editManager->getHoveredObject());
|
||||||
|
|
||||||
|
editManager->redraw();
|
||||||
|
sidebar.update();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -3,13 +3,17 @@
|
||||||
|
|
||||||
#include "Tool.h"
|
#include "Tool.h"
|
||||||
#include "EditManager.h"
|
#include "EditManager.h"
|
||||||
|
#include "SidebarView.h"
|
||||||
|
|
||||||
class ToolSelector : public Tool {
|
|
||||||
|
class ToolSelector : public Tool, public EventHandler {
|
||||||
private:
|
private:
|
||||||
GtkWidget *image;
|
GtkWidget *image;
|
||||||
|
|
||||||
EditManager *editManager;
|
EditManager *editManager;
|
||||||
|
|
||||||
|
SidebarView sidebar;
|
||||||
|
|
||||||
// prevent shallow copy
|
// prevent shallow copy
|
||||||
ToolSelector(const ToolSelector &t);
|
ToolSelector(const ToolSelector &t);
|
||||||
const ToolSelector& operator=(const ToolSelector &t);
|
const ToolSelector& operator=(const ToolSelector &t);
|
||||||
|
@ -26,13 +30,23 @@ class ToolSelector : public Tool {
|
||||||
return "Select";
|
return "Select";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isSensitive() {
|
virtual bool isSensitive() {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual GtkWidget *getImage() {
|
virtual GtkWidget *getImage() {
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual EventHandler *getEventHandler() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool buttonPress(unsigned int button);
|
||||||
|
|
||||||
|
virtual Sidebar* getSidebar() {
|
||||||
|
return &sidebar;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*TOOLSELECTOR_H_*/
|
#endif /*TOOLSELECTOR_H_*/
|
||||||
|
|
5
Window.h
5
Window.h
|
@ -36,6 +36,7 @@ class Window {
|
||||||
const Window& operator=(const Window &w);
|
const Window& operator=(const Window &w);
|
||||||
|
|
||||||
static gboolean deleteEvent(GtkWidget *widget, GdkEvent *event, Window *window);
|
static gboolean deleteEvent(GtkWidget *widget, GdkEvent *event, Window *window);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Window(GdkGLConfig *glconfig, WindowManager *manager);
|
Window(GdkGLConfig *glconfig, WindowManager *manager);
|
||||||
virtual ~Window();
|
virtual ~Window();
|
||||||
|
@ -48,6 +49,10 @@ class Window {
|
||||||
drawer.update();
|
drawer.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tool* getActiveTool() {
|
||||||
|
return sidebar.getActiveTool();
|
||||||
|
}
|
||||||
|
|
||||||
EditManager& getEditManager() {
|
EditManager& getEditManager() {
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue