Ref T506, allow to init overlay messages, passivate text messages, improved tab widget selection

This commit is contained in:
Klaus Basan
2019-01-06 11:19:43 +01:00
committed by Mat Sutcliffe
parent 419f8c0907
commit f6ce579f67
5 changed files with 102 additions and 17 deletions

View File

@@ -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()

View File

@@ -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::CTextMessageComponent> ui;
BlackMisc::CIdentifier m_identifier { "TextMessageComponent", this };
BlackMisc::CSetting<Settings::TextMessageSettings> m_messageSettings { this, &CTextMessageComponent::onSettingsChanged };
BlackMisc::CSetting<BlackMisc::Audio::TSettings> m_audioSettings { this };
BlackMisc::CSetting<BlackMisc::Audio::TSettings> 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;

View File

@@ -38,6 +38,7 @@
#include <QPointer>
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);

View File

@@ -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 <QFrame>
@@ -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::COverlayMessages> ui;
BlackMisc::CSettingReadOnly<Settings::TextMessageSettings> 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<void()> m_okLambda; //!< called when confirmed as "OK"
QList<std::function<void()>> m_pendingMessageCalls;

View File

@@ -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)