[kde-doc-english] extragear/graphics/kphotoalbum

Wes Hardaker wjhns25 at hardakers.net
Fri Jan 15 03:05:48 CET 2010


SVN commit 1074965 by hardaker:

GUI:Added the ability for the image search routine to detect copies and automatically stack them on top of the original

 M  +19 -0     DB/ImageInfo.cpp  
 M  +3 -0      DB/ImageInfo.h  
 M  +69 -1     DB/NewImageFinder.cpp  
 M  +26 -5     MainWindow/ExternalPopup.cpp  
 M  +52 -0     Settings/GeneralPage.cpp  
 M  +8 -0      Settings/GeneralPage.h  
 M  +7 -0      Settings/SettingsData.cpp  
 M  +7 -0      Settings/SettingsData.h  


--- trunk/extragear/graphics/kphotoalbum/DB/ImageInfo.cpp #1074964:1074965
@@ -485,6 +485,25 @@
     folderCategory->addItem( folderName );
 }
 
+void DB::ImageInfo::copyExtraData( const DB::ImageInfo& from) 
+{
+    _categoryInfomation = from._categoryInfomation;
+    _description = from._description;
+    // Hmm...  what should the date be?  orig or modified?
+    // _date = from._date;
+    _angle = from._angle;
+    _rating = from._rating;
+    _geoPosition = from._geoPosition;
+}
+
+void DB::ImageInfo::removeExtraData ()
+{
+    _categoryInfomation.clear();
+    _description = QString();
+    _rating = -1;
+    _geoPosition = GpsCoordinates();
+}
+
 void DB::ImageInfo::addCategoryInfo( const QString& category, const StringSet& values )
 {
     for ( StringSet::const_iterator valueIt = values.constBegin(); valueIt != values.constEnd(); ++valueIt ) {
--- trunk/extragear/graphics/kphotoalbum/DB/ImageInfo.h #1074964:1074965
@@ -147,6 +147,9 @@
 
     void delaySavingChanges(bool b=true);
 
+    void copyExtraData( const ImageInfo& from);
+    void removeExtraData();
+
 protected:
     /** Save changes to database.
      *
--- trunk/extragear/graphics/kphotoalbum/DB/NewImageFinder.cpp #1074964:1074965
@@ -19,9 +19,11 @@
 
 #include <sys/types.h>
 #include <dirent.h>
+#include <stdio.h>
 
 #include "DB/ImageDB.h"
 #include "DB/ResultId.h"
+#include "DB/Result.h"
 
 #include <qfileinfo.h>
 #include <QStringList>
@@ -229,11 +231,77 @@
         }
     }
 
+    QString err = Settings::SettingsData::instance()->modifiedFileComponent();
+    QRegExp modifiedFileComponent =
+        QRegExp(Settings::SettingsData::instance()->modifiedFileComponent());
+    
+    // check to see if this is a new version of a previous image
+    ImageInfoPtr info = ImageInfoPtr(new ImageInfo( relativeNewFileName, type ));
+    ImageInfoPtr originalInfo;
+    QString originalFileName;
+
+    if (Settings::SettingsData::instance()->detectModifiedFiles()) {
+        // should be cached because loading once per image is expensive
+        QString err = Settings::SettingsData::instance()->modifiedFileComponent();
+        QRegExp modifiedFileComponent =
+            QRegExp(Settings::SettingsData::instance()->modifiedFileComponent());
+        // requires at least *something* in the modifiedFileComponent
+        if (err.length() >= 0 &&
+            relativeNewFileName.contains(modifiedFileComponent)) {
+
+            originalFileName = relativeNewFileName;
+            QString originalFileComponent =
+                Settings::SettingsData::instance()->originalFileComponent();
+            originalFileName.replace(modifiedFileComponent, originalFileComponent);
+
+            MD5 originalSum = Utilities::MD5Sum( originalFileName );
+            if ( DB::ImageDB::instance()->md5Map()->contains( originalSum ) ) {
+                // we have a previous copy of this file; copy it's data
+                // from the original.
+                originalInfo = DB::ImageDB::instance()->info( originalFileName, DB::RelativeToImageRoot );
+                if ( !originalInfo ) {
+                    qWarning("How did that happen? We couldn't find info for the original image %s; can't copy the original data to %s", qPrintable(originalFileName), qPrintable(relativeNewFileName));
+                } else {
+                    info->copyExtraData(*originalInfo);
+                }
+
+                /* if requested to move, then delete old data from original */
+                if (Settings::SettingsData::instance()->moveOriginalContents() ) {
+                    originalInfo->removeExtraData();
+                }
+            }
+        }
+    }
+
     // also inserts image into exif db if present:
