#include <QPainter>
#include <QPainterPath>
#include <QMouseEvent>
#include <math.h>
#include "canvas.h"

#include <iostream>

Canvas::Canvas(QWidget *parent)
        : QFrame(parent) {
    setFrameStyle(QFrame::Box);
    setMouseTracking(true);

    type = NONE;
    dragging = false;

    s = new Scene();
}

Canvas::~Canvas() {
    delete s;
}

QSize Canvas::minimumSizeHint() const {
    return QSize(200, 200);
}

QSize Canvas::sizeHint() const {
    return QSize(640, 480);
}

void Canvas::clearCanvas(void) {
    s->clearScene();
}

void Canvas::setPrimitiveMode(int mode) {
    type = (PrimitiveMode) mode;
}

void Canvas::paintEvent(QPaintEvent *event) {
    QFrame::paintEvent(event);  // parent class draws border

    QPainter painter(this);

    // white background (inside parent's border)
    painter.fillRect(QRect(1, 1, width() - 2, height() - 2), Qt::white);

    s->drawScene(&painter);
}

void Canvas::resizeEvent(QResizeEvent *event) {
    QFrame::resizeEvent(event);
}

void Canvas::mousePressEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
        dragging = true;

        QPoint currPos = event->pos();
        s->handleMouseClickLeft(currPos.x(), currPos.y());

        update();
    }
}

void Canvas::mouseMoveEvent(QMouseEvent *event) {
    if ((event->buttons() & Qt::LeftButton) && dragging) {

        QPoint currPos = event->pos();
        s->handleMouseHover(currPos.x(), currPos.y());
        update();
    }
}

void Canvas::mouseReleaseEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton && dragging) {
        dragging = false;
        QPoint currPos = event->pos();
        s->handleMouseReleaseLeft();//currPos.x(), currPos.y());

        update();
    }
}