00001 #include "atitlewidget.h"
00002
00003 #include <QTimer>
00004 #include <QMouseEvent>
00005 #include <QFrame>
00006 #include <QLabel>
00007 #include <QLayout>
00008 #include <QTextDocument>
00009 #include <QIcon>
00010
00011 class ATitleWidget::Private
00012 {
00013 public:
00014 Private(ATitleWidget* parent) : q(parent)
00015 {
00016 }
00017
00018 ATitleWidget* q;
00019 QGridLayout *headerLayout;
00020 QLabel *imageLabel;
00021 QLabel *textLabel;
00022 QLabel *commentLabel;
00023
00029 QString iconTypeToIconName(ATitleWidget::MessageType type);
00030 };
00031
00032 QString ATitleWidget::Private::iconTypeToIconName(ATitleWidget::MessageType type)
00033 {
00034 switch (type)
00035 {
00036 case ATitleWidget::InfoMessage:
00037 return QLatin1String("dialog-information");
00038 break;
00039 case ATitleWidget::ErrorMessage:
00040 return QLatin1String("dialog-error");
00041 break;
00042 case ATitleWidget::WarningMessage:
00043 return QLatin1String("dialog-warning");
00044 break;
00045 case ATitleWidget::PlainMessage:
00046 break;
00047 }
00048
00049 return QString();
00050 }
00051
00052 ATitleWidget::ATitleWidget(QWidget *parent) : QWidget(parent), d(new Private(this))
00053 {
00054 QFrame *titleFrame = new QFrame(this);
00055 titleFrame->setAutoFillBackground(true);
00056 titleFrame->setFrameShape(QFrame::StyledPanel);
00057 titleFrame->setFrameShadow(QFrame::Plain);
00058 titleFrame->setBackgroundRole(QPalette::Base);
00059
00060
00061 d->headerLayout = new QGridLayout(titleFrame);
00062 d->headerLayout->setColumnStretch(0, 1);
00063 d->headerLayout->setMargin(6);
00064
00065 d->textLabel = new QLabel(titleFrame);
00066 d->textLabel->setVisible(false);
00067 d->textLabel->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse);
00068
00069 d->imageLabel = new QLabel(titleFrame);
00070 d->imageLabel->setVisible(false);
00071
00072 d->headerLayout->addWidget(d->textLabel, 0, 0);
00073 d->headerLayout->addWidget(d->imageLabel, 0, 1, 1, 2);
00074
00075 d->commentLabel = new QLabel(titleFrame);
00076 d->commentLabel->setVisible(false);
00077 d->commentLabel->setOpenExternalLinks(true);
00078 d->commentLabel->setWordWrap(true);
00079 d->commentLabel->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse);
00080 d->headerLayout->addWidget(d->commentLabel, 1, 0);
00081
00082
00083
00084 QVBoxLayout *mainLayout = new QVBoxLayout(this);
00085 mainLayout->addWidget(titleFrame);
00086 mainLayout->setMargin(0);
00087 setLayout(mainLayout);
00088 }
00089
00090 ATitleWidget::~ATitleWidget()
00091 {
00092 delete d;
00093 }
00094
00095 void ATitleWidget::setWidget(QWidget *widget)
00096 {
00097 d->headerLayout->addWidget(widget, 2, 0, 1, 2);
00098 }
00099
00100 QString ATitleWidget::text() const
00101 {
00102 return d->textLabel->text();
00103 }
00104
00105 QString ATitleWidget::comment() const
00106 {
00107 return d->commentLabel->text();
00108 }
00109
00110 const QPixmap *ATitleWidget::pixmap() const
00111 {
00112 return d->imageLabel->pixmap();
00113 }
00114
00115 void ATitleWidget::setBuddy(QWidget *buddy)
00116 {
00117 d->textLabel->setBuddy(buddy);
00118 }
00119
00120 void ATitleWidget::changeEvent(QEvent *e)
00121 {
00122 QWidget::changeEvent(e);
00123 if (e->type() == QEvent::PaletteChange)
00124 {
00125 d->textLabel->setStyleSheet(d->textLabel->styleSheet());
00126 d->commentLabel->setStyleSheet(d->commentLabel->styleSheet());
00127 }
00128 }
00129
00130 void ATitleWidget::setText(const QString &text, Qt::Alignment alignment)
00131 {
00132 d->textLabel->setVisible(!text.isNull());
00133
00134 if (!Qt::mightBeRichText(text))
00135 {
00136 d->textLabel->setStyleSheet("QLabel { font-weight: bold; }");
00137 }
00138
00139 d->textLabel->setText(text);
00140 d->textLabel->setAlignment(alignment);
00141 show();
00142 }
00143
00144 void ATitleWidget::setText(const QString &text, MessageType type)
00145 {
00146 setText(text);
00147 setPixmap(type);
00148 }
00149
00150 void ATitleWidget::setComment(const QString &comment, MessageType type)
00151 {
00152 d->commentLabel->setVisible(!comment.isNull());
00153
00154 QString styleSheet;
00155 switch (type)
00156 {
00157
00158
00159
00160
00161 case InfoMessage:
00162 case WarningMessage:
00163 case ErrorMessage:
00164 styleSheet = QString("QLabel { color: palette(highlighted-text); background: palette(highlight); }");
00165 break;
00166 case PlainMessage:
00167 default:
00168 break;
00169 }
00170
00171
00172 d->commentLabel->setStyleSheet(styleSheet);
00173 d->commentLabel->setText(comment);
00174 show();
00175 }
00176
00177 void ATitleWidget::setPixmap(const QPixmap &pixmap, ImageAlignment alignment)
00178 {
00179 d->imageLabel->setVisible(!pixmap.isNull());
00180
00181 d->headerLayout->removeWidget(d->textLabel);
00182 d->headerLayout->removeWidget(d->commentLabel);
00183 d->headerLayout->removeWidget(d->imageLabel);
00184
00185 if (alignment == ImageLeft)
00186 {
00187
00188 d->headerLayout->addWidget(d->imageLabel, 0, 0, 2, 1);
00189 d->headerLayout->addWidget(d->textLabel, 0, 1);
00190 d->headerLayout->addWidget(d->commentLabel, 1, 1);
00191 d->headerLayout->setColumnStretch(0, 0);
00192 d->headerLayout->setColumnStretch(1, 1);
00193 }
00194 else
00195 {
00196 d->headerLayout->addWidget(d->textLabel, 0, 0);
00197 d->headerLayout->addWidget(d->commentLabel, 1, 0);
00198 d->headerLayout->addWidget(d->imageLabel, 0, 1, 2, 1);
00199 d->headerLayout->setColumnStretch(1, 0);
00200 d->headerLayout->setColumnStretch(0, 1);
00201 }
00202
00203 d->imageLabel->setPixmap(pixmap);
00204 }
00205
00206
00207 void ATitleWidget::setPixmap(const QString &icon, ImageAlignment alignment)
00208 {
00209 setPixmap(QIcon(icon), alignment);
00210 }
00211
00212 void ATitleWidget::setPixmap(const QIcon& icon, ImageAlignment alignment)
00213 {
00214 setPixmap(icon.pixmap(QSize(64,64)), alignment);
00215 }
00216
00217 void ATitleWidget::setPixmap(MessageType type, ImageAlignment alignment)
00218 {
00219 setPixmap(QIcon(), alignment);
00220 }