-    ImageInfoPtr info = ImageInfoPtr( new ImageInfo( relativeNewFileName, type ) );
     info->setMD5Sum(sum);
     DB::ImageDB::instance()->md5Map()->insert( sum, info->fileName(DB::RelativeToImageRoot) );
 
+    if (originalInfo &&
+        Settings::SettingsData::instance()->autoStackNewFiles() ) {
+        // we have to do this immediately to get the ids
+        ImageInfoList newImages;
+        markUnTagged(info);
+        newImages.append(info);
+        DB::ImageDB::instance()->addImages( newImages );
+
+        // stack the files together
+        DB::ResultId olderfile = DB::ImageDB::instance()->ID_FOR_FILE(originalFileName);
+        DB::ResultId newerfile = DB::ImageDB::instance()->ID_FOR_FILE(info->fileName(DB::AbsolutePath));
+        DB::Result tostack = DB::Result();
+
+        tostack.append(newerfile);
+        tostack.append(olderfile);
+        DB::ImageDB::instance()->stack(tostack);
+
+        // ordering: XXX we ideally want to place the new image right
+        // after the older one in the list.
+
+        // XXX: deal with already-stacked items; currently a silent fail
+
+        info = NULL;  // we already added it, so don't process again
+    }
+    
     return info;
 }
 
--- trunk/extragear/graphics/kphotoalbum/MainWindow/ExternalPopup.cpp #1074964:1074965
@@ -22,6 +22,7 @@
 #include <qstringlist.h>
 #include <qlabel.h>
 #include <QPixmap>
+#include <QFile>
 #include <kservice.h>
 #include <kurl.h>
 #include <krun.h>
@@ -41,13 +42,13 @@
     _currentInfo = current;
     clear();
 
