#include "ToolRotate.h" #include ToolRotate::ToolRotate(EditManager *editManager) : Renderer(editManager), sidebar(editManager) { this->editManager = editManager; pressed = false; image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON); g_object_ref_sink(G_OBJECT(image)); } ToolRotate::~ToolRotate() { g_object_unref(G_OBJECT(image)); } void ToolRotate::activate() { pressed = false; editManager->setSelectedObject(NULL); } bool ToolRotate::buttonPress(unsigned int button, const Vertex *v) { if(button != 1 || !editManager->getHoveredObject()) return false; pressed = true; valid = false; vertexRot = vertex = *v; editManager->setSelectedObject(editManager->getHoveredObject()); editManager->redraw(); sidebar.update(); return true; } bool ToolRotate::buttonRelease(unsigned int button, const Vertex *v) { if(button != 1) return false; pressed = false; editManager->setSelectedObject(NULL); editManager->redraw(); sidebar.update(); return true; } bool ToolRotate::motion(const Vertex *v, float scale) { if(!pressed) return false; if(!v) return false; vertex = *v; float a = atan2((vertex-vertexRot).getY(), (vertex-vertexRot).getX()); if(vertexRot.distanceSq(vertex) > (10*10)/(scale*scale)) { if(valid) editManager->getSelectedObject()->rotate(vertexRot, a-angle); else valid = true; } else valid = false; angle = a; return false; } void ToolRotate::render(const Level &level, const Rectangle &rect, float scale) { Renderer::render(level, rect, scale); if(pressed && valid) { glLineWidth(1.0f); glColor4f(1.0f, 1.0f, 1.0f, 0.7f); drawCircleDotted(vertexRot, vertexRot.distance(vertex), 64, 16, angle); glLineWidth(2.0f); glBegin(GL_LINES); glVertex2f(vertexRot.getX(), vertexRot.getY()); glVertex2f(vertex.getX(), vertex.getY()); glEnd(); } }