25 #include <kdeversion.h> 26 #include <QtGui/QClipboard> 27 #include <QtGui/QImage> 28 #include <QtGui/QLabel> 29 #include <QtCore/QDebug> 30 #include <QtGui/QLayout> 31 #include <QtCore/QObject> 32 #include <QtGui/QPainter> 33 #include <QtCore/QRect> 34 #include <QtGui/QTabWidget> 35 #include <QtGui/QTabBar> 36 #include <QScrollArea> 37 #include <QtGui/QApplication> 38 #include <QtGui/QTextBrowser> 39 #include <QtGui/QStyle> 52 #define WORKTEXT_IDENTATION 16 57 #include "k3aboutdialog.moc" 58 #include "k3aboutdialog_p.moc" 61 class K3AboutContributor::Private
78 void K3AboutContributor::Private::updateLayout()
80 delete parent->layout();
83 if (!text[0]->text().isEmpty()) { ++row; }
84 if (!text[1]->text().isEmpty()) { ++row; }
85 if (!text[2]->text().isEmpty()) { ++row; }
86 if (!text[3]->text().isEmpty()) { ++row; }
91 gbox =
new QGridLayout(parent);
93 for (
int i=0; i<4; ++i)
101 if (text[0]->text().isEmpty() && !showHeader)
103 gbox =
new QGridLayout(parent);
104 gbox->setMargin(parent->frameWidth()+1);
109 gbox =
new QGridLayout(parent);
110 gbox->setMargin(parent->frameWidth()+1);
116 gbox->setColumnStretch(1, 10);
119 for (
int i=0, r=0; i<4; ++i)
121 label[i]->setFixedHeight(parent->fontMetrics().lineSpacing());
124 text[i]->setFixedHeight(parent->fontMetrics().lineSpacing());
127 if (!text[i]->text().isEmpty())
131 gbox->addWidget(
label[i], r, 0, Qt::AlignLeft);
132 gbox->addWidget(text[i], r, 1, Qt::AlignLeft );
141 gbox->addWidget(text[i], r, 0, 1, 2, Qt::AlignLeft);
145 gbox->addWidget(text[i], r, 1, Qt::AlignLeft );
160 parent->setMinimumSize(parent->sizeHint());
164 const QString &_name,
const QString &_email,
165 const QString &_url,
const QString &_work,
166 bool showHeader,
bool showFrame,
168 :
QFrame(_parent), d(new Private(this))
171 setFrameStyle(QFrame::Panel | QFrame::Plain);
173 d->showHeader = showHeader;
174 d->showBold = showBold;
175 for (
int i=0; i < 4; ++i) {
176 d->label[i] =
new QLabel(
this);
177 d->label[i]->setOpenExternalLinks(
true);
178 d->label[i]->setTextInteractionFlags(Qt::LinksAccessibleByMouse);
179 d->text[i] =
new QLabel(
this);
180 d->text[i]->setOpenExternalLinks(
true);
181 d->text[i]->setTextInteractionFlags(Qt::LinksAccessibleByMouse);
189 d->label[3]->setAlignment(Qt::AlignTop);
203 d->label[0]->setText(_header);
204 d->text[0]->setText(_text);
205 if (_update) { d->updateLayout(); }
214 d->label[1]->setText(_header);
215 d->text[1]->setText(QString(
"<a href=\"mailto:%1\">%1</a>").arg(_text));
216 if (_update) { d->updateLayout(); }
224 d->label[2]->setText(_header);
225 d->text[2]->setText(QString(
"<a href=\"%1\">%1</a>").arg(_text));
226 if (_update) { d->updateLayout(); }
232 d->label[3]->setText(_header);
233 d->text[3]->setText(_text);
234 if (_update) { d->updateLayout(); }
239 return d->text[0]->text();
244 return d->text[1]->text();
249 return d->text[2]->text();
254 return d->text[3]->text();
263 d->text[0]->setFont(f);
270 return minimumSizeHint();
278 mImageLabel(0), mTitleLabel(0), mIconLabel(0),mVersionLabel(0),
279 mAuthorLabel(0), mImageFrame(0),mPageTab(0),mPlainSpace(0),d(0)
281 mTopLayout =
new QVBoxLayout(
this);
282 mTopLayout->setMargin(0);
296 mTitleLabel =
new QLabel(
this);
297 mTitleLabel->setObjectName(
"title");
298 mTitleLabel->setAlignment(Qt::AlignCenter);
299 mTopLayout->addWidget(mTitleLabel);
306 productArea->setFrameStyle( QFrame::StyledPanel );
307 productArea->setFrameShadow( QFrame::Plain );
308 productArea->setBackgroundRole(QPalette::Base);
309 productArea->setAutoFillBackground(
true);
312 QHBoxLayout*
const hbox =
new QHBoxLayout();
316 mIconLabel =
new QLabel(productArea);
317 hbox->addWidget(mIconLabel, 0, Qt::AlignLeft|Qt::AlignHCenter);
319 QVBoxLayout*
const vbox =
new QVBoxLayout();
320 if (!vbox) {
return; }
322 mVersionLabel =
new QLabel(productArea);
323 mVersionLabel->setObjectName(
"version");
324 mAuthorLabel =
new QLabel(productArea);
325 mAuthorLabel->setObjectName(
"author");
326 vbox->addWidget(mVersionLabel);
327 vbox->addWidget(mAuthorLabel);
330 hbox->addLayout(vbox);
332 if ( QApplication::isRightToLeft() )
333 hbox->insertStretch(0 , 1);
335 hbox->insertStretch(-1 , 1);
337 productArea->setLayout(hbox);
339 mTopLayout->addWidget(productArea, 0);
342 QHBoxLayout*
const hbox =
new QHBoxLayout();
343 if (!hbox) {
return; }
344 mTopLayout->addLayout(hbox, 10);
346 if (layoutType & K3AboutDialog::ImageLeft)
348 QVBoxLayout* vbox =
new QVBoxLayout();
349 hbox->addLayout(vbox);
351 mImageFrame =
new QFrame(
this);
352 mImageFrame->setAutoFillBackground(
true);
354 vbox->addWidget(mImageFrame);
357 vbox =
new QVBoxLayout(mImageFrame);
359 mImageLabel =
new QLabel(mImageFrame);
360 vbox->addStretch(10);
361 vbox->addWidget(mImageLabel);
362 vbox->addStretch(10);
369 if (!mPageTab) {
return; }
370 mPageTab->setUsesScrollButtons(
false);
371 hbox->addWidget(mPageTab, 10);
373 else if (layoutType & K3AboutDialog::ImageOnly)
375 mImageFrame =
new QFrame(
this);
376 mImageFrame->setAutoFillBackground(
true);
378 hbox->addWidget(mImageFrame, 10);
380 QGridLayout*
const gbox =
new QGridLayout(mImageFrame);
383 gbox->setRowStretch(0, 10);
384 gbox->setRowStretch(2, 10);
385 gbox->setColumnStretch(0, 10);
386 gbox->setColumnStretch(2, 10);
388 mImageLabel =
new QLabel(mImageFrame);
389 gbox->addWidget(mImageLabel, 1, 1);
394 mPlainSpace =
new QFrame(
this);
395 if (!mPlainSpace) {
return; }
396 hbox->addWidget(mPlainSpace, 10);
401 QVBoxLayout *vbox =
new QVBoxLayout();
402 hbox->addLayout(vbox);
404 mImageFrame =
new QFrame(
this);
405 mImageFrame->setAutoFillBackground(
true);
407 vbox->addWidget(mImageFrame);
410 vbox =
new QVBoxLayout(mImageFrame);
412 mImageLabel =
new QLabel(mImageFrame);
413 vbox->addStretch(10);
414 vbox->addWidget(mImageLabel);
415 vbox->addStretch(10);
424 return minimumSize().expandedTo(QSize(QWidget::sizeHint().width(), 0));
433 int fs = f.pointSize();
435 fs = QFontInfo(f).pointSize();
436 f.setPointSize(fs+2);
437 mTitleLabel->setFont(f);
443 mVersionLabel->setFont(f);
444 mAuthorLabel->setFont(f);
445 mVersionLabel->parentWidget()->layout()->activate();
453 bool richText,
int numLines)
456 if (!page) {
return 0; }
457 if (numLines <= 0) { numLines = 10; }
459 QVBoxLayout*
const vbox =
new QVBoxLayout(page);
465 browser->setFrameStyle( QFrame::NoFrame );
466 browser->setOpenExternalLinks(
true);
467 browser->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
468 browser->setHtml(text);
469 browser->setMinimumHeight(fontMetrics().lineSpacing()*numLines);
471 vbox->addWidget(browser);
476 textEdit->setFrameStyle( QFrame::NoFrame );
477 textEdit->setObjectName(
"text");
479 textEdit->setMinimumHeight(fontMetrics().lineSpacing()*numLines);
480 textEdit->setLineWrapMode(QTextEdit::NoWrap);
481 vbox->addWidget(textEdit);
488 const QString &text,
int numLines)
491 if (!page) {
return 0; }
492 if (numLines <= 0) { numLines = 10; }
494 QVBoxLayout*
const vbox =
new QVBoxLayout(page);
500 textEdit->setFrameStyle(QFrame::NoFrame);
501 textEdit->setObjectName(
"license");
504 textEdit->setLineWrapMode(QTextEdit::NoWrap);
505 textEdit->setPlainText(text);
506 textEdit->setMinimumHeight(fontMetrics().lineSpacing()*numLines);
507 vbox->addWidget(textEdit);
513 Qt::Alignment childAlignment,
514 Qt::Alignment innerAlignment)
518 kDebug(291) <<
"addPage: " <<
"Invalid layout";
525 mPageTab->addTab(container, title);
531 const QString &title,
532 Qt::Alignment childAlignment,
533 Qt::Alignment innerAlignment)
537 kDebug(291) <<
"addPage: " <<
"Invalid layout";
542 QVBoxLayout*
const vbox =
new QVBoxLayout(page);
546 QScrollArea*
const scrollView =
new QScrollArea(page);
547 scrollView->setFrameStyle(QFrame::Plain);
548 vbox->addWidget(scrollView);
553 scrollView->setWidget(container);
562 kDebug(291) <<
"addPage: " <<
"Invalid layout";
567 page->setObjectName(title.toLatin1());
568 page->setFrameStyle(QFrame::NoFrame);
570 mPageTab->addTab(page, title);
576 Qt::Alignment innerAlignment)
580 container->setObjectName(
"container");
581 mTopLayout->addWidget(container, 0, childAlignment);
591 kDebug(291) <<
"setTitle: " <<
"Invalid layout";
594 mTitleLabel->setText(title);
602 kDebug(291) <<
"setImage: " <<
"Invalid layout";
605 if (fileName.isNull())
610 const QPixmap logo(fileName);
612 mImageLabel->setPixmap(logo);
614 mImageFrame->layout()->activate();
619 if (fileName.isNull())
624 const QPixmap logo(fileName);
632 kDebug(291) <<
"setProgramLogo: " <<
"Invalid layout";
635 if (!pixmap.isNull())
637 mIconLabel->setPixmap(pixmap);
645 QPalette palette(mImageFrame->palette());
646 palette.setColor(QPalette::Window, color);
647 mImageFrame->setPalette(palette);
658 mImageFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken);
659 mImageFrame->setLineWidth(1);
663 mImageFrame->setFrameStyle(QFrame::NoFrame);
664 mImageFrame->setLineWidth(0);
671 const QString &version,
672 const QString &author,
677 kDebug(291) <<
"setProduct: " <<
"Invalid layout";
682 mIconLabel->setPixmap(qApp->windowIcon().pixmap(size,size));
684 const QString msg1 =
i18n(
"<html><font size=\"5\">%1</font><br/><b>version %2</b><br/>Using KDE %3</html>", appName, version,
685 QLatin1String(KDE_VERSION_STRING));
686 const QString msg2 = !year.isEmpty() ?
i18n(
"%1 %2, %3", QChar(0xA9), year,
687 author) : QLatin1String(
"");
692 mVersionLabel->setText(msg1);
693 mAuthorLabel->setText(msg2);
696 mAuthorLabel->hide();
699 mIconLabel->parentWidget()->layout()->activate();
702 class K3AboutContainer::Private
706 Qt::Alignment alignment;
710 int margin,
int spacing,
711 Qt::Alignment childAlignment,
712 Qt::Alignment innerAlignment)
713 :
QFrame(parent), d(new Private)
715 d->alignment = innerAlignment;
717 setFrameStyle(QFrame::NoFrame);
719 QGridLayout*
const gbox =
new QGridLayout(
this);
720 gbox->setMargin(margin);
721 gbox->setMargin(spacing);
722 if (childAlignment & Qt::AlignHCenter)
724 gbox->setColumnStretch(0, 10);
725 gbox->setColumnStretch(2, 10);
727 else if (childAlignment & Qt::AlignRight)
729 gbox->setColumnStretch(0, 10);
733 gbox->setColumnStretch(2, 10);
736 if (childAlignment & Qt::AlignVCenter)
738 gbox->setRowStretch(0, 10);
739 gbox->setRowStretch(2, 10);
741 else if (childAlignment & Qt::AlignRight)
743 gbox->setRowStretch(0, 10);
747 gbox->setRowStretch(2, 10);
750 d->vbox =
new QVBoxLayout();
751 d->vbox->setSpacing(spacing);
752 gbox->addLayout(d->vbox, 1, 1);
774 if (o->isWidgetType())
779 QSize s = w->minimumSize();
782 s = w->minimumSizeHint();
792 total_size.setHeight(total_size.height() + s.height());
793 if (s.width() > total_size.width()) { total_size.setWidth(s.width()); }
804 total_size.setHeight(total_size.height() + layout()->spacing()*(numChild-1));
805 total_size += QSize(layout()->margin()*2, layout()->margin()*2 + 1);
809 total_size = QSize(1, 1);
822 widget->setParent(
this);
824 d->vbox->addWidget(widget, 0, d->alignment);
830 if (o->isWidgetType())
832 static_cast<QWidget *
>(o)->setMinimumWidth(s.width());
839 const QString &_url,
const QString &_task,
840 bool showHeader,
bool showFrame,
bool showBold)
844 _name, _email, _url, _task, showHeader, showFrame, showBold);
845 cont->setObjectName(
"pers");
851 bool showFrame,
bool showBold)
855 label->setObjectName(
"title");
858 QFont labelFont(font());
859 labelFont.setBold(
true);
860 label->setFont(labelFont);
863 label->setFrameStyle(QFrame::Panel | QFrame::Raised);
865 label->setAlignment(alignment);
872 if (fileName.isNull())
878 label->setObjectName(
"image");
879 const QImage logo(fileName);
883 pix = QPixmap::fromImage(logo, 0);
884 label->setPixmap(pix);
886 label->setAlignment(alignment);
892 version(new
QLabel(this)),
897 showMaintainer(false),
900 cont->setText(
i18n(
"Other Contributors:"));
901 logo->setText(
i18n(
"(No logo available)"));
902 logo->setFrameStyle(QFrame::Panel | QFrame::Raised);
903 version->setAlignment(Qt::AlignCenter);
910 int maintWidth, maintHeight;
916 maintWidth=total_size.width();
917 maintHeight=total_size.height();
926 tempx=qMax(total_size.width(), maintWidth);
928 cx=qMax(cx,
version->sizeHint().width());
929 cy+=qMax(
logo->height(),
934 cx=qMax(cx,
cont->sizeHint().width());
942 setMinimumSize(cx, cy);
951 const QString &_url,
const QString &_w)
960 const QString &_url,
const QString &_w)
970 const QString &_url,
const QString &_w)
988 int _x=0, _y, cx, tempx, tempy;
990 version->setGeometry(0, 0, width(),
version->sizeHint().height());
1003 _y+=qMax(
logo->height(),
1008 tempy=
cont->sizeHint().height();
1009 cont->setGeometry(0, _y, width(), tempy);
1017 tempy=currEntry->
sizeHint().height();
1019 currEntry->setGeometry(_x, _y, width(), tempy);
1084 const QString &_url,
const QString &_w)
1093 const QString &_url,
const QString &_work)
1102 const QString &_url,
const QString &_w)
1119 bool richText,
int numLines)
1133 Qt::Alignment childAlignment, Qt::Alignment innerAlignment)
1141 Qt::Alignment childAlignment, Qt::Alignment innerAlignment)
1156 Qt::Alignment innerAlignment)
1200 const QString &author,
const QString &year)
1207 const QString &_path,
const QColor &_imageColor,
1208 const QString &_url)
1213 a.setObjectName(
"image");
1221 c->
addPerson(QString(), QString(), _url, QString());
void setUrl(const QString &text, const QString &header=QString(), bool update=true)
void addImage(const QString &fileName, Qt::Alignment alignment=Qt::AlignLeft)
K3AboutContainer can be used to make a application specific AboutDialog.
QString i18n(const char *text)
void setProduct(const QString &appName, const QString &version, const QString &author, const QString &year)
(Constructor II only) Prints the application name, KDE version, author, a copyright sign and a year s...
void setImage(const QString &fileName)
(Constructor II only) Define an image to be shown in the dialog.
QFrame * addPage(const QString &title)
(Constructor II only) Adds an empty page to a tab box.
void setEmail(const QString &text, const QString &header=QString(), bool update=true)
QFrame * addTextPage(const QString &title, const QString &text, bool richText=false, int numLines=10)
(Constructor II only) Adds a text page to a tab box.
int IconSize(KIconLoader::Group group)
void setVersion(const QString &name)
(Constructor I only) Sets the text describing the version.
K3AboutContainer * addScrolledContainerPage(const QString &title, Qt::Alignment childAlignment=Qt::AlignCenter, Qt::Alignment innerAlignment=Qt::AlignCenter)
K3AboutContainer * addContainerPage(const QString &title, Qt::Alignment childAlignment=Qt::AlignCenter, Qt::Alignment innerAlignment=Qt::AlignCenter)
virtual void show()
Makes a modeless dialog visible.
virtual QSize sizeHint() const
void setProduct(const QString &appName, const QString &version, const QString &author, const QString &year)
K3AboutContainer(QWidget *parent=0, int margin=0, int spacing=0, Qt::Alignment childAlignment=Qt::AlignCenter, Qt::Alignment innerAlignment=Qt::AlignCenter)
QString label(StandardShortcut id)
K3AboutContainerBase * mContainerBase
The main widget (Constructor II)
Used internally by K3AboutDialog.
void setMaintainer(const QString &name, const QString &email, const QString &url, const QString &work)
(Constructor I only) Sets the maintainer's name and email address.
QFrame * addLicensePage(const QString &title, const QString &text, int numLines=10)
virtual QSize minimumSizeHint() const
void setTitle(const QString &title)
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
void setMainWidget(QWidget *widget)
void setProgramLogo(const QString &fileName)
K3AboutContributor(QWidget *parent=0, const QString &username=QString(), const QString &email=QString(), const QString &url=QString(), const QString &work=QString(), bool showHeader=false, bool showFrame=true, bool showBold=false)
void setTitle(const QString &title)
(Constructor II only) Sets a title (not caption) in the uppermost area of the dialog.
A KDialog with predefined main widget.
void setImageBackgroundColor(const QColor &color)
(Constructor II only) The image has a minimum size, but is centered within an area if the dialog box ...
virtual void setReadOnly(bool readOnly)
void fontChange(const QFont &oldFont)
K3AboutContainer * addContainer(Qt::Alignment childAlignment, Qt::Alignment innerAlignment)
(Constructor II only) Adds a container.
Used internally by K3AboutWidget.
K3AboutDialog(QWidget *parent=0)
The standard Qt constructor (Constructor I).
QFrame * addLicensePage(const QString &title, const QString &text, int numLines=10)
(Constructor II only) Adds a license page to a tab box.
void setImage(const QString &fileName)
K3AboutContainerBase(int layoutType, QWidget *parent=0)
K3AboutContainer * addScrolledContainerPage(const QString &title, Qt::Alignment childAlignment=Qt::AlignCenter, Qt::Alignment innerAlignment=Qt::AlignCenter)
(Constructor II only) Adds a container inside a QScrollView to a tab box.
QSize sizeHint(void) const
void setName(const QString &text, const QString &header=QString(), bool update=true)
static void imageUrl(QWidget *parent, const QString &caption, const QString &path, const QColor &imageColor, const QString &url)
Create a modal dialog with an image in the upper area with a URL link below.
void adjust()
Adjusts the dialog.
void setButtons(ButtonCodes buttonMask)
void setProgramLogo(const QString &fileName)
Overloaded version of setProgramLogo(const QPixmap& pixmap).
void setDefaultButton(ButtonCode id)
K3AboutContainer * addContainerPage(const QString &title, Qt::Alignment childAlignment=Qt::AlignCenter, Qt::Alignment innerAlignment=Qt::AlignCenter)
(Constructor II only) Adds a container to a tab box.
K3AboutWidget * mAbout
The main widget (Constructor I)
void setImageFrame(bool state)
void addTitle(const QString &title, Qt::Alignment alignment=Qt::AlignLeft, bool showframe=false, bool showBold=false)
void setImageBackgroundColor(const QColor &color)
static QFont generalFont()
void addContributor(const QString &name, const QString &email, const QString &url, const QString &work)
(Constructor I only) Show this person as one of the major contributors.
QFrame * addTextPage(const QString &title, const QString &text, bool richText=false, int numLines=10)
void addWidget(QWidget *widget)
void setWork(const QString &text, const QString &header=QString(), bool update=true)
void setImageFrame(bool state)
(Constructor II only) Enables or disables a frame around the image.
void setAuthor(const QString &name, const QString &email, const QString &url, const QString &work)
(Constructor I only) Sets the author's name and email address.
virtual QSize sizeHint() const
void setLogo(const QPixmap &logo)
(Constructor I only) Sets the image as the application logo.
virtual QSize sizeHint() const
virtual void setPlainCaption(const QString &caption)
K3AboutContainer * addContainer(Qt::Alignment childAlignment, Qt::Alignment innerAlignment)
void addPerson(const QString &name, const QString &email, const QString &url, const QString &task, bool showHeader=false, bool showframe=false, bool showBold=false)
virtual void fontChange(const QFont &oldFont)
QFrame * addEmptyPage(const QString &title)