-    QStringList list = QStringList() << i18n("Current Item") << i18n("All Selected Items");
-    for ( int which = 0; which < 2; ++which ) {
+    QStringList list = QStringList() << i18n("Current Item") << i18n("All Selected Items") << i18n("Copy and Open");
+    for ( int which = 0; which < 3; ++which ) {
         if ( which == 0 && !current )
             continue;
 
         const bool multiple = (_list.count() > 1);
-        const bool enabled = (which == 0 && _currentInfo ) || (which == 1 && multiple);
+        const bool enabled = (which != 1 && _currentInfo ) || (which == 1 && multiple);
 
         // Title
         QAction* action = addAction( list[which] );
@@ -104,13 +105,33 @@
 
     // get the list of arguments
     KUrl::List lst;
+
     if ( action->data() == 1 ) {
         for( QStringList::Iterator it = _list.begin(); it != _list.end(); ++it ) {
             if ( _appToMimeTypeMap[name].contains( mimeType(*it) ) )
                 lst.append( KUrl(*it) );
         }
-    }
-    else {
+    } else if (action->data() == 2) {
+        QString origFile = _currentInfo->fileName(DB::AbsolutePath);
+        QString newFile = origFile;
+
+        QString origRegexpString = 
+            Settings::SettingsData::instance()->copyFileComponent();
+        QRegExp origRegexp =
+            QRegExp(origRegexpString);
+        QString copyFileReplacement = 
+            Settings::SettingsData::instance()->copyFileReplacementComponent();
+        
+        if (origRegexpString.length() > 0) {
+            newFile.replace(origRegexp, copyFileReplacement);
+            QFile::copy(origFile, newFile);
+            lst.append( newFile );
+        } else {
+            qWarning("No settings were appropriate for modifying the file name (you must fill in the regexp field; Opening the original instead");
+            lst.append( origFile );
+        }
+
+    } else {
         lst.append( KUrl(_currentInfo->fileName(DB::AbsolutePath)));
     }
 
--- trunk/extragear/graphics/kphotoalbum/Settings/GeneralPage.cpp #1074964:1074965
@@ -6,6 +6,7 @@
 #include <QSpinBox>
 #include <QCheckBox>
 #include <QHBoxLayout>
+#include <QLineEdit>
 #include <QLabel>
 #include <QWidget>
 #include <Q3VGroupBox>
@@ -70,6 +71,29 @@
     _excludeDirectories = new KLineEdit( box );
     excludeDirectoriesLabel->setBuddy( _excludeDirectories );
 
+    // Original/Modified File Support
+    Q3VGroupBox* modifiedBox = new Q3VGroupBox( i18n("Modified File Detection Settings"), this );
+    lay1->addWidget( modifiedBox );
+
+    _detectModifiedFiles = new QCheckBox(i18n("Try and detect modified files"), modifiedBox);
+
+    QLabel* modifiedFileComponentLabel = new QLabel( i18n("Modified file search regexp:" ), modifiedBox );
+    _modifiedFileComponent = new QLineEdit(modifiedBox);
+
+    QLabel* originalFileComponentLabel = new QLabel( i18n("Original file replacement text:" ), modifiedBox );
+    _originalFileComponent = new QLineEdit(modifiedBox);
+
+    _moveOriginalContents = new QCheckBox(i18n("Move meta-data (i.e. delete tags from the original):"), modifiedBox);
+
+    _autoStackNewFiles = new QCheckBox(i18n("Auto-stack new files on top of old:"), modifiedBox);
+
+    QLabel* copyFileComponentLabel = new QLabel( i18n("Copy file search regexp:" ), modifiedBox );
+    _copyFileComponent = new QLineEdit(modifiedBox);
+
+    QLabel* copyFileReplacementComponentLabel = new QLabel( i18n("Copy file replacement text:" ), modifiedBox );
+    _copyFileReplacementComponent = new QLineEdit(modifiedBox);
+
+
     // Datebar size
     container = new QWidget( this );
     lay1->addWidget( container );
@@ -165,6 +189,21 @@
 
     txt = i18n( "Show the KPhotoAlbum splash screen on start up" );
     _showSplashScreen->setWhatsThis( txt );
+
+    txt = i18n( "<p>When KPhotoAlbum searches for new files and finds a file that matches the <i>modified file search regexp</i> it is assumed that an original version of the image may exist.  The regexp pattern will be replaced with the <i>original file string</i> text and if that file exists, all associated metadata (category information, ratings, etc) will be copied from the original file to the new one.</p>");
+    _detectModifiedFiles->setWhatsThis( txt );
+    modifiedFileComponentLabel->setWhatsThis( txt );
+    _modifiedFileComponent->setWhatsThis( txt );
+    originalFileComponentLabel->setWhatsThis( txt );
+    _originalFileComponent->setWhatsThis( txt );
+    _moveOriginalContents->setWhatsThis( txt );
+    _autoStackNewFiles->setWhatsThis( txt );
+
+    txt = i18n("<p>KPhotoAlbum can make a copy of an image before opening it with an external program.  These settings set the original rexexp to search for and contents to replace it with when deciding what the new filename should be.</p>");
+    copyFileComponentLabel->setWhatsThis( txt );
+    _copyFileComponent->setWhatsThis( txt );
+    copyFileReplacementComponentLabel->setWhatsThis( txt );
+    _copyFileReplacementComponent->setWhatsThis( txt );
 }
 
 void Settings::GeneralPage::loadSettings( Settings::SettingsData* opt )
@@ -185,6 +224,13 @@
         cat = DB::ImageDB::instance()->categoryCollection()->categories()[0];
 
     _albumCategory->setEditText( cat->text() );
+    _detectModifiedFiles->setChecked( opt->detectModifiedFiles() );
+    _modifiedFileComponent->setText( opt->modifiedFileComponent() );
+    _originalFileComponent->setText( opt->originalFileComponent() );
+    _moveOriginalContents->setChecked( opt->moveOriginalContents() );
+    _autoStackNewFiles->setChecked( opt->autoStackNewFiles() );
+    _copyFileComponent->setText( opt->copyFileComponent() );
+    _copyFileReplacementComponent->setText( opt->copyFileReplacementComponent() );
 
 }
 
