/* * Copyright (c) 2015 Tricoire Sebastien 3dsman@free.fr * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. * */ #include "OE_display.h" #include "OE_utils.h" #include "OE_controller.h" #include #include #include #include #include #include #include //float OE_display::cx, OE_display::cy = 0.0; vector_2d OE_display::viewPos; float OE_display::zoom = 1.0; //int OE_display::mouseX, OE_display::mouseY, OE_display::mouseXInit, OE_display::mouseYInit = -1; bool OE_display::pan = false; int OE_display::width, OE_display::height = 0; OE_display::OE_display() { } OE_display::OE_display(OE_document* document,OE_controller* controller) { this->document = document; } OE_display::~OE_display() { } /** \brief draw the document on screen * * \return true if all is ok * */ bool OE_display::setDocument(OE_document * document) { this->document = document; if(document) { std::list::iterator curve = document->curves.begin(); while (curve != document->curves.end()) { (*curve)->refresh(zoom/2); curve++; } } return true; } bool OE_display::setController(OE_controller* controller) { this->controller = controller; return true; } /** \brief move and zoom to see the entire document */ void OE_display::showAll() { if (document) { float xMin,yMin,xMax,yMax; BoundingBox bound = document->getBound(); viewPos.x = (bound.getMax().x + bound.getMin().x)/2; viewPos.y = (bound.getMax().y + bound.getMin().y)/2; zoom = maxf((bound.getMax().x - bound.getMin().x )/width/1.5,(bound.getMax().y - bound.getMin().y)/height/1.5); } } void OE_display::showSelection() { if (document&&controller) { float xMin,yMin,xMax,yMax; BoundingBox bound = controller->getSelectionBoundingBox(); viewPos.x = (bound.getMax().x + bound.getMin().x)/2; viewPos.y = (bound.getMax().y + bound.getMin().y)/2; zoom = maxf((bound.getMax().x - bound.getMin().x )/width/1.5,(bound.getMax().y - bound.getMin().y)/height/1.5); } } void OE_display::mouse_Pos(double x, double y) { if (pan) viewPos = viewPos + (mouse-vector_2d(x,y))*zoom; mouse.x = x; mouse.y = y; absMouse = viewPos+(mouse-vector_2d(width,height)/2)*zoom*2; } void OE_display::mouse_Button(int button, int action, int mods) { if (button == GLFW_MOUSE_BUTTON_MIDDLE) { if (action == GLFW_PRESS) pan = true; else pan = false; } } void OE_display::scroll(double xoffset, double yoffset) { if(!pan){ if (yoffset>0) zoom = zoom/1.1; else zoom = zoom*1.1; } } void OE_display::resize(int width, int height) { this->width = width; this->height = height; } void OE_display::key(int key, int scancode, int action, int mods){}; vector_2d OE_display::screenToDocument(vector_2d pos) { return viewPos+(pos-vector_2d(width,height)/2)*zoom*2; }