mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-01 21:56:43 +08:00
Improve the performance and usability of the raw FSD message display
* Replaced QListView with QPlainTextEdit * Added filter options for packet type and text * Option to globally disable/enable the feature. Default disabled Maniphest Tasks: Ref T240
This commit is contained in:
committed by
Klaus Basan
parent
58d128a9da
commit
b12002caa2
@@ -15,6 +15,7 @@
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QDir>
|
||||
#include <QStringList>
|
||||
#include <QtGlobal>
|
||||
|
||||
using namespace BlackMisc;
|
||||
@@ -30,37 +31,145 @@ namespace BlackGui
|
||||
QFrame(parent), ui(new Ui::CRawFsdMessagesComponent)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
ui->cb_FileWritingMode->addItem(QApplication::translate("CRawFsdMessagesComponent", "None", nullptr), QVariant::fromValue(CRawFsdMessageSettings::None));
|
||||
ui->cb_FileWritingMode->addItem(QApplication::translate("CRawFsdMessagesComponent", "Truncate", nullptr), QVariant::fromValue(CRawFsdMessageSettings::Truncate));
|
||||
ui->cb_FileWritingMode->addItem(QApplication::translate("CRawFsdMessagesComponent", "Append", nullptr), QVariant::fromValue(CRawFsdMessageSettings::Append));
|
||||
ui->cb_FileWritingMode->addItem(QApplication::translate("CRawFsdMessagesComponent", "Timestamped", nullptr), QVariant::fromValue(CRawFsdMessageSettings::Timestamped));
|
||||
|
||||
QMetaObject::Connection c = sGui->getIContextNetwork()->connectRawFsdMessageSignal(this, std::bind(&CRawFsdMessagesComponent::addFsdMessage, this, std::placeholders::_1));
|
||||
if (!c)
|
||||
{
|
||||
ui->cb_EnableFileWriting->setEnabled(false);
|
||||
ui->lw_RawFsdMessages->addItem(QStringLiteral("Could not connect to raw FSD message."));
|
||||
ui->lw_RawFsdMessages->addItem(QStringLiteral("This is most likely because core is not running in this process."));
|
||||
ui->lw_RawFsdMessages->addItem(QStringLiteral("Open this component again from the process running core."));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_signalConnections.append(c);
|
||||
readSettings();
|
||||
connect(ui->cb_EnableFileWriting, &QCheckBox::toggled, this, &CRawFsdMessagesComponent::changeWritingToFile);
|
||||
connect(ui->pb_SelectFileDir, &QPushButton::clicked, this, &CRawFsdMessagesComponent::selectFileDir);
|
||||
connect(ui->cb_FileWritingMode, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &CRawFsdMessagesComponent::changeFileWritingMode);
|
||||
}
|
||||
ui->cb_FilterPacketType->addItem("");
|
||||
ui->cb_FilterPacketType->addItems(CRawFsdMessage::getAllPacketTypes());
|
||||
ui->pte_RawFsdMessages->setMaximumBlockCount(m_maxDisplayedMessages);
|
||||
ui->le_MaxDisplayedMessages->setText(QString::number(m_maxDisplayedMessages));
|
||||
|
||||
setupConnections();
|
||||
expandFilters(false);
|
||||
expandWritingToFile(false);
|
||||
}
|
||||
|
||||
CRawFsdMessagesComponent::~CRawFsdMessagesComponent()
|
||||
{ }
|
||||
|
||||
void CRawFsdMessagesComponent::changeWritingToFile(bool enable)
|
||||
void CRawFsdMessagesComponent::setupConnections()
|
||||
{
|
||||
|
||||
connect(ui->le_FilterText, &QLineEdit::returnPressed, this, &CRawFsdMessagesComponent::changeStringFilter);
|
||||
connect(ui->cb_FilterPacketType, &QComboBox::currentTextChanged, this, &CRawFsdMessagesComponent::changePacketTypeFilter);
|
||||
connect(ui->gb_Filter, &QGroupBox::toggled, this, &CRawFsdMessagesComponent::expandFilters);
|
||||
connect(ui->gb_WriteToFile , &QGroupBox::toggled, this, &CRawFsdMessagesComponent::expandWritingToFile);
|
||||
connect(ui->pb_SelectFileDir, &QPushButton::clicked, this, &CRawFsdMessagesComponent::selectFileDir);
|
||||
connect(ui->le_MaxDisplayedMessages, &QLineEdit::returnPressed, this, &CRawFsdMessagesComponent::changeMaxDisplayedMessages);
|
||||
|
||||
QValidator *validator = new QIntValidator(10, 200, this);
|
||||
ui->le_MaxDisplayedMessages->setValidator(validator);
|
||||
|
||||
using namespace std::placeholders;
|
||||
QMetaObject::Connection c = sGui->getIContextNetwork()->connectRawFsdMessageSignal(this, std::bind(&CRawFsdMessagesComponent::addFsdMessage, this, _1));
|
||||
if (!c)
|
||||
{
|
||||
ui->pte_RawFsdMessages->appendPlainText(QStringLiteral("Could not connect to raw FSD message."));
|
||||
ui->pte_RawFsdMessages->appendPlainText(QStringLiteral("This is most likely because core is not running in this process."));
|
||||
ui->pte_RawFsdMessages->appendPlainText(QStringLiteral("Open this component again from the process running core."));
|
||||
return;
|
||||
}
|
||||
m_signalConnections.append(c);
|
||||
|
||||
readSettings();
|
||||
// Connect them after settings are read. Otherwise they get called.
|
||||
connect(ui->cb_FileWritingMode, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &CRawFsdMessagesComponent::changeFileWritingMode);
|
||||
connect(ui->cb_EnableRawFsdMessages, &QCheckBox::toggled, this, &CRawFsdMessagesComponent::enableRawFsdMessages);
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::enableRawFsdMessages(bool enable)
|
||||
{
|
||||
ui->cb_FilterPacketType->setEnabled(enable);
|
||||
ui->le_FilterText->setEnabled(enable);
|
||||
ui->le_MaxDisplayedMessages->setEnabled(enable);
|
||||
ui->le_FileDir->setEnabled(enable);
|
||||
ui->pb_SelectFileDir->setEnabled(enable);
|
||||
ui->cb_FileWritingMode->setEnabled(enable);
|
||||
m_setting.setProperty(Vatsim::CRawFsdMessageSettings::IndexWriteEnabled, CVariant::fromValue(enable));
|
||||
m_setting.setProperty(Vatsim::CRawFsdMessageSettings::IndexRawFsdMessagesEnabled, CVariant::fromValue(enable));
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::expandFilters(bool expand)
|
||||
{
|
||||
if(expand)
|
||||
{
|
||||
ui->gl_Filters->setHorizontalSpacing(7);
|
||||
ui->gl_Filters->setVerticalSpacing(7);
|
||||
ui->gl_Filters->setContentsMargins(11, 11, 11, 11);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->gl_Filters->setHorizontalSpacing(0);
|
||||
ui->gl_Filters->setVerticalSpacing(0);
|
||||
ui->gl_Filters->setContentsMargins(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
for(int idx = 0; idx < ui->gl_Filters->count(); idx++)
|
||||
{
|
||||
QLayoutItem * const item = ui->gl_Filters->itemAt(idx);
|
||||
if(item->widget()) { item->widget()->setVisible(expand); }
|
||||
}
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::expandWritingToFile(bool expand)
|
||||
{
|
||||
if(expand)
|
||||
{
|
||||
ui->gl_WriteToFile->setHorizontalSpacing(7);
|
||||
ui->gl_WriteToFile->setVerticalSpacing(7);
|
||||
ui->gl_WriteToFile->setContentsMargins(11, 11, 11, 11);
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->gl_WriteToFile->setHorizontalSpacing(0);
|
||||
ui->gl_WriteToFile->setVerticalSpacing(0);
|
||||
ui->gl_WriteToFile->setContentsMargins(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
for(int idx = 0; idx < ui->gl_WriteToFile->count(); idx++)
|
||||
{
|
||||
QLayoutItem * const item = ui->gl_WriteToFile->itemAt(idx);
|
||||
if(item->widget()) { item->widget()->setVisible(expand); }
|
||||
}
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::changeStringFilter()
|
||||
{
|
||||
m_filterString = ui->le_FilterText->text();
|
||||
filterDisplayedMessages();
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::changePacketTypeFilter(const QString &type)
|
||||
{
|
||||
m_filterPacketType = type;
|
||||
filterDisplayedMessages();
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::changeMaxDisplayedMessages()
|
||||
{
|
||||
int maxDisplayedMessages = 0;
|
||||
bool ok = false;
|
||||
maxDisplayedMessages = ui->le_MaxDisplayedMessages->text().toInt(&ok);
|
||||
if (ok)
|
||||
{
|
||||
m_maxDisplayedMessages = maxDisplayedMessages;
|
||||
filterDisplayedMessages();
|
||||
}
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::filterDisplayedMessages()
|
||||
{
|
||||
CRawFsdMessageList filtered = m_buffer;
|
||||
if (! m_filterString.isEmpty()) { filtered = filtered.findByContainsString(m_filterString); }
|
||||
if (! m_filterPacketType.isEmpty()) { filtered = filtered.findByPacketType(m_filterPacketType); }
|
||||
ui->pte_RawFsdMessages->clear();
|
||||
// Append only the last messages up to maximum display size. Erase everything before.
|
||||
filtered.erase(filtered.begin(), filtered.end() - std::min(filtered.size(), m_maxDisplayedMessages));
|
||||
for (const CRawFsdMessage &rawFsdMessage : filtered)
|
||||
{
|
||||
ui->pte_RawFsdMessages->appendPlainText(rawFsdMessageToString(rawFsdMessage));
|
||||
}
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::selectFileDir()
|
||||
@@ -74,38 +183,39 @@ namespace BlackGui
|
||||
|
||||
void CRawFsdMessagesComponent::changeFileWritingMode()
|
||||
{
|
||||
CRawFsdMessageSettings::FileWriteMode mode = ui->cb_FileWritingMode->currentData().value<CRawFsdMessageSettings::FileWriteMode>();
|
||||
const CRawFsdMessageSettings::FileWriteMode mode = ui->cb_FileWritingMode->currentData().value<CRawFsdMessageSettings::FileWriteMode>();
|
||||
m_setting.setProperty(Vatsim::CRawFsdMessageSettings::IndexFileWriteMode, CVariant::fromValue(mode));
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::setFileWritingModeFromSettings(CRawFsdMessageSettings::FileWriteMode mode)
|
||||
{
|
||||
ui->cb_FileWritingMode->setCurrentIndex(static_cast<int>(mode));
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::addFsdMessage(const CRawFsdMessage &rawFsdMessage)
|
||||
{
|
||||
ui->lw_RawFsdMessages->addItem(rawFsdMessage.toQString());
|
||||
ui->lw_RawFsdMessages->scrollToBottom();
|
||||
if (m_buffer.size() == m_maxDisplayedMessages) { m_buffer.pop_front(); }
|
||||
m_buffer.push_back(rawFsdMessage.getRawMessage());
|
||||
|
||||
while (ui->lw_RawFsdMessages->count() > 100)
|
||||
{
|
||||
QListWidgetItem *item = ui->lw_RawFsdMessages->takeItem(0);
|
||||
delete item;
|
||||
}
|
||||
if (! m_filterPacketType.isEmpty() && ! rawFsdMessage.isPacketType(m_filterPacketType)) { return; }
|
||||
if (! m_filterString.isEmpty() && ! rawFsdMessage.containsString(m_filterString)) { return; }
|
||||
ui->pte_RawFsdMessages->appendPlainText(rawFsdMessageToString(rawFsdMessage));
|
||||
}
|
||||
|
||||
void CRawFsdMessagesComponent::readSettings()
|
||||
{
|
||||
const Vatsim::CRawFsdMessageSettings setting = m_setting.get();
|
||||
ui->le_FileDir->setText(setting.getFileDir());
|
||||
const bool enable = setting.isFileWritingEnabled();
|
||||
ui->cb_EnableFileWriting->setChecked(enable);
|
||||
const bool enable = setting.areRawFsdMessagesEnabled();
|
||||
ui->cb_EnableRawFsdMessages->setChecked(enable);
|
||||
ui->cb_FilterPacketType->setEnabled(enable);
|
||||
ui->le_FilterText->setEnabled(enable);
|
||||
ui->le_MaxDisplayedMessages->setEnabled(enable);
|
||||
ui->le_FileDir->setEnabled(enable);
|
||||
ui->le_FileDir->setText(setting.getFileDir());
|
||||
ui->pb_SelectFileDir->setEnabled(enable);
|
||||
ui->cb_FileWritingMode->setEnabled(enable);
|
||||
const CRawFsdMessageSettings::FileWriteMode mode = setting.getFileWriteMode();
|
||||
ui->cb_FileWritingMode->setCurrentIndex(static_cast<int>(mode));
|
||||
}
|
||||
|
||||
QString CRawFsdMessagesComponent::rawFsdMessageToString(const BlackMisc::Network::CRawFsdMessage &rawFsdMessage)
|
||||
{
|
||||
return QString("%1 %2").arg(rawFsdMessage.getReceptionTime().toString("HH:mm:ss"), rawFsdMessage.getRawMessage());
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
Reference in New Issue
Block a user