#ifndef SETIDS_H
#define SETIDS_H

#include <QDialog>
#include "sequenz.h"
#include "model.h"

namespace Ui {
class SetIds;
}
class SetIdsModel; // Siehe unten
class SetIdsView; // Siehe unten

/*
 * Verwaltet die inteligente ID zuweisungs oberfläche
 */
class SetIds : public QDialog
{
    Q_OBJECT

public:
    explicit SetIds(Sequenz *s, QWidget *parent = 0);
    ~SetIds();

private slots:
    // Die Ids sollen nicht gespeichert werden
    void on_abbrechen_clicked();
    // Es sollen weitere Bilder geladen werden
    void on_weiter_clicked();
    // Die Ids sollen gespeichert werden
    void on_speichern_clicked();

private:
    Ui::SetIds *ui; // Enthält alle in setids.ui spezifizierten Objekte
    Sequenz *s; // Enthält die aktuell annotierte Bildsequenz
    SetIdsModel *m; // Enthält das Model der SetIdViews
    QList<SetIdsView*> views; // Enthält alle aktuellen SetIdViews (für jedes Bild eine)
};

/*
 * Das Model der SetIdViews
 */
class SetIdsModel : public Model
{
public:
    int id; // Die Id, welche vergeben werden soll
    QList<ObjectPolygon> list; // Eine Liste mit Objekten, denen die Id zugewiesen werden soll (eins pro bild)
    QList<bool> set; // Speichert, ob das Objekt aus der liste vom Nutzer angegeben wurde oder ob es automatisch erkannt wurde
};

/*
 * Verwaltet ein Bild der inteligenten ID zuweisungs Oberfläche
 */
class SetIdsView : public QWidget
{
    float xScaleFactor; // Ein Skallierungsfaktor in x Richtung
    float yScaleFactor; // Ein Skallierungsfaktor in y Richtung
    QPoint mousePos; // Die momentane Position der Maus
    SetIdsModel *m; // Das Model
    Sequenz *s; // Die aktuelle Bildsequenz
    int i; // Der Index des Bildes ausgehend vom ersten Bild
    Frame *f; // Das Bild, welches angezeigt wird
    // Transformiert einen Punkt von Bildkoordinaten nach Bildschirmkoordinaten
    QPoint        translate(QPoint p);
    // Transformiert ein Polygon von Bildkoordinaten nach Bildschirmkoordinaten
    QPolygon      translatePolygon(QPolygon p);
    // Transformiert einen Punkt von Bildschirmkoordinaten nach Bildkoordinaten
    QPoint        inverseTranslate(QPoint p);
    // Zeichnet die View neu
    void paintEvent(QPaintEvent *e) override;

public:
    explicit SetIdsView(Sequenz *s, SetIdsModel *m, int i, QWidget *parent = nullptr);
    ~SetIdsView();
    // Verarbeitet Maus Events und wählt das richtige Objekt aus
    void mouseReleaseEvent(QMouseEvent *e) override;
    // Übernimmt die neue Maus Position
    void mouseMoveEvent(QMouseEvent *e) override;
};

#endif // SETIDS_H
