[Digikam-devel] extragear/graphics/digikam/utilities/cameragui

Gilles Caulier caulier.gilles at free.fr
Sun Aug 20 22:33:23 BST 2006


SVN commit 575150 by cgilles:

digikam from trunk : camera gui improvements : New option to toggle on/off the write acess on files (Lock feature to prevent unwanted deletion of pictures)

This mode have been tested with my Olympus C3000Z (Gphoto2 driver) and my Dynax 5D in USM mode. 

Duing a limitiation in libgphoto2, this feature is unsupported actually by cameras in PTP mode.

CCMAIL: digikam-devel at kde.org


 M  +75 -0     cameracontroller.cpp  
 M  +2 -2      cameracontroller.h  
 M  +10 -0     cameraiconitem.cpp  
 M  +2 -0      cameraiconitem.h  
 M  +61 -8     cameraui.cpp  
 M  +2 -0      cameraui.h  
 M  +2 -0      dkcamera.h  
 M  +55 -0     gpcamera.cpp  
 M  +7 -11     gpcamera.h  
 M  +20 -0     umscamera.cpp  
 M  +2 -0      umscamera.h  


--- trunk/extragear/graphics/digikam/utilities/cameragui/cameracontroller.cpp #575149:575150
@@ -89,6 +89,7 @@
         gp_download,
         gp_upload,
         gp_delete,
+        gp_lock,
         gp_thumbnail,
         gp_exif,
         gp_open
@@ -116,6 +117,8 @@
         gp_uploadFailed,
         gp_deleted,
         gp_deleteFailed,
+        gp_locked,
+        gp_lockFailed,
         gp_thumbnailed,
         gp_exif,
         gp_cameraInformations,
@@ -509,6 +512,32 @@
                 }                
                 break;
             }
+            case(CameraCommand::gp_lock):
+            {
+                QString folder = cmd->map["folder"].asString();
+                QString file   = cmd->map["file"].asString();
+                bool    lock   = cmd->map["lock"].asBool();
+    
+                sendInfo(i18n("Toggle lock file %1...").arg(file));
+    
+                bool result = d->camera->setLockItem(folder, file, lock);
+    
+                if (result)
+                {
+                    CameraEvent* event = new CameraEvent(CameraEvent::gp_locked);
+                    event->map.insert("folder", QVariant(folder));
+                    event->map.insert("file", QVariant(file));
+                    QApplication::postEvent(parent, event);
+                }
+                else
+                {
+                    CameraEvent* event = new CameraEvent(CameraEvent::gp_lockFailed);
+                    event->map.insert("folder", QVariant(folder));
+                    event->map.insert("file", QVariant(file));
+                    QApplication::postEvent(parent, event);
+                }                
+                break;
+            }
             default:
                 kdWarning() << k_funcinfo << " unknown action specified" << endl;
         }    
@@ -731,6 +760,17 @@
     d->cmdQueue.enqueue(cmd);
 }
 
+void CameraController::lockFile(const QString& folder, const QString& file, bool lock)
+{
+    d->canceled = false;
+    CameraCommand *cmd = new CameraCommand;
+    cmd->action = CameraCommand::gp_lock;
+    cmd->map.insert("folder", QVariant(folder));
+    cmd->map.insert("file", QVariant(file));
+    cmd->map.insert("lock", QVariant(lock, 0));
+    d->cmdQueue.enqueue(cmd);
+}
+
 void CameraController::openFile(const QString& folder, const QString& file)
 {
     d->canceled = false;
@@ -946,6 +986,41 @@
             d->timer->start(50);
             break;
         }
