From ce4a32fe52ef09d8f5ff1dd22c001110902b60a2 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kdeui/kaboutdialog.cpp | 1797 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1797 insertions(+) create mode 100644 kdeui/kaboutdialog.cpp (limited to 'kdeui/kaboutdialog.cpp') diff --git a/kdeui/kaboutdialog.cpp b/kdeui/kaboutdialog.cpp new file mode 100644 index 000000000..3e534acfd --- /dev/null +++ b/kdeui/kaboutdialog.cpp @@ -0,0 +1,1797 @@ +/* + * This file is part of the KDE Libraries + * Copyright (C) 1999-2001 Mirko Boehm and + * Espen Sand + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//MOC_SKIP_BEGIN +template class QPtrList; +//MOC_SKIP_END + +#define WORKTEXT_IDENTATION 16 +#define Grid 3 + +// ############################################################## +// MOC OUTPUT FILES: +#include "kaboutdialog.moc" +#include "kaboutdialog_private.moc" +// ############################################################## + +class KAboutTabWidget : public QTabWidget +{ +public: + KAboutTabWidget( QWidget* parent ) : QTabWidget( parent ) {} + QSize sizeHint() const { + return QTabWidget::sizeHint().expandedTo( tabBar()->sizeHint() + QSize(4,4) ); + } +}; + + + + +KAboutContributor::KAboutContributor( QWidget *_parent, const char *wname, + const QString &_name,const QString &_email, + const QString &_url, const QString &_work, + bool showHeader, bool showFrame, + bool showBold ) + : QFrame( _parent, wname ), mShowHeader(showHeader), mShowBold(showBold), d(0) +{ + if( showFrame ) + { + setFrameStyle(QFrame::Panel | QFrame::Raised); + } + + mLabel[0] = new QLabel( this ); + mLabel[1] = new QLabel( this ); + mLabel[2] = new QLabel( this ); + mLabel[3] = new QLabel( this ); + mText[0] = new QLabel( this ); + mText[1] = new KURLLabel( this ); + mText[2] = new KURLLabel( this ); + mText[3] = new QLabel( this ); + + setName( _name, i18n("Author"), false ); + setEmail( _email, i18n("Email"), false ); + setURL( _url, i18n("Homepage"), false ); + setWork( _work, i18n("Task"), false ); + + KURLLabel *kurl = static_cast(mText[1]); + kurl->setFloat(true); + kurl->setUnderline(true); + kurl->setMargin(0); + connect(kurl, SIGNAL(leftClickedURL(const QString &)), + SLOT(emailClickedSlot(const QString &))); + + kurl = static_cast(mText[2]); + kurl->setFloat(true); + kurl->setUnderline(true); + kurl->setMargin(0); + connect(kurl, SIGNAL(leftClickedURL(const QString &)), + SLOT(urlClickedSlot(const QString &))); + + mLabel[3]->setAlignment( AlignTop ); + + fontChange( font() ); + updateLayout(); +} + + +void KAboutContributor::setName( const QString &_text, const QString &_header, + bool _update ) +{ + mLabel[0]->setText(_header); + mText[0]->setText(_text); + if( _update ) { updateLayout(); } +} + + +void KAboutContributor::setEmail( const QString &_text, const QString &_header, + bool _update ) +{ + mLabel[1]->setText(_header); + KURLLabel* const kurl = static_cast(mText[1]); + kurl->setText(_text); + kurl->setURL(_text); + if( _update ) { updateLayout(); } +} + + +void KAboutContributor::setURL( const QString &_text, const QString &_header, + bool _update ) +{ + mLabel[2]->setText(_header); + KURLLabel* const kurl = static_cast(mText[2]); + kurl->setText(_text); + kurl->setURL(_text); + if( _update ) { updateLayout(); } +} + + +void KAboutContributor::setWork( const QString &_text, const QString &_header, + bool _update ) +{ + mLabel[3]->setText(_header); + mText[3]->setText(_text); + if( _update ) { updateLayout(); } +} + + +QString KAboutContributor::getName( void ) const +{ + return mText[0]->text(); +} + + +QString KAboutContributor::getEmail( void ) const +{ + return mText[1]->text(); +} + + +QString KAboutContributor::getURL( void ) const +{ + return mText[2]->text(); +} + + +QString KAboutContributor::getWork( void ) const +{ + return mText[3]->text(); +} + + + +void KAboutContributor::updateLayout( void ) +{ + delete layout(); + + int row = 0; + if( !mText[0]->text().isEmpty() ) { ++row; } + if( !mText[1]->text().isEmpty() ) { ++row; } + if( !mText[2]->text().isEmpty() ) { ++row; } + if( !mText[3]->text().isEmpty() ) { ++row; } + + + QGridLayout *gbox; + if( row == 0 ) + { + gbox = new QGridLayout( this, 1, 1, 0 ); + for( int i=0; i<4; ++i ) + { + mLabel[i]->hide(); + mText[i]->hide(); + } + } + else + { + if( mText[0]->text().isEmpty() && !mShowHeader ) + { + gbox = new QGridLayout( this, row, 1, frameWidth()+1, 2 ); + } + else + { + gbox = new QGridLayout( this, row, 2, frameWidth()+1, 2 ); + if( !mShowHeader ) + { + gbox->addColSpacing( 0, KDialog::spacingHint()*2 ); + } + gbox->setColStretch( 1, 10 ); + } + + for( int i=0, r=0; i<4; ++i ) + { + mLabel[i]->setFixedHeight( fontMetrics().lineSpacing() ); + if( i != 3 ) + { + mText[i]->setFixedHeight( fontMetrics().lineSpacing() ); + } + + if( !mText[i]->text().isEmpty() ) + { + if( mShowHeader ) + { + gbox->addWidget( mLabel[i], r, 0, AlignLeft ); + gbox->addWidget( mText[i], r, 1, AlignLeft ); + mLabel[i]->show(); + mText[i]->show(); + } + else + { + mLabel[i]->hide(); + if( !i ) + { + gbox->addMultiCellWidget( mText[i], r, r, 0, 1, AlignLeft ); + } + else + { + gbox->addWidget( mText[i], r, 1, AlignLeft ); + } + mText[i]->show(); + } + ++r; + } + else + { + mLabel[i]->hide(); + mText[i]->hide(); + } + } + } + + gbox->activate(); + setMinimumSize( sizeHint() ); +} + + +void KAboutContributor::fontChange( const QFont &/*oldFont*/ ) +{ + if( mShowBold ) + { + QFont f( font() ); + f.setBold( true ); + mText[0]->setFont( f ); + } + update(); +} + + +QSize KAboutContributor::sizeHint( void ) const +{ + return minimumSizeHint(); +} + + +void KAboutContributor::urlClickedSlot( const QString &u ) +{ + emit openURL(u); +} + + +void KAboutContributor::emailClickedSlot( const QString &e ) +{ + emit sendEmail( mText[0]->text(), e ) ; +} + + +// +// Internal widget for the KAboutDialog class. +// +KAboutContainerBase::KAboutContainerBase( int layoutType, QWidget *_parent, + char *_name ) + : QWidget( _parent, _name ), + mImageLabel(0), mTitleLabel(0), mIconLabel(0),mVersionLabel(0), + mAuthorLabel(0), mImageFrame(0),mPageTab(0),mPlainSpace(0),d(0) +{ + mTopLayout = new QVBoxLayout( this, 0, KDialog::spacingHint() ); + if( !mTopLayout ) { return; } + + if( layoutType & AbtImageOnly ) + { + layoutType &= ~(AbtImageLeft|AbtImageRight|AbtTabbed|AbtPlain); + } + if( layoutType & AbtImageLeft ) + { + layoutType &= ~AbtImageRight; + } + + if( layoutType & AbtTitle ) + { + mTitleLabel = new QLabel( this, "title" ); + mTitleLabel->setAlignment(AlignCenter); + mTopLayout->addWidget( mTitleLabel ); + mTopLayout->addSpacing( KDialog::spacingHint() ); + } + + if( layoutType & AbtProduct ) + { + QWidget* const productArea = new QWidget( this, "area" ); + mTopLayout->addWidget( productArea, 0, QApplication::reverseLayout() ? AlignRight : AlignLeft ); + + QHBoxLayout* const hbox = new QHBoxLayout(productArea,0,KDialog::spacingHint()); + if( !hbox ) { return; } + + mIconLabel = new QLabel( productArea ); + hbox->addWidget( mIconLabel, 0, AlignLeft|AlignHCenter ); + + QVBoxLayout* const vbox = new QVBoxLayout(); + if( !vbox ) { return; } + hbox->addLayout( vbox ); + + mVersionLabel = new QLabel( productArea, "version" ); + mAuthorLabel = new QLabel( productArea, "author" ); + vbox->addWidget( mVersionLabel ); + vbox->addWidget( mAuthorLabel ); + hbox->activate(); + + mTopLayout->addSpacing( KDialog::spacingHint() ); + } + + QHBoxLayout* const hbox = new QHBoxLayout(); + if( !hbox ) { return; } + mTopLayout->addLayout( hbox, 10 ); + + if( layoutType & AbtImageLeft ) + { + QVBoxLayout* vbox = new QVBoxLayout(); + hbox->addLayout(vbox); + vbox->addSpacing(1); + mImageFrame = new QFrame( this ); + setImageFrame( true ); + vbox->addWidget( mImageFrame ); + vbox->addSpacing(1); + + vbox = new QVBoxLayout( mImageFrame, 1 ); + mImageLabel = new KImageTrackLabel( mImageFrame ); + connect( mImageLabel, SIGNAL(mouseTrack( int, const QMouseEvent * )), + SLOT( slotMouseTrack( int, const QMouseEvent * )) ); + vbox->addStretch(10); + vbox->addWidget( mImageLabel ); + vbox->addStretch(10); + vbox->activate(); + } + + if( layoutType & AbtTabbed ) + { + mPageTab = new KAboutTabWidget( this ); + if( !mPageTab ) { return; } + hbox->addWidget( mPageTab, 10 ); + } + else if( layoutType & AbtImageOnly ) + { + mImageFrame = new QFrame( this ); + setImageFrame( true ); + hbox->addWidget( mImageFrame, 10 ); + + QGridLayout* const gbox = new QGridLayout(mImageFrame, 3, 3, 1, 0 ); + gbox->setRowStretch( 0, 10 ); + gbox->setRowStretch( 2, 10 ); + gbox->setColStretch( 0, 10 ); + gbox->setColStretch( 2, 10 ); + + mImageLabel = new KImageTrackLabel( mImageFrame ); + connect( mImageLabel, SIGNAL(mouseTrack( int, const QMouseEvent * )), + SLOT( slotMouseTrack( int, const QMouseEvent * )) ); + gbox->addWidget( mImageLabel, 1, 1 ); + gbox->activate(); + } + else + { + mPlainSpace = new QFrame( this ); + if( !mPlainSpace ) { return; } + hbox->addWidget( mPlainSpace, 10 ); + } + + if( layoutType & AbtImageRight ) + { + QVBoxLayout *vbox = new QVBoxLayout(); + hbox->addLayout(vbox); + vbox->addSpacing(1); + mImageFrame = new QFrame( this ); + setImageFrame( true ); + vbox->addWidget( mImageFrame ); + vbox->addSpacing(1); + + vbox = new QVBoxLayout( mImageFrame, 1 ); + mImageLabel = new KImageTrackLabel( mImageFrame ); + connect( mImageLabel, SIGNAL(mouseTrack( int, const QMouseEvent * )), + SLOT( slotMouseTrack( int, const QMouseEvent * )) ); + vbox->addStretch(10); + vbox->addWidget( mImageLabel ); + vbox->addStretch(10); + vbox->activate(); + } + + fontChange( font() ); +} + + +void KAboutContainerBase::show( void ) +{ + QWidget::show(); +} + +QSize KAboutContainerBase::sizeHint( void ) const +{ + return minimumSize().expandedTo( QSize( QWidget::sizeHint().width(), 0 ) ); +} + +void KAboutContainerBase::fontChange( const QFont &/*oldFont*/ ) +{ + if( mTitleLabel ) + { + QFont f( KGlobalSettings::generalFont() ); + f.setBold( true ); + int fs = f.pointSize(); + if (fs == -1) + fs = QFontInfo(f).pointSize(); + f.setPointSize( fs+2 ); // Lets not make it too big + mTitleLabel->setFont(f); + } + + if( mVersionLabel ) + { + QFont f( KGlobalSettings::generalFont() ); + f.setBold( true ); + mVersionLabel->setFont(f); + mAuthorLabel->setFont(f); + mVersionLabel->parentWidget()->layout()->activate(); + } + + update(); +} + +QFrame *KAboutContainerBase::addTextPage( const QString &title, + const QString &text, + bool richText, int numLines ) +{ + QFrame* const page = addEmptyPage( title ); + if( !page ) { return 0; } + if( numLines <= 0 ) { numLines = 10; } + + QVBoxLayout* const vbox = new QVBoxLayout( page, KDialog::spacingHint() ); + + if( richText ) + { + KTextBrowser* const browser = new KTextBrowser( page, "browser" ); + browser->setHScrollBarMode( QScrollView::AlwaysOff ); + browser->setText( text ); + browser->setMinimumHeight( fontMetrics().lineSpacing()*numLines ); + + vbox->addWidget(browser); + connect(browser, SIGNAL(urlClick(const QString &)), + SLOT(slotUrlClick(const QString &))); + connect(browser, SIGNAL(mailClick(const QString &,const QString &)), + SLOT(slotMailClick(const QString &,const QString &))); + } + else + { + KTextEdit* const textEdit = new KTextEdit( page, "text" ); + textEdit->setReadOnly( true ); + textEdit->setMinimumHeight( fontMetrics().lineSpacing()*numLines ); + textEdit->setWordWrap( QTextEdit::NoWrap ); + vbox->addWidget( textEdit ); + } + + return page; +} + +QFrame *KAboutContainerBase::addLicensePage( const QString &title, + const QString &text, int numLines) +{ + QFrame* const page = addEmptyPage( title ); + if( !page ) { return 0; } + if( numLines <= 0 ) { numLines = 10; } + + QVBoxLayout* const vbox = new QVBoxLayout( page, KDialog::spacingHint() ); + + KTextEdit* const textEdit = new KTextEdit( page, "license" ); + textEdit->setFont( KGlobalSettings::fixedFont() ); + textEdit->setReadOnly( true ); + textEdit->setWordWrap( QTextEdit::NoWrap ); + textEdit->setText( text ); + textEdit->setMinimumHeight( fontMetrics().lineSpacing()*numLines ); + vbox->addWidget( textEdit ); + return page; +} + + +KAboutContainer *KAboutContainerBase::addContainerPage( const QString &title, + int childAlignment, + int innerAlignment ) +{ + if( !mPageTab ) + { + kdDebug(291) << "addPage: " << "Invalid layout" << endl; + return 0; + } + + KAboutContainer* const container = new KAboutContainer( mPageTab, "container", + KDialog::spacingHint(), KDialog::spacingHint(), childAlignment, + innerAlignment ); + mPageTab->addTab( container, title ); + + connect(container, SIGNAL(urlClick(const QString &)), + SLOT(slotUrlClick(const QString &))); + connect(container, SIGNAL(mailClick(const QString &,const QString &)), + SLOT(slotMailClick(const QString &,const QString &))); + + return container; +} + + +KAboutContainer *KAboutContainerBase::addScrolledContainerPage( + const QString &title, + int childAlignment, + int innerAlignment ) +{ + if( !mPageTab ) + { + kdDebug(291) << "addPage: " << "Invalid layout" << endl; + return 0; + } + + QFrame* const page = addEmptyPage( title ); + QVBoxLayout* const vbox = new QVBoxLayout( page, KDialog::spacingHint() ); + QScrollView* const scrollView = new QScrollView( page ); + scrollView->viewport()->setBackgroundMode( PaletteBackground ); + vbox->addWidget( scrollView ); + + KAboutContainer* const container = new KAboutContainer( scrollView, "container", + KDialog::spacingHint(), KDialog::spacingHint(), childAlignment, + innerAlignment ); + scrollView->addChild( container ); + + + connect(container, SIGNAL(urlClick(const QString &)), + SLOT(slotUrlClick(const QString &))); + connect(container, SIGNAL(mailClick(const QString &,const QString &)), + SLOT(slotMailClick(const QString &,const QString &))); + + return container; +} + + +QFrame *KAboutContainerBase::addEmptyPage( const QString &title ) +{ + if( !mPageTab ) + { + kdDebug(291) << "addPage: " << "Invalid layout" << endl; + return 0; + } + + QFrame* const page = new QFrame( mPageTab, title.latin1() ); + page->setFrameStyle( QFrame::NoFrame ); + + mPageTab->addTab( page, title ); + return page; +} + + +KAboutContainer *KAboutContainerBase::addContainer( int childAlignment, + int innerAlignment ) +{ + KAboutContainer* const container = new KAboutContainer( this, "container", + 0, KDialog::spacingHint(), childAlignment, innerAlignment ); + mTopLayout->addWidget( container, 0, childAlignment ); + + connect(container, SIGNAL(urlClick(const QString &)), + SLOT(slotUrlClick(const QString &))); + connect(container, SIGNAL(mailClick(const QString &,const QString &)), + SLOT(slotMailClick(const QString &,const QString &))); + + return container; +} + + + +void KAboutContainerBase::setTitle( const QString &title ) +{ + if( !mTitleLabel ) + { + kdDebug(291) << "setTitle: " << "Invalid layout" << endl; + return; + } + mTitleLabel->setText(title); +} + + +void KAboutContainerBase::setImage( const QString &fileName ) +{ + if( !mImageLabel ) + { + kdDebug(291) << "setImage: " << "Invalid layout" << endl; + return; + } + if( fileName.isNull() ) + { + return; + } + + const QPixmap logo( fileName ); + if( !logo.isNull() ) + mImageLabel->setPixmap( logo ); + + mImageFrame->layout()->activate(); +} + +void KAboutContainerBase::setProgramLogo( const QString &fileName ) +{ + if( fileName.isNull() ) + { + return; + } + + const QPixmap logo( fileName ); + setProgramLogo( logo ); +} + +void KAboutContainerBase::setProgramLogo( const QPixmap &pixmap ) +{ + if( !mIconLabel ) + { + kdDebug(291) << "setProgramLogo: " << "Invalid layout" << endl; + return; + } + if( !pixmap.isNull() ) + { + mIconLabel->setPixmap( pixmap ); + } +} + +void KAboutContainerBase::setImageBackgroundColor( const QColor &color ) +{ + if( mImageFrame ) + { + mImageFrame->setBackgroundColor( color ); + } +} + + +void KAboutContainerBase::setImageFrame( bool state ) +{ + if( mImageFrame ) + { + if( state ) + { + mImageFrame->setFrameStyle( QFrame::Panel | QFrame::Sunken ); + mImageFrame->setLineWidth(1); + } + else + { + mImageFrame->setFrameStyle( QFrame::NoFrame ); + mImageFrame->setLineWidth(0); + } + } +} + + +void KAboutContainerBase::setProduct( const QString &appName, + const QString &version, + const QString &author, + const QString &year ) +{ + if( !mIconLabel ) + { + kdDebug(291) << "setProduct: " << "Invalid layout" << endl; + return; + } + + if ( kapp ) + { + mIconLabel->setPixmap( kapp->icon() ); + kdDebug(291) << "setPixmap (iconName): " << kapp->iconName() << endl; + } + else + kdDebug(291) << "no kapp" << endl; + + const QString msg1 = i18n("%1 %2 (Using KDE %3)").arg(appName).arg(version). + arg(QString::fromLatin1(KDE_VERSION_STRING)); + const QString msg2 = !year.isEmpty() ? i18n("%1 %2, %3").arg('©').arg(year). + arg(author) : QString::fromLatin1(""); + + //if (!year.isEmpty()) + // msg2 = i18n("%1 %2, %3").arg('©').arg(year).arg(author); + + mVersionLabel->setText( msg1 ); + mAuthorLabel->setText( msg2 ); + if( msg2.isEmpty() ) + { + mAuthorLabel->hide(); + } + + mIconLabel->parentWidget()->layout()->activate(); +} + + +void KAboutContainerBase::slotMouseTrack( int mode, const QMouseEvent *e ) +{ + emit mouseTrack( mode, e ); +} + + +void KAboutContainerBase::slotUrlClick( const QString &url ) +{ + emit urlClick( url ); +} + +void KAboutContainerBase::slotMailClick( const QString &_name, + const QString &_address ) +{ + emit mailClick( _name, _address ); +} + + + +KAboutContainer::KAboutContainer( QWidget *_parent, const char *_name, + int _margin, int _spacing, + int childAlignment, int innerAlignment ) + : QFrame( _parent, _name ), d(0) +{ + mAlignment = innerAlignment; + + QGridLayout* const gbox = new QGridLayout( this, 3, 3, _margin, _spacing ); + if( childAlignment & AlignHCenter ) + { + gbox->setColStretch( 0, 10 ); + gbox->setColStretch( 2, 10 ); + } + else if( childAlignment & AlignRight ) + { + gbox->setColStretch( 0, 10 ); + } + else + { + gbox->setColStretch( 2, 10 ); + } + + if( childAlignment & AlignVCenter ) + { + gbox->setRowStretch( 0, 10 ); + gbox->setRowStretch( 2, 10 ); + } + else if( childAlignment & AlignRight ) + { + gbox->setRowStretch( 0, 10 ); + } + else + { + gbox->setRowStretch( 2, 10 ); + } + + mVbox = new QVBoxLayout( _spacing ); + gbox->addLayout( mVbox, 1, 1 ); + gbox->activate(); +} + + +void KAboutContainer::childEvent( QChildEvent *e ) +{ + if( !e->inserted() || !e->child()->isWidgetType() ) + { + return; + } + + QWidget* const w = static_cast(e->child()); + mVbox->addWidget( w, 0, mAlignment ); + const QSize s( sizeHint() ); + setMinimumSize( s ); + + QObjectList* const l = const_cast(children()); // silence please + QObjectListIterator itr( *l ); + QObject * o; + while ( (o = itr.current()) ) { + ++itr; + if( o->isWidgetType() ) + { + static_cast(o)->setMinimumWidth( s.width() ); + } + } +} + + +QSize KAboutContainer::sizeHint( void ) const +{ + // + // The size is computed by adding the sizeHint().height() of all + // widget children and taking the width of the widest child and adding + // layout()->margin() and layout()->spacing() + // + + QSize total_size; + + int numChild = 0; + QObjectList* const l = const_cast(children()); // silence please + + QObjectListIterator itr( *l ); + QObject * o; + while ( (o = itr.current()) ) { + ++itr; + if( o->isWidgetType() ) + { + ++numChild; + QWidget* const w= static_cast(o); + + QSize s = w->minimumSize(); + if( s.isEmpty() ) + { + s = w->minimumSizeHint(); + if( s.isEmpty() ) + { + s = w->sizeHint(); + if( s.isEmpty() ) + { + s = QSize( 100, 100 ); // Default size + } + } + } + total_size.setHeight( total_size.height() + s.height() ); + if( s.width() > total_size.width() ) { total_size.setWidth( s.width() ); } + } + } + + if( numChild > 0 ) + { + // + // Seems I have to add 1 to the height to properly show the border + // of the last entry if layout()->margin() is 0 + // + + total_size.setHeight( total_size.height() + layout()->spacing()*(numChild-1) ); + total_size += QSize( layout()->margin()*2, layout()->margin()*2 + 1 ); + } + else + { + total_size = QSize( 1, 1 ); + } + return total_size; +} + + +QSize KAboutContainer::minimumSizeHint( void ) const +{ + return sizeHint(); +} + + +void KAboutContainer::addWidget( QWidget *widget ) +{ + widget->reparent( this, 0, QPoint(0,0) ); +} + + +void KAboutContainer::addPerson( const QString &_name, const QString &_email, + const QString &_url, const QString &_task, + bool showHeader, bool showFrame,bool showBold) +{ + + KAboutContributor* const cont = new KAboutContributor( this, "pers", + _name, _email, _url, _task, showHeader, showFrame, showBold ); + connect( cont, SIGNAL( openURL(const QString&)), + this, SIGNAL( urlClick(const QString &))); + connect( cont, SIGNAL( sendEmail(const QString &, const QString &)), + this, SIGNAL( mailClick(const QString &, const QString &))); +} + + +void KAboutContainer::addTitle( const QString &title, int alignment, + bool showFrame, bool showBold ) +{ + + QLabel* const label = new QLabel( title, this, "title" ); + if( showBold ) + { + QFont labelFont( font() ); + labelFont.setBold( true ); + label->setFont( labelFont ); + } + if( showFrame ) + { + label->setFrameStyle(QFrame::Panel | QFrame::Raised); + } + label->setAlignment( alignment ); +} + + +void KAboutContainer::addImage( const QString &fileName, int alignment ) +{ + if( fileName.isNull() ) + { + return; + } + + KImageTrackLabel* const label = new KImageTrackLabel( this, "image" ); + const QImage logo( fileName ); + if( !logo.isNull() ) + { + QPixmap pix; + pix = logo; + label->setPixmap( pix ); + } + label->setAlignment( alignment ); +} + +#if 0 +//MOC_SKIP_BEGIN + +/** Every person displayed is stored in a KAboutContributor object. + * Every contributor, the author and/or the maintainer of the application are + * stored in objects of this local class. Every single field may be empty. + * To add a contributor, create a KAboutContributor object as a child of your + * @ref KAboutDialog, set its contents and add it using add addContributor. */ +class KAboutContributor : public QFrame +{ + // ############################################################################ + Q_OBJECT + // ---------------------------------------------------------------------------- +public: + /** The Qt constructor. */ + KAboutContributor(QWidget* parent=0, const char* name=0); + /** Set the name (a literal string). */ + void setName(const QString&); + /** Get the name. */ + QString getName(); + /** The email address (dito). */ + void setEmail(const QString&); + /** Get the email address. */ + QString getEmail(); + /** The URL (dito). */ + void setURL(const QString&); + /** Get the URL. */ + QString getURL(); + /** The tasks the person worked on (a literal string). More than one line is + * possible, but very long texts might look ugly. */ + void setWork(const QString&); + /** The size hint. Very important here, since KAboutWidget relies on it for + * geometry management. */ + QSize sizeHint(); + QSize minimumSizeHint(void); + virtual void show( void ); + + // ---------------------------------------------------------------------------- +protected: + // events: + /** The resize event. */ + void resizeEvent(QResizeEvent*); + /** The paint event. */ + void paintEvent(QPaintEvent*); + /** The label showing the program version. */ + QLabel *name; + /** The clickable URL label showing the email address. It is only visible if + * its text is not empty. */ + KURLLabel *email; + /** Another interactive part that displays the homepage URL. */ + KURLLabel *url; + /** The description of the contributions of the person. */ + QString work; + // ---------------------------------------------------------------------------- +protected slots: + /** The homepage URL has been clicked. */ + void urlClickedSlot(const QString&); + /** The email address has been clicked. */ + void emailClickedSlot(const QString& emailaddress); + // ---------------------------------------------------------------------------- +signals: + /** The email address has been clicked. */ + void sendEmail(const QString& name, const QString& email); + /** The URL has been clicked. */ + void openURL(const QString& url); + // ############################################################################ +}; + + + +KAboutContributor::KAboutContributor(QWidget* parent, const char* n) + : QFrame(parent, n), + name(new QLabel(this)), + email(new KURLLabel(this)), + url(new KURLLabel(this)) +{ + // ############################################################ + if(name==0 || email==0) + { // this will nearly never happen (out of memory in about box?) + kdDebug() << "KAboutContributor::KAboutContributor: Out of memory." << endl; + qApp->quit(); + } + setFrameStyle(QFrame::Panel | QFrame::Raised); + // ----- + connect(email, SIGNAL(leftClickedURL(const QString&)), + SLOT(emailClickedSlot(const QString&))); + connect(url, SIGNAL(leftClickedURL(const QString&)), + SLOT(urlClickedSlot(const QString&))); + // ############################################################ +} + +void +KAboutContributor::setName(const QString& n) +{ + // ############################################################ + name->setText(n); + // ############################################################ +} + +QString +KAboutContributor::getName() +{ + // ########################################################### + return name->text(); + // ########################################################### +} +void +KAboutContributor::setURL(const QString& u) +{ + // ########################################################### + url->setText(u); + // ########################################################### +} + +QString +KAboutContributor::getURL() +{ + // ########################################################### + return url->text(); + // ########################################################### +} + +void +KAboutContributor::setEmail(const QString& e) +{ + // ########################################################### + email->setText(e); + // ########################################################### +} + +QString +KAboutContributor::getEmail() +{ + // ########################################################### + return email->text(); + // ########################################################### +} + +void +KAboutContributor::emailClickedSlot(const QString& e) +{ + // ########################################################### + kdDebug() << "KAboutContributor::emailClickedSlot: called." << endl; + emit(sendEmail(name->text(), e)); + // ########################################################### +} + +void +KAboutContributor::urlClickedSlot(const QString& u) +{ + // ########################################################### + kdDebug() << "KAboutContributor::urlClickedSlot: called." << endl; + emit(openURL(u)); + // ########################################################### +} + +void +KAboutContributor::setWork(const QString& w) +{ + // ########################################################### + work=w; + // ########################################################### +} + +#endif + + +#if 0 +QSize +KAboutContributor::sizeHint() +{ + // ############################################################################ + const int FrameWidth=frameWidth(); + const int WorkTextWidth=200; + int maxx, maxy; + QRect rect; + // ----- first calculate name and email width: + maxx=name->sizeHint().width(); + maxx=QMAX(maxx, email->sizeHint().width()+WORKTEXT_IDENTATION); + // ----- now determine "work" text rectangle: + if(!work.isEmpty()) // save time + { + rect=fontMetrics().boundingRect + (0, 0, WorkTextWidth, 32000, WordBreak | AlignLeft, work); + } + if(maxxsizeHint().width()+WORKTEXT_IDENTATION); + // ----- + maxy=2*(name->sizeHint().height()+Grid); // need a space above the KURLLabels + maxy+=/* email */ name->sizeHint().height(); + maxy+=rect.height(); + // ----- + maxx+=2*FrameWidth; + maxy+=2*FrameWidth; + return QSize(maxx, maxy); + // ############################################################################ +} + +QSize KAboutContributor::minimumSizeHint(void) +{ + return( sizeHint() ); +} + + +void KAboutContributor::show( void ) +{ + QFrame::show(); + setMinimumSize( sizeHint() ); +} + + + +void +KAboutContributor::resizeEvent(QResizeEvent*) +{ // the widgets are simply aligned from top to bottom, since the parent is + // expected to respect the size hint + // ############################################################################ + int framewidth=frameWidth(), childwidth=width()-2*framewidth; + int cy=framewidth; + // ----- + name->setGeometry + (framewidth, framewidth, childwidth, name->sizeHint().height()); + cy=name->height()+Grid; + email->setGeometry + (framewidth+WORKTEXT_IDENTATION, cy, + childwidth-WORKTEXT_IDENTATION, /* email */ name->sizeHint().height()); + cy+=name->height()+Grid; + url->setGeometry + (framewidth+WORKTEXT_IDENTATION, cy, + childwidth-WORKTEXT_IDENTATION, /* url */ name->sizeHint().height()); + // the work text is drawn in the paint event + // ############################################################################ +} + + +void +KAboutContributor::paintEvent(QPaintEvent* e) +{ // the widgets are simply aligned from top to bottom, since the parent is + // expected to respect the size hint (the widget is only used locally by now) + // ############################################################################ + int cy=frameWidth()+name->height()+email->height()+Grid+url->height()+Grid; + int h=height()-cy-frameWidth(); + int w=width()-WORKTEXT_IDENTATION-2*frameWidth(); + // ----- + QFrame::paintEvent(e); + if(work.isEmpty()) return; + QPainter paint(this); // construct painter only if there is something to draw + // ----- + paint.drawText(WORKTEXT_IDENTATION, cy, w, h, AlignLeft | WordBreak, work); + // ############################################################################ +} +// MOC_SKIP_END +#endif + + +#if 0 +QSize KAboutContributor::sizeHint( void ) +{ + int s = KDialog::spacingHint(); + int h = fontMetrics().lineSpacing()*3 + 2*s; + int m = frameWidth(); + + int w = name->sizeHint().width(); + w = QMAX( w, email->sizeHint().width()+s); + w = QMAX( w, url->sizeHint().width()+s); + + if( work.isEmpty() == false ) + { + const int WorkTextWidth=200; + QRect r = fontMetrics().boundingRect + (0, 0, WorkTextWidth, 32000, WordBreak | AlignLeft, work); + if( w < r.width() ) + { + w = QMAX( w, WorkTextWidth+s ); + } + h += QMAX( fontMetrics().lineSpacing(), r.height() ) + s; + } + return( QSize( w + 2*m, h + 2*m ) ); + + + /* + int s = 3; + int m = frameWidth() + KDialog::spacingHint(); + int h = ls * 3 + s * 2; + int w = name->sizeHint().width(); + + w = QMAX( w, email->sizeHint().width()+WORKTEXT_IDENTATION); + w = QMAX( w, url->sizeHint().width()+WORKTEXT_IDENTATION); + if( work.isEmpty() == false ) + { + const int WorkTextWidth=200; + + QRect r = fontMetrics().boundingRect + (0, 0, WorkTextWidth, 32000, WordBreak | AlignLeft, work); + if( w < r.width() ) + { + w = QMAX( w, WorkTextWidth + WORKTEXT_IDENTATION ); + } + h += r.height() + s; + } + return( QSize( w + 2*m, h + 2*m ) ); + */ +} + + +// +// The widgets are simply aligned from top to bottom, since the parent is +// expected to respect the size hint +// +void KAboutContributor::resizeEvent(QResizeEvent*) +{ + int x = frameWidth(); + int s = KDialog::spacingHint(); + int h = fontMetrics().lineSpacing(); + int w = width() - 2*x; + int y = x; + + name->setGeometry( x, y, w, h ); + y += h + s; + email->setGeometry( x+s, y, w-s, h ); + y += h + s; + url->setGeometry( x+s, y, w-s, h ); + + /* + int x = frameWidth() + KDialog::spacingHint(); + int y = x; + int w = width() - 2*x; + int h = name->sizeHint().height(); + int s = 3; + + name->setGeometry( x, y, w, h ); + y += h + s; + email->setGeometry( x+WORKTEXT_IDENTATION, y, w-WORKTEXT_IDENTATION, h ); + y += h + s; + url->setGeometry( x+WORKTEXT_IDENTATION, y, w-WORKTEXT_IDENTATION, h ); + // + // the work text is drawn in the paint event + // + */ +} + + + +void KAboutContributor::paintEvent( QPaintEvent *e ) +{ + QFrame::paintEvent(e); + if(work.isEmpty()) return; + + int x = frameWidth() + KDialog::spacingHint(); + int h = fontMetrics().lineSpacing(); + int y = height() - frameWidth() - fontMetrics().lineSpacing(); + int w = width() - frameWidth()*2 - KDialog::spacingHint(); + + QPainter paint( this ); + paint.drawText( x, y, w, h, AlignLeft | WordBreak, work ); + + /* + + int s = 3; + int x = frameWidth() + KDialog::spacingHint() + WORKTEXT_IDENTATION; + int w = width()-WORKTEXT_IDENTATION-2*(frameWidth()+KDialog::spacingHint()); + int y = frameWidth()+KDialog::spacingHint()+(name->sizeHint().height()+s)*3; + int h = height()-y-frameWidth(); + + QPainter paint( this ); + paint.drawText( x, y, w, h, AlignLeft | WordBreak, work ); + */ +} +#endif + + + + + + +KAboutWidget::KAboutWidget(QWidget *_parent, const char *_name) + : QWidget(_parent, _name), + version(new QLabel(this)), + cont(new QLabel(this)), + logo(new QLabel(this)), + author(new KAboutContributor(this)), + maintainer(new KAboutContributor(this)), + showMaintainer(false), + d(0) +{ + // ################################################################# + if( !version || !cont || !logo || !author || !maintainer ) + { + // this will nearly never happen (out of memory in about box?) + kdDebug() << "KAboutWidget::KAboutWidget: Out of memory." << endl; + qApp->quit(); + } + // ----- + cont->setText(i18n("Other Contributors:")); + logo->setText(i18n("(No logo available)")); + logo->setFrameStyle(QFrame::Panel | QFrame::Raised); + version->setAlignment(AlignCenter); + // ----- + connect(author, SIGNAL(sendEmail(const QString&, const QString&)), + SLOT(sendEmailSlot(const QString&, const QString&))); + connect(author, SIGNAL(openURL(const QString&)), + SLOT(openURLSlot(const QString&))); + connect(maintainer, SIGNAL(sendEmail(const QString&, const QString&)), + SLOT(sendEmailSlot(const QString&, const QString&))); + connect(maintainer, SIGNAL(openURL(const QString&)), + SLOT(openURLSlot(const QString&))); + // ################################################################# +} + + +void +KAboutWidget::adjust() +{ + // ################################################################# + int cx, cy, tempx; + int maintWidth, maintHeight; + QSize total_size; + // ----- + if(showMaintainer) + { + total_size=maintainer->sizeHint(); + maintWidth=total_size.width(); + maintHeight=total_size.height(); + } else { + maintWidth=0; + maintHeight=0; + } + total_size=author->sizeHint(); + logo->adjustSize(); + cy=version->sizeHint().height()+Grid; + cx=logo->width(); + tempx=QMAX(total_size.width(), maintWidth); + cx+=Grid+tempx; + cx=QMAX(cx, version->sizeHint().width()); + cy+=QMAX(logo->height(), + total_size.height()+(showMaintainer ? Grid+maintHeight : 0)); + // ----- + if(!contributors.isEmpty()) + { + cx=QMAX(cx, cont->sizeHint().width()); + cy+=cont->sizeHint().height()+Grid; + QPtrListIterator _pos(contributors); + KAboutContributor* currEntry; + while ( (currEntry = _pos.current()) ) + { + ++_pos; + cy+=currEntry->sizeHint().height(); + } + } + // ----- + setMinimumSize(cx, cy); + // ################################################################# +} + +void +KAboutWidget::setLogo(const QPixmap& i) +{ + // ############################################################################ + logo->setPixmap(i); + // ############################################################################ +} + +void KAboutWidget::sendEmailSlot(const QString &_name, const QString &_email) +{ + emit(sendEmail(_name, _email)); +} + +void KAboutWidget::openURLSlot(const QString& _url) +{ + emit(openURL(_url)); +} + +void +KAboutWidget::setAuthor(const QString &_name, const QString &_email, + const QString &_url, const QString &_w) +{ + // ############################################################################ + author->setName(_name); + author->setEmail(_email); + author->setURL(_url); + author->setWork(_w); + // ############################################################################ +} + +void +KAboutWidget::setMaintainer(const QString &_name, const QString &_email, + const QString &_url, const QString &_w) +{ + // ############################################################################ + maintainer->setName(_name); + maintainer->setEmail(_email); + maintainer->setWork(_w); + maintainer->setURL(_url); + showMaintainer=true; + // ############################################################################ +} + +void +KAboutWidget::addContributor(const QString &_name, const QString &_email, + const QString &_url, const QString &_w) +{ + // ############################################################################ + KAboutContributor* const c=new KAboutContributor(this); + // ----- + c->setName(_name); + c->setEmail(_email); + c->setURL(_url); + c->setWork(_w); + contributors.append(c); + connect(c, SIGNAL(sendEmail(const QString&, const QString&)), + SLOT(sendEmailSlot(const QString&, const QString&))); + connect(c, SIGNAL(openURL(const QString&)), SLOT(openURLSlot(const QString&))); + // ############################################################################ +} + +void +KAboutWidget::setVersion(const QString &_name) +{ + // ############################################################################ + version->setText(_name); + // ############################################################################ +} + +void +KAboutWidget::resizeEvent(QResizeEvent*) +{ + // ############################################################################ + int _x=0, _y, cx, tempx, tempy; + // ----- set version label geometry: + version->setGeometry(0, 0, width(), version->sizeHint().height()); + _y=version->height()+Grid; + // ----- move logo to correct position: + logo->adjustSize(); + logo->move(0, _y); + // ----- move author and maintainer right to it: + tempx=logo->width()+Grid; + cx=width()-tempx; + author->setGeometry + (tempx, _y, cx, author->sizeHint().height()); + maintainer->setGeometry + (tempx, _y+author->height()+Grid, cx, maintainer->sizeHint().height()); + + _y+=QMAX(logo->height(), + author->height()+(showMaintainer ? Grid+maintainer->height() : 0)); + // ----- + if(!contributors.isEmpty()) + { + tempy=cont->sizeHint().height(); + cont->setGeometry(0, _y, width(), tempy); + cont->show(); + _y+=tempy+Grid; + } else { + cont->hide(); + } + QPtrListIterator _pos(contributors); + KAboutContributor* currEntry; + while( (currEntry = _pos.current()) ) + { + ++_pos; + tempy=currEntry->sizeHint().height(); + // y+=Grid; + currEntry->setGeometry(_x, _y, width(), tempy); + _y+=tempy; + } + if(showMaintainer) + { + maintainer->show(); + } else { + maintainer->hide(); + } + // ############################################################################ +} + +KAboutDialog::KAboutDialog(QWidget *_parent, const char *_name, bool modal) + : KDialogBase(_parent, _name, modal, QString::null, Ok, Ok ), + about(new KAboutWidget(this)), mContainerBase(0), d(0) +{ + // ################################################################# + if(!about) + { + // this will nearly never happen (out of memory in about box?) + kdDebug() << "KAboutDialog::KAboutDialog: Out of memory." << endl; + qApp->quit(); + } + setMainWidget(about); + connect(about, SIGNAL(sendEmail(const QString&, const QString&)), + SLOT(sendEmailSlot(const QString&, const QString&))); + connect(about, SIGNAL(openURL(const QString&)), + SLOT(openURLSlot(const QString&))); + // ################################################################# +} + + +KAboutDialog::KAboutDialog( int layoutType, const QString &_caption, + int buttonMask, ButtonCode defaultButton, + QWidget *_parent, const char *_name, bool modal, + bool separator, const QString &user1, + const QString &user2, const QString &user3 ) + :KDialogBase( _parent, _name, modal, QString::null, buttonMask, defaultButton, + separator, user1, user2, user3 ), + about(0), d(0) +{ + setPlainCaption( i18n("About %1").arg(_caption) ); + + mContainerBase = new KAboutContainerBase( layoutType, this ); + setMainWidget(mContainerBase); + + connect( mContainerBase, SIGNAL(urlClick(const QString &)), + this, SLOT(openURLSlot(const QString &))); + connect( mContainerBase, SIGNAL(mailClick(const QString &,const QString &)), + this, SLOT(sendEmailSlot(const QString &,const QString &))); + connect( mContainerBase, SIGNAL(mouseTrack(int, const QMouseEvent *)), + this, SLOT(mouseTrackSlot(int, const QMouseEvent *))); +} + + +void KAboutDialog::show( void ) +{ + adjust(); + if( mContainerBase ) { mContainerBase->show(); } + QDialog::show(); +} + + +void KAboutDialog::show( QWidget * /*centerParent*/ ) +{ + adjust(); + if( mContainerBase ) { mContainerBase->show(); } + QDialog::show(); +} + + +void KAboutDialog::adjust() +{ + if( !about ) { return; } + about->adjust(); + //initializeGeometry(); + resize( sizeHint() ); +} + + +void KAboutDialog::setLogo(const QPixmap& i) +{ + if( !about ) { return; } + about->setLogo(i); +} + + +void KAboutDialog::setMaintainer(const QString &_name, const QString &_email, + const QString &_url, const QString &_w) +{ + // ################################################################# + if( !about ) { return; } + about->setMaintainer(_name, _email, _url, _w); + // ################################################################# +} + +void KAboutDialog::setAuthor(const QString &_name, const QString &_email, + const QString &_url, const QString &_work) +{ + // ################################################################# + if( !about ) { return; } + about->setAuthor(_name, _email, _url, _work); + // ################################################################# +} + +void KAboutDialog::addContributor(const QString &_name, const QString &_email, + const QString &_url, const QString &_w) +{ + // ################################################################# + if( !about ) { return; } + about->addContributor(_name, _email, _url, _w); + // ################################################################# +} + +void KAboutDialog::setVersion(const QString &_name) +{ + // ################################################################# + if( !about ) { return; } + about->setVersion(_name); + // ################################################################# +} + +void KAboutDialog::sendEmailSlot(const QString& /*name*/, const QString& email) +{ + if ( kapp ) + kapp->invokeMailer( email, QString::null ); + /* + kdDebug() << "KAboutDialog::sendEmailSlot: request to send an email to " + << name << ", " << email << endl; + emit(sendEmail(name, email)); + */ +} + +void KAboutDialog::openURLSlot(const QString& url) +{ + if ( kapp ) + kapp->invokeBrowser( url ); + //kdDebug() << "KAboutDialog::openURLSlot: request to open URL " << url << endl; + //emit(openURL(url)); +} + + +void KAboutDialog::mouseTrackSlot( int /*mode*/, const QMouseEvent * /*e*/ ) +{ + // By default we do nothing. This method must be reimplemented. +} + + +QFrame *KAboutDialog::addTextPage( const QString &title, const QString &text, + bool richText, int numLines ) +{ + if( !mContainerBase ) { return 0; } + return mContainerBase->addTextPage( title, text, richText, numLines ); +} + +QFrame *KAboutDialog::addLicensePage( const QString &title, const QString &text, + int numLines ) +{ + if( !mContainerBase ) { return 0; } + return mContainerBase->addLicensePage( title, text, numLines ); +} + + +KAboutContainer *KAboutDialog::addContainerPage( const QString &title, + int childAlignment, int innerAlignment ) +{ + if( !mContainerBase ) { return 0; } + return mContainerBase->addContainerPage( title, childAlignment, + innerAlignment); +} + + +KAboutContainer *KAboutDialog::addScrolledContainerPage( const QString &title, + int childAlignment, int innerAlignment ) +{ + if( !mContainerBase ) { return 0; } + return mContainerBase->addScrolledContainerPage( title, childAlignment, + innerAlignment); +} + + + +QFrame *KAboutDialog::addPage( const QString &title ) +{ + if( !mContainerBase ) { return 0; } + return mContainerBase->addEmptyPage( title ); +} + + +KAboutContainer *KAboutDialog::addContainer( int childAlignment, + int innerAlignment ) +{ + if( !mContainerBase ) { return 0; } + return mContainerBase->addContainer( childAlignment, innerAlignment ); +} + + +void KAboutDialog::setTitle( const QString &title ) +{ + if( !mContainerBase ) { return; } + mContainerBase->setTitle( title ); +} + + +void KAboutDialog::setImage( const QString &fileName ) +{ + if( !mContainerBase ) { return; } + mContainerBase->setImage( fileName ); +} + +// KDE4: remove +void KAboutDialog::setIcon( const QString &fileName ) +{ + if( !mContainerBase ) { return; } + mContainerBase->setProgramLogo( fileName ); +} + +void KAboutDialog::setProgramLogo( const QString &fileName ) +{ + if( !mContainerBase ) { return; } + mContainerBase->setProgramLogo( fileName ); +} + +void KAboutDialog::setProgramLogo( const QPixmap &pixmap ) +{ + if( !mContainerBase ) { return; } + mContainerBase->setProgramLogo( pixmap ); +} + +void KAboutDialog::setImageBackgroundColor( const QColor &color ) +{ + if( !mContainerBase ) { return; } + mContainerBase->setImageBackgroundColor( color ); +} + + +void KAboutDialog::setImageFrame( bool state ) +{ + if( !mContainerBase ) { return; } + mContainerBase->setImageFrame( state ); +} + + +void KAboutDialog::setProduct( const QString &appName, const QString &version, + const QString &author, const QString &year ) +{ + if( !mContainerBase ) { return; } + mContainerBase->setProduct( appName, version, author, year ); +} + + + +void KAboutDialog::imageURL( QWidget *_parent, const QString &_caption, + const QString &_path, const QColor &_imageColor, + const QString &_url ) +{ + KAboutDialog a( AbtImageOnly, QString::null, Close, Close, _parent, "image", true ); + a.setPlainCaption( _caption ); + a.setImage( _path ); + a.setImageBackgroundColor( _imageColor ); + + KAboutContainer* const c = a.addContainer( AlignCenter, AlignCenter ); + if( c ) + { + c->addPerson( QString::null, QString::null, _url, QString::null ); + } + a.exec(); +} + + + + +// +// A class that can can monitor mouse movements on the image +// +KImageTrackLabel::KImageTrackLabel( QWidget *_parent, const char *_name, WFlags f ) + : QLabel( _parent, _name, f ) +{ + setText( i18n("Image missing")); +} + +void KImageTrackLabel::mousePressEvent( QMouseEvent *e ) +{ + emit mouseTrack( MousePress, e ); +} + +void KImageTrackLabel::mouseReleaseEvent( QMouseEvent *e ) +{ + emit mouseTrack( MouseRelease, e ); +} + +void KImageTrackLabel::mouseDoubleClickEvent( QMouseEvent *e ) +{ + emit mouseTrack( MouseDoubleClick, e ); +} + +void KImageTrackLabel::mouseMoveEvent ( QMouseEvent *e ) +{ + emit mouseTrack( MouseDoubleClick, e ); +} + +void KAboutDialog::virtual_hook( int id, void* data ) +{ KDialogBase::virtual_hook( id, data ); } + -- cgit v1.2.1