#ifndef CHANGEMASK_H
#define CHANGEMASK_H

#include <QDialog>
#include "kamera.h"

namespace Ui
{
    class ChangeMask;
}
class ChangeMaskView; // siehe weiter unten

/*
 * Verwaltet einen GUI-Dialog, welcher zum editieren einer Maske verwendet wird
 */
class ChangeMask : public QDialog
{
    Q_OBJECT

public:

    // Erstellt den Dialog
    //  m: Die Maske, welche editiert werden soll
    //  cam: Die Kamera, zu welcher die Maske gehört
    //  parent: Der Eltern QWidget von Qt
    explicit ChangeMask(Mask    *m,
                        Kamera  *cam,
                        QWidget *parent = 0);
    ~ChangeMask();

private slots:
    // Setzt die Farbe zukünftiger Polygone auf schwarz
    void on_black_clicked();
    // Setzt die Farbe zukünftiger Polygone auf Weiß
    void on_white_clicked();
    // Bricht das Ändern der Maske ab ohne sie zu speichern
    void on_abort_clicked();
    // Beendet das Ändern der Maske und speichert sie
    void on_save_clicked();

private:

    Ui::ChangeMask *ui; // Zeiger auf die in changemask.ui spezifizierten Objekte
    ChangeMaskView *view; // Zeiger auf die View für das Editieren der Maske
    Kamera *cam; // Zeiger auf die Kamera, deren Maske bearbeitet wird
};

/*
 * Verwaltet die Ansicht, in der die Maske editiert werden kann
 */
class ChangeMaskView : public QWidget
{
    Q_OBJECT

private:

    QImage background; // Das Bild, welches im Hintergrund angezeigt werden soll
    QImage  *mask; // Das Maskenbild, welches editiert werden soll
    QPolygon polygon; // Das Polygon, welches vom Nutzer angegeben wird
    float    xScaleFactor; // Ein Skallierungsfaktor in x Richtung
    float    yScaleFactor; // Ein Skallierungsfaktor in y Richtung
    QPoint   mousePos; // Die Position der Maus
    bool     black; // 1, falls schwarz gezeichnet wird, 0, falls weiß gezeichnet wird
    // Wandelt einen Punkt aus Bildkoordinaten in Bildschirmkoordinaten um
    QPoint translate(QPoint p);
    // Wandelt einen Punkt aus Bildschirmkoordinaten in Bildkoordinaten um
    QPoint inverseTranslate(QPoint p);

public:

    // Erstellt die Ansicht
    //  background: Ein Bild der Kamera, zu der die Maske editiert werden soll
    //  mask: Das Schwarz-Weiß Bild, welches die momentane Maske darstellt
    //  parent: Der Eltern QWidget von Qt
    explicit ChangeMaskView(QImage   background,
                            QImage  *mask,
                            QWidget *parent = 0);
    ~ChangeMaskView();

    // Setzt die Zeichenfarbe
    //  black: Falls 0 wird in Zukunft mit weiß gezeichnet, andernfalls mit
    // schwarz
    void setBlack(bool black);

protected:

    // Zeichnet die Ansicht (wird automatisch vom Qt Framework aufgerufen)
    void paintEvent(QPaintEvent *e) override;

    // Verarbeitet Maus Bewegungen (wird automatisch vom Qt Framework
    // aufgerufen)
    void mouseMoveEvent(QMouseEvent *e) override;

    // Verarbeitet Maus Tastendrücke (wird automatisch vom Qt Framework
    // aufgerufen)
    void mouseReleaseEvent(QMouseEvent *e) override;
};

#endif // CHANGEMASK_H
