mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 19:10:06 +00:00
193 lines
4.2 KiB
C++
193 lines
4.2 KiB
C++
#include "alert_dialog.hpp"
|
|
#include "ui_alert_dialog.h"
|
|
|
|
#include <scwx/qt/manager/text_event_manager.hpp>
|
|
#include <scwx/util/logger.hpp>
|
|
|
|
#include <QPushButton>
|
|
|
|
namespace scwx
|
|
{
|
|
namespace qt
|
|
{
|
|
namespace ui
|
|
{
|
|
|
|
static const std::string logPrefix_ = "scwx::qt::ui::alert_dialog";
|
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
|
|
|
class AlertDialogImpl : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
explicit AlertDialogImpl(AlertDialog* self) :
|
|
self_ {self},
|
|
textEventManager_ {manager::TextEventManager::Instance()},
|
|
goButton_ {nullptr},
|
|
key_ {},
|
|
centroid_ {},
|
|
currentIndex_ {0u}
|
|
{
|
|
}
|
|
~AlertDialogImpl() = default;
|
|
|
|
void ConnectSignals();
|
|
void SelectIndex(size_t newIndex);
|
|
void UpdateAlertInfo();
|
|
|
|
AlertDialog* self_;
|
|
|
|
std::shared_ptr<manager::TextEventManager> textEventManager_;
|
|
|
|
QPushButton* goButton_;
|
|
types::TextEventKey key_;
|
|
common::Coordinate centroid_;
|
|
size_t currentIndex_;
|
|
};
|
|
|
|
AlertDialog::AlertDialog(QWidget* parent) :
|
|
QDialog(parent),
|
|
p {std::make_unique<AlertDialogImpl>(this)},
|
|
ui(new Ui::AlertDialog)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
// Set monospace font for alert view
|
|
QFont monospaceFont("?");
|
|
monospaceFont.setStyleHint(QFont::StyleHint::TypeWriter);
|
|
|
|
if (!monospaceFont.fixedPitch())
|
|
{
|
|
monospaceFont.setStyleHint(QFont::StyleHint::Monospace);
|
|
}
|
|
|
|
ui->alertText->setFont(monospaceFont);
|
|
|
|
// Add Go button to button box
|
|
p->goButton_ = ui->buttonBox->addButton("&Go", QDialogButtonBox::ActionRole);
|
|
|
|
p->ConnectSignals();
|
|
}
|
|
|
|
AlertDialog::~AlertDialog()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void AlertDialogImpl::ConnectSignals()
|
|
{
|
|
connect(
|
|
textEventManager_.get(),
|
|
&manager::TextEventManager::AlertUpdated,
|
|
this,
|
|
[this](const types::TextEventKey& key)
|
|
{
|
|
if (key == key_)
|
|
{
|
|
UpdateAlertInfo();
|
|
}
|
|
},
|
|
Qt::QueuedConnection);
|
|
connect(goButton_,
|
|
&QPushButton::clicked,
|
|
this,
|
|
[this]()
|
|
{
|
|
Q_EMIT self_->MoveMap(centroid_.latitude_, centroid_.longitude_);
|
|
self_->close();
|
|
});
|
|
}
|
|
|
|
bool AlertDialog::SelectAlert(const types::TextEventKey& key)
|
|
{
|
|
p->key_ = key;
|
|
|
|
setWindowTitle(QString::fromStdString(key.ToFullString()));
|
|
|
|
auto messages = p->textEventManager_->message_list(key);
|
|
if (messages.empty())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
p->SelectIndex(messages.size() - 1u);
|
|
|
|
return true;
|
|
}
|
|
|
|
void AlertDialogImpl::SelectIndex(size_t newIndex)
|
|
{
|
|
size_t messageCount = textEventManager_->message_count(key_);
|
|
|
|
if (newIndex >= messageCount)
|
|
{
|
|
return;
|
|
}
|
|
|
|
auto messages = textEventManager_->message_list(key_);
|
|
|
|
currentIndex_ = newIndex;
|
|
|
|
self_->ui->alertText->setText(
|
|
QString::fromStdString(messages[currentIndex_]->message_content()));
|
|
|
|
UpdateAlertInfo();
|
|
}
|
|
|
|
void AlertDialogImpl::UpdateAlertInfo()
|
|
{
|
|
auto messages = textEventManager_->message_list(key_);
|
|
size_t messageCount = messages.size();
|
|
|
|
bool firstSelected = (currentIndex_ == 0u);
|
|
bool lastSelected = (currentIndex_ == messageCount - 1u);
|
|
|
|
self_->ui->firstButton->setEnabled(!firstSelected);
|
|
self_->ui->previousButton->setEnabled(!firstSelected);
|
|
|
|
self_->ui->nextButton->setEnabled(!lastSelected);
|
|
self_->ui->lastButton->setEnabled(!lastSelected);
|
|
|
|
self_->ui->messageCountLabel->setText(
|
|
QObject::tr("%1 of %2").arg(currentIndex_ + 1u).arg(messageCount));
|
|
|
|
// Update centroid
|
|
auto alertSegment = messages[currentIndex_]->segments().back();
|
|
if (alertSegment->codedLocation_.has_value())
|
|
{
|
|
centroid_ =
|
|
common::GetCentroid(alertSegment->codedLocation_->coordinates());
|
|
}
|
|
else
|
|
{
|
|
centroid_ = common::Coordinate {};
|
|
}
|
|
|
|
goButton_->setEnabled(centroid_ != common::Coordinate {});
|
|
}
|
|
|
|
void AlertDialog::on_firstButton_clicked()
|
|
{
|
|
p->SelectIndex(0);
|
|
}
|
|
|
|
void AlertDialog::on_previousButton_clicked()
|
|
{
|
|
p->SelectIndex(p->currentIndex_ - 1u);
|
|
}
|
|
|
|
void AlertDialog::on_nextButton_clicked()
|
|
{
|
|
p->SelectIndex(p->currentIndex_ + 1u);
|
|
}
|
|
|
|
void AlertDialog::on_lastButton_clicked()
|
|
{
|
|
p->SelectIndex(p->textEventManager_->message_count(p->key_) - 1u);
|
|
}
|
|
|
|
#include "alert_dialog.moc"
|
|
|
|
} // namespace ui
|
|
} // namespace qt
|
|
} // namespace scwx
|