[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    =?utf-8?q?=5Bdigikam/development/2=2E0=5D_/=3A_Implement_manuall?=
From:       Marcel Wiesweg <marcel.wiesweg () gmx ! de>
Date:       2011-03-05 12:40:26
Message-ID: 20110305124026.77097A60D3 () git ! kde ! org
[Download RAW message or body]

Git commit 1f9a1bbb4e1e64b73f52e1f42260a5c9b05c4e53 by Marcel Wiesweg.
Committed on 05/03/2011 at 13:39.
Pushed by mwiesweg into branch 'development/2.0'.

Implement manually adding a face

BUG: 262574

M  +3    -1    NEWS     
M  +88   -22   utilities/facedetection/facegroup.cpp     
M  +4    -0    utilities/facedetection/facegroup.h     

http://commits.kde.org/digikam/1f9a1bbb4e1e64b73f52e1f42260a5c9b05c4e53

diff --git a/NEWS b/NEWS
index 1bbd642..b5195c1 100644
--- a/NEWS
+++ b/NEWS
@@ -80,5 +80,7 @@ BUGFIXES FROM KDE BUGZILLA (alias B.K.O | http://bugs.kde.org):
 058 ==> 266327 : Move libkexiv2 to git.
 059 ==> 267361 : When using the luminosity curve in the image editor on an initial \
import from NEF, all changes are irreversible and cumulative.  060 ==> 266733 : \
                digiKam crashes on startup on OS X.
-061 ==> 
+061 ==> 262574 : Add a face tag does not do anything.
+062 ==> 
+
 
diff --git a/utilities/facedetection/facegroup.cpp \
b/utilities/facedetection/facegroup.cpp index 963f613..206313d 100644
--- a/utilities/facedetection/facegroup.cpp
+++ b/utilities/facedetection/facegroup.cpp
@@ -39,6 +39,7 @@
 #include "albumfiltermodel.h"
 #include "albummanager.h"
 #include "assignnamewidget.h"
+#include "clickdragreleaseitem.h"
 #include "dimgpreviewitem.h"
 #include "faceiface.h"
 #include "facepipeline.h"
@@ -105,6 +106,8 @@ void FaceItem::setHudWidget(AssignNameWidget* widget)
     m_widget = widget;
     updateCurrentTag();
     RegionFrameItem::setHudWidget(widget);
+    // Ensure that all HUD widgets are stacked before the frame items
+    hudWidget()->setZValue(1);
 }
 
 AssignNameWidget* FaceItem::widget() const
@@ -170,6 +173,8 @@ public:
         view                 = 0;
         autoSuggest          = false;
         showOnHover          = false;
+        manuallyAddWrapItem  = 0;
+        manuallyAddedItem    = 0;
         visibilityController = 0;
         state                = NoFaces;
         tagModel             = 0;
@@ -179,6 +184,7 @@ public:
 
     void                       applyVisible();
     FaceItem*                  createItem(const DatabaseFace& face);
+    FaceItem*                  addItem(const DatabaseFace& face);
     AssignNameWidget*          createAssignNameWidget(const DatabaseFace& face, \
const QVariant& identifier);  AssignNameWidget::Mode     \
assignWidgetMode(DatabaseFace::Type type);  void                       checkModels();
@@ -193,6 +199,9 @@ public:
 
     QList<FaceItem*>           items;
 
+    ClickDragReleaseItem*      manuallyAddWrapItem;
+    FaceItem*                  manuallyAddedItem;
+
     FaceGroupState             state;
     ItemVisibilityController*  visibilityController;
 
@@ -498,6 +507,21 @@ FaceItem* FaceGroup::FaceGroupPriv::createItem(const \
DatabaseFace& face)  return item;
 }
 
