swift
overlaymessages.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "gui/overlaymessages.h"
5 
6 #include <QGraphicsDropShadowEffect>
7 #include <QKeyEvent>
8 #include <QLabel>
9 #include <QLineEdit>
10 #include <QPixmap>
11 #include <QPointer>
12 #include <QPushButton>
13 #include <QSize>
14 #include <QStackedWidget>
15 #include <QTextEdit>
16 #include <QToolButton>
17 #include <Qt>
18 #include <QtGlobal>
19 
20 #include "ui_overlaymessages.h"
21 
22 #include "core/application.h"
26 #include "gui/guiapplication.h"
28 #include "gui/stylesheetutility.h"
30 #include "gui/views/viewbase.h"
31 #include "misc/aviation/callsign.h"
34 
35 using namespace swift::misc;
36 using namespace swift::misc::aviation;
37 using namespace swift::misc::network;
38 using namespace swift::misc::simulation;
39 using namespace swift::core;
40 using namespace swift::core::context;
41 using namespace swift::gui::models;
42 using namespace swift::gui::views;
43 using namespace swift::gui::settings;
44 using namespace swift::gui::components;
45 
46 namespace swift::gui
47 {
48  COverlayMessages::COverlayMessages(int w, int h, QWidget *parent) : QFrame(parent), ui(new Ui::COverlayMessages)
49  {
50  this->init(w, h);
51 
52  if (sGui)
53  {
54  connect(sGui, &CGuiApplication::styleSheetsChanged, this, &COverlayMessages::onStyleSheetsChanged,
55  Qt::QueuedConnection);
56  }
57  connect(ui->pb_Ok, &QPushButton::clicked, this, &COverlayMessages::onOkClicked);
58  connect(ui->pb_Cancel, &QPushButton::clicked, this, &COverlayMessages::onCancelClicked);
59 
60  ui->tvp_StatusMessages->setResizeMode(CStatusMessageView::ResizingAlways);
61  ui->tvp_StatusMessages->setForceColumnsToMaxSize(
62  false); // problems with multiline entries, with T138 we need multiline messages
63  ui->tvp_StatusMessages->menuAddItems(CStatusMessageView::MenuSave);
64  ui->fr_Confirmation->setVisible(false);
65 
66  ui->comp_OverlayTextMessage->showSettings(false);
67  ui->comp_OverlayTextMessage->showTextMessageEntry(true);
68  ui->comp_OverlayTextMessage->setAsUsedInOverlayMode();
69  ui->comp_OverlayTextMessage->activate(false, false); // per default ignore incoming/outgoing text messages
70  ui->comp_OverlayTextMessage->removeAllMessagesTab();
71  ui->comp_OverlayTextMessage->setAtcButtonsRowsColumns(2, 3, true);
72  ui->comp_OverlayTextMessage->setAtcButtonsBackgroundUpdates(false);
73 
74  this->setDefaultConfirmationButton(QMessageBox::Cancel);
75  }
76 
78 
79  void COverlayMessages::init(int w, int h)
80  {
81  ui->setupUi(this);
82  if (this->parent() && !this->parent()->objectName().isEmpty())
83  {
84  const QString n("Overlay messages for " + this->parent()->objectName());
85  this->setObjectName(n);
86  }
87 
88  this->resize(w, h);
89  this->setAutoFillBackground(true);
90  m_autoCloseTimer.setObjectName(this->objectName() % ":autoCloseTimer");
91  ui->tvp_StatusMessages->setMode(CStatusMessageListModel::Simplified);
92  connect(ui->tb_Close, &QToolButton::released, this, &COverlayMessages::close);
93  connect(&m_autoCloseTimer, &QTimer::timeout, this, &COverlayMessages::close);
94  }
95 
96  void COverlayMessages::setHeader(const QString &header)
97  {
98  ui->lbl_Header->setText(m_header.isEmpty() ? header : m_header);
99  }
100 
101  void COverlayMessages::onStyleSheetsChanged()
102  {
103  // stylesheet
104  }
105 
106  void COverlayMessages::onOkClicked()
107  {
108  m_lastConfirmation = QMessageBox::Ok;
109  if (m_okLambda) { m_okLambda(); }
110  this->close();
111  }
112 
113  void COverlayMessages::onCancelClicked()
114  {
115  m_lastConfirmation = QMessageBox::Cancel;
116  this->close();
117  }
118 
119  bool COverlayMessages::useSmall() const { return (m_forceSmall || this->width() < 400 || this->height() < 300); }
120 
121  bool COverlayMessages::displayTextMessage(const CTextMessage &textMessage) const
122  {
123  if (!sGui || sGui->isShuttingDown() || !sGui->getIContextOwnAircraft()) { return false; }
124  const CTextMessageSettings s = m_messageSettings.getThreadLocal();
125  if (s.popup(textMessage)) { return true; } // fast check without needing own aircraft
127  return s.popup(textMessage, ownAircraft);
128  }
129 
130  void COverlayMessages::showOverlayMessages(const CStatusMessageList &messages, bool appendOldMessages,
131  std::chrono::milliseconds timeout)
132  {
133  if (messages.isEmpty()) { return; }
134  if (!sGui || sGui->isShuttingDown()) { return; }
135  if (this->hasPendingConfirmation())
136  {
137  // defer message
138  QPointer<COverlayMessages> myself(this);
139  m_pendingMessageCalls.push_back([=]() {
140  if (!myself) { return; }
141  myself->showOverlayMessages(messages, true, timeout);
142  });
143  return;
144  }
145 
146  CStatusMessageList newMsgs(messages);
147  if (appendOldMessages && !ui->tvp_StatusMessages->isEmpty())
148  {
149  newMsgs.push_back(ui->tvp_StatusMessages->container());
150  }
151 
153  ui->tvp_StatusMessages->adjustOrderColumn(newMsgs);
154  ui->tvp_StatusMessages->rowsResizeModeBasedOnThreshold(newMsgs.size());
155  ui->tvp_StatusMessages->updateContainerMaybeAsync(newMsgs);
156 
157  this->setModeToMessages();
158  this->display(timeout);
159  }
160 
162  bool appendOldMessages, std::chrono::milliseconds timeout)
163  {
164  if (messages.isEmpty()) { return; }
165  if (!sGui || sGui->isShuttingDown()) { return; }
166  if (messages.size() > 1) { this->showOverlayMessages(messages, appendOldMessages, timeout); }
167  else { this->showOverlayMessage(messages.front(), timeout); }
168  }
169 
170  void COverlayMessages::showOverlayMessagesOrHTMLMessage(const CStatusMessageList &messages, bool appendOldMessages,
171  std::chrono::milliseconds timeout)
172  {
173  if (messages.isEmpty()) { return; }
174  if (!sGui || sGui->isShuttingDown()) { return; }
175  if (messages.size() > 1) { this->showOverlayMessages(messages, appendOldMessages, timeout); }
176  else { this->showHTMLMessage(messages.front(), timeout); }
177  }
178 
179  void COverlayMessages::sortOverlayMessages(const CPropertyIndex &propertyIndex, Qt::SortOrder order)
180  {
181  ui->tvp_StatusMessages->sortByPropertyIndex(propertyIndex, order);
182  }
183 
184  void COverlayMessages::setOverlayMessagesSorting(const CPropertyIndex &propertyIndex, Qt::SortOrder order)
185  {
186  ui->tvp_StatusMessages->setSorting(propertyIndex, order);
187  }
188 
189  void COverlayMessages::showOverlayMessage(const CStatusMessage &message, std::chrono::milliseconds timeout)
190  {
191  if (message.isEmpty()) { return; }
192  if (!sGui || sGui->isShuttingDown()) { return; }
193  if (this->hasPendingConfirmation())
194  {
195  // defer message
196  QPointer<COverlayMessages> myself(this);
197  m_pendingMessageCalls.push_back([=]() {
198  if (!myself) { return; }
199  myself->showOverlayMessage(message, timeout);
200  });
201  return;
202  }
203 
204  if (this->useSmall())
205  {
206  this->setModeToMessageSmall();
207  ui->form_StatusMessageSmall->setValue(message);
208  }
209  else
210  {
211  this->setModeToMessage();
212  ui->form_StatusMessage->setValue(message);
213  }
214  this->display(timeout);
215  }
216 
217  void COverlayMessages::showOverlayTextMessage(const CTextMessage &textMessage, std::chrono::milliseconds timeout)
218  {
219  if (textMessage.isEmpty()) { return; }
220  if (!this->displayTextMessage(textMessage)) { return; }
221  if (!sGui || sGui->isShuttingDown()) { return; }
222 
223  if (this->hasPendingConfirmation())
224  {
225  // defer message
226  QPointer<COverlayMessages> myself(this);
227  m_pendingMessageCalls.push_back([=]() {
228  if (!myself) { return; }
229  myself->showOverlayTextMessage(textMessage, timeout);
230  });
231  return;
232  }
233 
234  // do we support inline text messages, we use this one
235  const bool activatedText = ui->comp_OverlayTextMessage->isActivated();
236  if (activatedText)
237  {
238  if (textMessage.isPrivateMessage()) { this->showOverlayInlineTextMessage(textMessage.getSenderCallsign()); }
239  else
240  {
241  this->showOverlayInlineTextMessage(TextMessagesAll);
242  ui->comp_OverlayTextMessage->showCorrespondingTabForFrequency(textMessage.getFrequency());
243  }
244  }
245  else
246  {
247  // message and display
249  ui->le_TmFrom->setText(textMessage.getSenderCallsign().asString());
250  ui->le_TmTo->setText(textMessage.getRecipientCallsign().asString());
251  ui->le_TmReceived->setText(textMessage.getFormattedUtcTimestampHms());
252  ui->te_TmText->setText(textMessage.getMessage());
253  ui->wi_TmSupervisor->setVisible(textMessage.isSupervisorMessage());
254  ui->wi_TmSupervisor->setStyleSheet("background-color: red;");
255 
256  this->setModeToTextMessage();
257  this->display(timeout);
258  }
259  }
260 
262  {
263  ui->comp_OverlayTextMessage->setTab(tab);
264  ui->comp_OverlayTextMessage->updateAtcStationsButtons();
265  ui->comp_OverlayTextMessage->showTextMessageEntry(true);
267  this->display();
268  ui->comp_OverlayTextMessage->focusTextEntry();
269  }
270 
272  {
273  this->showOverlayInlineTextMessage(TextMessagesUnicom);
274  ui->comp_OverlayTextMessage->showCorrespondingTab(callsign);
275  }
276 
277  void COverlayMessages::showOverlayImage(const CPixmap &image, std::chrono::milliseconds timeout)
278  {
279  this->showOverlayImage(image.toPixmap(), timeout);
280  }
281 
282  void COverlayMessages::showOverlayImage(const QPixmap &image, std::chrono::milliseconds timeout)
283  {
284  if (this->hasPendingConfirmation())
285  {
286  // defer message
287  QPointer<COverlayMessages> myself(this);
288  m_pendingMessageCalls.push_back([=]() {
289  if (!myself) { return; }
290  myself->showOverlayImage(image, timeout);
291  });
292  return;
293  }
294 
295  this->setModeToImage();
296  QSize sizeAvailable = ui->fr_StatusMessagesComponentsInner->size();
297  if (sizeAvailable.width() < 300)
298  {
299  // first time inner frame is not giving correct size, workaround
300  sizeAvailable = this->size() * 0.9;
301  }
302 
303  ui->lbl_Image->setText("");
304  if (image.isNull())
305  {
306  static const QPixmap e;
307  ui->lbl_Image->setPixmap(e);
308  }
309  else { ui->lbl_Image->setPixmap(image.scaled(sizeAvailable, Qt::KeepAspectRatio, Qt::FastTransformation)); }
310  this->display(timeout);
311  }
312 
313  void COverlayMessages::showOverlayVariant(const CVariant &variant, std::chrono::milliseconds timeout)
314  {
315  if (variant.canConvert<CStatusMessageList>())
316  {
317  this->showOverlayMessages(variant.value<CStatusMessageList>(), true, timeout);
318  }
319  else if (variant.canConvert<CStatusMessage>())
320  {
321  this->showOverlayMessage(variant.value<CStatusMessage>(), timeout);
322  }
323  else if (variant.canConvert<CTextMessage>())
324  {
325  this->showOverlayTextMessage(variant.value<CTextMessage>(), timeout);
326  }
327  else if (variant.canConvert<QPixmap>()) { this->showOverlayImage(variant.value<QPixmap>(), timeout); }
328  else if (variant.canConvert<CPixmap>()) { this->showOverlayImage(variant.value<CPixmap>(), timeout); }
329  else { Q_ASSERT_X(false, Q_FUNC_INFO, "Unsupported type"); }
330  }
331 
332  void COverlayMessages::showHTMLMessage(const CStatusMessage &message, std::chrono::milliseconds timeout)
333  {
334  if (message.isEmpty()) { return; }
335  if (!sGui || sGui->isShuttingDown()) { return; }
336  this->showHTMLMessage(message.toHtml(true, true), timeout);
337  }
338 
339  void COverlayMessages::showHTMLMessage(const QString &htmlMessage, std::chrono::milliseconds timeout)
340  {
341  if (htmlMessage.isEmpty()) { return; }
342  if (!sGui || sGui->isShuttingDown()) { return; }
343 
344  if (this->hasPendingConfirmation())
345  {
346  // defer message
347  QPointer<COverlayMessages> myself(this);
348  m_pendingMessageCalls.push_back([=]() {
349  if (!myself) { return; }
350  myself->showHTMLMessage(htmlMessage, timeout);
351  });
352  return;
353  }
354 
355  this->setModeToHTMLMessage();
356  ui->te_HTMLMessage->setTextColor(QColor(Qt::white)); // hardcoded color
357  ui->te_HTMLMessage->setReadOnly(true);
358  ui->te_HTMLMessage->setText(htmlMessage);
359  this->display(timeout);
360  }
361 
362  void COverlayMessages::showDownloadProgress(int progress, qint64 current, qint64 max, const QUrl &url,
363  std::chrono::milliseconds timeout)
364  {
365  if (progress >= 0 && max >= 0)
366  {
367  static const QString m("%1 of %2 from '%3'");
368  this->showProgressBar(progress, m.arg(current).arg(max).arg(url.toString()), timeout);
369  }
370  else
371  {
372  static const QString m("%1 from '%2'");
373  this->showHTMLMessage(m.arg(current).arg(url.toString()), timeout);
374  }
375  }
376 
377  void COverlayMessages::showProgressBar(int percentage, const QString &message, std::chrono::milliseconds timeout)
378  {
379  if (message.isEmpty()) { return; }
380  if (!sGui || sGui->isShuttingDown()) { return; }
381  if (this->hasPendingConfirmation()) { return; } // ignore if something else is pending
382 
383  const int p = qMax(qMin(percentage, 100), 0);
384 
385  ui->pb_ProgressBar->setValue(p);
386  ui->lbl_ProgressBar->setText(message);
387  this->setModeToProgressBar();
388 
389  if (p >= 100) { this->close(); }
390  else { this->display(timeout); }
391  }
392 
394  {
395  ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_StatusMessages);
396  this->setHeader("Messages");
397  }
398 
400  {
401  ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_StatusMessage);
402  this->setHeader("Message");
403  }
404 
406  {
407  ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_StatusMessageSmall);
408  this->setHeader("Message");
409  }
410 
412  {
413  ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_HTMLMessage);
414  this->setHeader("Message");
415  }
416 
418  {
419  ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_ProgressBar);
420  this->setHeader("Progress bar");
421  }
422 
424  {
425  ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_TextMessage);
426  this->setHeader("Text message");
427  }
428 
430  {
431  ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_OverlayTextMessage);
432  this->setHeader("Text message");
433  }
434 
436  {
437  ui->comp_OverlayTextMessage->activate(activate, activate);
438  }
439 
440  bool COverlayMessages::isTextMessagesActivated() const { return ui->comp_OverlayTextMessage->isActivated(); }
441 
443  {
444  ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_Image);
445  this->setHeader("Image");
446  }
447 
448  void COverlayMessages::setConfirmationMessage(const QString &message)
449  {
450  if (message.isEmpty()) { ui->fr_Confirmation->setVisible(false); }
451  else
452  {
453  ui->fr_Confirmation->setVisible(true);
454  ui->lbl_Confirmation->setText(message);
455  }
456  }
457 
459  const CStatusMessageList &messages, bool appendOldMessages, const QString &confirmationMessage,
460  std::function<void()> okLambda, QMessageBox::StandardButton defaultButton, std::chrono::milliseconds timeout)
461  {
462  if (this->hasPendingConfirmation())
463  {
464  // defer message
465  QPointer<COverlayMessages> myself(this);
466  m_pendingMessageCalls.push_back([=]() {
467  if (!myself) { return; }
468  this->showOverlayMessagesWithConfirmation(messages, appendOldMessages, confirmationMessage, okLambda,
469  defaultButton, timeout);
470  });
471  return;
472  }
473  this->setConfirmationMessage(confirmationMessage);
474  this->setDefaultConfirmationButton(defaultButton);
475  this->showOverlayMessages(messages, appendOldMessages, timeout);
476  m_awaitingConfirmation = true; // needs to be after showOverlayMessages
477  m_okLambda = okLambda;
478  }
479 
480  void COverlayMessages::clearOverlayMessages() { ui->tvp_StatusMessages->clear(); }
481 
483  {
484  switch (button)
485  {
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;
493  break;
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;
501  break;
502  default: break;
503  }
504  }
505 
506  bool COverlayMessages::hasPendingConfirmation() const { return m_awaitingConfirmation; }
507 
509  {
510  ui->form_StatusMessage->setReducedInfo(reduced);
511  ui->form_StatusMessageSmall->setReducedInfo(reduced);
512  }
513 
514  void COverlayMessages::addShadow(QColor color)
515  {
516  QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
517  color.setAlpha(96);
518  shadow->setColor(color);
519  this->setGraphicsEffect(shadow);
520  }
521 
522  void COverlayMessages::keyPressEvent(QKeyEvent *event)
523  {
524  if (!this->isVisible()) { QFrame::keyPressEvent(event); }
525  if (event->key() == Qt::Key_Escape)
526  {
527  this->close();
528  event->accept();
529  }
530  else { QFrame::keyPressEvent(event); }
531  }
532 
534  {
535  this->hide();
536  this->setEnabled(false);
537  ui->fr_Confirmation->setVisible(false);
538  if (m_awaitingConfirmation) { emit this->confirmationCompleted(); }
539  else { m_lastConfirmation = QMessageBox::Cancel; }
540  m_awaitingConfirmation = false;
541  m_okLambda = nullptr;
542 
543  if (!m_pendingMessageCalls.isEmpty())
544  {
545  std::function<void()> f = m_pendingMessageCalls.constFirst();
546  m_pendingMessageCalls.removeFirst();
547  const QPointer<COverlayMessages> myself(this);
548  QTimer::singleShot(500, this, [=] {
549  if (!myself) { return; }
550  if (!sGui || sGui->isShuttingDown()) { return; }
551  f();
552  });
553  }
554  }
555 
556  void COverlayMessages::display(std::chrono::milliseconds timeout)
557  {
558  using namespace std::chrono_literals;
559  this->show();
560  this->raise();
561  this->setEnabled(true);
562  if (timeout > 250ms) { m_autoCloseTimer.start(timeout); }
563  else { m_autoCloseTimer.stop(); }
564  }
565 } // namespace swift::gui
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.
Definition: pixmap.h:28
QPixmap toPixmap() const
Corresponding pixmap.
Definition: pixmap.cpp:65
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
reference front()
Access the first element.
Definition: sequence.h:225
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
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...
Definition: variant.h:66
T value() const
Return the value converted to the type T.
Definition: variant.h:169
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.
Definition: callsign.h:30
const QString & asString() const
Get callsign (normalized)
Definition: callsign.h:96
Value object encapsulating information of a text message.
Definition: textmessage.h:31
bool isPrivateMessage() const
Is private message?
Definition: textmessage.cpp:53
bool isEmpty() const
Empty message.
Definition: textmessage.h:90
const QString & getMessage() const
Get message.
Definition: textmessage.h:78
const aviation::CCallsign & getSenderCallsign() const
Get callsign (from)
Definition: textmessage.h:54
const aviation::CCallsign & getRecipientCallsign() const
Get callsign (to)
Definition: textmessage.h:60
const physical_quantities::CFrequency & getFrequency() const
Get frequency.
Definition: textmessage.h:96
bool isSupervisorMessage() const
Supervisor message?
Definition: textmessage.cpp:58
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.
Definition: actionbind.cpp:7
High level reusable GUI components.
Definition: aboutdialog.cpp:13
Models to be used with views, mainly QTableView.
Views, mainly QTableView.
GUI related classes.
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...
Definition: threadutils.h:30