kio Library API Documentation

kimagefilepreview.cpp

00001 /*
00002  * This file is part of the KDE project
00003  * Copyright (C) 2001 Martin R. Jones <mjones@kde.org>
00004  *               2001 Carsten Pfeiffer <pfeiffer@kde.org>
00005  *
00006  * You can Freely distribute this program under the GNU Library General Public
00007  * License. See the file "COPYING" for the exact licensing terms.
00008  */
00009 
00010 #include <qlayout.h>
00011 #include <qlabel.h>
00012 #include <qcombobox.h>
00013 #include <qcheckbox.h>
00014 #include <qpushbutton.h>
00015 #include <qwhatsthis.h>
00016 #include <qtimer.h>
00017 
00018 #include <kapplication.h>
00019 #include <kconfig.h>
00020 #include <kglobal.h>
00021 #include <kiconloader.h>
00022 #include <kstandarddirs.h>
00023 #include <kdebug.h>
00024 #include <klocale.h>
00025 #include <kfiledialog.h>
00026 #include <kfileitem.h>
00027 #include <kio/previewjob.h>
00028 
00029 #include "kimagefilepreview.h"
00030 #include "config-kfile.h"
00031 
00032 /**** KImageFilePreview ****/
00033 
00034 KImageFilePreview::KImageFilePreview( QWidget *parent )
00035     : KPreviewWidgetBase( parent ),
00036       m_job( 0L )
00037 {
00038     KConfig *config = KGlobal::config();
00039     KConfigGroupSaver cs( config, ConfigGroup );
00040     autoMode = config->readBoolEntry( "Automatic Preview", true );
00041 
00042     QVBoxLayout *vb = new QVBoxLayout( this, KDialog::marginHint() );
00043 
00044     imageLabel = new QLabel( this );
00045     imageLabel->setFrameStyle( QFrame::Panel | QFrame::Sunken );
00046     imageLabel->setAlignment( Qt::AlignHCenter | Qt::AlignVCenter );
00047     imageLabel->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ) );
00048     vb->addWidget( imageLabel, 1 );
00049 
00050     QHBoxLayout *hb = new QHBoxLayout( vb );
00051 
00052     autoPreview = new QCheckBox( i18n("&Automatic preview"), this );
00053     autoPreview->setChecked( autoMode );
00054     hb->addWidget( autoPreview );
00055     connect( autoPreview, SIGNAL(toggled(bool)), SLOT(toggleAuto(bool)) );
00056 
00057     previewButton = new QPushButton( i18n("&Preview"), this );
00058     hb->addWidget( previewButton );
00059     connect( previewButton, SIGNAL(clicked()), SLOT(showPreview()) );
00060 
00061     timer = new QTimer( this );
00062     connect( timer, SIGNAL(timeout()), SLOT(showPreview()) );
00063 
00064     setSupportedMimeTypes( KIO::PreviewJob::supportedMimeTypes() );
00065 }
00066 
00067 KImageFilePreview::~KImageFilePreview()
00068 {
00069     if ( m_job )
00070         m_job->kill();
00071 
00072     KConfig *config = KGlobal::config();
00073     KConfigGroupSaver cs( config, ConfigGroup );
00074     config->writeEntry( "Automatic Preview", autoPreview->isChecked() );
00075 }
00076 
00077 void KImageFilePreview::showPreview()
00078 {
00079     // Pass a copy since clearPreview() will clear currentURL
00080     KURL url = currentURL;
00081     showPreview( url, true );
00082 }
00083 
00084 // called via KPreviewWidgetBase interface
00085 void KImageFilePreview::showPreview( const KURL& url )
00086 {
00087     showPreview( url, false );
00088 }
00089 
00090 void KImageFilePreview::showPreview( const KURL &url, bool force )
00091 {
00092     if ( !url.isValid() ) {
00093         clearPreview();
00094         return;
00095     }
00096 
00097     if ( url != currentURL || force )
00098     {
00099         clearPreview();
00100     currentURL = url;
00101 
00102     if ( autoMode || force )
00103     {
00104             int w = imageLabel->contentsRect().width() - 4;
00105             int h = imageLabel->contentsRect().height() - 4;
00106 
00107             m_job =  createJob( url, w, h );
00108             connect( m_job, SIGNAL( result( KIO::Job * )),
00109                      this, SLOT( slotResult( KIO::Job * )));
00110             connect( m_job, SIGNAL( gotPreview( const KFileItem*,
00111                                                 const QPixmap& )),
00112                      SLOT( gotPreview( const KFileItem*, const QPixmap& ) ));
00113 
00114             connect( m_job, SIGNAL( failed( const KFileItem* )),
00115                      this, SLOT( slotFailed( const KFileItem* ) ));
00116     }
00117     }
00118 }
00119 
00120 void KImageFilePreview::toggleAuto( bool a )
00121 {
00122     autoMode = a;
00123     if ( autoMode )
00124     {
00125         // Pass a copy since clearPreview() will clear currentURL
00126         KURL url = currentURL;
00127         showPreview( url, true );
00128     }
00129 }
00130 
00131 void KImageFilePreview::resizeEvent( QResizeEvent * )
00132 {
00133     timer->start( 100, true ); // forces a new preview
00134 }
00135 
00136 QSize KImageFilePreview::sizeHint() const
00137 {
00138     return QSize( 20, 200 ); // otherwise it ends up huge???
00139 }
00140 
00141 KIO::PreviewJob * KImageFilePreview::createJob( const KURL& url, int w, int h )
00142 {
00143     KURL::List urls;
00144     urls.append( url );
00145     return KIO::filePreview( urls, w, h, 0, 0, true, false );
00146 }
00147 
00148 void KImageFilePreview::gotPreview( const KFileItem* item, const QPixmap& pm )
00149 {
00150     if ( item->url() == currentURL ) // should always be the case
00151         imageLabel->setPixmap( pm );
00152 }
00153 
00154 void KImageFilePreview::slotFailed( const KFileItem* item )
00155 {
00156     if ( item->isDir() )
00157         imageLabel->clear();
00158     else if ( item->url() == currentURL ) // should always be the case
00159         imageLabel->setPixmap( SmallIcon( "file_broken", KIcon::SizeLarge,
00160                                           KIcon::DisabledState ));
00161 }
00162 
00163 void KImageFilePreview::slotResult( KIO::Job *job )
00164 {
00165     if ( job == m_job )
00166         m_job = 0L;
00167 }
00168 
00169 void KImageFilePreview::clearPreview()
00170 {
00171     if ( m_job ) {
00172         m_job->kill();
00173         m_job = 0L;
00174     }
00175 
00176     imageLabel->clear();
00177     currentURL = KURL();
00178 }
00179 
00180 void KImageFilePreview::virtual_hook( int id, void* data )
00181 { KPreviewWidgetBase::virtual_hook( id, data ); }
00182 
00183 #include "kimagefilepreview.moc"
KDE Logo
This file is part of the documentation for kio Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Feb 14 09:17:10 2006 by doxygen 1.3.6 written by Dimitri van Heesch, © 1997-2003