Diffstat (limited to 'noncore/multimedia/showimg/showimg.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/multimedia/showimg/showimg.cpp | 279 |
1 files changed, 242 insertions, 37 deletions
diff --git a/noncore/multimedia/showimg/showimg.cpp b/noncore/multimedia/showimg/showimg.cpp index d7d53ec..0fbffe7 100644 --- a/noncore/multimedia/showimg/showimg.cpp +++ b/noncore/multimedia/showimg/showimg.cpp @@ -15,55 +15,60 @@ ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ // // Full-screen and rotation options contributed by Robert Wittams <robert@wittams.com> // #include "showimg.h" #include "ImageFileSelector.h" +#include "settingsdialog.h" + +#include <opie/ofiledialog.h> + +#include <qpe/qpeapplication.h> #include <qpe/config.h> #include <qpe/resource.h> #include <qpe/fileselector.h> #include <qpe/applnk.h> #include <qfileinfo.h> #include <math.h> #include <qpe/qpemenubar.h> #include <qwidgetstack.h> #include <qpe/qpetoolbar.h> #include <qaction.h> #include <qfiledialog.h> #include <qmessagebox.h> #include <qpopupmenu.h> #include <qscrollview.h> #include <qlabel.h> #include <qpainter.h> #include <qkeycode.h> #include <qapplication.h> #include <qclipboard.h> #include <qtimer.h> #include <qspinbox.h> -ControlsDialog::ControlsDialog(const QString &caption,QImage image,int *brightness,QWidget *parent):QDialog(parent,0,true) +ControlsDialog::ControlsDialog(const QString &caption,QImage image,int *brightness,QWidget *parent) + : QDialog(parent,0,true) { setCaption(caption); - if ( parent ) - { + if ( parent ) { setPalette(parent->palette()); } b=brightness; img=image; setMinimumSize(140,80); QGridLayout *gl= new QGridLayout(this,2,2,4,4); pixmap =new ImageWidget(this);; QPixmap pm; @@ -92,27 +97,28 @@ void ControlsDialog::bValueChanged(int value) pixmap->setPixmap(pm); pixmap->repaint(false); } void ControlsDialog::accept() { *b=spb->value(); done(1); } +//=========================================================================== - -InfoDialog::InfoDialog(const QString &caption, const QStringList text,QWidget *parent):QDialog(parent,0,true) +InfoDialog::InfoDialog(const QString &caption, const QStringList text,QWidget *parent) + : QDialog(parent,0,true) { setCaption(caption); if ( parent ) { setPalette(parent->palette()); } const char *labels[]={"File Name","Format","File Size","Size","Colors","Alpha"}; setMinimumSize(180,80); int num=ImageViewer::LAST+1; @@ -140,24 +146,26 @@ InfoDialog::InfoDialog(const QString &caption, const QStringList text,QWidget *p } } void InfoDialog::displayInfo(const QString &caption, const QStringList text, QWidget *parent) { InfoDialog *dlg=new InfoDialog(caption,text,parent); dlg->exec(); delete dlg; } +//=========================================================================== + ImagePane::ImagePane( QWidget *parent ) : QWidget( parent ) { vb = new QVBoxLayout( this ); image = new QScrollView(this,0,WResizeNoErase|WNorthWestGravity); pic=new ImageWidget(image); image->addChild(pic); connect(pic, SIGNAL( clicked() ), this, SLOT( imageClicked() )); vb->addWidget( image ); @@ -220,44 +228,51 @@ ImageViewer::ImageViewer( QWidget *parent, const char *name, int wFlags ) toolBar = new QPEToolBar( this ); toolBar->setHorizontalStretchable( TRUE ); menuBar = new QPEMenuBar( toolBar ); current=menuBar; fileMenuFile = new QPopupMenu(this); //menuBarmenubarFile->insertItem( tr("File"), fileMenu ); - fileMenuFile->insertItem(tr("Open"), this, SLOT(openFile()), 0); + fileMenuFile->insertItem(tr("Open"), + this, SLOT(openFile()), 0); viewMenuFile = new QPopupMenu( this ); //menubarFile->insertItem( tr("View"), viewMenu ); - viewMenuFile->insertItem( tr("Thumbnail View"), this, SLOT(switchThumbView()), 0, SHOW_THUMBNAILS ); + viewMenuFile->insertItem( tr("Thumbnail View"), + this, SLOT(switchThumbView()), 0, SHOW_THUMBNAILS ); viewMenuFile->setItemChecked ( SHOW_THUMBNAILS, showThumbView ); optionsMenuFile = new QPopupMenu( this); //menubarFile->insertItem( tr("Options"),optionsMenu ); - optionsMenuFile->insertItem( tr("Slideshow") ); - optionsMenuFile->insertSeparator(); - optionsMenuFile->insertItem( tr("Preferences..")); - optionsMenuFile->insertItem( tr("Help")); - + slideAction = new QAction( tr( "Slide show" ), Resource::loadIconSet( "slideshow" ), + QString::null, 0, this, 0 ); + slideAction->setToggleAction( TRUE ); + connect( slideAction, SIGNAL( toggled(bool) ), this, SLOT( slideShow(bool) ) ); + slideAction->addTo( optionsMenuFile); +// slideAction->addTo( toolBar ); +// optionsMenuFile->insertItem( tr("Slideshow") ); + optionsMenuFile->insertSeparator(); + optionsMenuFile->insertItem( tr("Preferences.."), this, SLOT(settings()), 0); +// optionsMenuFile->insertItem( tr("Help"), this, SLOT(help()), 0); QStrList fmt = QImage::outputFormats(); fileMenuView = new QPopupMenu( this ); //menubarView->insertItem( tr("File"),fileMenu ); fileMenuView->insertItem( tr("Image Info ..."),this, SLOT(displayInfoDialog()),0 ); fileMenuView->insertSeparator(); viewMenuView = new QPopupMenu(this ); viewMenuView->setCheckable ( true ); @@ -282,25 +297,29 @@ ImageViewer::ImageViewer( QWidget *parent, const char *name, int wFlags ) qDebug("cv = %d",cv); fileSelector = new ImageFileSelector( cv,stack, "fs"); //switchThumbView(); //fileSelector = new ImageFileSelector("image/*", stack, "fs"); //fileSelector->setNewVisible(FALSE); //fileSelector->setCloseVisible(FALSE); connect( fileSelector, SIGNAL( closeMe() ), this, SLOT( closeFileSelector() ) ); - connect( fileSelector, SIGNAL( fileSelected( const DocLnk &) ), this, SLOT( openFile( const DocLnk & ) ) ); + connect( fileSelector, SIGNAL( fileSelected( const DocLnk &) ), + this, SLOT( openFile( const DocLnk & ) ) ); + + imageList = fileSelector->fileList(); + slideAction->setEnabled( imageList.count() != 0); iconToolBar = new QPEToolBar(this); QAction *a; a = new QAction( tr( "Open ..." ), Resource::loadPixmap( "fileopen" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( open() ) ); a->addTo( fileMenuView); a->addTo( iconToolBar ); a = new QAction( tr( "Rotate 90"), Resource::loadPixmap( "rotate90" ), QString::null, 0, this, 0); @@ -327,84 +346,145 @@ ImageViewer::ImageViewer( QWidget *parent, const char *name, int wFlags ) viewMenuView->insertSeparator(); sss = new QAction( tr( "Scale to Screen"), Resource::loadPixmap( "scale" ), QString::null, 0, this, 0,true); connect( sss, SIGNAL( activated() ), this, SLOT( switchSizeToScreen() ) ); sss->addTo( iconToolBar ); sss->addTo( viewMenuView ); sss->setOn(isSized); viewMenuView->insertSeparator(); - a = new QAction( tr( "Fullscreen" ), Resource::loadPixmap( "fullscreen" ), QString::null, 0, this, 0 ); + a = new QAction( tr( "Fullscreen" ), Resource::loadPixmap( "fullscreen" ), + QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( fullScreen() ) ); a->addTo( iconToolBar ); a->addTo( viewMenuView); + a = new QAction( tr( "Stop Slideshow" ), Resource::loadPixmap( "quit_icon" ), + QString::null, 0, this, 0 ); + connect( a, SIGNAL( activated() ), this, SLOT( stopSlideShow() ) ); + a->addTo( iconToolBar ); + a->addTo( viewMenuView); + + + Config config( "ImageViewer" ); + config.setGroup( "SlideShow" ); + slideDelay = config.readNumEntry( "Delay", 2); + slideRepeat = config.readBoolEntry( "Repeat", FALSE ); + slideReverse = config.readBoolEntry("Reverse", FALSE); + + config.setGroup("Default"); + rotateOnLoad = config.readBoolEntry("Rotate", FALSE); + fastLoad = config.readBoolEntry("FastLoad", TRUE); + slideTimer = new QTimer( this ); + connect( slideTimer, SIGNAL(timeout()), this, SLOT(slideUpdate()) ); + switchToFileSelector(); setMouseTracking( TRUE ); } ImageViewer::~ImageViewer() { Config cfg("Image Viewer"); cfg.setGroup("Image Viewer"); cfg.writeEntry("ShowThumbnails",(int)showThumbView); cfg.writeEntry("SizeToScreen",(int)isSized); + cfg.setGroup( "SlideShow" ); + cfg.writeEntry( "Delay", slideDelay); + cfg.writeEntry( "Repeat", slideRepeat ); + cfg.writeEntry("Reverse", slideReverse); + + cfg.setGroup("Default"); + cfg.writeEntry("Rotate", rotateOnLoad); + cfg.writeEntry("FastLoad", fastLoad); + delete imagePanel; // in case it is fullscreen } +void ImageViewer::help() { + +} + + +void ImageViewer::settings() +{ + SettingsDialog dlg( this, 0, TRUE ); + dlg.setDelay( slideDelay ); + dlg.setRepeat( slideRepeat ); + dlg.setReverse( slideReverse ); + dlg.setRotate(rotateOnLoad); + dlg.setFastLoad(fastLoad); + + if ( QPEApplication::execDialog(&dlg) == QDialog::Accepted ) { + qDebug("<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>"); + slideDelay = dlg.delay(); + slideRepeat = dlg.repeat(); + slideReverse = dlg.reverse(); + rotateOnLoad = dlg.rotate(); + fastLoad = dlg.fastLoad(); + + Config config( "ImageViewer" ); + config.setGroup( "SlideShow" ); + config.writeEntry( "Delay", slideDelay ); + config.writeEntry( "Repeat", slideRepeat ); + config.writeEntry("Reverse", slideReverse); + + config.setGroup("Default"); + config.writeEntry("Rotate", rotateOnLoad); + config.writeEntry("FastLoad", fastLoad); + } +} + void ImageViewer::switchSizeToScreen() { isSized=!isSized; sss->setOn(isSized); updateImage(); } void ImageViewer::updateImage() { - if ( isSized ) - { + if ( isSized ) { imagePanel->setPixmap(pmScaled); - } - else - { + } else { imagePanel->setPixmap(pm); } } void ImageViewer::switchThumbView() { showThumbView=!showThumbView; viewMenuFile->setItemChecked ( SHOW_THUMBNAILS, showThumbView ); fileSelector->switchView(); } void ImageViewer::switchToFileSelector() { stack->raiseWidget(fileSelector); menuBar->clear(); menuBar->insertItem( tr("File"), fileMenuFile ); menuBar->insertItem( tr("View"), viewMenuFile ); menuBar->insertItem( tr("Options"), optionsMenuFile ); iconToolBar->hide(); imagePanel->disable(); + slideShow(false); } void ImageViewer::switchToImageView() { stack->raiseWidget(imagePanel); menuBar->clear(); menuBar->insertItem( tr("File"), fileMenuView ); menuBar->insertItem( tr("View"), viewMenuView ); viewMenuView->setItemEnabled(BLACKANDWHITE,true); iconToolBar->show(); @@ -425,45 +505,61 @@ void ImageViewer::doDelayedLoad() { show(delayLoad); } void ImageViewer::show() { normalView(); QMainWindow::show(); } void ImageViewer::show(const QString& fileref) { +// qDebug("Show "+fileref); bFromDocView = TRUE; closeFileSelector(); DocLnk link(fileref); - if ( link.isValid() ) - { + if ( link.isValid() ) { openFile(link); - } - else - { + } else { filename = fileref; updateCaption( fileref ); loadImage( fileref ); } } -void ImageViewer::openFile( const DocLnk &file ) +void ImageViewer::openFile() { + MimeTypes types; + QStringList image; + image << "image/*"; + types.insert("Images", image); + + QString str = OFileDialog::getOpenFileName( 1,QPEApplication::documentDir(),"", types, 0 ); + DocLnk link(str); + if ( link.isValid() ) + openFile(link); + +} + +void ImageViewer::openFile( const DocLnk &link ) { closeFileSelector(); - DocLnk link(file); +// DocLnk link(file); + qDebug("open "+link.name()); updateCaption( link.name() ); loadImage( link.file() ); + if (slideTimer->isActive()) { + slideTimer->start(slideDelay * 1000, FALSE); + } + } void ImageViewer::open() { switchToFileSelector(); } void ImageViewer::closeFileSelector() { switchToImageView(); } @@ -473,42 +569,53 @@ void ImageViewer::updateCaption( QString name ) if ( sep >= 0 ) name = name.mid( sep+1 ); setCaption( name + tr(" - Image Viewer") ); } /* This function loads an image from a file. */ void ImageViewer::loadImage( const char *fileName ) { filename = fileName; - if ( filename ) - { + if ( filename ) { QApplication::setOverrideCursor( waitCursor ); // this might take time //imagePanel->statusLabel()->setText( tr("Loading image...") ); qApp->processEvents(); bool ok = image.load(filename, 0); - if ( ok ) - { + if ( ok ) { ok = reconvertImage(); updateImageInfo(filename); } - if ( !ok ) - { + if ( !ok ) { pm.resize(0,0); // couldn't load image update(); } QApplication::restoreOverrideCursor(); // restore original cursor } + +// fastLoad ? ", Fast" : "", +// fastLoad ? QMAX(imagewidth/maxsize, imageheight/maxsize) : 1); + + +// matrix.reset(); + rotated90 = FALSE; + + if (rotateOnLoad) { + rotated90 = TRUE; + rot90(); +// matrix.rotate( -90.0 ); + } + switchToImageView(); updateImage(); } bool ImageViewer::loadSelected() { bool ok = false; if ( stack->visibleWidget() == fileSelector ) { const DocLnk *link = fileSelector->selected(); if ( link ) @@ -610,79 +717,81 @@ void ImageViewer::resizeEvent( QResizeEvent * ) if ( imagePanel->paneWidth() != pmScaled.width() || h != pmScaled.height() ) { // if new size, scale(); // scale pmScaled to window } if ( image.hasAlphaBuffer() ) erase(); } void ImageViewer::hFlip() { +// matrix.scale( -1.0, 1.0 ); + setImage(image.mirror(TRUE,FALSE)); } void ImageViewer::vFlip() { +// matrix.scale( 1.0, -1.0 ); setImage(image.mirror(FALSE,TRUE)); } void ImageViewer::rot180() { - +// matrix.rotate( 180.0 ); setImage(image.mirror(TRUE,TRUE)); } void ImageViewer::rot90() { QImage oldimage; oldimage = image.convertDepth(32); +// matrix.rotate( -90.0 ); setImage(rotate(oldimage,Rotate90)); } void ImageViewer::rot270() { QImage oldimage; oldimage = image.convertDepth(32); +// matrix.rotate(90.0); setImage(rotate(oldimage,Rotate270)); } void ImageViewer::blackAndWhite() { viewMenuView->setItemEnabled(BLACKANDWHITE,false); setImage(toGray(image,false)); - - } void ImageViewer::displayControlsDialog() { int w=80; int h=w; QImage small; if ( image.width()<w ||image.height()<h ) small=image.smoothScale(w,h); else small=image.copy(0,0,w,h); int newB=0; ControlsDialog *dlg=new ControlsDialog("Image Viewer",small,&newB,this); dlg->exec(); - if ( newB ) - { + if ( newB ) { intensity(image,(float)newB/100); setImage(image); } } void ImageViewer::displayInfoDialog() { QStringList ls; @@ -698,24 +807,29 @@ void ImageViewer::normalView() isFullScreen = FALSE; stack->addWidget( imagePanel, 1 ); switchToImageView(); if ( isSized ) scale(); updateImage(); } } +void ImageViewer::stopSlideShow() { + if (slideTimer->isActive()) + slideTimer->stop(); +} + void ImageViewer::fullScreen() { // Full-screen option // contributed by Robert Wittams <robert@wittams.com> if ( imagePanel->parentWidget() && loadSelected() ) { isFullScreen = TRUE; imagePanel->reparent(0,QPoint(0,0)); imagePanel->resize(qApp->desktop()->width(), qApp->desktop()->height()); if ( isSized ) scale(); @@ -1025,20 +1139,111 @@ QImage ImageViewer::rotate(QImage &img, RotateDirection r) destData = (unsigned char *)dest.scanLine(img.width()-x-1); destData[y] = srcData[x]; } } break; default: dest = img; break; } } return (dest); +} + +void ImageViewer::slideShow( bool on ) +{ + if (on) { + if (!imageList.isEmpty()) { + slideTimer->start(slideDelay * 1000, FALSE); + filename = ""; // force restart + slideReverse ? prevImage() : nextImage(); + } + } else { + slideTimer->stop(); + slideAction->setOn( false); + } +} + +void ImageViewer::slideUpdate() +{ + bool final_image = slideReverse ? prevImage() : nextImage(); + + if (final_image && !slideRepeat) { + slideTimer->stop(); + slideAction->setOn(FALSE); + } +} +// +// Display the image after the current one in the image list. +// Return TRUE if the next call to nextImage() will wrap around to the +// first image in the list (ie. we're now viewing the last image in the list). +// +bool ImageViewer::nextImage(void) +{ + int idx = 0; + + if (imageList.count() > 0) { + idx = imageIndex(); + if (idx != -1) { + if (idx == int(imageList.count() - 1)) { + idx = 0; + } else { + idx++; + } + } else { + idx = 0; + } + openFile(imageList[idx]); + } + return idx == int(imageList.count() - 1) ? TRUE : FALSE; } +// +// Display the image preceeding the current one in the image list. +// Return TRUE if the next call to prevImage() will wrap around to the last +// image in the list (ie. we're now viewing the first image in the list). +// +bool ImageViewer::prevImage(void) +{ + int idx = -1; + + if (imageList.count() > 0) { + idx = imageIndex(); + if (idx != -1) { + if (idx == 0) { + idx = imageList.count() - 1; + } else { + idx--; + } + } else { + idx = imageList.count() - 1; + } + openFile(imageList[idx]); + } + return idx == 0 ? TRUE : FALSE; +} +// +// Return the index into the imageList of the currently viewed +// image (ie. ImageViewer::filename in ImageViewer::imageList). +// +int ImageViewer::imageIndex(void) +{ + QValueListConstIterator<DocLnk> i; + int index; + if (imageList.count() == 0) { + return -1; + } + for (index = 0, i = imageList.begin(); i != imageList.end(); ++i, index++) { + if ((*i).file() == filename) { + return index; + } + } + + return -1; +} |