importantmessageswidget.cpp
1 //------------------------------------------------------------------------------
2 // importantmessageswidget.cpp
3 //
4 // Copyright (C) 2011 "Zalewa" <zalewapl@gmail.com>
5 //------------------------------------------------------------------------------
6 #include "importantmessageswidget.h"
7 
8 #include <QDateTime>
9 #include "ui_importantmessageswidget.h"
10 #include <QLabel>
11 #include <QVBoxLayout>
12 
13 DClass<ImportantMessagesWidget> : public Ui::ImportantMessagesWidget
14 {
15 public:
16  class MessageLabel
17  {
18  public:
19  MessageLabel(QLabel* pLabel)
20  {
21  this->pLabel = pLabel;
22  this->timeCreated = QDateTime::currentDateTime();
23  }
24 
25  QLabel* pLabel;
26  QDateTime timeCreated;
27  };
28 
29  static const unsigned DEFAULT_MAX_MESSAGES = 0;
30  static const int MAX_MSG_KEEP_TIME_SEC = 10;
31 
32  QList<MessageLabel> labelWidgets;
33  int maxMessages;
34 };
35 
36 DPointered(ImportantMessagesWidget)
37 
39 : QWidget(pParent)
40 {
42  d->setupUi(this);
43 
44  this->hide();
45 }
46 
47 ImportantMessagesWidget::~ImportantMessagesWidget()
48 {
49 }
50 
51 void ImportantMessagesWidget::addMessage(const QString& message)
52 {
53  addMessage(message, QDateTime());
54 }
55 
56 void ImportantMessagesWidget::addMessage(const QString& message, const QDateTime& dateTime)
57 {
58  QString strTimestamp = "";
59  if (dateTime.isValid())
60  {
61  strTimestamp = dateTime.toString("[hh:mm:ss]") + " ";
62  }
63 
64  QString formattedMessage = "<p>" + strTimestamp + message + "</p>";
65 
66  QFont font;
67  font.setPointSize(qMax(1, font.pointSize() - 1));
68 
69  QLabel* pNewLabel = new QLabel(this);
70  pNewLabel->setFont(font);
71  pNewLabel->setText(formattedMessage);
72  pNewLabel->setTextInteractionFlags(pNewLabel->textInteractionFlags()
73  | Qt::TextSelectableByMouse);
74  pNewLabel->setWordWrap(true);
75 
76  d->labelWidgets << PrivData<ImportantMessagesWidget>::MessageLabel(pNewLabel);
77  d->messageLayout->addWidget(pNewLabel);
78 
79  // Remember that widget may be auto-hidden.
80  this->show();
81 
82  // Do not forget co clear oldest widgets if necessary.
83  dropOldWidgetsIfBeyondLimit();
84 }
85 
86 void ImportantMessagesWidget::addMessage(const QString& message, unsigned timestamp)
87 {
88  addMessage(message, QDateTime::fromTime_t(timestamp));
89 }
90 
92 {
93  while (!d->labelWidgets.isEmpty())
94  {
95  removeOneOldest();
96  }
97 }
98 
99 void ImportantMessagesWidget::dropOldWidgetsIfBeyondLimit()
100 {
101  while (d->labelWidgets.size() > d->maxMessages)
102  {
103  PrivData<ImportantMessagesWidget>::MessageLabel& oldestLabel = d->labelWidgets.first();
104  int timeDifference = oldestLabel.timeCreated.secsTo(QDateTime::currentDateTime());
105 
107  {
108  removeOneOldest();
109  }
110  else
111  {
112  // Exit the loop as no message is old enough to be dropped.
113  // Messages are ordered in chronological order.
114  break;
115  }
116  }
117 }
118 
120 {
121  if (num >= d->labelWidgets.size())
122  {
123  clear();
124  }
125  else
126  {
127  for (; num > 0; --num)
128  {
129  removeOneOldest();
130  }
131  }
132 }
133 
135 {
136  if (!d->labelWidgets.isEmpty())
137  {
138  delete d->labelWidgets.takeFirst().pLabel;
139 
140  if (d->labelWidgets.isEmpty())
141  {
142  // Auto-hide when there is nothing to show.
143  hide();
144  }
145  }
146 }
147 
149 {
150  return d->maxMessages;
151 }
152 
153 void ImportantMessagesWidget::setMaxMessages(unsigned num)
154 {
155  d->maxMessages = num;
156 }
void addMessage(const QString &message)
Adds a new message without a timestamp.
void removeOneOldest()
Will remove one oldest message.
A self-scaling widget that displays messages as separate instances of QLabel.
unsigned maxMessages() const
Amount of messages that can be displayed in the widget at the same time.
void clear()
Clears all messages from the widghet.
Definition: dptr.h:31
void removeOldest(int num)
Removes a number of oldest messages from the widget.