+        case (CameraEvent::gp_locked) :
+        {
+            QString folder = QDeepCopy<QString>(event->map["folder"].asString());
+            QString file   = QDeepCopy<QString>(event->map["file"].asString());
+            emit signalLocked(folder, file, true);
+            break;
+        }
+        case (CameraEvent::gp_lockFailed) :
+        {
+            QString folder = QDeepCopy<QString>(event->map["folder"].asString());
+            QString file   = QDeepCopy<QString>(event->map["file"].asString());
+    
+            d->timer->stop();
+            emit signalLocked(folder, file, false);
+
+            QString msg = i18n("Failed to toggle lock file \"%1\".").arg(file);
+            
+            if (!d->canceled)
+            {
+                if (d->cmdQueue.isEmpty())
+                {
+                    KMessageBox::error(d->parent, msg);
+                }
+                else
+                {
+                    msg += i18n(" Do you want to continue?");
+                    int result = KMessageBox::warningContinueCancel(d->parent, msg);
+                    if (result != KMessageBox::Continue)
+                        slotCancel();
+                }
+            }
+    
+            d->timer->start(50);
+            break;
+        }
         case (CameraEvent::gp_opened) :
         {
             QString file = QDeepCopy<QString>(event->map["file"].asString());
--- trunk/extragear/graphics/digikam/utilities/cameragui/cameracontroller.h #575149:575150
@@ -60,9 +60,8 @@
     void downloadPrep();
     void download(DownloadSettingsContainer downloadSettings);
     void upload(const QFileInfo& srcFileInfo, const QString& destFile, const QString& destFolder);
-
     void deleteFile(const QString& folder, const QString& file);
-
+    void lockFile(const QString& folder, const QString& file, bool lock);
     void openFile(const QString& folder, const QString& file);
     
 signals:
@@ -79,6 +78,7 @@
     void signalDownloaded(const QString& folder, const QString& file, int status);
     void signalSkipped(const QString& folder, const QString& file);
     void signalDeleted(const QString& folder, const QString& file, bool status);
+    void signalLocked(const QString& folder, const QString& file, bool status);
     void signalThumbnail(const QString& folder, const QString& file, const QImage& thumb);
     void signalExifFromFile(const QString& folder, const QString& file);
     void signalExifData(const QByteArray& exifData);
--- trunk/extragear/graphics/digikam/utilities/cameragui/cameraiconitem.cpp #575149:575150
@@ -332,6 +332,16 @@
     repaint();
 }
 
+void CameraIconViewItem::toggleLock()
+{
+    if (d->itemInfo->writePermissions == 0) 
+        d->itemInfo->writePermissions = 1;
+    else 
+        d->itemInfo->writePermissions = 0;
+
+    repaint();
+}
+
 void CameraIconViewItem::calcRect(const QString& itemName, const QString& downloadName)
 {
     CameraIconView* view = (CameraIconView*)iconView();
--- trunk/extragear/graphics/digikam/utilities/cameragui/cameraiconitem.h #575149:575150
@@ -53,6 +53,8 @@
     QString getDownloadName() const;
     void    setDownloaded(int status);
 
+    void    toggleLock();
+
     GPItemInfo* itemInfo() const;
 
     // reimplemented from IconItem
--- trunk/extragear/graphics/digikam/utilities/cameragui/cameraui.cpp #575149:575150
@@ -313,6 +313,8 @@
     d->imageMenu->insertSeparator();
     d->imageMenu->insertItem(i18n("Increase Thumbs"),   this,    SLOT(slotIncreaseThumbSize()), CTRL+Key_Plus, 4);
     d->imageMenu->insertItem(i18n("Decrease Thumbs"),   this,    SLOT(slotDecreaseThumbSize()), CTRL+Key_Minus, 5);
+    d->imageMenu->insertSeparator();
+    d->imageMenu->insertItem(i18n("Toggle Lock"),       this,    SLOT(slotLock()), 0, 6);
     actionButton(User3)->setPopup(d->imageMenu);    
 
     // -------------------------------------------------------------------------
@@ -424,6 +426,9 @@
     connect(d->controller, SIGNAL(signalDeleted(const QString&, const QString&, bool)),
             this, SLOT(slotDeleted(const QString&, const QString&, bool)));
 
+    connect(d->controller, SIGNAL(signalLocked(const QString&, const QString&, bool)),
+            this, SLOT(slotLocked(const QString&, const QString&, bool)));
+
     connect(d->controller, SIGNAL(signalExifFromFile(const QString&, const QString&)),
             this, SLOT(slotExifFromFile(const QString&, const QString&)));
     
@@ -1033,6 +1038,54 @@
     d->progress->setProgress(curr+1);
 }
 
