#include "SignalIndicatorLampUI.h" #include #include #include #include #include "../DockTitleBar.h" #include "../DockWidget.h" #include #include #include "common/SpdLogger.h" #include "workspace/WorkSpace.h" #include "workspace/Timestep.h" #include "workspace/WorkSpaceManager.h" SignalIndicatorLampUI::SignalIndicatorLampUI(QWidget* parent) : QWidget(parent) { ui.setupUi(this); connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, this, &SignalIndicatorLampUI::OnWorkSpaceChanged); } SignalIndicatorLampUI::~SignalIndicatorLampUI() { } void SignalIndicatorLampUI::AttachDock(DockWidget* dockWidget) { if (nullptr == dockWidget) { qDebug() << __FUNCTION__ << "dockwidget is nullptr"; return; } dockWidget->SetDockWidgetTitleBar(nullptr); dockWidget->setWidget(this); DockTitleBar* dockTitleBar = new DockTitleBar; dockTitleBar->SetTitle(tr("Signal Indicator Lamp")); dockWidget->SetDockWidgetTitleBar(dockTitleBar); } void SignalIndicatorLampUI::InitIndicatorLamp(QStringList& lamps, LayoutType type, int nColCount) { QGridLayout* pMainLyt = new QGridLayout(this); int nColIndex = 0; int nRowIndex = 0; for (auto i = 0; i < lamps.size(); ++i) { SignalLabel* pLampLab = new SignalLabel; pLampLab->setFixedSize(24, 24); pLampLab->setStyleSheet("QLabel{background-color: rgb(255, 0, 0);border-radius: 10px;}; "); m_listLampPtr.push_back(pLampLab); QLabel* pTextLab = new QLabel; pTextLab->setText(lamps[i]); QHBoxLayout* pLyt = new QHBoxLayout; pLyt->addWidget(pLampLab); pLyt->addWidget(pTextLab); switch (type) { case SignalIndicatorLampUI::HLyt: { pMainLyt->addLayout(pLyt, 0, i); } break; case SignalIndicatorLampUI::VLyt: { pMainLyt->addLayout(pLyt, i, 0); } break; case SignalIndicatorLampUI::GLyt: { pMainLyt->addLayout(pLyt, nRowIndex, nColIndex); nColIndex++; if (nColIndex >= nColCount) { nRowIndex++; nColIndex = 0; } } break; default: break; } } } void SignalIndicatorLampUI::SetLampState(std::vector vecStatus) { int nIndexCount = 0; if (m_listLampPtr.size() >= vecStatus.size()) { nIndexCount = vecStatus.size(); } else { nIndexCount = m_listLampPtr.size(); } for (auto i = 0; i < nIndexCount; ++i) { QLabel* pLampLab = m_listLampPtr[i]; if (1 == vecStatus[i]) { pLampLab->setStyleSheet("QLabel{background-color: rgb(0, 255, 0);border-radius: 10px;}; "); } else { pLampLab->setStyleSheet("QLabel{background-color: rgb(255, 0, 0);border-radius: 10px;}; "); } } } void SignalIndicatorLampUI::UpdateIndicatorLamp(QStringList& lamps, LayoutType type, int nColCount) { QGridLayout* pMainLyt = (QGridLayout*)this->layout(); if (pMainLyt) { QList listChild = pMainLyt->children(); for (size_t i = 0; i < listChild.size(); i++) { pMainLyt->removeWidget((QWidget*)listChild[i]); } } int nColIndex = 0; int nRowIndex = 0; for (auto i = 0; i < lamps.size(); ++i) { SignalLabel* pLampLab = new SignalLabel; pLampLab->setFixedSize(24, 24); pLampLab->setStyleSheet("QLabel{background-color: rgb(255, 0, 0);border-radius: 10px;}; "); m_listLampPtr.push_back(pLampLab); QLabel* pTextLab = new QLabel; pTextLab->setText(lamps[i]); QHBoxLayout* pLyt = new QHBoxLayout; pLyt->addWidget(pLampLab); pLyt->addWidget(pTextLab); switch (type) { case SignalIndicatorLampUI::HLyt: { pMainLyt->addLayout(pLyt, 0, i); } break; case SignalIndicatorLampUI::VLyt: { pMainLyt->addLayout(pLyt, i, 0); } break; case SignalIndicatorLampUI::GLyt: { pMainLyt->addLayout(pLyt, nRowIndex, nColIndex); nColIndex++; if (nColIndex >= nColCount) { nRowIndex++; nColIndex = 0; } } break; default: break; } } } void SignalIndicatorLampUI::InitLamp(const QString& strFile) { ParseLamp(strFile); QStringList listLamp; for (size_t i = 0; i < m_iLampCount; i++) { listLamp <= m_lampStatus.size()) { return; } std::vector vecStatus; for (size_t i = 0; i < m_iLampCount; i++) { vecStatus.push_back(0); } int iStatus = m_lampStatus[dTime - 1]; vecStatus[iStatus-1] = 1; SetLampState(vecStatus); } void SignalIndicatorLampUI::onStatusChanged(int status) { if ((status) >= m_lampStatus.size()) { return; } std::vector vecStatus; for (size_t i = 0; i < m_iLampCount; i++) { vecStatus.push_back(0); } vecStatus[status - 1] = 1; SetLampState(vecStatus); } void SignalIndicatorLampUI::OnWorkSpaceChanged(WorkSpace* worksapce) { if (worksapce == nullptr) { LOG_ERROR("worksapce is nullptr"); return; } connect(worksapce, &WorkSpace::TimestepChanged, this, &SignalIndicatorLampUI::OnTimestepChanged); } void SignalIndicatorLampUI::OnTimestepChanged(Timestep* timestep) { if (timestep == nullptr) { LOG_ERROR("timestep is nullptr"); return; } connect(timestep, SIGNAL(TimeChanged(double)), this, SLOT(slotUpdateTime(double))); } void SignalIndicatorLampUI::paintEvent(QPaintEvent* event) { QPainter painter(this); QPen pen; pen.setColor(Qt::black); pen.setWidth(1); painter.setPen(pen); painter.drawRect(QRect(5,5,rect().width() - 10, rect().height() - 10)); } void SignalIndicatorLampUI::ParseLamp(const QString& strFile) { if (strFile.isEmpty()) { QMessageBox::information(nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请检查数据Lamp文件路径!")); return; } m_lampStatus.clear(); QFile file(strFile); if (file.open(QIODevice::ReadOnly)) { while (!file.atEnd()) { QString strLine = file.readLine().simplified(); if (!strLine.isEmpty()) { int iLamp = (int)strLine.toDouble(); m_lampStatus.push_back(iLamp); if (m_iLampCount < iLamp) { m_iLampCount = iLamp; } } } file.close(); } }