[KimDaBa] Patch to read Exif information from files.

Jesper K. Pedersen blackie at blackie.dk
Thu May 6 19:20:11 CEST 2004


I haven't tried the patch yet, but could you please rework it in a minor way:
If images are selected then work on these images only, otherwise work on 
current context.
The function MainView::getSelectedOnDisk will giev you exactly this.

Cheers
Jesper

On Thursday 06 May 2004 17:56, Marco Caldarelli wrote:
| Hi,
|
| I wrote a small patch to reread EXIF info from files. It adds two menu
| items,
|
|   Maintenance->Read EXIF info from all files...
|
| to reread info for all files in the database, and
|
|   Images->Read EXIF info from selected files...
|
| to reread info only for the selected files.
|
| In both cases, a dialog opens and asks what information should be read. It
| is possible to select any combination of
|   Read time
|   Read date
|   Read EXIF orientation
|   Read EXIF description
| or, alternatively, to select the "Read all" box.
| Then, clicking on "Read File Info" the whanted data is updated.
|
| The code is easy to expand if more file data will be inserted in the future
| (for example the image resolution, or some camera settings...).
| It would be nice to have the "Read all" exclusive in the future (checking
| it unsets all other boxes, and setting a different box clears it).
|
| I didn't do extensive tests for the moment, I will do some in the next
| days, but the code seems to work. I would appreciate very much any
| suggestion, comment and help to test it.
|
| Here follows the diff file for the modifications, and the code for two new
| files, readinfodialog.h and readinfodialog.cpp.
|
| Ciao,
| Marco
|
| ---------------------------------------------------------------------------
|--
|
| --- BEGIN DIFF ---
|
| Index: Makefile.am
| ===================================================================
| RCS file: /home/kde/kdeextragear-2/kimdaba/Makefile.am,v
| retrieving revision 1.53
| diff -r1.53 Makefile.am
| 39c39
| < 	myimageinfo.cpp myimagecollection.cpp plugininterface.cpp
| ---
|
| > 	myimageinfo.cpp myimagecollection.cpp plugininterface.cpp
| > readinfodialog.cpp
|
| Index: imagedb.cpp
| ===================================================================
| RCS file: /home/kde/kdeextragear-2/kimdaba/imagedb.cpp,v
| retrieving revision 1.38
| diff -r1.38 imagedb.cpp
| 113c113
| <             slotReread( missingTimes );
| ---
|
| >             slotReread( missingTimes, EXIFMODE_TIME );
|
| 536c536
| <     slotReread(missingTimes);
| ---
|
| >     slotReread(missingTimes, EXIFMODE_TIME);
|
| 540c540
| < void ImageDB::slotReread(ImageInfoList rereadList)
| ---
|
| > void ImageDB::slotReread(ImageInfoList rereadList, int mode)
|
| 565c565
| <             (*it)->readExif((*it)->fileName(),ImageInfo::Time);
| ---
|
| >             (*it)->readExif((*it)->fileName(), mode);
|
| Index: imagedb.h
| ===================================================================
| RCS file: /home/kde/kdeextragear-2/kimdaba/imagedb.h,v
| retrieving revision 1.22
| diff -r1.22 imagedb.h
| 54c54
| <     void slotReread(ImageInfoList rereadList);
| ---
|
| >     void slotReread(ImageInfoList rereadList, int mode);
|
| Index: imageinfo.cpp
| ===================================================================
| RCS file: /home/kde/kdeextragear-2/kimdaba/imageinfo.cpp,v
| retrieving revision 1.52
| diff -r1.52 imageinfo.cpp
| 52c52
| <     readExif(fullPath, ImageInfo::Init);
| ---
|
| >     readExif(fullPath, EXIFMODE_INIT);
|
| 387c387
| < void ImageInfo::readExif(const QString& fullPath, ExifMode mode)
| ---
|
| > void ImageInfo::readExif(const QString& fullPath, int mode)
|
| 391a392
|
| 403c404,405
| <     if( mode == ImageInfo::Time ) {
| ---
|
| >     //Time
| >     if ( mode & EXIFMODE_TIME ) {
|
| 405d406
| <             //Time
| 417,418c418,420
| <     else if ( mode == ImageInfo::Init ) {
| <         // Date
| ---
|
| >     // Date
| >     if ( mode & EXIFMODE_DATE ) {
|
| 447,463d448
| <
| <
| <             //Time
| <             if (exif.contains( QString::fromLatin1( "CreationTime" ) ) ){
| <
| <                 QTime time = exif[QString::fromLatin1( "CreationTime"
| )].toTime(); <                 if (time.isValid())
| <                     _startDate.setTime( time );
| <
| <             }
| <             else{
| <
| <                 QTime time = fi.lastModified().time();
| <                 _startDate.setTime( time );
| <
| <             }
| <
| 465c450,453
| <         // Orientation
| ---
|
| >     }
| >
| >     // Orientation
| >     if ( mode == EXIFMODE_ORIENTATION ) {
|
| 476a465
|
| >     }
|
| 478c467,468
| <         // Description
| ---
|
| >     // Description
| >     if ( mode == EXIFMODE_DESCRIPTION ) {
|
| 486d475
| <
| Index: imageinfo.h
| ===================================================================
| RCS file: /home/kde/kdeextragear-2/kimdaba/imageinfo.h,v
| retrieving revision 1.32
| diff -r1.32 imageinfo.h
| 33a34,39
|
| > #define EXIFMODE_TIME          1
| > #define EXIFMODE_DATE          2
| > #define EXIFMODE_ORIENTATION   4
| > #define EXIFMODE_DESCRIPTION   8
| > #define EXIFMODE_INIT ( EXIFMODE_TIME | EXIFMODE_DATE |
| > EXIFMODE_ORIENTATION | EXIFMODE_DESCRIPTION )
|
| 37d42
| <     enum ExifMode { Init, Time };
| 59c64
| <     void readExif(const QString& fullPath, ExifMode mode);
| ---
|
| >     void readExif(const QString& fullPath, int mode);
|
| Index: kimdabaui.rc
| ===================================================================
| RCS file: /home/kde/kdeextragear-2/kimdaba/kimdabaui.rc,v
| retrieving revision 1.22
| diff -r1.22 kimdabaui.rc
| 27a28
|
| >       <Action name="readInfoSelected" />
|
| 49a51
|
| >       <Action name="readInfo" />
|
| Index: mainview.cpp
| ===================================================================
| RCS file: /home/kde/kdeextragear-2/kimdaba/mainview.cpp,v
| retrieving revision 1.119
| diff -r1.119 mainview.cpp
| 72a73
|
| > #include "readinfodialog.h"
|
| 78c79,80
| <      _deleteDialog( 0 ), _dirtyIndicator(0), _htmlDialog(0)
| ---
|
| >      _deleteDialog( 0 ), _readInfoDialog( 0 ), _dirtyIndicator(0),
| >      _htmlDialog(0)
|
| 319a322,339
|
| > void MainView::slotReadInfoSelected()
| > {
| >     if ( ! _readInfoDialog )
| >         _readInfoDialog = new ReadInfoDialog( this );
| >     if ( _readInfoDialog->exec( selected() ) == QDialog::Accepted )
| >         setDirty( true );
| > }
| >
| >
| > void MainView::slotReadInfo()
| > {
| >     if ( ! _readInfoDialog )
| >         _readInfoDialog = new ReadInfoDialog( this );
| >     if ( _readInfoDialog->exec( ImageDB::instance()->images() ) ==
| > QDialog::Accepted ) setDirty( true );
| > }
|
| 584a605
|
| >     _readInfoSelected = new KAction( i18n("Read EXIF info from selected
| > files..."), 0, this, SLOT( slotReadInfoSelected() ), actionCollection(),
| > "readInfoSelected" );
|
| 604a626
|
| >     new KAction( i18n("Read EXIF info from all files..."), 0, this, SLOT(
| > slotReadInfo() ), actionCollection(), "readInfo" );
|
| 1087a1110
|
| >     _readInfoSelected->setEnabled( thumbNailView );
|
| Index: mainview.h
| ===================================================================
| RCS file: /home/kde/kdeextragear-2/kimdaba/mainview.h,v
| retrieving revision 1.58
| diff -r1.58 mainview.h
| 28a29
|
| > class ReadInfoDialog;
|
| 56a58,59
|
| >     void slotReadInfoSelected();
| >     void slotReadInfo();
|
| 125a129
|
| >     ReadInfoDialog* _readInfoDialog;
|
| 136a141
|
| >     KAction* _readInfoSelected;
|
| ---- END DIFF ---
|
|
|
|
| ---- BEGIN NEW FILE readinfodialog.h ---
|
| #ifndef READINFODIALOG_H
| #define READINFODIALOG_H
| #include "imageinfo.h"
| #include <kdialogbase.h>
| class QLabel;
| class QCheckBox;
| class QRadioButton;
|
| class ReadInfoDialog :public KDialogBase {
|     Q_OBJECT
|
| public:
|     ReadInfoDialog( QWidget* parent, const char* name = 0 );
|     int exec( const ImageInfoList& );
|
| protected slots:
|     void readInfo();
| private:
|     ImageInfoList _list;
|     QLabel* _label;
|     QCheckBox* _time;
|     QCheckBox* _date;
|     QCheckBox* _orientation;
|     QCheckBox* _description;
|     QCheckBox* _init;
| };
|
|
| #endif /* READINFODIALOG_H */
|
| ---- END FILE readinfodialog.h ---
|
|
|
|
| ---- BEGIN NEW FILE readinfodialog.cpp ---
|
| #include "readinfodialog.h"
| #include <klocale.h>
| #include <qlabel.h>
| #include <qcheckbox.h>
| #include <qradiobutton.h>
| #include <qlayout.h>
| #include <qbuttongroup.h>
| #include <qfile.h>
| #include <kmessagebox.h>
| #include "imagedb.h"
| #include "imageinfo.h"
| #include "util.h"
|
| ReadInfoDialog::ReadInfoDialog( QWidget* parent, const char* name )
|
|     :KDialogBase( Plain, i18n("Read File Info"), Cancel|User1, User1,
|     : parent, name,
|
|                   true, false, i18n("Read File Info"))
| {
|     QWidget* top = plainPage();
|     QVBoxLayout* lay1 = new QVBoxLayout( top, 6 );
|
|     _label = new QLabel( top );
|     lay1->addWidget( _label );
|
|     _time = new QCheckBox( i18n( "Read time" ), top );
|     lay1->addWidget( _time );
|
|     _date = new QCheckBox( i18n( "Read date" ), top );
|     lay1->addWidget( _date );
|
|     _orientation = new QCheckBox( i18n( "Read EXIF orientation" ), top );
|     lay1->addWidget( _orientation );
|
|     _description = new QCheckBox( i18n( "Read EXIF description" ), top );
|     lay1->addWidget( _description );
|
|     _init = new QCheckBox( i18n( "Read all (time, date, orientation and
| description)" ), top ); lay1->addWidget( _init );
|
|     connect( this, SIGNAL( user1Clicked() ), this, SLOT( readInfo() ) );
| }
|
| int ReadInfoDialog::exec( const ImageInfoList& list )
| {
|     _label->setText( i18n("<qt><b><center><font size=\"+3\">Read File
| Info<br>%1 selected</font></center></b></qt>").arg( list.count() ) );
|
|     _init->setChecked( true );
|     _time->setChecked( false );
|     _date->setChecked( false );
|     _orientation->setChecked( false );
|     _description->setChecked( false );
|     _list = list;
|
|     return KDialogBase::exec();
| }
|
| void ReadInfoDialog::readInfo()
| {
|     int mode = 0;
|
|     if ( _init->isChecked() )
|             mode |= EXIFMODE_INIT;
|     else {
|             if ( _time->isChecked() )
|                     mode |= EXIFMODE_TIME;
|             if ( _date->isChecked() )
|                     mode |= EXIFMODE_DATE;
|             if ( _orientation->isChecked() )
|                     mode |= EXIFMODE_ORIENTATION;
|             if ( _description->isChecked() )
|                     mode |= EXIFMODE_DESCRIPTION;
|     }
|     ImageDB::instance()->slotReread(_list, mode);
|     accept();
| }
|
| #include "readinfodialog.moc"
|
| ---- END FILE readinfodialog.cpp ---
|
| _______________________________________________
| KimDaBa mailing list
| KimDaBa at klaralvdalens-datakonsult.se
| http://sulaco.hrhansen.dk/mailman/listinfo/kimdaba

-- 
Having trouble finding a given image in your collection containing
thousands of images?

http://ktown.kde.org/KimDaBa might be the answer.



More information about the KimDaBa mailing list