#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "arbeitsview.h"
#include "sequenz.h"
#include <QLabel>
#include "frametreemodel.h"
#include <QItemSelection>
#include <QApplication>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QApplication *app, QWidget *parent = 0);
    ~MainWindow();
    // Erstellt den Navigationsbaum
    void setupFrameTree();
    // Aktualisiert die Ausgefählten Objekte im Navigationsbaum
    void setFrameTreeSelection();
    // Zeichnet den Navigazionsbaum neu
    void repaintFrameTree();
    // Setzt den Controller der Arbeitsfläche
    void setMode( UserMode m );
    // Gibt die geladene Sequenz zurück
    Sequenz *getSequenz();

private slots:
    // Öffnet eine Sequenz
    void on_actionOpen_triggered();
    // Wechselt zum nächsten Bild
    void on_actionNext_triggered();
    // Wechselt zum vorherigen Bild
    void on_actionBefore_triggered();
    // Wechselt zum nächsten Bild
    void on_next_clicked();
    // Wechselt zum vorherigen Bild
    void on_before_clicked();
    // Setzt die Vergrößerung der Arbeitsfläche zurück
    void on_zoom_out_clicked();
    // Wechselt in den ZOOM_IN Modus
    void on_zoom_in_clicked();
    // Wechselt in den DELETE Modus
    void on_remove_clicked();
    // Wechselt in den NEW Modus
    void on_polygon_clicked();
    // Wechselt in den MOVE Modus
    void on_move_clicked();
    // Wechselt zum angeklickten Bild des Navigationsbaumes
    void on_framesTree_clicked(const QModelIndex &index);
    // Wechselt in den SELECT Modus
    void on_select_clicked();
    // Zeigt ein Rechtsklick Menü im Navigationsbaum an
    void on_framesTree_customContextMenuRequested(const QPoint &pos);
    // Speichert die geladene Sequenz
    void on_actionSave_triggered();
    // Wechselt in den Modus PIPETTE_SELECT
    void on_pipette_clicked();
    // Wechselt in den CUT Modus
    void on_cut_clicked();
    // Zeigt die Option zum einstellen der Serveradresse an
    void on_actionServer_address_triggered();
    // Zeigt die Klassen Verwaltungsoberfläche an
    void on_actionKlassen_verwalten_triggered();
    // Zeigt ein Rechtsklick Menü auf der Arbeitsfläche an
    void on_viewWidget_customContextMenuRequested(const QPoint &pos);
    // Setzt das anzeigen der Maske in der Arbeitsfläche
    void on_actionMake_anzeigen_toggled(bool checked);
    // Setzt die Option des einfärbens von Objekten in der Arbeitsfläche
    void on_actionObjekte_faerben_triggered(bool checked);
    // Setzt die Option des Anzeigens von IDs in der Arbeitsfläche
    void on_actionIDs_anzeigen_triggered(bool checked);
    // Zeigt die Maskenbearbeitungsoberfläche
    void on_actionMaske_bearbeiten_triggered();
    // zeigt die intelligente Id Bearbeitungsoberfläche an
    void on_actionIDs_bearbeiten_triggered();

private:
    // Wählt alle Buttons für die Werkzeuge ab
    void unselectButttons();
    // Fragt nach Vorabannotationen beim Server
    void requestFromServer();

    ArbeitsModel *workModel; // Das Model der Arbaits View
    ArbeitsView *v; // Die Arbeitsview
    Ui::MainWindow *ui; // Ein zeiger auf die Objekte, welche in mainwindow.ui spezifiziert sind
    Sequenz *seq; // Die annotierte Bildsequenz
    QLabel *status; // Der Status Text
    FrameTreeModel *m; // Ein Wrapper der Sequenz für die QTreeView
    QString serverAddress; // Die Adresse des Annotations Servers
    QMenu *contextMenu; // Ein Kontextmenü, das beim rechtsklick erscheint
    QApplication *app; // Die QT Application
};

#endif // MAINWINDOW_H
