[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