#ifndef MAINWINDOW_H
#define MAINWINDOW_H

//MSVC编译器界面显示乱码问题
#if _MSC_VER >= 1600
    #pragma execution_character_set("utf-8")
#endif

#include <QMainWindow>
#include <QStackedWidget>
#include <QProgressDialog>
#include <QString>
#include <QMutex>
#include <QWidgetAction>

//子窗口头文件
#include "saveroutedialog.h"
#include "bindroutedialog.h"
#include "computeoffsetpositiondialog.h"

//supermap
#include <Workspace/UGWorkspace.h>
#include <Engine/UGDataset.h>
#include "Map/UGLayer.h"
#include "scenecontrol.h"
#include "sceneview.h"

namespace UGC
{
    class UGWorkspace;
    class UGImage;
    class UGGraphics;
    class UGDataset;
    class UGDataSource;
    class UGLayer;
    class UGMap;
    class UGDatasetVector;
//    class UGMapEditorWnd;
}
using namespace UGC;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class QMapControl; //声明所依赖的QMapControl类

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    enum RBtnMenuType
    {
        DefaultMenu,
        AttributeMenu,
        EditMenu
    };
    Q_ENUM(RBtnMenuType);

    enum MapType
    {
        Map2D,
        Map3D,
    };
    Q_ENUM(MapType);

    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void setupUI(QMainWindow* mainWindow);//声明搭建界面的函数

    void initWorkSpace();//工作空间初始化

    void initMapControl(); //二维地图容器初始化

    void initMenu(QMainWindow* mainWindow);  //Map菜单初始化

    void initMainToolBar(QMainWindow* mainWindow); //工具条初始化

    void addMapAction(QMainWindow *mainWindow);//声明界面上各元素的行为函数

    void addMapMenuAction();//声明Map右键菜单的行为函数

    void addEditToolAction();//声明编辑条的行为行数

    void addMapConnect();//声明Map连接信号和槽的函数

    void addEditConnect();//声明edit连接信号和槽的函数

    void initSceneControl(QWidget* parent); //三维场景容器初始化

    void initSceneMene(); //场景菜单初始化

    void addSceneMenuAction();//声明Scene右键菜单的行为函数

    void addSceneActionConnect(); //声明Scene QAction连接信号和槽的函数

    void addSceneConnect();//声明Scene连接信号和槽的函数

    UGbool DirExist(QString fullPath); //判断文件夹是否存在

    void importKMLData();  //导入KML,仅用于二维地图

    void importKML3DData();  //导入KML,仅用于三维地图

    void exportKMLFile();   //导出KML文件

    //加载模型文件
    void loadModelData();

protected:
    // 如果窗口设置了 Qt::DefaultContextMenu 策略,
    // 点击鼠标右键该函数被Qt框架调用
    void contextMenuEvent(QContextMenuEvent *event);

private:
    Ui::MainWindow *ui;
    QStackedWidget* stackedWidget;
    QProgressDialog* progressDlg;

    RBtnMenuType rMenuType;
    MapType mapType;

    ComputeOffsetPositionDialog* inputPosDlg;
    saveRouteDialog *saveRouteDlg;
    bindRouteDialog *bindRouteDlg;

    QMapControl* qMapControl;//声明一个地图窗口对象,QMapControl类对象

    SceneControl* pSceneControl; //三维场景对象
    SceneView* pSceneView;

    UGWorkspace* m_pWorkspace; //声明一个工作空间对象

    QMenu* mapRBtnMenu;//声明一个地图右键菜单对象
    //声明右键菜单各按钮对象
    QAction* actionShowRoute; //显示航线
    QAction* actionBindRoute;//装订航线
    QAction* actionImportRoute; //导入航线

    QMenu* attributeRBtnMenu; //声明属性右键菜单对象
    QAction* actionAttribute; //属性
    QAction* actionExportFile; //文件导出

    QMenu* EditRBtnMenu; //编辑右键菜单
    QAction* saveRoute;//保存航线
    QAction* cancelRoute;//取消航线

    /*******************场景菜单对象*******************/
    QMenu* sceneRBtnMenu;//声明一个场景右键菜单对象
    //声明场景右键菜单各按钮对象
    QAction* actionSceneShowRoute; //显示航线
    QAction* actionSceneBindRoute;//装订航线
    QAction* actionSceneImportRoute; //导入航线

    //声明界面上工具条对象
    QToolBar *mainToolBar;

    //声明工具条上各个按钮对象
    QAction *actionOpen;

    QAction *actionZoomout;

    QAction *actionZoomin;

    QAction *actionPan;

    QAction *actionViewEntire;

    QAction *actionCalcLength;

    QAction *actionCalcArea;

    QAction *actionCalcAngle;

    QAction *actionSelect;

    QAction *actionDrawPoint;

    QAction *actionDrawLine;

    QAction *actionDrawPolygon;

    QAction *actionInputPoint;

    QAction *actionOnlineMap;

    QAction *actionMapLocation;

    QAction *actionTransformMap;

    QAction *actionImportData;

    QAction *actionEdit;

    QWidgetAction* wactionEdit;

    //声明编辑工具条对象
    QMenu *editToolMenu;
    QToolBar *editToolBar;

    //工具条上各对象
    QAction *actionStartEdit;
    QAction *actionEditNode;
//    QAction *actionAddNode;
//    QAction *actionDeleteNode;

    //绘制模式
    qint16 drawMode;

    //
//    QStringList imageDataList;
//    QStringList terrainDataList;
//    int imageDataCount;
//    int terrainDataCount;

    QMutex m_mutex;

//    QThread* loadSceneDataThread;

signals:
    void sendAddRouteState(int addState);// 航线是否添加成功信号

    void sendSceneDataList(SceneControl* pSceneControl,UGDataSource* pDataSource,QStringList imagePathList,QStringList terrianPathList);

//    void closedProgressDialog();

public slots:
    void openRasterMap(); //声明槽函数openRasterMap(打开地图操作)

    void zoomIn();//声明槽函数zoomIn(放大地图操作)

    void zoomOut();//声明槽函数zoomOut(缩小地图操作)

    void viewEntire();//声明槽函数viewEntire(全幅显示地图)

    void pan();//声明槽函数pan(平移浏览地图)

    void calcLength();//声明槽函数calcLength(量算距离)

    void calcArea();//声明槽函数calcArea(量算面积)

    void calcAngle();//声明槽函数calcAngle(量算角度)

    void Select(); //声明槽函数Select

    void Edit(); //声明槽函数Edit

    void drawPoint();//声明槽函数drawPoint(绘制点)

    void drawLine();//声明槽函数drawLine(绘制线)

    void drawPolygon();//声明槽函数drawPolygon(绘制多边形)

    void showBindRouteDialog(); //显示航线装订弹窗

    void showComputeOffsetPosition(); //显示坐标点输入坐标弹窗

    void showOnlineMapDialog(); //显示在线地图选择弹窗

    void showAttributeMenu();  //显示属性右键菜单

    void transformMap(); //二三维地图切换

    void importSceneData(QStringList imagePathList,QStringList terrianPathList); //导入场景数据

    void closedProgressDialog(QString taskName);  //关闭进度条

    void showSettingFlightPoint3DDialog(); //显示航高设置对话框

    void showSaveRoute3DDialog(UGGeometry* pGeometry);  //显示三维航线保存对话框

    void highLightKMLGeometry(int currentGeometryID,int lastGeometryID); //高亮当前导入的KML 3D几何对象

};
#endif // MAINWINDOW_H