#include "windLayerTreeViewMenuProvider.h"
#include "qgslayertreeviewdefaultactions.h"
#include <QMenu>
#include <QAction>
#include "qgslayertreenode.h"
#include "qgslayertree.h"
#include "qgsvectorlayer.h"
#include "qgsmapcanvas.h"
#include "qgsrasterlayerproperties.h"
#include "qgsgui.h"
#include "qgsproviderguiregistry.h"
#include "qgsmeshlayerproperties.h"


windLayerTreeViewMenuProvider::windLayerTreeViewMenuProvider(QgsLayerTreeView* view, QgsMapCanvas* canvas, QObject* parent)
    : QObject(parent)
    , mLayerTreeView(view)
    , mMapCanvas(canvas)
{
}

QMenu* windLayerTreeViewMenuProvider::createContextMenu()
{
    // 创建空的菜单
    QMenu* menu = new QMenu();

    // 获取图层树视图的默认操作集合，它包含了许多常用的菜单项实现
    QgsLayerTreeViewDefaultActions* actions = mLayerTreeView->defaultActions();

    // 获取当前鼠标位置对应的模型索引
    QModelIndex index = mLayerTreeView->currentIndex();

    // 情况1：在空白处右键（未选中任何节点）
    if (!index.isValid()) {
 
        menu->addAction(actions->actionAddGroup(menu));
        menu->addAction(tr("&Expand All"), mLayerTreeView, &QgsLayerTreeView::expandAll);
        menu->addAction(tr("&Collapse All"), mLayerTreeView, &QgsLayerTreeView::collapseAll);
        return menu;
    }

    // 将索引转换为图层树节点
    QgsLayerTreeNode* node = mLayerTreeView->index2node(index);
    if (!node) {
        return menu; // 如果转换失败，返回空菜单
    }

    // 情况2：右键点击的是图层组
    if (QgsLayerTree::isGroup(node)) {
        menu->addAction(actions->actionZoomToGroup(mMapCanvas, menu));
        menu->addAction(actions->actionRemoveGroupOrLayer(menu));
        menu->addAction(actions->actionRenameGroupOrLayer(menu));
    }
    else if (QgsLayerTree::isLayer(node)) {

        menu->addAction(actions->actionZoomToLayers(mMapCanvas, menu));
        menu->addAction(actions->actionZoomToSelection(mMapCanvas, menu));
        menu->addAction(actions->actionRenameGroupOrLayer(menu));
        menu->addAction(actions->actionShowInOverview(menu));
        menu->addAction(actions->actionRemoveGroupOrLayer(menu));


        QgsMapLayer* mapLayer = QgsLayerTree::toLayer(node)->layer();
        if (mapLayer) {
            // 添加"缩放到图层"动作
            menu->addAction(actions->actionZoomToLayers(mMapCanvas, menu));
            // 添加"删除图层"和"重命名图层"动作
            menu->addAction(actions->actionRemoveGroupOrLayer(menu));
            menu->addAction(actions->actionRenameGroupOrLayer(menu));

            menu->addSeparator();
            
            
            if (mapLayer->type() == Qgis::LayerType::Raster) {
                QAction* rasterLayerPropertyAction = menu->addAction(u8"属性");
                QObject::connect(rasterLayerPropertyAction, &QAction::triggered, this, &windLayerTreeViewMenuProvider::showlayerpropertyDialog);
            }
            else if (mapLayer->type() == Qgis::LayerType::Mesh) {
                QAction* meshLayerPropertyAction = menu->addAction(u8"属性");
                QObject::connect(meshLayerPropertyAction, &QAction::triggered, this, &windLayerTreeViewMenuProvider::showlayerpropertyDialog);
            }

        }
    }
    return menu; // 返回构建好的菜单
}

void windLayerTreeViewMenuProvider::showlayerpropertyDialog(bool flag)
{


	QgsMapLayer* mapLayer = mLayerTreeView->currentLayer();
    if (!mapLayer) {
        return;
    }
	if (mapLayer->type()==Qgis::LayerType::Raster) {
		// collect factories from registered data providers
		QList<const QgsMapLayerConfigWidgetFactory*> providerFactories = QgsGui::providerGuiRegistry()->mapLayerConfigWidgetFactories(mapLayer);
		QgsRasterLayerProperties* rasterLayerPropertiesDialog = new QgsRasterLayerProperties(mapLayer, mMapCanvas, mMapCanvas);
		for (const QgsMapLayerConfigWidgetFactory* factory : std::as_const(providerFactories))
		{
			rasterLayerPropertiesDialog->addPropertiesPageFactory(factory);
		}

		rasterLayerPropertiesDialog->restoreLastPage();

		rasterLayerPropertiesDialog->setModal(true);
		rasterLayerPropertiesDialog->show();
		connect(rasterLayerPropertiesDialog, &QgsRasterLayerProperties::accepted, [rasterLayerPropertiesDialog] {
			rasterLayerPropertiesDialog->deleteLater();
			});
		connect(rasterLayerPropertiesDialog, &QgsRasterLayerProperties::rejected, [rasterLayerPropertiesDialog] {
			rasterLayerPropertiesDialog->deleteLater();
			});

    }
	else if (mapLayer->type() == Qgis::LayerType::Mesh) {
		QList<const QgsMapLayerConfigWidgetFactory*> providerFactories = QgsGui::providerGuiRegistry()->mapLayerConfigWidgetFactories(mapLayer);

		QgsMeshLayerProperties meshLayerPropertiesDialog(mapLayer, mMapCanvas, mMapCanvas);

		for (const QgsMapLayerConfigWidgetFactory* factory : std::as_const(providerFactories))
		{
			meshLayerPropertiesDialog.addPropertiesPageFactory(factory);
		}

		meshLayerPropertiesDialog.restoreLastPage();
        meshLayerPropertiesDialog.exec();

	}
}
 