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"