[Digikam-devel] [digikam] [Bug 361047] Wishlist: make grouped images more prominently visible [patch]
Omar Amin via KDE Bugzilla
bugzilla_noreply at kde.org
Mon May 16 02:39:27 BST 2016
https://bugs.kde.org/show_bug.cgi?id=361047
Omar Amin <omar.moh.amin at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Attachment #99001|0 |1
is obsolete| |
--- Comment #45 from Omar Amin <omar.moh.amin at gmail.com> ---
Comment on attachment 99001
--> https://bugs.kde.org/attachment.cgi?id=99001
patch3 grouped images, fitting grouped borders
>diff --git a/app/items/imagedelegate.cpp b/app/items/imagedelegate.cpp
>index 25f36c8..716afc4 100644
>--- a/app/items/imagedelegate.cpp
>+++ b/app/items/imagedelegate.cpp
>@@ -253,16 +253,22 @@ void ImageDelegate::paint(QPainter* p, const QStyleOptionViewItem& option, const
> // Thumbnail
> QPixmap pix;
>
>+ bool isGroupExpanded = (info.hasGroupedImages() && index.data(ImageFilterModel::GroupIsOpenRole).toBool())
>+ || (info.isGrouped());
> if (isSelected)
> {
> pix = d->selPixmap;
> }
>+ else if(isGroupExpanded)
>+ {
>+ pix = d->grpPixmap;
>+ }
> else
> {
> pix = d->regPixmap;
> }
>
>- QRect actualPixmapRect = drawThumbnail(p, d->pixmapRect, pix, thumbnailPixmap(index));
>+ QRect actualPixmapRect = drawThumbnail(p, d->pixmapRect, pix, thumbnailPixmap(index), info.hasGroupedImages());
>
> if (!actualPixmapRect.isNull())
> {
>@@ -271,7 +277,16 @@ void ImageDelegate::paint(QPainter* p, const QStyleOptionViewItem& option, const
>
> if (!d->ratingRect.isNull())
> {
>- drawRating(p, index, d->ratingRect, info.rating(), isSelected);
>+ int backgroundtype = 0;
>+ if(isSelected)
>+ {
>+ backgroundtype = 1;
>+ }
>+ else if(isGroupExpanded)
>+ {
>+ backgroundtype = 2;
>+ }
>+ drawRating(p, index, d->ratingRect, info.rating(), backgroundtype);
> }
>
> // Draw Color Label rectangle
>diff --git a/libs/widgets/itemview/ditemdelegate.cpp b/libs/widgets/itemview/ditemdelegate.cpp
>index b92fd43..9fa3824 100644
>--- a/libs/widgets/itemview/ditemdelegate.cpp
>+++ b/libs/widgets/itemview/ditemdelegate.cpp
>@@ -78,19 +78,35 @@ void DItemDelegate::clearCaches()
> d->squeezedTextCache.clear();
> }
>
>-QPixmap DItemDelegate::thumbnailBorderPixmap(const QSize& pixSize) const
>+QPixmap DItemDelegate::thumbnailBorderPixmap(const QSize& pixSize, bool isGrouped) const
> {
> const QColor borderColor = QColor(0, 0, 0, 128);
>- QString cacheKey = QString::number(pixSize.width()) + QLatin1Char('-') + QString::number(pixSize.height());
>+ QString cacheKey = QString::number(pixSize.width()) + QLatin1Char('-')
>+ + QString::number(pixSize.height()) + QLatin1Char('-')
>+ + QString::number(isGrouped);
> QPixmap* const cachePix = d->thumbnailBorderCache.object(cacheKey);
>
> if (!cachePix)
> {
> const int radius = 3;
>- QPixmap pix = ThumbBarDock::generateFuzzyRect(QSize(pixSize.width() + 2*radius,
>- pixSize.height() + 2*radius),
>- borderColor, radius);
>- const_cast<DItemDelegate*>(this)->d->thumbnailBorderCache.insert(cacheKey, new QPixmap(pix));
>+ QPixmap pix;
>+ const int width = pixSize.width() + 2*radius;
>+ const int height = pixSize.height() + 2*radius;
>+
>+ if(!isGrouped)
>+ {
>+ pix = ThumbBarDock::generateFuzzyRect(QSize(width, height),
>+ borderColor,
>+ radius);
>+ }
>+ else
>+ {
>+ pix = ThumbBarDock::generateFuzzyRectForGroup(QSize(width, height),
>+ borderColor,
>+ radius);
>+ }
>+
>+ d->thumbnailBorderCache.insert(cacheKey, new QPixmap(pix));
> return pix;
> }
>
>diff --git a/libs/widgets/itemview/ditemdelegate.h b/libs/widgets/itemview/ditemdelegate.h
>index 87f4614..7caa5c0 100644
>--- a/libs/widgets/itemview/ditemdelegate.h
>+++ b/libs/widgets/itemview/ditemdelegate.h
>@@ -85,7 +85,7 @@ protected:
> virtual void clearCaches();
>
> QString squeezedTextCached(QPainter* const p, int width, const QString& text) const;
>- QPixmap thumbnailBorderPixmap(const QSize& pixSize) const;
>+ QPixmap thumbnailBorderPixmap(const QSize& pixSize, bool isGrouped = false) const;
>
> private:
>
>diff --git a/libs/widgets/itemview/itemviewimagedelegate.cpp b/libs/widgets/itemview/itemviewimagedelegate.cpp
>index 35b9177..cba6afc 100644
>--- a/libs/widgets/itemview/itemviewimagedelegate.cpp
>+++ b/libs/widgets/itemview/itemviewimagedelegate.cpp
>@@ -62,11 +62,13 @@ ItemViewImageDelegatePrivate::ItemViewImageDelegatePrivate()
>
> // painting constants
> radius = 3;
>- margin = 5;
>+ margin = 14;
>
> makeStarPolygon();
>
>- ratingPixmaps = QVector<QPixmap>(10);
>+ setGroupBackgroundColors();
>+
>+ ratingPixmaps = QVector<QPixmap>(15);
> }
>
> void ItemViewImageDelegatePrivate::init(ItemViewImageDelegate* const _q)
>@@ -77,6 +79,28 @@ void ItemViewImageDelegatePrivate::init(ItemViewImageDelegate* const _q)
> q, SLOT(slotThemeChanged()));
> }
>
>+void ItemViewImageDelegatePrivate::setGroupBackgroundColors()
>+{
>+ grpBackgroundColors["Breeze"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Breeze Dark"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Breeze High Contrast"] = QColor(200, 200, 200);
>+ grpBackgroundColors["ColorContrast"] = QColor(200, 200, 200);
>+ grpBackgroundColors["DarkRoom"] = QColor(200, 200, 200);
>+ grpBackgroundColors["GrayCard"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Honeycomb"] = QColor(200, 200, 200);
>+ grpBackgroundColors["LowKey"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Norway"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Obsidian Coast"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Oxygen"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Oxygen Cold"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Steel"] = QColor(200, 200, 200);
>+ grpBackgroundColors["SunsetColor"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Wonton Soup"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Zion"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Zion (Reversed)"] = QColor(200, 200, 200);
>+ grpBackgroundColors["Default"] = grpBackgroundColors["Breeze"] ;
>+}
>+
> void ItemViewImageDelegatePrivate::clearRects()
> {
> gridSize = QSize(0, 0);
>@@ -267,7 +291,7 @@ void ItemViewImageDelegate::invalidatePaintingCache()
> }
>
> QRect ItemViewImageDelegate::drawThumbnail(QPainter* p, const QRect& thumbRect, const QPixmap& background,
>- const QPixmap& thumbnail) const
>+ const QPixmap& thumbnail, bool isGrouped) const
> {
> p->drawPixmap(0, 0, background);
>
>@@ -293,24 +317,38 @@ QRect ItemViewImageDelegate::drawThumbnail(QPainter* p, const QRect& thumbRect,
>
> p->drawPixmap(0, 0, background);
> */
>- QPixmap borderPix = thumbnailBorderPixmap(actualPixmapRect.size());
>- p->drawPixmap(actualPixmapRect.x()-3, actualPixmapRect.y()-3, borderPix);
>+ QPixmap borderPix = thumbnailBorderPixmap(actualPixmapRect.size(), isGrouped);
>+
>+ if(isGrouped)
>+ {
>+ const int xPadding = (borderPix.width()-actualPixmapRect.width())/2;
>+ const int yPadding = (borderPix.height()-actualPixmapRect.height())/2;
>+
>+ p->drawPixmap(actualPixmapRect.x()-xPadding,
>+ actualPixmapRect.y()-yPadding, borderPix);
>+ }
>+ else
>+ {
>+ p->drawPixmap(actualPixmapRect.x()-IMAGE_BORDER_RADIUS,
>+ actualPixmapRect.y()-IMAGE_BORDER_RADIUS, borderPix);
>+ }
>
> p->drawPixmap(r.x() + (r.width()-thumbnail.width())/2,
> r.y() + (r.height()-thumbnail.height())/2,
> thumbnail);
>+
> //p->restore();
> return actualPixmapRect;
> }
>
> void ItemViewImageDelegate::drawRating(QPainter* p, const QModelIndex& index, const QRect& ratingRect,
>- int rating, bool isSelected) const
>+ int rating, int bgType) const
> {
> Q_D(const ItemViewImageDelegate);
>
> if (d->editingRating != index)
> {
>- p->drawPixmap(ratingRect, ratingPixmap(rating, isSelected));
>+ p->drawPixmap(ratingRect, ratingPixmap(rating, bgType));
> }
> }
>
>@@ -622,6 +660,7 @@ void ItemViewImageDelegate::prepareBackground()
> {
> d->regPixmap = QPixmap();
> d->selPixmap = QPixmap();
>+ d->grpPixmap = QPixmap();
> }
> else
> {
>@@ -636,6 +675,15 @@ void ItemViewImageDelegate::prepareBackground()
> QPainter p2(&d->selPixmap);
> p2.setPen(qApp->palette().color(QPalette::Midlight));
> p2.drawRect(0, 0, d->rect.width()-1, d->rect.height()-1);
>+
>+ // getting grouped background color
>+ QColor groupedImagesBGColor = d->grpBackgroundColors[ThemeManager::instance()->currentThemeName()];
>+
>+ d->grpPixmap = QPixmap(d->rect.width(), d->rect.height());
>+ d->grpPixmap.fill(groupedImagesBGColor);
>+ QPainter p3(&d->grpPixmap);
>+ p3.setPen(qApp->palette().color(QPalette::Midlight));
>+ p3.drawRect(0, 0, d->rect.width()-1, d->rect.height()-1);
> }
> }
>
>@@ -653,33 +701,34 @@ void ItemViewImageDelegate::prepareRatingPixmaps(bool composeOverBackground)
> // We use antialiasing and want to pre-render the pixmaps.
> // So we need the background at the time of painting,
> // and the background may be a gradient, and will be different for selected items.
>- // This makes 5*2 (small) pixmaps.
>+ // This makes 5*3 (small) pixmaps.
>
>- for (int sel=0; sel<2; ++sel)
>+ for (int sel=0; sel<3; ++sel)
> {
> QPixmap basePix;
>
>- if (composeOverBackground)
>- {
>- // do this once for regular, once for selected backgrounds
>- if (sel)
>- {
>- basePix = d->selPixmap.copy(d->ratingRect);
>- }
>- else
>- {
>- basePix = d->regPixmap.copy(d->ratingRect);
>- }
>- }
>- else
>- {
>- basePix = QPixmap(d->ratingRect.size());
>- basePix.fill(Qt::transparent);
>- }
>+// if (composeOverBackground)
>+// {
>+// // do this once for regular, once for selected backgrounds, and once for grouped backgrounds
>+// if(sel == 2)
>+// {
>+// basePix = d->grpPixmap.copy(d->ratingRect);
>+// }
>+// else if(sel == 1)
>+// {
>+// basePix = d->selPixmap.copy(d->ratingRect);
>+// }
>+// else
>+// {
>+// basePix = d->regPixmap.copy(d->ratingRect);
>+// }
>+// }
>+ basePix = QPixmap(d->ratingRect.size());
>+ basePix.fill(Qt::transparent);
>
> for (int rating=1; rating<=5; ++rating)
> {
>- // we store first the 5 regular, then the 5 selected pixmaps, for simplicity
>+ // we store first the 5 regular, then the 5 selected ,then the 5 grouped pixmaps
> int index = (sel * 5 + rating) - 1;
>
> // copy background
>@@ -707,7 +756,7 @@ void ItemViewImageDelegate::prepareRatingPixmaps(bool composeOverBackground)
> }
> }
>
>-QPixmap ItemViewImageDelegate::ratingPixmap(int rating, bool selected) const
>+QPixmap ItemViewImageDelegate::ratingPixmap(int rating, int backgroundType) const
> {
> Q_D(const ItemViewImageDelegate);
>
>@@ -718,7 +767,11 @@ QPixmap ItemViewImageDelegate::ratingPixmap(int rating, bool selected) const
>
> --rating;
>
>- if (selected)
>+ if(backgroundType == 2)
>+ {
>+ return d->ratingPixmaps.at(10 + rating);
>+ }
>+ else if (backgroundType == 1)
> {
> return d->ratingPixmaps.at(5 + rating);
> }
>diff --git a/libs/widgets/itemview/itemviewimagedelegate.h b/libs/widgets/itemview/itemviewimagedelegate.h
>index 16e1f0a..bfcabd9 100644
>--- a/libs/widgets/itemview/itemviewimagedelegate.h
>+++ b/libs/widgets/itemview/itemviewimagedelegate.h
>@@ -100,8 +100,9 @@ Q_SIGNALS:
> protected:
>
> /// Use the tool methods for painting in subclasses
>- QRect drawThumbnail(QPainter* p, const QRect& thumbRect, const QPixmap& background, const QPixmap& thumbnail) const;
>- void drawRating(QPainter* p, const QModelIndex& index, const QRect& ratingRect, int rating, bool isSelected) const;
>+ QRect drawThumbnail(QPainter* p, const QRect& thumbRect,
>+ const QPixmap& background, const QPixmap& thumbnail, bool isGrouped) const;
>+ void drawRating(QPainter* p, const QModelIndex& index, const QRect& ratingRect, int rating, int bgType) const;
> void drawName(QPainter* p,const QRect& nameRect, const QString& name) const;
> void drawTitle(QPainter *p, const QRect& titleRect, const QString& title) const;
> void drawComments(QPainter* p, const QRect& commentsRect, const QString& comments) const;
>@@ -126,7 +127,7 @@ protected:
>
> /** Returns the relevant pixmap from the cached rating pixmaps.
> */
>- QPixmap ratingPixmap(int rating, bool selected) const;
>+ QPixmap ratingPixmap(int rating, int backgroundType) const;
>
> virtual QAbstractItemDelegate* asDelegate();
>
>diff --git a/libs/widgets/itemview/itemviewimagedelegatepriv.h b/libs/widgets/itemview/itemviewimagedelegatepriv.h
>index 5c38998..a5159e2 100644
>--- a/libs/widgets/itemview/itemviewimagedelegatepriv.h
>+++ b/libs/widgets/itemview/itemviewimagedelegatepriv.h
>@@ -33,6 +33,7 @@
> #include <QFont>
> #include <QPainter>
> #include <QPolygon>
>+#include <QMap>
>
> // Local includes
>
>@@ -57,6 +58,8 @@ public:
>
> void makeStarPolygon();
>
>+ void setGroupBackgroundColors();
>+
> /// Resets cached rects. Remember to reimplement in subclass for added rects.
> virtual void clearRects();
>
>@@ -70,6 +73,7 @@ public:
>
> QPixmap regPixmap;
> QPixmap selPixmap;
>+ QPixmap grpPixmap;
> QVector<QPixmap> ratingPixmaps;
>
> QFont font;
>@@ -90,6 +94,8 @@ public:
> QRect oneRowComRect;
> QRect oneRowXtraRect;
>
>+ QMap<QString,QColor> grpBackgroundColors;
>+
> // constant values for drawing
> int radius;
> int margin;
>diff --git a/libs/widgets/mainview/thumbbardock.cpp b/libs/widgets/mainview/thumbbardock.cpp
>index 21d42a6..2910339 100644
>--- a/libs/widgets/mainview/thumbbardock.cpp
>+++ b/libs/widgets/mainview/thumbbardock.cpp
>@@ -239,7 +239,7 @@ void ThumbBarDock::showThumbBar(bool status)
> QPixmap ThumbBarDock::generateFuzzyRect(const QSize& size, const QColor& color, int radius)
> {
> QPixmap pix(size);
>- pix.fill(Qt::transparent);
>+ pix.fill(Qt::white);
>
> QPainter painter(&pix);
> painter.setRenderHint(QPainter::Antialiasing, true);
>@@ -304,4 +304,37 @@ QPixmap ThumbBarDock::generateFuzzyRect(const QSize& size, const QColor& color,
> return pix;
> }
>
>+
>+QPixmap ThumbBarDock::generateFuzzyRectForGroup(const QSize& size, const QColor& color, int radius)
>+{
>+ // Create two normal borders
>+ QPixmap border1 = generateFuzzyRect(size, color,radius);
>+ QPixmap border2 = border1.copy();
>+
>+ QTransform rm;
>+ // Rotate first border right by 3 degrees
>+ rm.rotate(3);
>+ border1 = border1.transformed(rm, Qt::SmoothTransformation);
>+
>+ // Rotate second border left by 3 degrees
>+ rm.rotate(-6);
>+ border2 = border2.transformed(rm, Qt::SmoothTransformation);
>+
>+ // Combine both borders
>+ int width = std::max(border1.size().width() , border2.size().width());
>+ int height = std::max(border1.size().height() , border2.size().height());
>+
>+ QPixmap result(QSize(width, height));
>+ result.fill(Qt::transparent); // force alpha channel
>+ {
>+ QPainter painter(&result);
>+ painter.setRenderHints(QPainter::Antialiasing, true);
>+ painter.drawPixmap(0, 0, border1);
>+ painter.drawPixmap(0, 0, border2);
>+ }
>+
>+ return result;
>+}
>+
>+
> } // namespace Digikam
>diff --git a/libs/widgets/mainview/thumbbardock.h b/libs/widgets/mainview/thumbbardock.h
>index 655bf11..2b7f136 100644
>--- a/libs/widgets/mainview/thumbbardock.h
>+++ b/libs/widgets/mainview/thumbbardock.h
>@@ -123,7 +123,8 @@ public:
> void setShouldBeVisible(bool);
> void restoreVisibility();
>
>- static QPixmap generateFuzzyRect(const QSize& size, const QColor& color, int radius);
>+ static QPixmap generateFuzzyRect(const QSize& size, const QColor& color, int radius);
>+ static QPixmap generateFuzzyRectForGroup(const QSize& size, const QColor& color, int radius);
>
> public Q_SLOTS:
>
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the Digikam-devel
mailing list