#pragma once
/*
* 所有的功能指针传递 都是使用 共享指针，不手动释放
* 定义各种任务管理类
* 任务管理类以树状节点进行保存，
* 树状节点都是一个树，具有完整的任务管理能力
* 任务按照 制备任务、测量任务、仿真任务
* 任务基类：
*	1.任务名
*	2. 任务描述
*	3. 子任务项
*   4. 节点类型 -- 文件节点、任务节点、
*   5. 当前节点操作窗口
* 仿真任务：
*	<feko工程导入任务>
*	<FEKO成像任务>
* 
* 
***/

#ifndef TASKTREECLASS_H
#define TASKTREECLASS_H

#include "AllHead.h"
#include <memory>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <rapidxml/rapidxml.hpp>
#include <rapidxml/rapidxml_utils.hpp>  //rapidxml::file
#include <rapidxml/rapidxml_print.hpp>  //rapidxml::print
#include <QObject> // QObject 借助 QOject 中的信号槽机制，完成任务的回调，相当于 事件的劣化版
#include <QDomDocument>

enum TaskStatusEnum {
	wait,
	success,
	fail,
	excuting,
	finish,
};
 

// 任务列表
class TaskNode :public QCheckBox
{
	Q_OBJECT // 每个子类必须使用这个宏
public:
	QString TaskXmlPath; 
public:
	QMenu* ContentListContextMenu;
	QString description; // 描述
	TaskStatusEnum status;
	std::vector<std::shared_ptr<TaskNode>> Nodelist;
public:
	TaskNode(QWidget* parent = nullptr);
	~TaskNode();
public:
	QString getName();
	int setName(QString anme);
	QString getTaskName(); 
	virtual int ExcuteTask(); // 任务执行操作
	virtual int FinishTask();
	virtual TaskNode* CopyToNew();


	int loadXmlDocument(QString xmlfilepath, QDomDocument& doc);
	int writeXmlDocument(QDomDocument& doc);
	virtual int preView(); // 预览信息

	virtual int loadXmlFile(QString xmlFilePath); // 加载任务文件,必须重写
	virtual int saveXmlFile();  // 保存任务文件，必须重写
 
	virtual int addNode(std::shared_ptr<TaskNode> n);
	virtual std::shared_ptr<TaskNode> getNode(int nid);
	virtual std::shared_ptr<TaskNode> getNode(QString nodename);
	virtual std::shared_ptr<TaskNode> removeAt(int nid);
	virtual std::shared_ptr<TaskNode> removeByName(QString nodename);
	virtual TaskStatusEnum getStatus();
	virtual int setStatus(TaskStatusEnum taskstatus);

public slots:	
	void ShowContentListContextMenu(QPoint p);
	void renameNode();
	void deleteNode();
	void copyNewNode();

signals:
	void renameNode(QString oldname,QString newname);
	void deleteNode(QString name);
	void copyNewNode(TaskNode* sendernode);
};


/// <summary>
///  任务管理地址
/// </summary>
class TaskTreeClass
{
public:
	QString TaskName;
	std::vector<TaskNode> tasknodes;
public:
	virtual int loadXmlFile(QString xmlFilePath); // 加载任务文件,必须重写
	virtual int saveXmlFile();  // 保存任务文件，必须重写
};



#endif