6 #include <QGraphicsDropShadowEffect>
12 #include <QPushButton>
14 #include <QStackedWidget>
16 #include <QToolButton>
20 #include "ui_overlaymessages.h"
36 using namespace swift::misc::aviation;
37 using namespace swift::misc::network;
38 using namespace swift::misc::simulation;
40 using namespace swift::core::context;
43 using namespace swift::gui::settings;
48 COverlayMessages::COverlayMessages(
int w,
int h, QWidget *parent) : QFrame(parent), ui(new Ui::
COverlayMessages)
55 Qt::QueuedConnection);
57 connect(ui->pb_Ok, &QPushButton::clicked,
this, &COverlayMessages::onOkClicked);
58 connect(ui->pb_Cancel, &QPushButton::clicked,
this, &COverlayMessages::onCancelClicked);
60 ui->tvp_StatusMessages->setResizeMode(CStatusMessageView::ResizingAlways);
61 ui->tvp_StatusMessages->setForceColumnsToMaxSize(
63 ui->tvp_StatusMessages->menuAddItems(CStatusMessageView::MenuSave);
64 ui->fr_Confirmation->setVisible(
false);
66 ui->comp_OverlayTextMessage->showSettings(
false);
67 ui->comp_OverlayTextMessage->showTextMessageEntry(
true);
68 ui->comp_OverlayTextMessage->setAsUsedInOverlayMode();
69 ui->comp_OverlayTextMessage->activate(
false,
false);
70 ui->comp_OverlayTextMessage->removeAllMessagesTab();
71 ui->comp_OverlayTextMessage->setAtcButtonsRowsColumns(2, 3,
true);
72 ui->comp_OverlayTextMessage->setAtcButtonsBackgroundUpdates(
false);
79 void COverlayMessages::init(
int w,
int h)
82 if (this->parent() && !this->parent()->objectName().isEmpty())
84 const QString n(
"Overlay messages for " + this->parent()->objectName());
85 this->setObjectName(n);
89 this->setAutoFillBackground(
true);
90 m_autoCloseTimer.setObjectName(this->objectName() %
":autoCloseTimer");
91 ui->tvp_StatusMessages->setMode(CStatusMessageListModel::Simplified);
96 void COverlayMessages::setHeader(
const QString &header)
98 ui->lbl_Header->setText(m_header.isEmpty() ? header : m_header);
101 void COverlayMessages::onStyleSheetsChanged()
106 void COverlayMessages::onOkClicked()
108 m_lastConfirmation = QMessageBox::Ok;
109 if (m_okLambda) { m_okLambda(); }
113 void COverlayMessages::onCancelClicked()
115 m_lastConfirmation = QMessageBox::Cancel;
119 bool COverlayMessages::useSmall()
const {
return (m_forceSmall || this->width() < 400 || this->height() < 300); }
121 bool COverlayMessages::displayTextMessage(
const CTextMessage &textMessage)
const
125 if (s.
popup(textMessage)) {
return true; }
127 return s.
popup(textMessage, ownAircraft);
131 std::chrono::milliseconds timeout)
133 if (messages.
isEmpty()) {
return; }
138 QPointer<COverlayMessages> myself(
this);
139 m_pendingMessageCalls.push_back([=]() {
140 if (!myself) {
return; }
141 myself->showOverlayMessages(messages,
true, timeout);
147 if (appendOldMessages && !ui->tvp_StatusMessages->isEmpty())
149 newMsgs.
push_back(ui->tvp_StatusMessages->container());
153 ui->tvp_StatusMessages->adjustOrderColumn(newMsgs);
154 ui->tvp_StatusMessages->rowsResizeModeBasedOnThreshold(newMsgs.
size());
155 ui->tvp_StatusMessages->updateContainerMaybeAsync(newMsgs);
162 bool appendOldMessages, std::chrono::milliseconds timeout)
164 if (messages.
isEmpty()) {
return; }
171 std::chrono::milliseconds timeout)
173 if (messages.
isEmpty()) {
return; }
181 ui->tvp_StatusMessages->sortByPropertyIndex(propertyIndex, order);
186 ui->tvp_StatusMessages->setSorting(propertyIndex, order);
191 if (message.
isEmpty()) {
return; }
196 QPointer<COverlayMessages> myself(
this);
197 m_pendingMessageCalls.push_back([=]() {
198 if (!myself) {
return; }
199 myself->showOverlayMessage(message, timeout);
204 if (this->useSmall())
207 ui->form_StatusMessageSmall->setValue(message);
212 ui->form_StatusMessage->setValue(message);
219 if (textMessage.
isEmpty()) {
return; }
220 if (!this->displayTextMessage(textMessage)) {
return; }
226 QPointer<COverlayMessages> myself(
this);
227 m_pendingMessageCalls.push_back([=]() {
228 if (!myself) {
return; }
229 myself->showOverlayTextMessage(textMessage, timeout);
235 const bool activatedText = ui->comp_OverlayTextMessage->isActivated();
242 ui->comp_OverlayTextMessage->showCorrespondingTabForFrequency(textMessage.
getFrequency());
252 ui->te_TmText->setText(textMessage.
getMessage());
254 ui->wi_TmSupervisor->setStyleSheet(
"background-color: red;");
263 ui->comp_OverlayTextMessage->setTab(tab);
264 ui->comp_OverlayTextMessage->updateAtcStationsButtons();
265 ui->comp_OverlayTextMessage->showTextMessageEntry(
true);
268 ui->comp_OverlayTextMessage->focusTextEntry();
274 ui->comp_OverlayTextMessage->showCorrespondingTab(callsign);
287 QPointer<COverlayMessages> myself(
this);
288 m_pendingMessageCalls.push_back([=]() {
289 if (!myself) {
return; }
290 myself->showOverlayImage(image, timeout);
296 QSize sizeAvailable = ui->fr_StatusMessagesComponentsInner->size();
297 if (sizeAvailable.width() < 300)
300 sizeAvailable = this->size() * 0.9;
303 ui->lbl_Image->setText(
"");
306 static const QPixmap e;
307 ui->lbl_Image->setPixmap(e);
309 else { ui->lbl_Image->setPixmap(image.scaled(sizeAvailable, Qt::KeepAspectRatio, Qt::FastTransformation)); }
329 else { Q_ASSERT_X(
false, Q_FUNC_INFO,
"Unsupported type"); }
334 if (message.
isEmpty()) {
return; }
341 if (htmlMessage.isEmpty()) {
return; }
347 QPointer<COverlayMessages> myself(
this);
348 m_pendingMessageCalls.push_back([=]() {
349 if (!myself) {
return; }
350 myself->showHTMLMessage(htmlMessage, timeout);
356 ui->te_HTMLMessage->setTextColor(QColor(Qt::white));
357 ui->te_HTMLMessage->setReadOnly(
true);
358 ui->te_HTMLMessage->setText(htmlMessage);
363 std::chrono::milliseconds timeout)
365 if (progress >= 0 && max >= 0)
367 static const QString m(
"%1 of %2 from '%3'");
368 this->
showProgressBar(progress, m.arg(current).arg(max).arg(url.toString()), timeout);
372 static const QString m(
"%1 from '%2'");
379 if (message.isEmpty()) {
return; }
383 const int p = qMax(qMin(percentage, 100), 0);
385 ui->pb_ProgressBar->setValue(p);
386 ui->lbl_ProgressBar->setText(message);
389 if (p >= 100) { this->
close(); }
390 else { this->
display(timeout); }
395 ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_StatusMessages);
396 this->setHeader(
"Messages");
401 ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_StatusMessage);
402 this->setHeader(
"Message");
407 ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_StatusMessageSmall);
408 this->setHeader(
"Message");
413 ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_HTMLMessage);
414 this->setHeader(
"Message");
419 ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_ProgressBar);
420 this->setHeader(
"Progress bar");
425 ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_TextMessage);
426 this->setHeader(
"Text message");
431 ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_OverlayTextMessage);
432 this->setHeader(
"Text message");
437 ui->comp_OverlayTextMessage->activate(activate, activate);
444 ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_Image);
445 this->setHeader(
"Image");
450 if (message.isEmpty()) { ui->fr_Confirmation->setVisible(
false); }
453 ui->fr_Confirmation->setVisible(
true);
454 ui->lbl_Confirmation->setText(message);
459 const CStatusMessageList &messages,
bool appendOldMessages,
const QString &confirmationMessage,
460 std::function<
void()> okLambda, QMessageBox::StandardButton defaultButton, std::chrono::milliseconds timeout)
465 QPointer<COverlayMessages> myself(
this);
466 m_pendingMessageCalls.push_back([=]() {
467 if (!myself) {
return; }
469 defaultButton, timeout);
476 m_awaitingConfirmation =
true;
477 m_okLambda = okLambda;
486 case QMessageBox::Ok:
487 ui->pb_Cancel->setDefault(
false);
488 ui->pb_Cancel->setAutoDefault(
false);
489 ui->pb_Ok->setDefault(
true);
490 ui->pb_Ok->setAutoDefault(
true);
491 ui->pb_Ok->setFocus();
492 m_lastConfirmation = QMessageBox::Ok;
494 case QMessageBox::Cancel:
495 ui->pb_Ok->setDefault(
false);
496 ui->pb_Ok->setAutoDefault(
false);
497 ui->pb_Cancel->setDefault(
true);
498 ui->pb_Cancel->setAutoDefault(
true);
499 ui->pb_Cancel->setFocus();
500 m_lastConfirmation = QMessageBox::Cancel;
510 ui->form_StatusMessage->setReducedInfo(reduced);
511 ui->form_StatusMessageSmall->setReducedInfo(reduced);
516 QGraphicsDropShadowEffect *shadow =
new QGraphicsDropShadowEffect(
this);
518 shadow->setColor(color);
519 this->setGraphicsEffect(shadow);
524 if (!this->isVisible()) { QFrame::keyPressEvent(event); }
525 if (event->key() == Qt::Key_Escape)
530 else { QFrame::keyPressEvent(event); }
536 this->setEnabled(
false);
537 ui->fr_Confirmation->setVisible(
false);
539 else { m_lastConfirmation = QMessageBox::Cancel; }
540 m_awaitingConfirmation =
false;
541 m_okLambda =
nullptr;
543 if (!m_pendingMessageCalls.isEmpty())
545 std::function<void()> f = m_pendingMessageCalls.constFirst();
546 m_pendingMessageCalls.removeFirst();
547 const QPointer<COverlayMessages> myself(
this);
549 if (!myself) {
return; }
558 using namespace std::chrono_literals;
561 this->setEnabled(
true);
562 if (timeout > 250ms) { m_autoCloseTimer.start(timeout); }
563 else { m_autoCloseTimer.stop(); }
const context::IContextOwnAircraft * getIContextOwnAircraft() const
Direct access to contexts if a CCoreFacade has been initialized.
bool isShuttingDown() const
Is application shutting down?
virtual swift::misc::simulation::CSimulatedAircraft getOwnAircraft() const =0
Get own aircraft.
void styleSheetsChanged()
Style sheet changed.
Display status messages (nested in the parent widget)
void setDefaultConfirmationButton(int button=QMessageBox::Cancel)
Set the default confirmation button.
void setModeToProgressBar()
Progress bar.
void setModeToOverlayTextMessage()
Inline text message.
void sortOverlayMessages(const swift::misc::CPropertyIndex &propertyIndex, Qt::SortOrder order=Qt::AscendingOrder)
Sort of overlay messages.
void showOverlayMessagesOrSingleMessage(const swift::misc::CStatusMessageList &messages, bool appendOldMessages=false, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show multiple messages or a single message.
void showProgressBar(int percentage, const QString &message, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Progress bar.
void setModeToMessage()
Single Message mode.
void setModeToHTMLMessage()
HTML message mode.
void activateTextMessages(bool activate)
Active send/receive of text messages.
virtual void keyPressEvent(QKeyEvent *event)
bool isTextMessagesActivated() const
Are text messages.
void display(std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show message.
void showOverlayVariant(const swift::misc::CVariant &variant, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Display one of the supported types.
void showDownloadProgress(int progress, qint64 current, qint64 max, const QUrl &url, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Download progress.
void setOverlayMessagesSorting(const swift::misc::CPropertyIndex &propertyIndex, Qt::SortOrder order=Qt::AscendingOrder)
Set sorting of overlay messages.
void clearOverlayMessages()
Clear the overlay messages.
virtual ~COverlayMessages()
Destructor.
void close()
Close button clicked.
void showOverlayTextMessage(const swift::misc::network::CTextMessage &textMessage, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Info message, based on text message.
void showOverlayMessages(const swift::misc::CStatusMessageList &messages, bool appendOldMessages=false, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show multiple messages.
void showOverlayMessage(const swift::misc::CStatusMessage &message, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show single message.
void setModeToTextMessage()
Single text message mode.
void showOverlayMessagesOrHTMLMessage(const swift::misc::CStatusMessageList &messages, bool appendOldMessages=false, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show multiple messages or a single message (HTML)
void showOverlayInlineTextMessage(components::TextMessageTab tab)
Inline text message.
void setReducedInfo(bool reduced)
Display reduced information.
void showOverlayMessagesWithConfirmation(const swift::misc::CStatusMessageList &messages, bool appendOldMessages, const QString &confirmationMessage, std::function< void()> okLambda, QMessageBox::StandardButton defaultButton=QMessageBox::Cancel, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show multiple messages with confirmation bar.
void setModeToImage()
Display image.
void showHTMLMessage(const swift::misc::CStatusMessage &message, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
HTML message.
void setConfirmationMessage(const QString &message)
Set the message and show the confirmation frame.
void setModeToMessageSmall()
Single Message mode.
void confirmationCompleted()
Confirmation completed.
void showOverlayImage(const swift::misc::CPixmap &image, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Image.
void setModeToMessages()
Messages mode.
bool hasPendingConfirmation() const
Is awaiting a conformation.
void addShadow(QColor color=Qt::gray)
Add a shadow.
bool popup(const swift::misc::network::CTextMessage &textMessage) const
Popup the given message? Quick check without frequency checks.
bool isEmpty() const
Message empty.
Pixmap which can be transferred via DBus.
QPixmap toPixmap() const
Corresponding pixmap.
size_type size() const
Returns number of elements in the sequence.
void push_back(const T &value)
Appends an element at the end of the sequence.
reference front()
Access the first element.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
QString toHtml(bool withIcon, bool withColors) const
To HTML.
Status messages, e.g. from Core -> GUI.
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
T value() const
Return the value converted to the type T.
bool canConvert(int typeId) const
True if this variant can be converted to the type with the given metatype ID.
QString getFormattedUtcTimestampHms() const
As hh:mm:ss.
Value object encapsulating information of a callsign.
const QString & asString() const
Get callsign (normalized)
Value object encapsulating information of a text message.
bool isPrivateMessage() const
Is private message?
bool isEmpty() const
Empty message.
const QString & getMessage() const
Get message.
const aviation::CCallsign & getSenderCallsign() const
Get callsign (from)
const aviation::CCallsign & getRecipientCallsign() const
Get callsign (to)
const physical_quantities::CFrequency & getFrequency() const
Get frequency.
bool isSupervisorMessage() const
Supervisor message?
Comprehensive information of an aircraft.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
Backend services of the swift project, like dealing with the network or the simulators.
High level reusable GUI components.
Models to be used with views, mainly QTableView.
Views, mainly QTableView.
Free functions in swift::misc.
auto singleShot(int msec, QObject *target, F &&task)
Starts a single-shot timer which will call a task in the thread of the given object when it times out...