@@ -205,6 +251,12 @@
     opt->setHistogramSize( QSize( _barWidth->value(), _barHeight->value() ) );
 
     opt->setAlbumCategory( name );
+    opt->setDetectModifiedFiles( _detectModifiedFiles->isChecked() );
+    opt->setModifiedFileComponent( _modifiedFileComponent->text() );
+    opt->setOriginalFileComponent( _originalFileComponent->text() );
+    opt->setAutoStackNewFiles( _autoStackNewFiles->isChecked() );
+    opt->setCopyFileComponent( _copyFileComponent->text() );
+    opt->setCopyFileReplacementComponent( _copyFileReplacementComponent->text() );
 }
 
 void Settings::GeneralPage::setUseRawThumbnailSize( const QSize& size  )
--- trunk/extragear/graphics/kphotoalbum/Settings/GeneralPage.h #1074964:1074965
@@ -3,6 +3,7 @@
 #include <QWidget>
 
 class QComboBox;
+class QLineEdit;
 class QSpinBox;
 class QCheckBox;
 class KComboBox;
@@ -34,6 +35,13 @@
     QCheckBox* _showSplashScreen;
     QComboBox* _albumCategory;
     KLineEdit* _excludeDirectories; // Directories to exclude
+    QCheckBox* _detectModifiedFiles;
+    QLineEdit* _modifiedFileComponent;
+    QLineEdit* _originalFileComponent;
+    QCheckBox* _moveOriginalContents;
+    QCheckBox* _autoStackNewFiles;
+    QLineEdit* _copyFileComponent;
+    QLineEdit* _copyFileReplacementComponent;
 };
 }
 
--- trunk/extragear/graphics/kphotoalbum/Settings/SettingsData.cpp #1074964:1074965
@@ -164,6 +164,13 @@
 property_copy( backupCount           , setBackupCount           , int           , General, 5                          )
 property_enum( tTimeStamps           , setTTimeStamps           , TimeStampTrust, General, Always                     )
 property_copy( excludeDirectories    , setExcludeDirectories    , QString       , General, QString::fromLatin1("xml,ThumbNails,.thumbs") )
+property_copy( detectModifiedFiles   , setDetectModifiedFiles   , bool          , General, false                       )
+property_copy( modifiedFileComponent , setModifiedFileComponent , QString          , General, i18n("")                )
+property_copy( originalFileComponent , setOriginalFileComponent , QString          , General, i18n("")                )
+property_copy( moveOriginalContents  , setMoveOriginalContents  , bool          , General, false                      )
+property_copy( autoStackNewFiles     , setAutoStackNewFiles     , bool          , General, true                       )
+property_copy( copyFileComponent     , setCopyFileComponent     , QString       , General, i18n("")                   )
+property_copy( copyFileReplacementComponent , setCopyFileReplacementComponent , QString          , General, i18n("")                )
 
 getValueFunc( QSize,histogramSize,  General,QSize(15,30) )
 getValueFunc( ViewSortType,viewSortType,  General,(int)SortLastUse )
--- trunk/extragear/graphics/kphotoalbum/Settings/SettingsData.h #1074964:1074965
@@ -89,6 +89,13 @@
     property_copy( viewSortType          , setViewSortType          , ViewSortType   );
     property_copy( tTimeStamps           , setTTimeStamps           , TimeStampTrust );
     property_copy( excludeDirectories    , setExcludeDirectories    , QString );
+    property_copy( detectModifiedFiles   , setDetectModifiedFiles   , bool );
+    property_copy( modifiedFileComponent , setModifiedFileComponent , QString );
+    property_copy( originalFileComponent , setOriginalFileComponent , QString );
+    property_copy( moveOriginalContents  , setMoveOriginalContents  , bool );
+    property_copy( autoStackNewFiles     , setAutoStackNewFiles  , bool );
+    property_copy( copyFileComponent     , setCopyFileComponent , QString );
+    property_copy( copyFileReplacementComponent , setCopyFileReplacementComponent , QString );
 
     bool trustTimeStamps();
 



More information about the kde-doc-english mailing list