23 #include "importantmessageswidget.h"
25 #include "ui_importantmessageswidget.h"
26 #include "gui/icons.h"
30 #include <QVBoxLayout>
33 DClass<ImportantMessagesWidget> :
public Ui::ImportantMessagesWidget
39 MessageLabel(QLabel *pLabel)
41 this->pLabel = pLabel;
42 this->timeCreated = QDateTime::currentDateTime();
46 QDateTime timeCreated;
52 Handler(QPointer<::ImportantMessagesWidget> container, QPointer<QLabel> label,
53 std::function<
void(QLabel *label)> remover)
54 : container(container), label(label), remover(remover)
58 void remove()
override
60 if (container !=
nullptr && label !=
nullptr)
62 remover(label.data());
67 QPointer<::ImportantMessagesWidget> container;
68 QPointer<QLabel> label;
69 std::function<void(QLabel *label)> remover;
72 static const unsigned DEFAULT_MAX_MESSAGES = 0;
73 static const int MAX_MSG_KEEP_TIME_SEC = 10;
75 QList<MessageLabel> labelWidgets;
91 ImportantMessagesWidget::~ImportantMessagesWidget()
96 const QString &message)
102 const QString &message,
const QDateTime &dateTime)
104 QString strTimestamp =
"";
105 if (dateTime.isValid())
106 strTimestamp = dateTime.toString(
"[hh:mm:ss]") +
" ";
108 QString formattedMessage =
"<p>" + strTimestamp + message +
"</p>";
110 QLabel *pNewLabel =
new QLabel(
this);
111 pNewLabel->setText(formattedMessage);
112 pNewLabel->setTextInteractionFlags(pNewLabel->textInteractionFlags()
113 | Qt::TextSelectableByMouse);
114 pNewLabel->setCursor(Qt::IBeamCursor);
115 pNewLabel->setWordWrap(
true);
117 auto handler = QSharedPointer<PrivData<ImportantMessagesWidget>::Handler>::create(
118 QPointer<ImportantMessagesWidget>(
this), QPointer<QLabel>(pNewLabel),
119 [
this](QLabel *label){
remove(label); });
122 d->messageLayout->addWidget(pNewLabel);
128 dropOldWidgetsIfBeyondLimit();
133 const QString &message,
unsigned timestamp)
135 #if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)
136 return addMessage(message, QDateTime::fromSecsSinceEpoch(timestamp));
138 return addMessage(message, QDateTime::fromTime_t(timestamp));
144 while (!d->labelWidgets.isEmpty())
150 void ImportantMessagesWidget::dropOldWidgetsIfBeyondLimit()
152 while (d->labelWidgets.size() > d->maxMessages)
155 int timeDifference = oldestLabel.timeCreated.secsTo(QDateTime::currentDateTime());
170 if (num >= d->labelWidgets.size())
174 for (; num > 0; --num)
181 if (!d->labelWidgets.isEmpty())
183 remove(d->labelWidgets.first().pLabel);
187 void ImportantMessagesWidget::remove(QLabel *label)
189 if (label !=
nullptr)
191 for (
auto it = d->labelWidgets.begin(); it != d->labelWidgets.end(); ++it)
193 if (it->pLabel == label)
196 d->labelWidgets.erase(it);
201 if (d->labelWidgets.isEmpty())
210 return d->maxMessages;
213 void ImportantMessagesWidget::setMaxMessages(
unsigned num)
215 d->maxMessages = num;