#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->highlightHoveredObject(); editManager->setSelectedObject(NULL); } bool ToolRotate::buttonPress(unsigned int button) { if(button != 1 || !editManager->getHoveredObject()) return false; pressed = true; valid = false; v0 = v = *editManager->getHoveredVertex(); editManager->setSelectedObject(editManager->getHoveredObject()); editManager->redraw(); sidebar.update(); return true; } bool ToolRotate::buttonRelease(unsigned int button) { if(button != 1) return false; pressed = false; editManager->setSelectedObject(NULL); editManager->redraw(); sidebar.update(); return true; } bool ToolRotate::motion() { if(!pressed) { editManager->highlightHoveredObject(); return true; } if(!editManager->getHoveredVertex()) return false; v = *editManager->getHoveredVertex(); float a = atan2((v-v0).getY(), (v-v0).getX()); if(v0.distanceSq(v) > 0.04f) { if(valid) editManager->getSelectedObject()->rotate(v0, 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(v0, v0.distance(v), 64, 16, angle); glLineWidth(2.0f); glBegin(GL_LINES); glVertex2f(v0.getX(), v0.getY()); glVertex2f(v.getX(), v.getY()); glEnd(); } }