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

List:       kde-commits
Subject:    [digikam] core: fix and optimize manual sorting
From:       Maik Qualmann <null () kde ! org>
Date:       2018-07-31 19:47:59
Message-ID: E1fkach-0002b3-7E () code ! kde ! org
[Download RAW message or body]

Git commit c6e92a02cfeebc86b60faad9442e780a7342abbf by Maik Qualmann.
Committed on 31/07/2018 at 19:46.
Pushed by mqualmann into branch 'master'.

fix and optimize manual sorting
CCBUGS: 91562

M  +21   -13   core/app/items/digikamimageview.cpp
M  +0    -2    core/libs/database/coredb/coredb.cpp
M  +14   -2    core/libs/database/item/imageinfo.cpp
M  +1    -1    core/libs/database/item/imageinfo.h
M  +1    -1    core/libs/database/item/imageinfodata.h

https://commits.kde.org/digikam/c6e92a02cfeebc86b60faad9442e780a7342abbf

diff --git a/core/app/items/digikamimageview.cpp \
b/core/app/items/digikamimageview.cpp index 53b8221f95..c6098e4d0b 100644
--- a/core/app/items/digikamimageview.cpp
+++ b/core/app/items/digikamimageview.cpp
@@ -31,6 +31,7 @@
 
 // Qt includes
 
+#include <QApplication>
 #include <QPointer>
 #include <QMenu>
 #include <QIcon>
@@ -214,41 +215,48 @@ ImageInfoList \
DigikamImageView::selectedImageInfosCurrentFirst(bool grouping) co  
 void DigikamImageView::dragDropSort(const ImageInfo& pick, const QList<ImageInfo>& \
infos)  {
-    if (infos.isEmpty())
+    if (pick.isNull() || infos.isEmpty())
     {
         return;
     }
 
     ImageInfoList infoList = allImageInfos(false);
     int counter            = pick.manualOrder();
-    bool flag              = false;
-    int order              = 1;
+    bool order             = (ApplicationSettings::instance()->
+                                getImageSorting() == Qt::AscendingOrder);
+    bool found             = false;
 
-    if (ApplicationSettings::instance()->getImageSorting() == Qt::DescendingOrder)
-    {
-        order = -1;
-    }
+    QApplication::setOverrideCursor(Qt::WaitCursor);
 
     foreach(ImageInfo info, infoList)
     {
-        if (!flag && info.name() == pick.name())
+        if (!found && info.name() == pick.name())
         {
             foreach(ImageInfo info, infos)
             {
                 info.setManualOrder(counter);
-                counter += order;
+                counter += (order ? 1 : -1);
             }
 
-            flag = true;
+            info.setManualOrder(counter);
+            counter += (order ? 1 : -1);
+            found    = true;
         }
-
-        if (flag && !infos.contains(info))
+        else if (found && !infos.contains(info))
         {
+            if ((order  && info.manualOrder() > counter) ||
+                (!order && info.manualOrder() < counter))
+            {
+                break;
+            }
+
             info.setManualOrder(counter);
-            counter += order;
+            counter += (order ? 1000 : -1000);
         }
     }
 
+    QApplication::restoreOverrideCursor();
+
     imageFilterModel()->invalidate();
  }
 