+void CameraUI::slotLock()
+{
+    int count = 0;
+    for (IconItem* item = d->view->firstItem(); item;
+         item = item->nextItem())
+    {
+        CameraIconViewItem* iconItem = static_cast<CameraIconViewItem*>(item);
+        if (iconItem->isSelected())
+        {
+            QString folder = iconItem->itemInfo()->folder;
+            QString file   = iconItem->itemInfo()->name;
+            int writePerm  = iconItem->itemInfo()->writePermissions;
+            bool lock      = true;            
+
+            // If item is currently locked, unlock it.
+            if (writePerm == 0) 
+                lock = false;
+
+            d->controller->lockFile(folder, file, lock);
+            count++;
+        }
+    }
+
+    if (count > 0)
+    {
+        d->progress->setProgress(0);
+        d->progress->setTotalSteps(count);
+        d->progress->show();
+    }
+}
+
+void CameraUI::slotLocked(const QString& folder, const QString& file, bool status)
+{
+    if (status)
+    {
+        CameraIconViewItem* iconItem = d->view->findItem(folder, file);
+        if (iconItem)
+        {
+            iconItem->toggleLock();
+            if (iconItem->isSelected())
+                slotItemsSelected(iconItem, true);
+        }
+    }
+
+    int curr = d->progress->progress();
+    d->progress->setProgress(curr+1);
+}
+
 void CameraUI::slotDeleteSelected()
 {
     QStringList folders;
@@ -1072,6 +1125,10 @@
     {
         QStringList::iterator itFolder = folders.begin();
         QStringList::iterator itFile   = files.begin();
+
+        d->progress->setProgress(0);
+        d->progress->setTotalSteps(deleteList.count());
+        d->progress->show();
     
         for ( ; itFolder != folders.end(); ++itFolder, ++itFile)
         {
@@ -1080,10 +1137,6 @@
             // will immenently be deleted into the sidebar and wasting time
             d->currentlyDeleting.append(*itFolder + *itFile);
         }
-
-        d->progress->setProgress(0);
-        d->progress->setTotalSteps(deleteList.count());
-        d->progress->show();
     }
 }
 
@@ -1125,16 +1178,16 @@
     {
         QStringList::iterator itFolder = folders.begin();
         QStringList::iterator itFile   = files.begin();
+
+        d->progress->setProgress(0);
+        d->progress->setTotalSteps(deleteList.count());
+        d->progress->show();
     
         for ( ; itFolder != folders.end(); ++itFolder, ++itFile)
         {
             d->controller->deleteFile(*itFolder, *itFile);
             d->currentlyDeleting.append(*itFolder + *itFile);
         }
-
-        d->progress->setProgress(0);
-        d->progress->setTotalSteps(deleteList.count());
-        d->progress->show();
     }
 }
 
--- trunk/extragear/graphics/digikam/utilities/cameragui/cameraui.h #575149:575150
@@ -103,6 +103,7 @@
     void slotDownload(bool onlySelected);
     void slotDeleteSelected();
     void slotDeleteAll();
+    void slotLock();
 
     void slotFileView(CameraIconViewItem* item);
 
@@ -110,6 +111,7 @@
     void slotDownloaded(const QString&, const QString&, int);
     void slotSkipped(const QString&, const QString&);
     void slotDeleted(const QString&, const QString&, bool);
+    void slotLocked(const QString&, const QString&, bool);
     
     void slotNewSelection(bool);
     void slotItemsSelected(CameraIconViewItem* item, bool selected);
--- trunk/extragear/graphics/digikam/utilities/cameragui/dkcamera.h #575149:575150
@@ -64,6 +64,8 @@
     virtual void cameraManual(QString& manual) = 0;
     virtual void cameraAbout(QString& about) = 0;
 
+    virtual bool setLockItem(const QString& folder, const QString& itemName, bool lock) = 0;
+
     QString title() const;
     QString model() const;
     QString port()  const;
--- trunk/extragear/graphics/digikam/utilities/cameragui/gpcamera.cpp #575149:575150
@@ -602,6 +602,61 @@
     return true;
 }
 
