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

Gilles Caulier caulier.gilles at kdemail.net
Fri Feb 2 07:03:33 GMT 2007


SVN commit 629273 by cgilles:

digiKam from trunk : first way to introduce a pop-up menu in Preview mode. This one provide minimum options : back, Forward, Edit, Open With, Assign Tags, Remove Tags, and Assign Rating. More than this can be added later : Delete item and Rotate...

CCMAIL: digikam-devel at kde.org

 M  +22 -10    albumwidgetstack.cpp  
 M  +7 -4      albumwidgetstack.h  
 M  +7 -4      digikamview.cpp  
 M  +266 -4    imagepreviewview.cpp  
 M  +12 -5     imagepreviewview.h  
 M  +1 -1      imagepreviewwidget.cpp  


--- trunk/extragear/graphics/digikam/digikam/albumwidgetstack.cpp #629272:629273
@@ -81,6 +81,18 @@
 
     // -----------------------------------------------------------------
 
+    connect(d->imagePreviewView, SIGNAL(signalNextItem()),
+            this, SIGNAL(signalNextItem()));
+
+    connect(d->imagePreviewView, SIGNAL(signalPrevItem()),
+            this, SIGNAL(signalPrevItem()));
+
+    connect(d->imagePreviewView, SIGNAL( editImageSignal() ),
+            this, SIGNAL( editImageSignal() ) );
+
+    connect(d->imagePreviewView, SIGNAL( signalDeleteItem() ),
+            this, SIGNAL( signalDeleteItem() ) );
+
     connect(d->imagePreviewView, SIGNAL( previewLoadedSignal() ),
             this, SLOT( slotPreviewLoaded() ) );
 }
@@ -101,24 +113,24 @@
     return d->albumIconView;
 }
 
