#include "WindowAppMdiFrame.h"
#include "WindowAppMdiSubContainer.h"
#include "WindowAppGvlView.h"
#include "WindowAppPouFrame.h"
#include "WindowAppTaskView.h"
#include "WindowAppTaskMonitorView.h"
#include "WindowAppLogView.h"
#include "WindowAppUiFrame.h"
#include "WindowAppResourceManagerTree.h"
#include "Pou.h"
WindowAppMdiFrame::WindowAppMdiFrame()
{
// 初始化UI
this->initUI();
VPGlobal::Register(this);
}
WindowAppMdiFrame::~WindowAppMdiFrame()
{
}
///
/// 初始化UI
///
void WindowAppMdiFrame::initUI()
{
// 设置自身的风格
// Tab方式
this->setViewMode(QMdiArea::TabbedView);
// 是否可以关闭子窗口
this->setTabsClosable(true);
// 采用梯形标题栏
//this->setTabShape(QTabWidget::Triangular);
// 设置标题栏的方向是在正上方
this->setTabPosition(QTabWidget::North);
// Tab是否可以拖动调整顺序
this->setTabsMovable(true);
}
///
/// 根据类型添加对应类型的窗体
///
///
///
QWidget* WindowAppMdiFrame::addSubView(QString strTitle, SUBVIEW_TYPE viewType, bool bActive)
{
// 创建子视图的容器( SubWindow )
WindowAppMdiSubContainer* subViewContainer = new WindowAppMdiSubContainer(strTitle);
// 根据不同的类型创建对应视图
QWidget* newView = nullptr;
// QToolBar* viewToolBar = nullptr;
if (viewType == SUBVIEW_TYPE::SUBVIEW_POU)
{
// 创建Pou视图
newView = new WindowAppPouFrame(strTitle, subViewContainer);
//// 2022-8-29 增加,注册PouFrame指针便于后续统一管理
//g_pFrameManager->registerNewPouFrame(strTitle, (WindowAppPouFrame*)newView);
}
// 2022-2-16 Gvl视图有更多的参数,另外独立出来了
//else if (viewType == SUBVIEW_TYPE::SUBVIEW_GVL)
//{
// // 创建Gvl视图
// newView = new WindowAppGvlView(strTitle, subViewContainer);
//}
else if (viewType == SUBVIEW_TYPE::SUBVIEW_TASKMONITOR)
{
// 创建Task Monitor视图
newView = new WindowAppTaskMonitorView(strTitle, subViewContainer);
// 在VPGlobal中注册 Task Monitor
VPGlobal::Register((WindowAppTaskMonitorView*)newView);
}
else if (viewType == SUBVIEW_TYPE::SUBVIEW_TASK)
{
// 创建Task视图
newView = new WindowAppTaskView(strTitle, subViewContainer);
}
else if (viewType == SUBVIEW_TYPE::SUBVIEW_LOG)
{
// 创建Log视图
newView = new WindowAppLogView(strTitle, subViewContainer);
}
else if (viewType == SUBVIEW_TYPE::SUBVIEW_HDW)
{
// 创建Hardware视图
newView = new WindowAppPouFrame(strTitle, subViewContainer);
}
else if (viewType == SUBVIEW_TYPE::SUBVIEW_UI)
{
// 创建 UI 视图
newView = new WindowAppUiFrame(strTitle, subViewContainer);
//// 2022-8-29 增加,注册UiFrame指针便于后续统一管理
//g_pFrameManager->registerNewUiFrame(strTitle, (WindowAppUiFrame*)newView);
}
else
{
// 报告一个错误
Utility::VPCriticalMessageBox("Invalid WindowAppMdiSubContainer type:" + (short)viewType);
return nullptr;
}
// 保存视图和子窗体容器信息
m_containerToViews.insert(subViewContainer, newView);
m_nameToContainers.insert(strTitle, subViewContainer);
if (bActive)
{
// 激活此子窗口
activeSubView(strTitle);
// 设置子窗口的初始化大小
AjustSubWindowGeometry(newView, subViewContainer);
}
return newView;
}
///
/// 2022-2-16 添加Gvl子窗体(由于GVL窗体参数增加,额外独立出来了)
///
///
///
///
///
QWidget* WindowAppMdiFrame::addGvlSubView(QString strTitle, GVL_MODE gvlType, DllTool* pHdwTool, bool bActive /*= false*/)
{
// 创建子视图的容器( SubWindow )
WindowAppMdiSubContainer* subViewContainer = new WindowAppMdiSubContainer(strTitle);
// 创建视图
QWidget* newView = new WindowAppGvlView(strTitle, gvlType, pHdwTool, subViewContainer);
// 保存视图和子窗体容器信息
m_containerToViews.insert(subViewContainer, newView);
m_nameToContainers.insert(strTitle, subViewContainer);
if (bActive)
{
// 激活此子窗口
activeSubView(strTitle);
// 设置子窗口的初始化大小
AjustSubWindowGeometry(newView, subViewContainer);
}
return newView;
}
///
/// 激活对应的子窗体(按名称)
///
///
void WindowAppMdiFrame::activeSubView(QString strTitle)
{
WindowAppMdiSubContainer* pSub = m_liveContainers[strTitle];
if ( pSub==nullptr )
{
pSub = qobject_cast(this->addSubWindow(m_nameToContainers[strTitle]));
if (pSub == nullptr)
{
return;
}
m_liveContainers.insert(strTitle, pSub);
}
// 激活窗体
this->setActiveSubWindow(pSub);
// 显示窗体
pSub->showNormal();
// 绑定关闭信号
connect(
pSub,
&WindowAppMdiSubContainer::subWindowClosed,
this,
&WindowAppMdiFrame::onSubWindowClosed
);
// 绑定激活信号
connect(
pSub,
&WindowAppMdiSubContainer::subWindowActivated,
this,
&WindowAppMdiFrame::onSubWindowActivated
);
// 调整内部的View尺寸
QWidget* pSubView = this->findSubView(strTitle);
AjustSubWindowGeometry(pSubView, pSub);
vDebug() << pSub->m_strTitle;
}
///
/// 删除指定的子窗体(按名称)
///
///
void WindowAppMdiFrame::deleteSubView(QString strTitle)
{
qDebug() << "[MDI] Delete sub view - " << strTitle;
WindowAppMdiSubContainer* pContainer = m_nameToContainers[strTitle];
if (pContainer == nullptr)
{
return;
}
// 从数据结构中清除此窗体
m_containerToViews.remove(pContainer);
m_nameToContainers.remove(strTitle);
m_liveContainers.remove(strTitle);
//g_pFrameManager->unregisterPouFrame(strTitle);
//g_pFrameManager->unregisterUiFrame(strTitle);
//// 关闭此窗体
//if (this->isActiveWindow())
//{
// this->removeSubWindow(pContainer);
//}
// 删除窗体
delete pContainer;
pContainer = nullptr;
// 如果还有剩余的子窗体的话,则激活
if (m_liveContainers.size() > 0)
{
// 随便激活一个剩下的
this->activateNextSubWindow();
}
}
///
/// 删除所有子窗体
///
void WindowAppMdiFrame::deleteAllSubViews()
{
QHashIterator iter(m_nameToContainers);
// 循环关闭所有窗体
while (iter.hasNext())
{
QString strTitle = iter.next().key();
if (strTitle != GROUP_NAME_HARDWARE
&& strTitle != GROUP_NAME_TASKMONITOR
&& strTitle != GROUP_NAME_LOGVIEW
)
{
this->deleteSubView(strTitle);
}
}
//m_containerToViews.clear();
//m_nameToContainers.clear();
//m_liveContainers.clear();
}
///
/// 根据名字查找对应的子窗体
///
///
///
QWidget* WindowAppMdiFrame::findSubView(QString strNewName)
{
QHashIterator iter(m_nameToContainers);
while (iter.hasNext())
{
if (iter.next().key() == strNewName)
{
return m_containerToViews[iter.value()];
}
}
return nullptr;
}
///
/// 当子窗口关闭时触发
///
///
void WindowAppMdiFrame::onSubWindowClosed(WindowAppMdiSubContainer* pSub)
{
// qDebug() << "WindowAppMdiFrame::onSubWindowClosed";
this->removeSubWindow(m_liveContainers[pSub->m_strTitle]);
m_liveContainers.remove(pSub->m_strTitle);
}
///
/// 2022-9-21,当子窗口激活时触发
///
///
void WindowAppMdiFrame::onSubWindowActivated(WindowAppMdiSubContainer* pSub)
{
// 调用ResourceManager来进行对应的Toolbox切换
g_pResourceManager->switchAppToolbox(pSub->m_strTitle);
}
//void WindowAppMdiFrame::setActiveSubWindow(QMdiSubWindow* window)
//{
// vDebug() << "setActiveSubWindow";
//}
///
/// 调整子窗体大小
///
///
///
void WindowAppMdiFrame::AjustSubWindowGeometry(QWidget* pView, WindowAppMdiSubContainer* pContainer)
{
if (pView == nullptr)
{
return;
}
pView->resize(this->frameGeometry().size());
pContainer->resize(this->frameGeometry().size());
QApplication::sendEvent(pView , new QEvent(QResizeEvent::Resize));
// qDebug() << "Resize " << pView << " + " << pContainer;
}
///
/// 自动缩放
///
///
void WindowAppMdiFrame::resizeEvent(QResizeEvent* resizeEvent)
{
Q_UNUSED(resizeEvent);
// qDebug() << "WindowAppMdiFrame::resizeEvent";
// 调整所有窗口大小
QHashIterator iter(m_containerToViews);
while (iter.hasNext())
{
this->AjustSubWindowGeometry(iter.value(), iter.next().key());
}
}