diff --git a/src/blackgui/components/textmessagecomponent.cpp b/src/blackgui/components/textmessagecomponent.cpp index 7898e39db..dcc55eb9f 100644 --- a/src/blackgui/components/textmessagecomponent.cpp +++ b/src/blackgui/components/textmessagecomponent.cpp @@ -152,6 +152,14 @@ namespace BlackGui } } + void CTextMessageComponent::selectTabWidget(const CCallsign &callsign, bool addIfNotExisting) + { + QWidget *tab = this->findTextMessageTabByCallsign(callsign); + if (!tab && addIfNotExisting) { tab = this->addNewTextMessageTab(callsign); } + if (!tab) { return; } + ui->tw_TextMessages->setCurrentWidget(tab); + } + bool CTextMessageComponent::isCloseableTab(const QWidget *tabWidget) const { if (!tabWidget) { return false; } @@ -601,11 +609,13 @@ namespace BlackGui void CTextMessageComponent::onTextMessageReceived(const CTextMessageList &messages) { + if (!m_activeReceive) { return; } this->displayTextMessage(messages); } void CTextMessageComponent::onTextMessageSent(const CTextMessage &sentMessage) { + if (!m_activeSend) { return; } this->displayTextMessage(sentMessage); } @@ -644,7 +654,9 @@ namespace BlackGui } if (!w) { return; } ui->tw_TextMessages->setCurrentWidget(w); - this->displayMyself(); + + // force display + if (!m_usedAsOverlayWidget) { this->displayMyself(); } } void CTextMessageComponent::fontSizeMinus() diff --git a/src/blackgui/components/textmessagecomponent.h b/src/blackgui/components/textmessagecomponent.h index 527681c39..53dfe0787 100644 --- a/src/blackgui/components/textmessagecomponent.h +++ b/src/blackgui/components/textmessagecomponent.h @@ -87,6 +87,12 @@ namespace BlackGui //! Used as overlay and not dock widget void setAsUsedInOverlayMode() { m_usedAsOverlayWidget = true; } + //! Ignore incoming send/receive signals + void activate(bool send, bool receive) { m_activeSend = send; m_activeReceive = receive; } + + //! Text activated + bool isActivated() const { return m_activeSend && m_activeReceive; } + //! Rows/columns void setAtcButtonsRowsColumns(int rows, int cols, bool setMaxElements); @@ -107,8 +113,10 @@ namespace BlackGui QScopedPointer ui; BlackMisc::CIdentifier m_identifier { "TextMessageComponent", this }; BlackMisc::CSetting m_messageSettings { this, &CTextMessageComponent::onSettingsChanged }; - BlackMisc::CSetting m_audioSettings { this }; + BlackMisc::CSetting m_audioSettings { this }; bool m_usedAsOverlayWidget = false; //!< disables dockwidget parts if used as overlay widget + bool m_activeSend = true; //!< ignore sent callback + bool m_activeReceive = true; //!< ignore received messages //! Enum to widget QWidget *getTabWidget(TextMessageTab tab) const; @@ -119,6 +127,9 @@ namespace BlackGui //! Select given tab void selectTabWidget(TextMessageTab tab); + //! Select tab by callsign (for private messages) + void selectTabWidget(const BlackMisc::Aviation::CCallsign &callsign, bool addIfNotExisting); + //! Is that a closeable tab (one the user can close) bool isCloseableTab(const QWidget *tabWidget) const; diff --git a/src/blackgui/overlaymessages.cpp b/src/blackgui/overlaymessages.cpp index 07917691f..c2ac75ebb 100644 --- a/src/blackgui/overlaymessages.cpp +++ b/src/blackgui/overlaymessages.cpp @@ -38,6 +38,7 @@ #include using namespace BlackMisc; +using namespace BlackMisc::Aviation; using namespace BlackMisc::Network; using namespace BlackMisc::Simulation; using namespace BlackCore; @@ -67,6 +68,7 @@ namespace BlackGui ui->comp_OverlayTextMessage->showSettings(false); ui->comp_OverlayTextMessage->showTextMessageEntry(true); ui->comp_OverlayTextMessage->setAsUsedInOverlayMode(); + ui->comp_OverlayTextMessage->activate(false, false); // per default ignore incoming/outgoing text messages ui->comp_OverlayTextMessage->removeAllMessagesTab(); ui->comp_OverlayTextMessage->setAtcButtonsRowsColumns(2, 3, true); ui->comp_OverlayTextMessage->setAtcButtonsBackgroundUpdates(false); @@ -88,9 +90,15 @@ namespace BlackGui void COverlayMessages::init(int w, int h) { ui->setupUi(this); + if (this->parent() && !this->parent()->objectName().isEmpty()) + { + const QString n("Overlay messages for " + this->parent()->objectName()); + this->setObjectName(n); + } + this->resize(w, h); this->setAutoFillBackground(true); - m_autoCloseTimer.setObjectName(objectName() % ":autoCloseTimer"); + m_autoCloseTimer.setObjectName(this->objectName() % ":autoCloseTimer"); ui->tvp_StatusMessages->setMode(CStatusMessageListModel::Simplified); connect(ui->tb_Close, &QToolButton::released, this, &COverlayMessages::close); connect(&m_autoCloseTimer, &QTimer::timeout, this, &COverlayMessages::close); @@ -188,7 +196,7 @@ namespace BlackGui this->display(timeOutMs); } - void COverlayMessages::showOverlayMessage(const BlackMisc::CStatusMessage &message, int timeOutMs) + void COverlayMessages::showOverlayMessage(const CStatusMessage &message, int timeOutMs) { if (message.isEmpty()) { return; } if (!sGui || sGui->isShuttingDown()) { return; } @@ -259,6 +267,12 @@ namespace BlackGui ui->comp_OverlayTextMessage->focusTextEntry(); } + void COverlayMessages::showOverlayInlineTextMessage(const CCallsign &callsign) + { + this->showOverlayInlineTextMessage(Components::TextMessagesUnicom); + ui->comp_OverlayTextMessage->showCorrespondingTab(callsign); + } + void COverlayMessages::showOverlayImage(const CPixmap &image, int timeOutMs) { this->showOverlayImage(image.toPixmap(), timeOutMs); @@ -442,6 +456,18 @@ namespace BlackGui this->showKill(false); } + void COverlayMessages::setModeToOverlayTextMessage() + { + ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_OverlayTextMessage); + this->setHeader("Text message"); + this->showKill(false); + } + + void COverlayMessages::activateTextMessages(bool activate) + { + ui->comp_OverlayTextMessage->activate(activate, activate); + } + void COverlayMessages::setModeToImage() { ui->sw_StatusMessagesComponent->setCurrentWidget(ui->pg_Image); diff --git a/src/blackgui/overlaymessages.h b/src/blackgui/overlaymessages.h index 789317cc9..367c7dbfd 100644 --- a/src/blackgui/overlaymessages.h +++ b/src/blackgui/overlaymessages.h @@ -15,9 +15,10 @@ #include "blackgui/components/textmessagecomponenttab.h" #include "blackgui/settings/textmessagesettings.h" #include "blackgui/blackguiexport.h" -#include "blackmisc/pixmap.h" -#include "blackmisc/statusmessage.h" +#include "blackmisc/aviation/callsign.h" #include "blackmisc/statusmessagelist.h" +#include "blackmisc/statusmessage.h" +#include "blackmisc/pixmap.h" #include "blackmisc/variant.h" #include @@ -32,8 +33,8 @@ class QKeyEvent; class QPaintEvent; class QPixmap; -namespace BlackMisc { namespace Network { class CTextMessage; } } namespace Ui { class COverlayMessages; } +namespace BlackMisc { namespace Network { class CTextMessage; } } namespace BlackGui { /*! @@ -68,9 +69,15 @@ namespace BlackGui //! Progress bar void setModeToProgressBar(bool withKillButton = false); - //! Single Text message mode + //! Single text message mode void setModeToTextMessage(); + //! Inline text message + void setModeToOverlayTextMessage(); + + //! Active send/receive of text messages + void activateTextMessages(bool activate); + //! Display image void setModeToImage(); @@ -105,7 +112,10 @@ namespace BlackGui void showOverlayTextMessage(const BlackMisc::Network::CTextMessage &textMessage, int timeOutMs = -1); //! Inline text message - void showOverlayInlineTextMessage(BlackGui::Components::TextMessageTab tab); + void showOverlayInlineTextMessage(Components::TextMessageTab tab); + + //! Inline text message + void showOverlayInlineTextMessage(const BlackMisc::Aviation::CCallsign &callsign); //! Image void showOverlayImage(const BlackMisc::CPixmap &image, int timeOutMs = -1); @@ -161,10 +171,10 @@ namespace BlackGui QScopedPointer ui; BlackMisc::CSettingReadOnly m_messageSettings { this }; QString m_header; - int m_lastConfirmation = QMessageBox::Cancel; + int m_lastConfirmation = QMessageBox::Cancel; bool m_awaitingConfirmation = false; - bool m_hasKillButton = false; - bool m_forceSmall = false; + bool m_hasKillButton = false; + bool m_forceSmall = false; QTimer m_autoCloseTimer { this }; std::function m_okLambda; //!< called when confirmed as "OK" QList> m_pendingMessageCalls; diff --git a/src/blackgui/overlaymessagesframe.h b/src/blackgui/overlaymessagesframe.h index 067f05464..f33f9ff2b 100644 --- a/src/blackgui/overlaymessagesframe.h +++ b/src/blackgui/overlaymessagesframe.h @@ -47,6 +47,27 @@ namespace BlackGui //! Destructor virtual ~COverlayMessagesBase() override { } + //! Init, normally we use lazy init, but by calling init explicitly we can force initalization + //! \remark usefule for text messages, as history will be already available + void initOverlayMessages(QSize inner = {}) + { + if (m_overlayMessages) { return; } + if (inner.isNull()) { inner = this->innerFrameSize(); } + + m_overlayMessages = new COverlayMessages(inner.width(), inner.height(), this); + m_overlayMessages->hide(); + m_overlayMessages->showKillButton(m_showKillButton); + m_overlayMessages->setForceSmall(m_forceSmallMsgs); + m_overlayMessages->setReducedInfo(m_reducedInfo); + } + + //! \copydoc BlackGui::COverlayMessages::activateTextMessages + void activateTextMessages(bool activate) + { + this->initOverlayMessages(); + m_overlayMessages->activateTextMessages(activate); + } + //! Show the inner frame void showStatusMessagesFrame() { @@ -196,6 +217,14 @@ namespace BlackGui WIDGET::repaint(); } + //! \copydoc BlackGui::COverlayMessages::showOverlayImage + void showOverlayInlineTextMessage(const BlackMisc::Aviation::CCallsign &callsign) + { + this->initInnerFrame(0.75, 0.75); + m_overlayMessages->showOverlayInlineTextMessage(callsign); + WIDGET::repaint(); + } + protected: COverlayMessages *m_overlayMessages = nullptr; //!< embedded QFrame with status messages @@ -214,11 +243,7 @@ namespace BlackGui if (!m_overlayMessages) { // lazy init - m_overlayMessages = new COverlayMessages(inner.width(), inner.height(), this); - // m_overlayMessages->addShadow(); - m_overlayMessages->showKillButton(m_showKillButton); - m_overlayMessages->setForceSmall(m_forceSmallMsgs); - m_overlayMessages->setReducedInfo(m_reducedInfo); + this->initOverlayMessages(inner); } Q_ASSERT(m_overlayMessages); @@ -229,6 +254,7 @@ namespace BlackGui const int x = middle.x() - w / 2; const int y = qRound(middle.y() - h / m_middleFactor); m_overlayMessages->setGeometry(x, y, w, h); + m_overlayMessages->setVisible(true); } //! Init a minimal frame (smaller as the normal one)