+bool GPCamera::setLockItem(const QString& folder, const QString& itemName, bool lock)
+{
+    if (m_status) 
+    {
+        delete m_status;
+        m_status = 0;
+    }
+    
+    m_status = new GPStatus;
+
+    CameraFileInfo info;
+    if (gp_camera_file_get_info(d->camera, QFile::encodeName(folder),
+                                QFile::encodeName(itemName), &info, m_status->context) != GP_OK) 
+    {
+        kdDebug() << "failed to get camera item properties!" << endl;
+        delete m_status;
+        m_status = 0;
+        return false;
+    }
+
+    if (info.file.fields & GP_FILE_INFO_PERMISSIONS) 
+    {
+        if (lock)
+        {
+            // Lock the file to set read only flag
+            info.file.permissions = (CameraFilePermissions)GP_FILE_PERM_READ;
+        }
+        else
+        {
+            // Unlock the file to set read/write flag
+            info.file.permissions = (CameraFilePermissions)(GP_FILE_PERM_READ | GP_FILE_PERM_DELETE);
+        }
+    }
+    
+    // Some gphoto2 drivers need to have only the right flag at on to process properties update in camera.
+    info.file.fields    = GP_FILE_INFO_PERMISSIONS;
+    info.preview.fields = GP_FILE_INFO_NONE; 
+    info.audio.fields   = GP_FILE_INFO_NONE;
+
+    int valRet = gp_camera_file_set_info(d->camera, QFile::encodeName(folder),
+                                         QFile::encodeName(itemName), info, m_status->context);
+    if (valRet != GP_OK) 
+    {
+        kdDebug() << "failed to set camera item lock properties! (Gphoto2 error code: " 
+                  << valRet << ")" << endl;
+        delete m_status;
+        m_status = 0;
+        return false;
+    }
+
+    delete m_status;
+    m_status = 0;
+    return true;
+}
+
 bool GPCamera::deleteItem(const QString& folder, const QString& itemName)
 {
     if (m_status) 
--- trunk/extragear/graphics/digikam/utilities/cameragui/gpcamera.h #575149:575150
@@ -60,19 +60,14 @@
     bool getSubFolders(const QString& folder, QStringList& subFolderList);
     bool getItemsList(const QString& folder, QStringList& itemsList);
     bool getItemsInfoList(const QString& folder, GPItemInfoList& items, bool getImageDimensions = true);
+    bool getThumbnail(const QString& folder, const QString& itemName, QImage& thumbnail);
+    bool getExif(const QString& folder, const QString& itemName, char **edata, int& esize);
 
-    bool getThumbnail(const QString& folder, const QString& itemName,
-                      QImage& thumbnail);
-    bool getExif(const QString& folder, const QString& itemName,
-                 char **edata, int& esize);
+    bool setLockItem(const QString& folder, const QString& itemName, bool lock);
 
-    bool downloadItem(const QString& folder,
-                      const QString& itemName,
-                      const QString& saveFile);
+    bool downloadItem(const QString& folder, const QString& itemName, const QString& saveFile);
+    bool deleteItem(const QString& folder, const QString& itemName);
 
-    bool deleteItem(const QString& folder,
-                    const QString& itemName);
-
     // recursively delete all items
     bool deleteAllItems(const QString& folder);
 
@@ -93,12 +88,13 @@
     static void getSupportedPorts(QStringList& plist);
     static void getCameraSupportedPorts(const QString& model, QStringList& plist);
     static int  autoDetect(QString& model, QString& port);
-    
 
 private:
 
     int  setup();
 
+private:
+
     GPCameraPrivate *d;
     GPStatus        *m_status;
 };
--- trunk/extragear/graphics/digikam/utilities/cameragui/umscamera.cpp #575149:575150
@@ -264,6 +264,26 @@
     return true;
 }
 
+bool UMSCamera::setLockItem(const QString& folder, const QString& itemName, bool lock)
+{
+    QString src  = folder + QString("/") + itemName;   
+
+    if (lock)
+    {
+        // Lock the file to set read only flag
+        if (::chmod(QFile::encodeName(src), S_IREAD) == -1)
+            return false; 
+    }
+    else
+    {
+        // Unlock the file to set read/write flag
+        if (::chmod(QFile::encodeName(src), S_IREAD | S_IWRITE) == -1)
+            return false; 
+    }
+
+    return true;
+}
+
 bool UMSCamera::deleteItem(const QString& folder, const QString& itemName)
 {
     m_cancel = false;
--- trunk/extragear/graphics/digikam/utilities/cameragui/umscamera.h #575149:575150
@@ -51,6 +51,8 @@
     bool getThumbnail(const QString& folder, const QString& itemName, QImage& thumbnail);
     bool getExif(const QString& folder, const QString& itemName, char **edata, int& esize);
 
+    bool setLockItem(const QString& folder, const QString& itemName, bool lock);
+
     bool downloadItem(const QString& folder, const QString& itemName, const QString& saveFile);
     bool deleteItem(const QString& folder, const QString& itemName);
     bool uploadItem(const QString& folder, const QString& itemName, const QString& localFile, 



More information about the Digikam-devel mailing list