zoomedit: Added rectangular room tool.
This commit is contained in:
parent
953a6ff48a
commit
052641637b
13 changed files with 210 additions and 18 deletions
|
@ -52,6 +52,10 @@ gboolean Drawer::eventHandler(GtkWidget *widget, GdkEvent *event, Drawer *drawer
|
|||
drawer->window->getActiveTool()->getEventHandler()->buttonPress(event->button.button);
|
||||
return TRUE;
|
||||
|
||||
case GDK_BUTTON_RELEASE:
|
||||
drawer->window->getActiveTool()->getEventHandler()->buttonRelease(event->button.button);
|
||||
return TRUE;
|
||||
|
||||
case GDK_SCROLL:
|
||||
switch(event->scroll.direction) {
|
||||
case GDK_SCROLL_UP:
|
||||
|
@ -194,12 +198,12 @@ Drawer::Drawer(Window *window, GdkGLConfig *glconfig) : renderer(&window->getEdi
|
|||
g_signal_connect(G_OBJECT(drawingArea), "configure-event", G_CALLBACK(eventHandler), this);
|
||||
g_signal_connect(G_OBJECT(drawingArea), "expose-event", G_CALLBACK(eventHandler), this);
|
||||
g_signal_connect(G_OBJECT(drawingArea), "button-press-event", G_CALLBACK(eventHandler), this);
|
||||
//g_signal_connect(G_OBJECT(drawingArea), "button-release-event", G_CALLBACK(eventHandler), this);
|
||||
g_signal_connect(G_OBJECT(drawingArea), "button-release-event", G_CALLBACK(eventHandler), this);
|
||||
g_signal_connect(G_OBJECT(drawingArea), "enter-notify-event", G_CALLBACK(eventHandler), this);
|
||||
g_signal_connect(G_OBJECT(drawingArea), "leave-notify-event", G_CALLBACK(eventHandler), this);
|
||||
g_signal_connect(G_OBJECT(drawingArea), "motion-notify-event", G_CALLBACK(eventHandler), this);
|
||||
g_signal_connect(G_OBJECT(drawingArea), "scroll-event", G_CALLBACK(eventHandler), this);
|
||||
gtk_widget_add_events(drawingArea, GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
|
||||
gtk_widget_add_events(drawingArea, GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_RELEASE_MASK);
|
||||
gtk_table_attach(GTK_TABLE(drawer), drawingArea, 0, 1, 0, 1, (GtkAttachOptions)(GTK_FILL|GTK_EXPAND|GTK_SHRINK), (GtkAttachOptions)(GTK_FILL|GTK_EXPAND|GTK_SHRINK), 0, 0);
|
||||
|
||||
hAdjustment = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 0, 10, 100, 100));
|
||||
|
|
|
@ -46,7 +46,9 @@ bool EditManager::addRoom(const Room &newRoom) {
|
|||
room->setName(idManager.generate("room"));
|
||||
|
||||
window->getLevel().push_back(SharedPtr<LevelObject>(room));
|
||||
selectedObject = &*window->getLevel().back();
|
||||
selectedObject = room;
|
||||
|
||||
window->resetTool();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -83,20 +85,23 @@ void EditManager::setHoveredVertex(Vertex *v) {
|
|||
window->update();
|
||||
}
|
||||
|
||||
bool EditManager::vertexOk(const Room &newRoom, const Vertex &v) const {
|
||||
bool EditManager::vertexOk(const Vertex &v, const Room *newRoom) const {
|
||||
Line l;
|
||||
|
||||
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||
if((*room)->isOfType("Room") && ((Room*)&**room)->contains(v)) return false;
|
||||
}
|
||||
|
||||
if(newRoom.empty())
|
||||
if(!newRoom)
|
||||
return true;
|
||||
|
||||
l.setVertex1(newRoom.back());
|
||||
if(newRoom->empty())
|
||||
return true;
|
||||
|
||||
l.setVertex1(newRoom->back());
|
||||
l.setVertex2(v);
|
||||
|
||||
return lineOk(newRoom, l);
|
||||
return lineOk(*newRoom, l);
|
||||
}
|
||||
|
||||
bool EditManager::polygonOk(const Polygon& polygon) const {
|
||||
|
|
|
@ -45,7 +45,7 @@ class EditManager {
|
|||
Vertex* getHoveredVertex();
|
||||
void setHoveredVertex(Vertex *v);
|
||||
|
||||
bool vertexOk(const Room &newRoom, const Vertex &v) const;
|
||||
bool vertexOk(const Vertex &v, const Room *newRoom = NULL) const;
|
||||
bool polygonOk(const Polygon &polygon) const;
|
||||
};
|
||||
|
||||
|
|
|
@ -5,7 +5,8 @@ class EventHandler {
|
|||
public:
|
||||
virtual ~EventHandler() {}
|
||||
|
||||
virtual bool buttonPress(unsigned int button) = 0;
|
||||
virtual bool buttonPress(unsigned int button) {return false;}
|
||||
virtual bool buttonRelease(unsigned int button) {return false;}
|
||||
};
|
||||
|
||||
#endif /*EVENTHANDLER_H_*/
|
||||
|
|
|
@ -4,6 +4,6 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
|
|||
IdManager.cpp WindowManager.cpp SidebarManager.cpp \
|
||||
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
|
||||
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
|
||||
ToolSelector.cpp ToolAddPolygon.cpp Vertex3d.cpp
|
||||
ToolSelector.cpp ToolAddPolygon.cpp ToolAddRect.cpp Vertex3d.cpp
|
||||
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
|
||||
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@
|
20
Makefile.in
20
Makefile.in
|
@ -60,7 +60,8 @@ am_zoomedit_OBJECTS = zoomedit-zoomedit.$(OBJEXT) \
|
|||
zoomedit-FileManager.$(OBJEXT) \
|
||||
zoomedit-SidebarToolbox.$(OBJEXT) \
|
||||
zoomedit-ToolSelector.$(OBJEXT) \
|
||||
zoomedit-ToolAddPolygon.$(OBJEXT) zoomedit-Vertex3d.$(OBJEXT)
|
||||
zoomedit-ToolAddPolygon.$(OBJEXT) \
|
||||
zoomedit-ToolAddRect.$(OBJEXT) zoomedit-Vertex3d.$(OBJEXT)
|
||||
zoomedit_OBJECTS = $(am_zoomedit_OBJECTS)
|
||||
zoomedit_DEPENDENCIES =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@
|
||||
|
@ -187,7 +188,7 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
|
|||
IdManager.cpp WindowManager.cpp SidebarManager.cpp \
|
||||
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
|
||||
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
|
||||
ToolSelector.cpp ToolAddPolygon.cpp Vertex3d.cpp
|
||||
ToolSelector.cpp ToolAddPolygon.cpp ToolAddRect.cpp Vertex3d.cpp
|
||||
|
||||
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
|
||||
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@
|
||||
|
@ -292,6 +293,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarToolbox.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarView.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ToolAddPolygon.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ToolAddRect.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ToolSelector.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Triangle.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-UIManager.Po@am__quote@
|
||||
|
@ -595,6 +597,20 @@ zoomedit-ToolAddPolygon.obj: ToolAddPolygon.cpp
|
|||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-ToolAddPolygon.obj `if test -f 'ToolAddPolygon.cpp'; then $(CYGPATH_W) 'ToolAddPolygon.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolAddPolygon.cpp'; fi`
|
||||
|
||||
zoomedit-ToolAddRect.o: ToolAddRect.cpp
|
||||
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolAddRect.o -MD -MP -MF $(DEPDIR)/zoomedit-ToolAddRect.Tpo -c -o zoomedit-ToolAddRect.o `test -f 'ToolAddRect.cpp' || echo '$(srcdir)/'`ToolAddRect.cpp
|
||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolAddRect.Tpo $(DEPDIR)/zoomedit-ToolAddRect.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ToolAddRect.cpp' object='zoomedit-ToolAddRect.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-ToolAddRect.o `test -f 'ToolAddRect.cpp' || echo '$(srcdir)/'`ToolAddRect.cpp
|
||||
|
||||
zoomedit-ToolAddRect.obj: ToolAddRect.cpp
|
||||
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-ToolAddRect.obj -MD -MP -MF $(DEPDIR)/zoomedit-ToolAddRect.Tpo -c -o zoomedit-ToolAddRect.obj `if test -f 'ToolAddRect.cpp'; then $(CYGPATH_W) 'ToolAddRect.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolAddRect.cpp'; fi`
|
||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-ToolAddRect.Tpo $(DEPDIR)/zoomedit-ToolAddRect.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='ToolAddRect.cpp' object='zoomedit-ToolAddRect.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-ToolAddRect.obj `if test -f 'ToolAddRect.cpp'; then $(CYGPATH_W) 'ToolAddRect.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolAddRect.cpp'; fi`
|
||||
|
||||
zoomedit-Vertex3d.o: Vertex3d.cpp
|
||||
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Vertex3d.o -MD -MP -MF $(DEPDIR)/zoomedit-Vertex3d.Tpo -c -o zoomedit-Vertex3d.o `test -f 'Vertex3d.cpp' || echo '$(srcdir)/'`Vertex3d.cpp
|
||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Vertex3d.Tpo $(DEPDIR)/zoomedit-Vertex3d.Po
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
|
||||
SidebarManager::SidebarManager(Window *window)
|
||||
: sidebarToolbox(window), toolAddPolygon(&window->getEditManager())
|
||||
: sidebarToolbox(window), toolAddRect(&window->getEditManager()), toolAddPolygon(&window->getEditManager())
|
||||
{
|
||||
this->window = window;
|
||||
activeSidebar = NULL;
|
||||
|
@ -27,6 +27,7 @@ SidebarManager::SidebarManager(Window *window)
|
|||
viewport = gtk_viewport_new(NULL, NULL);
|
||||
gtk_container_add(GTK_CONTAINER(scrolledWindow), viewport);
|
||||
|
||||
sidebarToolbox.addTool(&toolAddRect);
|
||||
sidebarToolbox.addTool(&toolAddPolygon);
|
||||
|
||||
gtk_widget_show(sidebar);
|
||||
|
|
|
@ -4,10 +4,8 @@
|
|||
#include <gtk/gtk.h>
|
||||
#include "Sidebar.h"
|
||||
#include "SidebarToolbox.h"
|
||||
#include "SidebarView.h"
|
||||
#include "SidebarAdd.h"
|
||||
#include "EditManager.h"
|
||||
#include "ToolSelector.h"
|
||||
#include "ToolAddRect.h"
|
||||
#include "ToolAddPolygon.h"
|
||||
|
||||
|
||||
|
@ -24,6 +22,7 @@ class SidebarManager {
|
|||
|
||||
Window *window;
|
||||
|
||||
ToolAddRect toolAddRect;
|
||||
ToolAddPolygon toolAddPolygon;
|
||||
|
||||
// prevent shallow copy
|
||||
|
@ -38,6 +37,10 @@ class SidebarManager {
|
|||
return sidebar;
|
||||
}
|
||||
|
||||
void resetTool() {
|
||||
sidebarToolbox.resetTool();
|
||||
}
|
||||
|
||||
Tool* getActiveTool() {
|
||||
return &sidebarToolbox.getActiveTool();
|
||||
}
|
||||
|
|
|
@ -47,6 +47,10 @@ class SidebarToolbox : Sidebar {
|
|||
return widget;
|
||||
}
|
||||
|
||||
void resetTool() {
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttons[&toolSelector]), TRUE);
|
||||
}
|
||||
|
||||
Tool& getActiveTool() {
|
||||
return *activeTool;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ void ToolAddPolygon::render(const Level &level, const Rectangle &rect, float sca
|
|||
drawPolygon(newRoom, false);
|
||||
|
||||
if(!newRoom.empty() && editManager->getHoveredVertex()) {
|
||||
if(!editManager->vertexOk(newRoom, *editManager->getHoveredVertex()))
|
||||
if(!editManager->vertexOk(*editManager->getHoveredVertex(), &newRoom))
|
||||
glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
|
||||
|
||||
glBegin(GL_LINES);
|
||||
|
@ -55,7 +55,7 @@ bool ToolAddPolygon::buttonPress(unsigned int button) {
|
|||
if(!editManager->getHoveredVertex())
|
||||
return false;
|
||||
|
||||
if(!editManager->vertexOk(newRoom, *editManager->getHoveredVertex()))
|
||||
if(!editManager->vertexOk(*editManager->getHoveredVertex(), &newRoom))
|
||||
return false;
|
||||
|
||||
newRoom.push_back(*editManager->getHoveredVertex());
|
||||
|
|
89
ToolAddRect.cpp
Normal file
89
ToolAddRect.cpp
Normal file
|
@ -0,0 +1,89 @@
|
|||
#include "ToolAddRect.h"
|
||||
#include "GL/gl.h"
|
||||
|
||||
|
||||
Room ToolAddRect::createRoom() {
|
||||
Vertex *v2 = editManager->getHoveredVertex();
|
||||
|
||||
Room room;
|
||||
room.push_back(v1);
|
||||
room.push_back(Vertex(v1.getX(), v2->getY()));
|
||||
room.push_back(*v2);
|
||||
room.push_back(Vertex(v2->getX(), v1.getY()));
|
||||
|
||||
return room;
|
||||
}
|
||||
|
||||
ToolAddRect::ToolAddRect(EditManager *editManager) : Renderer(editManager), sidebar(editManager) {
|
||||
this->editManager = editManager;
|
||||
|
||||
image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON);
|
||||
g_object_ref_sink(G_OBJECT(image));
|
||||
}
|
||||
|
||||
ToolAddRect::~ToolAddRect() {
|
||||
g_object_unref(G_OBJECT(image));
|
||||
}
|
||||
|
||||
void ToolAddRect::activate() {
|
||||
editManager->setSelectedObject(NULL);
|
||||
}
|
||||
|
||||
void ToolAddRect::render(const Level &level, const Rectangle &rect, float scale) {
|
||||
if(!pressed || !editManager->getHoveredVertex())
|
||||
return;
|
||||
|
||||
Room room = createRoom();
|
||||
|
||||
if(editManager->polygonOk(room))
|
||||
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
||||
else
|
||||
glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
|
||||
|
||||
fillPolygon(room);
|
||||
|
||||
glLineWidth(2.0f);
|
||||
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
||||
drawPolygon(room);
|
||||
}
|
||||
|
||||
bool ToolAddRect::buttonPress(unsigned int button) {
|
||||
if(button != 1)
|
||||
return false;
|
||||
|
||||
if(!editManager->getHoveredVertex())
|
||||
return false;
|
||||
|
||||
if(!editManager->vertexOk(*editManager->getHoveredVertex()))
|
||||
return false;
|
||||
|
||||
pressed = true;
|
||||
v1 = *editManager->getHoveredVertex();
|
||||
|
||||
editManager->redraw();
|
||||
sidebar.update();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ToolAddRect::buttonRelease(unsigned int button) {
|
||||
if(button != 1 || !pressed)
|
||||
return false;
|
||||
|
||||
pressed = false;
|
||||
|
||||
if(!editManager->getHoveredVertex())
|
||||
return false;
|
||||
|
||||
Room room = createRoom();
|
||||
|
||||
if(!editManager->polygonOk(room))
|
||||
return false;
|
||||
|
||||
editManager->addRoom(room);
|
||||
|
||||
editManager->redraw();
|
||||
sidebar.update();
|
||||
|
||||
return true;
|
||||
}
|
65
ToolAddRect.h
Normal file
65
ToolAddRect.h
Normal file
|
@ -0,0 +1,65 @@
|
|||
#ifndef TOOLADDRECT_H_
|
||||
#define TOOLADDRECT_H_
|
||||
|
||||
#include "Tool.h"
|
||||
#include "SidebarAdd.h"
|
||||
|
||||
|
||||
class ToolAddRect : public Tool, public EventHandler, public Renderer {
|
||||
private:
|
||||
GtkWidget *image;
|
||||
|
||||
EditManager *editManager;
|
||||
|
||||
SidebarAdd sidebar;
|
||||
|
||||
bool pressed;
|
||||
Vertex v1;
|
||||
|
||||
// prevent shallow copy
|
||||
ToolAddRect(const ToolAddRect &t);
|
||||
const ToolAddRect& operator=(const ToolAddRect &t);
|
||||
|
||||
Room createRoom();
|
||||
|
||||
public:
|
||||
ToolAddRect(EditManager *editManager);
|
||||
virtual ~ToolAddRect();
|
||||
|
||||
virtual void activate();
|
||||
|
||||
virtual const char *getType() const {
|
||||
return "ToolAddRect";
|
||||
}
|
||||
|
||||
virtual const char *getName() const {
|
||||
return "Add rectangular room";
|
||||
}
|
||||
|
||||
virtual bool isSensitive() {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
virtual GtkWidget *getImage() {
|
||||
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 bool buttonRelease(unsigned int button);
|
||||
|
||||
virtual Sidebar* getSidebar() {
|
||||
return &sidebar;
|
||||
}
|
||||
};
|
||||
|
||||
#endif /*TOOLADDRECT_H_*/
|
4
Window.h
4
Window.h
|
@ -49,6 +49,10 @@ class Window {
|
|||
drawer.update();
|
||||
}
|
||||
|
||||
void resetTool() {
|
||||
sidebar.resetTool();
|
||||
}
|
||||
|
||||
Tool* getActiveTool() {
|
||||
return sidebar.getActiveTool();
|
||||
}
|
||||
|
|
Reference in a new issue