PowerMaster/source/dashboardFrame.cpp

459 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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>
#include <QMimeData>
DashboardFrame::DashboardFrame(const QString& strName, 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);
setAcceptDrops(true);
m_strName = strName;
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(strName + "_tabBar");
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;
}
CustomTabBar* DashboardFrame::tabBar()
{
return m_pDashboardTabBar;
}
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::dragEnterEvent(QDragEnterEvent* event)
{
const QMimeData* mimeData = event->mimeData();
if( mimeData->hasFormat("dragData/cutomTab") )
{
event->acceptProposedAction();
//qDebug() << "dragEnterEvent-frame";
}
else
event->ignore();
}
void DashboardFrame::dragLeaveEvent(QDragLeaveEvent* event)
{
//qDebug() << "dragLeaveEvent-frame";
}
void DashboardFrame::dropEvent(QDropEvent* event)
{
//qDebug() << "dropEvent-frame";
event->setDropAction(Qt::MoveAction);
event->accept();
QByteArray itemData = event->mimeData()->data("dragData/cutomTab");
QDataStream dataStream(&itemData, QIODevice::ReadOnly);
QString strTabText = "";
QString strFromBar = "";
dataStream >> strTabText >> strFromBar;
if(strFromBar != m_pDashboardTabBar->objectName()) //来自别的frame
{
}
}
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);
insertDashboard(m_listDashboard.count(), dashboard);
// 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::insertDashboard(int index, Dashboard* dashboard)
{
if(index < 0)
index = 0;
else if(index > m_listDashboard.count())
index = m_listDashboard.count();
dashboard->setFrame(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->insertTab(index, tab);
connect(tab, SIGNAL(clicked()), this, SLOT(onBtnClicked_dashboardTab()));
m_listDashboard.insert(index, 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;
}
else
{
dashboard->disconnect(this); //断开和当前frame的信号/槽链接
}
}
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();
}