PowerMaster/source/dashboardFrame.cpp

390 lines
14 KiB
C++
Raw Normal View History

#include "dashboardFrame.h"
#include "./ui_dashboardFrame.h"
#include "transparentMask.h"
#include "messageDialog.h"
#include "customTabBar.h"
#include "dashboard.h"
#include "customTab.h"
#include "dashboardNamingDialog.h"
#include "panelSelectionDialog.h"
#include "dateTimeWidget.h"
#include <QKeyEvent>
#include <QMenu>
#include <QDateTime>
DashboardFrame::DashboardFrame(QWidget *parent)
: QWidget(parent)
, ui(new Ui::dashboardFrame)
, m_pParentWindow(nullptr)
, m_pTransparentMask(nullptr)
, m_pMessageDialog(nullptr)
, m_pDashboardTabBar(nullptr)
, m_pDashboardNamingDialog(nullptr)
, m_curActiveDashboard(nullptr)
, m_curOperationDashboard(nullptr)
, m_pPanelSelectionDialog(nullptr)
{
ui->setupUi(this);
m_pParentWindow = parent;
m_type = dashboardFrame::ft_main;
m_pDateTimeWidget = new DateTimeWidget(this);
ui->layout_dateTime->addWidget(m_pDateTimeWidget);
connect(m_pDateTimeWidget, SIGNAL(showMask()), this, SLOT(onSignal_showMask()));
connect(m_pDateTimeWidget, SIGNAL(hideMask()), this, SLOT(onSignal_hideMask()));
connect(m_pDateTimeWidget, SIGNAL(viewHistoricalData(QDateTime)), this, SLOT(onSignal_viewHistoricalData(QDateTime)));
m_pDashboardTabBar = new CustomTabBar(this);
m_pDashboardTabBar->setObjectName("mainWindow_Bar");
ui->hLayout_dashboardTabBar->addWidget(m_pDashboardTabBar);
connect(m_pDashboardTabBar, SIGNAL(tabMoved(int, int)), this, SLOT(onSignal_dashboardTabMoved(int, int)));
connect(ui->btnAddDashboard, SIGNAL(clicked()), this, SLOT(onBtnClicked_addDashboard()));
connect(ui->btnAddPanel, SIGNAL(clicked()), this, SLOT(onBtnClicked_addDataPanel()));
//connect(ui->btnDashboradList1, SIGNAL(clicked()), this, SLOT(onBtnClicked_dashboardList()));
connect(ui->btnDashboradList2, SIGNAL(clicked()), this, SLOT(onBtnClicked_dashboardList()));
}
DashboardFrame::~DashboardFrame()
{
delete ui;
}
void DashboardFrame::setType(dashboardFrame::frameType type)
{
if(type == dashboardFrame::ft_secondary) //只有主window具有报警提示
{
ui->btnEventNotication->setVisible(false);
ui->btnAlarmNoticatio->setVisible(false);
}
m_type = type;
}
bool DashboardFrame::eventFilter(QObject* obj, QEvent* event)
{
QDialog *pDialog = qobject_cast<QDialog*>(obj);
if(pDialog)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent* pKeyEvent = static_cast<QKeyEvent*>(event);
if (pKeyEvent->key() == Qt::Key_Escape)
{
return true;
}
}
}
return QObject::eventFilter(obj, event);
}
void DashboardFrame::showTransparentMask()
{
if(m_pTransparentMask == nullptr)
m_pTransparentMask = new TransparentMask(this);
QPoint originPoint = QPoint(0, 0);
if(m_pParentWindow)
originPoint = m_pParentWindow->mapToGlobal(QPoint(0, 0));
else
originPoint = this->mapToGlobal(QPoint(0, 0));
m_pTransparentMask->setGeometry(originPoint.x(), originPoint.y(), this->width(), this->height());
m_pTransparentMask->show();
}
void DashboardFrame::hideTransparentMask()
{
if(m_pTransparentMask != nullptr && m_pTransparentMask->isVisible())
m_pTransparentMask->hide();
}
void DashboardFrame::showMessageDialog(MessageDialogType type,const QString& strTitle,const QString& strContent)
{
if(m_pMessageDialog == nullptr)
{
m_pMessageDialog = new MessageDialog(this);
m_pMessageDialog->installEventFilter(this);
connect(m_pMessageDialog, SIGNAL(sgl_hide()), this, SLOT(onSignal_subDialogClose()));
}
m_pMessageDialog->setMessage(type, strTitle, strContent);
// QPoint originPoint = this->mapToGlobal(QPoint(0, 0));
// int nX = originPoint.x() + (this->width() - m_pMessageDialog->width()) * 0.5;
// int nY = originPoint.y() + (this->height() - m_pMessageDialog->height()) * 0.5;
QPoint originPoint = ui->navigationPanel->mapToGlobal(QPoint(0, 0));
int nX = originPoint.x() + (ui->navigationPanel->width() - m_pMessageDialog->width()) * 0.5;
int nY = originPoint.y() + ui->navigationPanel->height() * 0.5;
m_pMessageDialog->setGeometry(nX, nY, m_pMessageDialog->width(), m_pMessageDialog->height());
if(type == type_question)
m_pMessageDialog->exec();
else
m_pMessageDialog->show();
}
void DashboardFrame::addDashboard(const QString& strName)
{
Dashboard* dashboard = new Dashboard(strName, this);
connect(dashboard, SIGNAL(sgl_rename()), this, SLOT(onSignal_renameDashboard()));
connect(dashboard, SIGNAL(sgl_remove()), this, SLOT(onSignal_removeDashboard()));
dashboard->setDisplayAreaLayout(ui->hLayout_dashboardDisplayArea);
//添加tab
CustomTab* tab = dashboard->tab();
m_pDashboardTabBar->addTab(tab);
connect(tab, SIGNAL(clicked()), this, SLOT(onBtnClicked_dashboardTab()));
m_listDashboard.push_back(dashboard);
if(m_curActiveDashboard)
m_curActiveDashboard->setActive(false);
dashboard->setActive(true);
m_curActiveDashboard = dashboard;
}
void DashboardFrame::removeDashboard(const QString& strName, bool bDelete) //右键删除和移动到别的frame下均会调用该函数只有删除时才会delete
{
int nIndex = 0;
Dashboard* dashboard = nullptr;
for(int n=0; n<m_listDashboard.count(); n++)
{
if(m_listDashboard.at(n)->getName() == strName)
{
nIndex = n;
dashboard = m_listDashboard.at(n);
break;
}
}
if( !dashboard )
return;
if(dashboard == m_curActiveDashboard) //删除的是当前所选
{
dashboard->setActive(false);
if(m_listDashboard.count() == 1) //唯一一个
m_curActiveDashboard = nullptr;
else
{
if(nIndex != 0) //不是第一个,将其前一个置为选中状态
{
m_listDashboard.at(nIndex - 1)->setActive(true);
m_curActiveDashboard = m_listDashboard.at(nIndex - 1);
}
else //是第一个,将下一个置为选中状态
{
m_listDashboard.at(nIndex + 1)->setActive(true);
m_curActiveDashboard = m_listDashboard.at(nIndex + 1);
}
}
}
CustomTab* tab = dashboard->tab();
if(tab)
m_pDashboardTabBar->removeTab(tab);
m_listDashboard.removeAt(nIndex);
if(bDelete)
{
dashboard->deleteSubWidgets();
delete dashboard;
}
}
void DashboardFrame::setCurrentDashboard(const QString& strName)
{
for(int n=0; n<m_listDashboard.count(); n++)
{
if(m_listDashboard.at(n)->getName() == strName)
{
if(m_listDashboard.at(n) == m_curActiveDashboard)
return;
m_curActiveDashboard->setActive(false);
m_listDashboard.at(n)->setActive(true);
CustomTab* tab = m_listDashboard.at(n)->tab();
m_pDashboardTabBar->ensureWidgetVisible(tab);
m_curActiveDashboard = m_listDashboard.at(n);
}
}
}
void DashboardFrame::onSignal_showMask()
{
showTransparentMask();
}
void DashboardFrame::onSignal_hideMask()
{
hideTransparentMask();
}
void DashboardFrame::onBtnClicked_addDashboard()
{
if(m_pDashboardNamingDialog == nullptr)
{
m_pDashboardNamingDialog = new DashboardNamingDialog(this);
m_pDashboardNamingDialog->installEventFilter(this);
connect(m_pDashboardNamingDialog, SIGNAL(sgl_hide()), this, SLOT(onSignal_subDialogClose()));
connect(m_pDashboardNamingDialog, SIGNAL(dashboardName(const QString&, const QString&)), this, SLOT(onSignal_dashboardNaming(const QString&, const QString&)));
}
showTransparentMask();
QPoint originPoint = ui->navigationPanel->mapToGlobal(QPoint(0, 0));
int nX = originPoint.x() + (ui->navigationPanel->width() - m_pDashboardNamingDialog->width()) * 0.5;
int nY = originPoint.y() + ui->navigationPanel->height() * 0.5;
m_pDashboardNamingDialog->setGeometry(nX, nY, m_pDashboardNamingDialog->width(), m_pDashboardNamingDialog->height());
m_pDashboardNamingDialog->showUsedForCreat();
}
void DashboardFrame::onBtnClicked_addDataPanel()
{
if(m_listDashboard.count() == 0)
{
showTransparentMask();
showMessageDialog(type_warning, QString::fromWCharArray(L"错误"), QString::fromWCharArray(L"只能在数据看板内创建展项,请先创建一个数据看板"));
return;
}
if(m_pPanelSelectionDialog == nullptr)
{
m_pPanelSelectionDialog = new PanelSelectionDialog(this);
m_pPanelSelectionDialog->installEventFilter(this);
connect(m_pPanelSelectionDialog, SIGNAL(sgl_hide()), this, SLOT(onSignal_subDialogClose()));
connect(m_pPanelSelectionDialog, SIGNAL(panelType(const QString&)), this, SLOT(onSignal_panelSelectResult(const QString&)));
}
showTransparentMask();
QPoint originPoint = ui->navigationPanel->mapToGlobal(QPoint(0, 0));
int nX = originPoint.x() + (ui->navigationPanel->width() - m_pPanelSelectionDialog->width()) * 0.5;
int nY = originPoint.y() + ui->navigationPanel->height() * 0.5;
m_pPanelSelectionDialog->setGeometry(nX, nY, m_pPanelSelectionDialog->width(), m_pPanelSelectionDialog->height());
m_pPanelSelectionDialog->show();
}
void DashboardFrame::onBtnClicked_dashboardList()
{
if(m_listDashboard.count() ==0 )
return;
QMenu menu;
menu.setStyleSheet("QMenu{\n"
" background-color:rgb(36,43,50);\n"
" border:1px solid rgb(6, 6, 6);\n"
"}\n"
"QMenu:scroller{\n"
" show-arrows:true;\n"
"}\n"
"QMenu:item{\n"
" padding-left:15px;\n"
" padding-right:15px;\n"
" font:9pt \"微软雅黑\";\n"
" color:rgb(220,220,220);\n"
" height:26px;\n"
"}\n"
"QMenu:item:selected{\n"
" background-color: rgba(67,160,249, 80);\n"
"}\n");
for(int n=0; n<m_listDashboard.count(); n++)
{
menu.addAction(m_listDashboard.at(n)->getName(), this, SLOT(onMenuAction_dashboardList()));
}
QPoint originPoint = ui->btnDashboradList2->mapToGlobal(QPoint(0, 0));
int nX = originPoint.x();
originPoint = ui->navigationPanel->mapToGlobal(QPoint(0, 0));
int nY = originPoint.y() + ui->navigationPanel->height();
menu.exec(QPoint(nX, nY));
}
void DashboardFrame::onBtnClicked_dashboardTab()
{
CustomTab* pBtn = qobject_cast<CustomTab*>(sender());
QString strName = pBtn->text();
setCurrentDashboard(strName);
}
void DashboardFrame::onMenuAction_dashboardList()
{
QAction* action = qobject_cast<QAction*>(sender());
QString strName = action->text();
setCurrentDashboard(strName);
}
void DashboardFrame::onSignal_subDialogClose()
{
hideTransparentMask();
}
void DashboardFrame::onSignal_dashboardNaming(const QString& strName, const QString& strUsedFor)
{
for(int n=0; n<m_listDashboard.count(); n++)
{
if(m_listDashboard.at(n)->getName() == strName)
{
QString strError = QString::fromStdWString(L"已存在同名看板");
m_pDashboardNamingDialog->showErrorInfo(strError);
return;
}
}
if(strUsedFor == "create")
addDashboard(strName);
else if(strUsedFor == "rename" && m_curOperationDashboard)
m_curOperationDashboard->setName(strName);
m_pDashboardNamingDialog->hide();
hideTransparentMask();
}
void DashboardFrame::onSignal_dashboardTabMoved(int nFromIndex, int nToIndex)
{
//同步相应数据在其存储接结构中的位置
Dashboard* movingDashboard = m_listDashboard.takeAt(nFromIndex);
m_listDashboard.insert(nToIndex, movingDashboard);
}
void DashboardFrame::onSignal_removeDashboard()
{
Dashboard* dashboard = qobject_cast<Dashboard*>(sender());
if(dashboard)
{
showTransparentMask();
QString strName = dashboard->getName();
QString strMsg = QString::fromStdWString(L"确认删除名为 \"") + strName + QString::fromStdWString(L"\" 的数据看板吗?");
showMessageDialog(type_question, QString::fromStdWString(L"删除看板"), strMsg);
if(g_msgDlgBtn == btn_No)
return;
removeDashboard(strName, true);
}
}
void DashboardFrame::onSignal_renameDashboard()
{
m_curOperationDashboard = qobject_cast<Dashboard*>(sender());
if(m_pDashboardNamingDialog == nullptr)
{
m_pDashboardNamingDialog = new DashboardNamingDialog(this);
connect(m_pDashboardNamingDialog, SIGNAL(dlgHide()), this, SLOT(onSignal_subDialogClose()));
connect(m_pDashboardNamingDialog, SIGNAL(dashboardName(const QString&, const QString&)), this, SLOT(onSignal_dashboardNaming(const QString&, const QString&)));
}
showTransparentMask();
QPoint originPoint = ui->navigationPanel->mapToGlobal(QPoint(0, 0));
int nX = originPoint.x() + (ui->navigationPanel->width() - m_pDashboardNamingDialog->width()) * 0.5;
int nY = originPoint.y() + ui->navigationPanel->height() * 0.5;
m_pDashboardNamingDialog->setGeometry(nX, nY, m_pDashboardNamingDialog->width(), m_pDashboardNamingDialog->height());
m_pDashboardNamingDialog->showUsedForRename();
}
void DashboardFrame::onSignal_panelSelectResult(const QString& strType)
{
//m_pPanelSelectionDialog->hide();
hideTransparentMask();
m_curActiveDashboard->addPanel(strType);
}
void DashboardFrame::onSignal_viewHistoricalData(QDateTime dateTime)
{
qDebug() << "viewHistoricalData: " + dateTime.date().toString("yyyy/MM/dd");
hideTransparentMask();
}