zoomedit: Let tools decide wether to highlight hovered objects.

This commit is contained in:
neoraider 2008-01-16 16:11:00 +00:00
parent e9d27f488c
commit 8b4b9845d6
9 changed files with 50 additions and 19 deletions

View file

@ -43,10 +43,12 @@ gboolean Drawer::eventHandler(GtkWidget *widget, GdkEvent *event, Drawer *drawer
case GDK_ENTER_NOTIFY: case GDK_ENTER_NOTIFY:
drawer->updateHoveredPoint(event->crossing.x, event->crossing.y); drawer->updateHoveredPoint(event->crossing.x, event->crossing.y);
drawer->window->getActiveTool()->getEventHandler()->motion();
return TRUE; return TRUE;
case GDK_LEAVE_NOTIFY: case GDK_LEAVE_NOTIFY:
drawer->window->getEditManager().setHoveredVertex(NULL); drawer->window->getEditManager().setHoveredVertex(NULL);
drawer->window->getActiveTool()->getEventHandler()->motion();
return TRUE; return TRUE;
case GDK_BUTTON_PRESS: case GDK_BUTTON_PRESS:

View file

@ -31,6 +31,7 @@ EditManager::EditManager(Window *window) {
this->window = window; this->window = window;
hoveredObject = NULL; hoveredObject = NULL;
highlightedObject = NULL;
selectedObject = NULL; selectedObject = NULL;
hasHoveredVertex = false; hasHoveredVertex = false;
@ -56,12 +57,12 @@ bool EditManager::addRoom(const Room &newRoom) {
return false; return false;
} }
Vertex* EditManager::getHoveredVertex() { const Vertex* EditManager::getHoveredVertex() const {
if(hasHoveredVertex) return &hoveredVertex; if(hasHoveredVertex) return &hoveredVertex;
else return NULL; else return NULL;
} }
void EditManager::setHoveredVertex(Vertex *v) { void EditManager::setHoveredVertex(const Vertex *v) {
if(v) { if(v) {
hasHoveredVertex = true; hasHoveredVertex = true;
hoveredVertex = *v; hoveredVertex = *v;

View file

@ -16,6 +16,7 @@ class EditManager {
Window *window; Window *window;
LevelObject *hoveredObject; LevelObject *hoveredObject;
LevelObject *highlightedObject;
LevelObject *selectedObject; LevelObject *selectedObject;
Vertex hoveredVertex; Vertex hoveredVertex;
@ -32,6 +33,18 @@ class EditManager {
return hoveredObject; return hoveredObject;
} }
void setHighlightedObject(LevelObject *object) {
highlightedObject = object;
}
LevelObject* getHighlightedObject() {
return highlightedObject;
}
void highlightHoveredObject() {
highlightedObject = hoveredObject;
}
void setSelectedObject(LevelObject *object) { void setSelectedObject(LevelObject *object) {
selectedObject = object; selectedObject = object;
} }
@ -42,8 +55,8 @@ class EditManager {
bool addRoom(const Room &room); bool addRoom(const Room &room);
Vertex* getHoveredVertex(); const Vertex* getHoveredVertex() const;
void setHoveredVertex(Vertex *v); void setHoveredVertex(const Vertex *v);
bool vertexOk(const Vertex &v, const Room *newRoom = NULL) const; bool vertexOk(const Vertex &v, const Room *newRoom = NULL) const;
bool polygonOk(const Polygon &polygon) const; bool polygonOk(const Polygon &polygon) const;

View file

@ -107,14 +107,14 @@ void Renderer::drawCross(const Vertex &m, float r) {
glEnd(); glEnd();
} }
void Renderer::renderObject(const LevelObject &object, bool selected, bool hovered, float scale) { void Renderer::renderObject(const LevelObject &object, bool selected, bool highlighted, float scale) {
if(object.isOfType("Room")) if(object.isOfType("Room"))
renderRoom(*(Room*)&object, selected, hovered, scale); renderRoom(*(Room*)&object, selected, highlighted, scale);
else if(object.isOfType("PlayerStart")) else if(object.isOfType("PlayerStart"))
renderPlayerStart(*(PlayerStart*)&object, selected, hovered, scale); renderPlayerStart(*(PlayerStart*)&object, selected, highlighted, scale);
} }
void Renderer::renderRoom(const Room &room, bool selected, bool hovered, float scale) { void Renderer::renderRoom(const Room &room, bool selected, bool highlighted, float scale) {
if(selected) if(selected)
glColor4f(0.0f, 0.7f, 1.0f, 0.2f); glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
else else
@ -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) { else if(highlighted) {
glColor4f(0.0f, 0.7f, 1.0f, 0.7f); glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
glLineWidth(2.0f); glLineWidth(2.0f);
} }
@ -138,12 +138,12 @@ void Renderer::renderRoom(const Room &room, bool selected, bool hovered, float s
drawPolygon(room); drawPolygon(room);
} }
void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool hovered, float scale) { void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale) {
if(selected) { if(selected) {
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) { else if(highlighted) {
glColor4f(0.0f, 0.7f, 0.7f, 0.7f); glColor4f(0.0f, 0.7f, 0.7f, 0.7f);
glLineWidth(2.0f); glLineWidth(2.0f);
} }
@ -168,6 +168,6 @@ void Renderer::render(const Level &level, const Rectangle &rect, float scale) {
for(Level::const_iterator object = level.begin(); object != level.end(); object++) { for(Level::const_iterator object = level.begin(); object != level.end(); object++) {
renderObject(**object, (&**object == editManager->getSelectedObject()), renderObject(**object, (&**object == editManager->getSelectedObject()),
(&**object == editManager->getHoveredObject()), scale); (&**object == editManager->getHighlightedObject()), scale);
} }
} }

View file

@ -21,10 +21,10 @@ class Renderer {
void drawCircle(const Vertex &m, float r, int n); void drawCircle(const Vertex &m, float r, int n);
void drawCross(const Vertex &m, float r); void drawCross(const Vertex &m, float r);
void renderObject(const LevelObject &object, bool selected, bool hovered, float scale); void renderObject(const LevelObject &object, bool selected, bool highlighted, float scale);
void renderRoom(const Room &room, bool selected, bool hovered, float scale); void renderRoom(const Room &room, bool selected, bool highlighted, float scale);
void renderPlayerStart(const PlayerStart &start, bool selected, bool hovered, float scale); void renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale);
public: public:
Renderer(EditManager *editManager) { Renderer(EditManager *editManager) {

View file

@ -16,6 +16,7 @@ ToolAddPolygon::~ToolAddPolygon() {
void ToolAddPolygon::activate() { void ToolAddPolygon::activate() {
newRoom = Room(); newRoom = Room();
editManager->setHighlightedObject(NULL);
editManager->setSelectedObject(NULL); editManager->setSelectedObject(NULL);
} }

View file

@ -3,7 +3,7 @@
Room ToolAddRect::createRoom() { Room ToolAddRect::createRoom() {
Vertex *v2 = editManager->getHoveredVertex(); const Vertex *v2 = editManager->getHoveredVertex();
Room room; Room room;
room.push_back(v1); room.push_back(v1);
@ -28,6 +28,7 @@ ToolAddRect::~ToolAddRect() {
} }
void ToolAddRect::activate() { void ToolAddRect::activate() {
editManager->setHighlightedObject(NULL);
editManager->setSelectedObject(NULL); editManager->setSelectedObject(NULL);
} }

View file

@ -15,6 +15,7 @@ ToolGrab::~ToolGrab() {
void ToolGrab::activate() { void ToolGrab::activate() {
pressed = false; pressed = false;
editManager->highlightHoveredObject();
editManager->setSelectedObject(NULL); editManager->setSelectedObject(NULL);
} }
@ -48,10 +49,12 @@ bool ToolGrab::buttonRelease(unsigned int button) {
} }
bool ToolGrab::motion() { bool ToolGrab::motion() {
if(!pressed) if(!pressed) {
return false; editManager->highlightHoveredObject();
return true;
}
Vertex *v = editManager->getHoveredVertex(); const Vertex *v = editManager->getHoveredVertex();
if(!v) if(!v)
return false; return false;

View file

@ -26,6 +26,10 @@ class ToolSelector : public Tool, public EventHandler {
return "ToolSelector"; return "ToolSelector";
} }
virtual void activate() {
editManager->highlightHoveredObject();
}
virtual const char *getName() const { virtual const char *getName() const {
return "Select"; return "Select";
} }
@ -44,6 +48,12 @@ class ToolSelector : public Tool, public EventHandler {
virtual bool buttonPress(unsigned int button); virtual bool buttonPress(unsigned int button);
virtual bool motion() {
editManager->highlightHoveredObject();
return true;
}
virtual Sidebar* getSidebar() { virtual Sidebar* getSidebar() {
return &sidebar; return &sidebar;
} }