-ImagePreviewWidget* AlbumWidgetStack::imagePreviewWidget()
+void AlbumWidgetStack::setPreviewItem(ImageInfo* info)
 {
-    return d->imagePreviewView->imagePreviewWidget();
-}
-
-void AlbumWidgetStack::setPreviewItem(const KURL& url)
-{
-    if (url.isEmpty())
+    if (!info)
     {
         if (previewMode() == MediaPlayerMode)
             d->mediaPlayerView->setMediaPlayerFromUrl(KURL());
         else if (previewMode() == PreviewImageMode)
+        {
+            //FIXME
+            //d->imagePreviewView->setImageInfo();
             slotPreviewLoaded();
+            //setPreviewMode(AlbumWidgetStack::PreviewAlbumMode);
+        }
     }    
     else
     {
         AlbumSettings *settings      = AlbumSettings::instance();
-        QString currentFileExtension = QFileInfo(url.path()).extension(false);
+        QString currentFileExtension = QFileInfo(info->kurl().path()).extension(false);
         QString mediaplayerfilter    = settings->getMovieFileFilter().lower() +
                                        settings->getMovieFileFilter().upper() +
                                        settings->getAudioFileFilter().lower() +
@@ -126,7 +138,7 @@
         if (mediaplayerfilter.contains(currentFileExtension) )
         {
             setPreviewMode(AlbumWidgetStack::MediaPlayerMode);
-            d->mediaPlayerView->setMediaPlayerFromUrl(url);
+            d->mediaPlayerView->setMediaPlayerFromUrl(info->kurl());
         }
         else
         {
@@ -134,7 +146,7 @@
             if (previewMode() == MediaPlayerMode)
                 setPreviewItem();
 
-            imagePreviewWidget()->setImagePath(url.path());
+            d->imagePreviewView->setImageInfo(info);
 
             // NOTE: No need to toggle imediatly in PreviewImageMode here, 
             // because we will recieve a signal for that when the image preview will be loaded.
--- trunk/extragear/graphics/digikam/digikam/albumwidgetstack.h #629272:629273
@@ -35,6 +35,7 @@
 namespace Digikam
 {
 
+class ImageInfo;
 class AlbumIconView;
 class ImagePreviewWidget;
 class AlbumWidgetStackPriv;
@@ -55,20 +56,22 @@
 
 public:
 
-    AlbumWidgetStack( QWidget *parent=0 );
+    AlbumWidgetStack(QWidget *parent=0);
     ~AlbumWidgetStack();
 
-    AlbumIconView      *albumIconView();
-    ImagePreviewWidget *imagePreviewWidget();
+    AlbumIconView *albumIconView();
 
-    void setPreviewItem(const KURL& url=QString::null);
+    void setPreviewItem(ImageInfo* info=0);
     int  previewMode(void);
     void setPreviewMode(int mode);
 
 signals:
 
+    void signalNextItem();
+    void signalPrevItem();
     void backToAlbumSignal();    
     void editImageSignal();
+    void signalDeleteItem();
 
 public slots:
 
--- trunk/extragear/graphics/digikam/digikam/digikamview.cpp #629272:629273
@@ -293,10 +293,10 @@
 
     // -- Preview image widget Connections ------------------------
 
-    connect(d->albumWidgetStack->imagePreviewWidget(), SIGNAL(signalNextItem()),
+    connect(d->albumWidgetStack, SIGNAL(signalNextItem()),
             this, SLOT(slotNextItem()));
 
-    connect(d->albumWidgetStack->imagePreviewWidget(), SIGNAL(signalPrevItem()),
+    connect(d->albumWidgetStack, SIGNAL(signalPrevItem()),
             this, SLOT(slotPrevItem()));
     
     connect(d->albumWidgetStack, SIGNAL(backToAlbumSignal()),
@@ -305,6 +305,9 @@
     connect(d->albumWidgetStack, SIGNAL(editImageSignal()),
             this, SLOT(slotEditImage()));
 
+    connect(d->albumWidgetStack, SIGNAL(signalDeleteItem()),
+            this, SLOT(slot_imageDelete()));
+
     // -- Selection timer ---------------
 
     connect(d->selectionTimer, SIGNAL(timeout()),
@@ -644,7 +647,7 @@
                 d->rightSideBar->takeImageInfoOwnership(true);
 
                 if (!d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode)
-                    d->albumWidgetStack->setPreviewItem(selectedItem->imageInfo()->kurl());
+                    d->albumWidgetStack->setPreviewItem(selectedItem->imageInfo());
             }
 
             emit signalImageSelected(list, hasPrev, hasNext);
@@ -896,7 +899,7 @@
             item = iconItem;
         }
 
-        d->albumWidgetStack->setPreviewItem( item->imageInfo()->kurl() );
+        d->albumWidgetStack->setPreviewItem(item->imageInfo());
     }
     else
     {
--- trunk/extragear/graphics/digikam/digikam/imagepreviewview.cpp #629272:629273
@@ -21,15 +21,31 @@
 // Qt includes.
 
 #include <qstring.h>
+#include <qvaluevector.h>
+#include <qpainter.h>
+#include <qpixmap.h>
 
 // KDE includes.
 
 #include <kdialogbase.h>
 #include <klocale.h>
+#include <kservice.h>
+#include <krun.h>
+#include <ktrader.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+#include <kmimetype.h>
 
 // Local includes.
 
 #include "ddebug.h"
+#include "albumdb.h"
+#include "albummanager.h"
+#include "albumsettings.h"
+#include "imageinfo.h"
+#include "dpopupmenu.h"
+#include "dmetadata.h"
+#include "tagspopupmenu.h"
 #include "themeengine.h"
 #include "imagepreviewview.h"
 #include "imagepreviewview.moc"
@@ -44,8 +60,13 @@
     ImagePreviewViewPriv()
     {
         imagePreviewWidget = 0;
+        imageInfo          = 0;
     }
 
+    QPixmap             ratingPixmap;
+
+    ImageInfo          *imageInfo;
+
     ImagePreviewWidget *imagePreviewWidget;
 };
     
@@ -59,6 +80,21 @@
     setMargin(0); 
     setLineWidth(1); 
 
+    // -- Load rating Pixmap ------------------------------------------
+
+    KGlobal::dirs()->addResourceType("digikam_rating",
+                                     KGlobal::dirs()->kde_default("data")
+                                     + "digikam/data");
+    QString ratingPixPath = KGlobal::dirs()->findResourceDir("digikam_rating",
+                                                             "rating.png");
+    ratingPixPath += "/rating.png";
+    d->ratingPixmap = QPixmap(ratingPixPath);
+
+    QPainter painter(&d->ratingPixmap);
+    painter.fillRect(0, 0, d->ratingPixmap.width(), d->ratingPixmap.height(),
+                     ThemeEngine::instance()->textSpecialRegColor());
+    painter.end();
+
     // ----------------------------------------------------------------
 
     connect(ThemeEngine::instance(), SIGNAL(signalThemeChanged()),
@@ -69,6 +105,12 @@
     
     connect(d->imagePreviewWidget, SIGNAL( previewFailed() ),
             this, SIGNAL( previewLoadedSignal() ) );    
+
+    connect(d->imagePreviewWidget, SIGNAL(signalNextItem()),
+            this, SIGNAL(signalNextItem()));
+
+    connect(d->imagePreviewWidget, SIGNAL(signalPrevItem()),
+            this, SIGNAL(signalPrevItem()));
 }
 
 ImagePreviewView::~ImagePreviewView()
@@ -76,15 +118,235 @@
     delete d;
 }
 
-ImagePreviewWidget* ImagePreviewView::imagePreviewWidget()
+void ImagePreviewView::slotThemeChanged()
 {
-    return d->imagePreviewWidget;
+    setPaletteBackgroundColor(ThemeEngine::instance()->baseColor());
 }
 
-void ImagePreviewView::slotThemeChanged()
+void ImagePreviewView::setImageInfo(ImageInfo* info)
 {
-    setPaletteBackgroundColor(ThemeEngine::instance()->baseColor());
+    d->imageInfo = info;
+    if (d->imageInfo)
+        d->imagePreviewWidget->setImagePath(info->kurl().path()); 
+    else 
+        d->imagePreviewWidget->setImagePath(); 
 }
 
+void ImagePreviewView::mousePressEvent(QMouseEvent* e)
+{
+    if (e->button() == Qt::RightButton)
+    {
+        QPopupMenu    *ratingMenu     = 0;
+        TagsPopupMenu *assignTagsMenu = 0;
+        TagsPopupMenu *removeTagsMenu = 0;
+
+        if (!d->imageInfo)
+            return;
+
+        // --------------------------------------------------------
+    
+        KURL url(d->imageInfo->kurl().path());
+        KMimeType::Ptr mimePtr = KMimeType::findByURL(url, 0, true, true);
+    
+        QValueVector<KService::Ptr> serviceVector;
+        KTrader::OfferList offers = KTrader::self()->query(mimePtr->name(), "Type == 'Application'");
+
+        QPopupMenu openWithMenu;
+    
+        KTrader::OfferList::Iterator iter;
+        KService::Ptr ptr;
+        int index = 100;
+    
+        for( iter = offers.begin(); iter != offers.end(); ++iter )
+        {
+            ptr = *iter;
+            openWithMenu.insertItem( ptr->pixmap(KIcon::Small), ptr->name(), index++);
+            serviceVector.push_back(ptr);
+        }
+
+        // --------------------------------------------------------
+
+        DPopupMenu popmenu(this);
+        popmenu.insertItem(SmallIcon("back"), i18n("Back"), 10);
+        popmenu.insertItem(SmallIcon("forward"), i18n("Forward"), 11);
+        popmenu.insertItem(SmallIcon("editimage"), i18n("Edit..."), 12);
+        popmenu.insertItem(i18n("Open With"), &openWithMenu, 13);
+
+        /* FIXME
+        popmenu.insertSeparator();
+        popmenu.insertItem(SmallIcon("edittrash"), i18n("Move to Trash"), 14);
+        */
+
+        // Bulk assignment/removal of tags --------------------------
+
+        Q_LLONG id = d->imageInfo->id();
+        QValueList<Q_LLONG> idList;
+        idList.append(id);
+
+        assignTagsMenu = new TagsPopupMenu(idList, 1000, TagsPopupMenu::ASSIGN);
+        removeTagsMenu = new TagsPopupMenu(idList, 2000, TagsPopupMenu::REMOVE);
+
+        popmenu.insertSeparator();
+
+        popmenu.insertItem(i18n("Assign Tag"), assignTagsMenu);
+        int i = popmenu.insertItem(i18n("Remove Tag"), removeTagsMenu);
+
+        connect(assignTagsMenu, SIGNAL(signalTagActivated(int)),
+                this, SLOT(slotAssignTag(int)));
+
+        connect(removeTagsMenu, SIGNAL(signalTagActivated(int)),
+                this, SLOT(slotRemoveTag(int)));
+
+        AlbumDB* db = AlbumManager::instance()->albumDB();
+        if (!db->hasTags( idList ))
+            popmenu.setItemEnabled(i, false);
+
+        popmenu.insertSeparator();
+
+        // Assign Star Rating -------------------------------------------
+    
+        ratingMenu = new QPopupMenu();
+        
+        connect(ratingMenu, SIGNAL(activated(int)),
+                this, SLOT(slotAssignRating(int)));
+    
+        ratingMenu->insertItem(i18n("None"), 0);
+
+        for (int i = 1 ; i <= 5 ; i++)
+        {
+            QPixmap pix(d->ratingPixmap.width() * 5, d->ratingPixmap.height());
+            pix.fill(ratingMenu->colorGroup().background());
+    
+            QPainter painter(&pix);
+            painter.drawTiledPixmap(0, 0,
+                                    i*d->ratingPixmap.width(),
+                                    pix.height(),
+                                    d->ratingPixmap);
+            painter.end();
+            ratingMenu->insertItem(pix, i);
+        }
+    
+        popmenu.insertItem(i18n("Assign Rating"), ratingMenu);
+
+        // --------------------------------------------------------
+
+        int idm = popmenu.exec(e->globalPos());
+    
+        switch(idm) 
+        {
+            case 10:     // Back
+            {
+                emit signalPrevItem();
+                break;
+            }
+
+            case 11:     // Forward
+            {
+                emit signalNextItem();
+                break;
+            }
+
+            case 12:     // Edit...
+            {
+                emit editImageSignal();
+                break;
+            }
+  
+            case 14:     // Move to trash
+            {
+                emit signalDeleteItem();
+                break;
+            }
+
+            default:
+                break;
+        }
+
+        // Open With...
+        if (idm >= 100 && idm < 1000) 
+        {
+            KService::Ptr imageServicePtr = serviceVector[idm-100];
+            KRun::run(*imageServicePtr, url);
+        }
+    
+        serviceVector.clear();
+        delete assignTagsMenu;
+        delete removeTagsMenu;
+        delete ratingMenu;
+    }
+}
+
+void ImagePreviewView::slotAssignTag(int tagID)
+{
+    if (d->imageInfo)
+    {
+        QStringList oldKeywords = d->imageInfo->tagNames();
+
+        d->imageInfo->setTag(tagID);
+
+        // TODO MetadataHub: fix this part to use it instead.
+
+        // Update Image Tags like Iptc keywords tags.
+
+        if (AlbumSettings::instance())
+        {
+            if (AlbumSettings::instance()->getSaveIptcRating())
+            {
+                DMetadata metadata(d->imageInfo->filePath());
+                metadata.setImageKeywords(oldKeywords, d->imageInfo->tagNames());
+                metadata.applyChanges();
+            }
+        }
+    }
+}
+
+void ImagePreviewView::slotRemoveTag(int tagID)
+{
+    if (d->imageInfo)
+    {
+        QStringList oldKeywords = d->imageInfo->tagNames();
+
+        d->imageInfo->removeTag(tagID);
+
+        // TODO MetadataHub: fix this part to use it instead.
+
+        // Update Image Tags like Iptc keywords tags.
+
+        if (AlbumSettings::instance())
+        {
+            if (AlbumSettings::instance()->getSaveIptcRating())
+            {
+                DMetadata metadata(d->imageInfo->filePath());
+                metadata.setImageKeywords(oldKeywords, d->imageInfo->tagNames());
+                metadata.applyChanges();
+            }
+        }
+    }
+}
+
+void ImagePreviewView::slotAssignRating(int rating)
+{
+    rating = QMIN(5, QMAX(0, rating));
+    
+    if (d->imageInfo)
+    {
+        d->imageInfo->setRating(rating);
+
+        // TODO MetadataHub: fix this part to use it instead.
+        
+        // Store Image rating as Iptc tag.
+    
+        if (AlbumSettings::instance())
+        {
+            if (AlbumSettings::instance()->getSaveIptcRating())
+            {
+                DMetadata metadata(d->imageInfo->filePath());
+                metadata.setImageRating(rating);
+                metadata.applyChanges();
+            }
+        }
+    }
+}
+
 }  // NameSpace Digikam
 
--- trunk/extragear/graphics/digikam/digikam/imagepreviewview.h #629272:629273
@@ -44,22 +44,29 @@
     ImagePreviewView(QWidget *parent=0);
     ~ImagePreviewView();    
            
-    ImagePreviewWidget* imagePreviewWidget();
+    void setImageInfo(ImageInfo* info=0);
 
 signals:
 
+    void signalNextItem();
+    void signalPrevItem();
+    void signalDeleteItem();
+    void editImageSignal();
     void previewLoadedSignal();   
 
-public slots:
-
-//    void slotPreviewFailed();
-   
 private slots:
 
     void slotThemeChanged();
+    void slotAssignTag(int tagID);
+    void slotRemoveTag(int tagID);
+    void slotAssignRating(int rating);
 
 private:
 
+    void mousePressEvent(QMouseEvent* e);
+
+private:
+
     ImagePreviewViewPriv* d;        
 };
 
--- trunk/extragear/graphics/digikam/digikam/imagepreviewwidget.cpp #629272:629273
@@ -76,7 +76,7 @@
     setLineWidth(0);
     
     // ---------------------------------------------------------------
-            
+
     connect(ThemeEngine::instance(), SIGNAL(signalThemeChanged()),
             this, SLOT(slotThemeChanged()));
 }



More information about the Digikam-devel mailing list