File indexing completed on 2024-04-28 03:51:17

0001 /*.
0002     SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "messageframe.h"
0008 
0009 #include <QHBoxLayout>
0010 #include <QIcon>
0011 #include <QLabel>
0012 #include <QSignalMapper>
0013 #include <QTimer>
0014 #include <QToolButton>
0015 #include <QVBoxLayout>
0016 
0017 MessageFrame::MessageFrame(QWidget* parent)
0018     : QFrame(parent), _lastId(0)
0019 {
0020     hide();
0021 
0022     int br, bg, bb;
0023     setFrameShape(QFrame::StyledPanel);
0024     palette().color(QPalette::Window).getRgb(&br, &bg, &bb);
0025     setStyleSheet(QString(".MessageFrame {border: 2px solid rgba(133,133,133,85%);"
0026         "border-radius: 6px; background-color: rgba(%1,%2,%3,85%);}").arg(br).arg(bg).arg(bb));
0027 
0028     _layout = new QVBoxLayout(this);
0029     _layout->setContentsMargins(9,0,9,0);
0030     _layout->setSpacing(0);
0031     _layout->setSizeConstraint(QLayout::SetFixedSize);
0032 }
0033 
0034 int MessageFrame::showMessage(Type type, const QString& text, Flags flags)
0035 {
0036     if(_layout->count() != 0) {
0037         QFrame* line = new QFrame(this);
0038         line->setFrameShape(QFrame::HLine);
0039         line->setFrameShadow(QFrame::Sunken);
0040         _layout->addWidget(line);
0041     }
0042 
0043     QString widgetName(QStringLiteral("message"));
0044     widgetName.append(QString::number(_lastId));
0045 
0046     QWidget* widget = new QWidget(this);
0047     widget->setObjectName(widgetName);
0048     widget->setMinimumHeight(32);
0049 
0050     QHBoxLayout* layout = new QHBoxLayout(widget);
0051     layout->setContentsMargins(0,2,0,2);
0052 
0053     QLabel* iconLabel = new QLabel(widget);
0054     iconLabel->setObjectName(QStringLiteral("iconLabel"));
0055     if(type == Error) iconLabel->setPixmap(QIcon::fromTheme(QStringLiteral("dialog-error")).pixmap(16,16));
0056     else if(type == Warning) iconLabel->setPixmap(QIcon::fromTheme(QStringLiteral("dialog-warning")).pixmap(16,16));
0057     else iconLabel->setPixmap(QIcon::fromTheme(QStringLiteral("dialog-information")).pixmap(16,16));
0058     layout->addWidget(iconLabel);
0059 
0060     QLabel* textLabel = new QLabel(widget);
0061     textLabel->setObjectName(QStringLiteral("textLabel"));
0062     //textLabel->setWordWrap(true);
0063     textLabel->setText(text);
0064     layout->addWidget(textLabel, 1);
0065 
0066     connect(textLabel, &QLabel::linkActivated,
0067                 this, &MessageFrame::messageLinkActivated);
0068 
0069     if(flags.testFlag(CloseButton)) {
0070         QToolButton* button = new QToolButton(widget);
0071         button->setObjectName(QStringLiteral("closeButton"));
0072         button->setIcon(QIcon::fromTheme(QStringLiteral("window-close")));
0073         button->setIconSize(QSize(16,16));
0074         button->setAutoRaise(true);
0075         layout->addWidget(button);
0076 
0077         connect(button, &QToolButton::clicked, this, [this, widget](){ messageCloseClicked(widget); });
0078     }
0079 
0080     if(flags.testFlag(CloseTimer)) {
0081         QTimer* timer = new QTimer(widget);
0082         timer->setObjectName(QStringLiteral("closeTimer"));
0083         timer->setSingleShot(true);
0084         timer->setInterval(2000);
0085 
0086         connect(timer, &QTimer::timeout, this, [this, widget](){ messageCloseClicked(widget); });
0087         timer->start();
0088     }
0089 
0090     _layout->addWidget(widget);
0091     if(!isVisible()) show();
0092 
0093     return _lastId++;
0094 }
0095 
0096 int MessageFrame::changeMessage(int id, Type type, const QString& text, Flags flags)
0097 {
0098     QString widgetName(QStringLiteral("message"));
0099     widgetName.append(QString::number(id));
0100     QWidget* widget = findChild<QWidget*>(widgetName);
0101     if(widget) messageCloseClicked(widget);
0102     return showMessage(type, text, flags);
0103 }
0104 
0105 void MessageFrame::closeMessage(int id)
0106 {
0107     QString widgetName(QStringLiteral("message"));
0108     widgetName.append(QString::number(id));
0109     QWidget* widget = findChild<QWidget*>(widgetName);
0110     if(widget) messageCloseClicked(widget);
0111 }
0112     
0113 void MessageFrame::messageLinkActivated(const QString& link)
0114 {
0115     emit linkActivated(link);
0116 }
0117 
0118 void MessageFrame::messageCloseClicked(QWidget* widget)
0119 {
0120     int index = _layout->indexOf(widget);
0121     if(index < 0) return;
0122 
0123     _layout->itemAt(index)->widget()->hide();
0124     _layout->takeAt(index)->widget()->deleteLater();
0125     if(index > 0) {
0126         _layout->itemAt(index-1)->widget()->hide();
0127         _layout->takeAt(index-1)->widget()->deleteLater();
0128     } else if(_layout->count() > 0) {
0129         _layout->itemAt(0)->widget()->hide();
0130         _layout->takeAt(0)->widget()->deleteLater();
0131     }
0132 
0133     if(_layout->count() == 0) hide();
0134 }
0135 
0136 #include "moc_messageframe.cpp"