diff --git a/core/libs/database/coredb/coredb.cpp \
b/core/libs/database/coredb/coredb.cpp index 1f4e0bab36..decb87ecc7 100644
--- a/core/libs/database/coredb/coredb.cpp
+++ b/core/libs/database/coredb/coredb.cpp
@@ -3773,8 +3773,6 @@ void CoreDB::setItemAlbum(qlonglong imageID, qlonglong album)
 
 void CoreDB::setItemManualOrder(qlonglong imageID, int value)
 {
-    // qCDebug(DIGIKAM_DATABASE_LOG) << "CoreDB::setItemManualOrder" << imageID << \
                value;;
-
     QVariantList boundValues;
     boundValues << value << imageID;
     d->db->execSql(QString::fromUtf8("UPDATE Images SET manualOrder=? WHERE id=?;"),
diff --git a/core/libs/database/item/imageinfo.cpp \
b/core/libs/database/item/imageinfo.cpp index fee625c4b4..e99dfb318f 100644
--- a/core/libs/database/item/imageinfo.cpp
+++ b/core/libs/database/item/imageinfo.cpp
@@ -196,6 +196,7 @@ ImageInfoData::ImageInfoData()
     rating                 = -1;
     category               = DatabaseItem::UndefinedCategory;
     fileSize               = 0;
+    manualOrder            = 0;
 
     longitude              = 0;
     latitude               = 0;
@@ -213,12 +214,12 @@ ImageInfoData::ImageInfoData()
     pickLabelCached        = false;
     colorLabelCached       = false;
     ratingCached           = false;
-    manualOrderCached      = false;
     categoryCached         = false;
     formatCached           = false;
     creationDateCached     = false;
     modificationDateCached = false;
     fileSizeCached         = false;
+    manualOrderCached      = false;
     imageSizeCached        = false;
     tagIdsCached           = false;
     positionsCached        = false;
@@ -653,10 +654,11 @@ int ImageInfo::rating() const
     RETURN_IF_CACHED(rating)
 
     QVariantList values = CoreDbAccess().db()->getImageInformation(m_data->id, \
DatabaseFields::Rating); +
     STORE_IN_CACHE_AND_RETURN(rating, values.first().toLongLong())
 }
 
-int ImageInfo::manualOrder() const
+qlonglong ImageInfo::manualOrder() const
 {
     if (!m_data)
     {
@@ -666,6 +668,7 @@ int ImageInfo::manualOrder() const
     RETURN_IF_CACHED(manualOrder)
 
     QVariantList values = CoreDbAccess().db()->getImagesFields(m_data->id, \
DatabaseFields::ManualOrder); +
     STORE_IN_CACHE_AND_RETURN(manualOrder, values.first().toLongLong())
 }
 
@@ -677,7 +680,9 @@ QString ImageInfo::format() const
     }
 
     RETURN_IF_CACHED(format)
+
     QVariantList values = CoreDbAccess().db()->getImageInformation(m_data->id, \
DatabaseFields::Format); +
     STORE_IN_CACHE_AND_RETURN(format, values.first().toString())
 }
 
@@ -689,7 +694,9 @@ DatabaseItem::Category ImageInfo::category() const
     }
 
     RETURN_IF_CACHED(category)
+
     QVariantList values = CoreDbAccess().db()->getImagesFields(m_data->id, \
DatabaseFields::Category); +
     STORE_IN_CACHE_AND_RETURN(category, \
(DatabaseItem::Category)values.first().toInt())  }
 
@@ -701,7 +708,9 @@ QDateTime ImageInfo::dateTime() const
     }
 
     RETURN_IF_CACHED(creationDate)
+
     QVariantList values = CoreDbAccess().db()->getImageInformation(m_data->id, \
DatabaseFields::CreationDate); +
     STORE_IN_CACHE_AND_RETURN(creationDate, values.first().toDateTime())
 }
 
@@ -713,7 +722,9 @@ QDateTime ImageInfo::modDateTime() const
     }
 
     RETURN_IF_CACHED(modificationDate)
+
     QVariantList values = CoreDbAccess().db()->getImagesFields(m_data->id, \
DatabaseFields::ModificationDate); +
     STORE_IN_CACHE_AND_RETURN(modificationDate, values.first().toDateTime())
 }
 
@@ -725,6 +736,7 @@ QSize ImageInfo::dimensions() const
     }
 
     RETURN_IF_CACHED(imageSize)
+
     QVariantList values = CoreDbAccess().db()->getImageInformation(m_data->id, \
DatabaseFields::Width | DatabaseFields::Height);  ImageInfoWriteLocker lock;
     m_data.constCastData()->imageSizeCached = true;
diff --git a/core/libs/database/item/imageinfo.h \
b/core/libs/database/item/imageinfo.h index 63516c7732..94b346db77 100644
--- a/core/libs/database/item/imageinfo.h
+++ b/core/libs/database/item/imageinfo.h
@@ -215,7 +215,7 @@ public:
     /**
      * Returns the manual sort order
      */
-    int manualOrder() const;
+    qlonglong manualOrder() const;
 
     /**
      * Returns the category of the item: Image, Audio, Video
diff --git a/core/libs/database/item/imageinfodata.h \
b/core/libs/database/item/imageinfodata.h index 365c6b51ec..42f1ef9089 100644
--- a/core/libs/database/item/imageinfodata.h
+++ b/core/libs/database/item/imageinfodata.h
@@ -108,12 +108,12 @@ public:
     quint8                 pickLabel;
     quint8                 colorLabel;
     qint8                  rating;
-    qint8                  manualOrder;
     DatabaseItem::Category category;
     QString                format;
     QDateTime              creationDate;
     QDateTime              modificationDate;
     qlonglong              fileSize;
+    qlonglong              manualOrder;
     QString                uniqueHash;
     QSize                  imageSize;
     QList<int>             tagIds;


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

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