+FaceItem* FaceGroup::FaceGroupPriv::addItem(const DatabaseFace& face)
+{
+    FaceItem* item = createItem(face);
+
+    // for identification, use index in our list
+    AssignNameWidget* assignWidget = createAssignNameWidget(face, items.size());
+    item->setHudWidget(assignWidget);
+    //new StyleSheetDebugger(assignWidget);
+
+    visibilityController->addItem(item);
+
+    items << item;
+    return item;
+}
+
 void FaceGroup::FaceGroupPriv::checkModels()
 {
     if (!tagModel)
@@ -573,16 +597,7 @@ void FaceGroup::load()
 
     foreach (const DatabaseFace& face, faces)
     {
-        FaceItem* item = d->createItem(face);
-
-        // for identification, use index in our list
-        AssignNameWidget* assignWidget = d->createAssignNameWidget(face, \
                d->items.size());
-        item->setHudWidget(assignWidget);
-        //new StyleSheetDebugger(assignWidget);
-
-        d->visibilityController->addItem(item);
-
-        d->items << item;
+        d->addItem(face);
     }
 
     d->state = FacesLoaded;
@@ -595,6 +610,7 @@ void FaceGroup::load()
 
 void FaceGroup::clear()
 {
+    cancelAddItem();
     d->visibilityController->clear();
     foreach (RegionFrameItem* item, d->items)
     {
@@ -604,18 +620,6 @@ void FaceGroup::clear()
     d->state = NoFaces;
 }
 
-void FaceGroup::addFace()
-{
-    /*
-        int w = this->scene()->width()/2;
-        int h = w;
-        int x = this->scene()->width()/2 - w/2;
-        int y = this->scene()->height()/2 - w/2;
-
-        d->faceitems.append(new FaceItem(0, this->scene(), QRect(x, y, w, h), \
                d->scale , "", d->scale));
-    */
-}
-
 void FaceGroup::rejectAll()
 {
 }
@@ -686,6 +690,68 @@ void FaceGroup::startAutoSuggest()
     }
 }
 
+void FaceGroup::addFace()
+{
+    d->manuallyAddWrapItem = new ClickDragReleaseItem(d->view->previewItem());
+    d->manuallyAddWrapItem->setFocus();
+
+    connect(d->manuallyAddWrapItem, SIGNAL(started(const QPointF&)),
+            this, SLOT(slotAddItemStarted(const QPointF&)));
+
+    connect(d->manuallyAddWrapItem, SIGNAL(moving(const QRectF&)),
+            this, SLOT(slotAddItemMoving(const QRectF&)));
+
+    connect(d->manuallyAddWrapItem, SIGNAL(finished(const QRectF&)),
+            this, SLOT(slotAddItemFinished(const QRectF&)));
+
+    connect(d->manuallyAddWrapItem, SIGNAL(cancelled()),
+            this, SLOT(cancelAddItem()));
+}
+
+void FaceGroup::slotAddItemStarted(const QPointF& pos)
+{
+    Q_UNUSED(pos);
+}
+
+void FaceGroup::slotAddItemMoving(const QRectF& rect)
+{
+    if (!d->manuallyAddedItem)
+    {
+        d->manuallyAddedItem = d->createItem(DatabaseFace());
+        d->visibilityController->addItem(d->manuallyAddedItem);
+        d->visibilityController->showItem(d->manuallyAddedItem);
+    }
+    d->manuallyAddedItem->setRectInSceneCoordinates(rect);
+}
+
+void FaceGroup::slotAddItemFinished(const QRectF& rect)
+{
+    if (d->manuallyAddedItem)
+    {
+        d->manuallyAddedItem->setRectInSceneCoordinates(rect);
+        DatabaseFace face = \
d->faceIface.addUnknownManually(d->view->previewItem()->image(), +                    \
d->info.id(), +                                                            \
d->manuallyAddedItem->originalRect()); +        FaceItem* item = d->addItem(face);
+        d->visibilityController->setItemDirectlyVisible(item, true);
+        d->manuallyAddWrapItem->stackBefore(item);
+    }
+    cancelAddItem();
+}
+
+void FaceGroup::cancelAddItem()
+{
+    delete d->manuallyAddedItem;
+    d->manuallyAddedItem = 0;
+
+    if (d->manuallyAddWrapItem)
+    {
+        d->view->scene()->removeItem(d->manuallyAddWrapItem);
+        d->manuallyAddWrapItem->deleteLater();
+        d->manuallyAddWrapItem = 0;
+    }
+}
+
 /*
 void ImagePreviewView::trainFaces()
 {
diff --git a/utilities/facedetection/facegroup.h \
b/utilities/facedetection/facegroup.h index 28595c3..70270e5 100644
--- a/utilities/facedetection/facegroup.h
+++ b/utilities/facedetection/facegroup.h
@@ -123,6 +123,10 @@ protected Q_SLOTS:
     void slotAssigned(const TaggingAction& action, const ImageInfo& info, const \
                QVariant& faceIdentifier);
     void slotRejected(const ImageInfo& info, const QVariant& faceIdentifier);
     void slotLabelClicked(const ImageInfo& info, const QVariant& faceIdentifier);
+    void slotAddItemStarted(const QPointF& pos);
+    void slotAddItemMoving(const QRectF& rect);
+    void slotAddItemFinished(const QRectF& rect);
+    void cancelAddItem();
 
 private:
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic