summaryrefslogtreecommitdiff
path: root/noncore/multimedia/showimg/showimg.cpp
Side-by-side diff
Diffstat (limited to 'noncore/multimedia/showimg/showimg.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/showimg/showimg.cpp279
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;
+}