Skip to content

Commit 9bd6c5d

Browse files
committed
Improve thumbnail layout
Align thumbnail labels, extend the selection visual indicator to all available space in the grid.
1 parent c97527c commit 9bd6c5d

File tree

1 file changed

+34
-26
lines changed

1 file changed

+34
-26
lines changed

Orange/widgets/data/owimageviewer.py

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def __init__(self, pixmap, parent=None):
4444
self.setCacheMode(QGraphicsItem.ItemCoordinateCache)
4545
self._pixmap = pixmap
4646
self._pixmapSize = QSizeF()
47+
self._keepAspect = True
4748
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
4849

4950
def setPixmap(self, pixmap):
@@ -54,30 +55,29 @@ def setPixmap(self, pixmap):
5455
def pixmap(self):
5556
return QPixmap(self._pixmap)
5657

57-
def setPixmapSize(self, size):
58-
if self._pixmapSize != size:
59-
self._pixmapSize = QSizeF(size)
60-
self.updateGeometry()
61-
62-
def pixmapSize(self):
63-
if self._pixmapSize.isValid():
64-
return QSizeF(self._pixmapSize)
65-
else:
66-
return QSizeF(self._pixmap.size())
67-
6858
def sizeHint(self, which, constraint=QSizeF()):
6959
if which == Qt.PreferredSize:
70-
return self.pixmapSize()
60+
return QSizeF(self._pixmap.size())
7161
else:
7262
return QGraphicsWidget.sizeHint(self, which, constraint)
7363

64+
def setKeepAspectRatio(self, keep):
65+
if self._keepAspect != keep:
66+
self._keepAspect = bool(keep)
67+
self.update()
68+
69+
def keepAspectRatio(self):
70+
return self._keepAspect
71+
7472
def paint(self, painter, option, widget=0):
7573
if self._pixmap.isNull():
7674
return
7775

7876
rect = self.contentsRect()
79-
80-
pixsize = self.pixmapSize()
77+
pixsize = QSizeF(self._pixmap.size())
78+
aspectmode = (Qt.KeepAspectRatio if self._keepAspect
79+
else Qt.IgnoreAspectRatio)
80+
pixsize.scale(rect.size(), aspectmode)
8181
pixrect = QRectF(QPointF(0, 0), pixsize)
8282
pixrect.moveCenter(rect.center())
8383

@@ -133,13 +133,13 @@ def __init__(self, pixmap, title="", parent=None):
133133

134134
layout.addItem(self.pixmapWidget)
135135
layout.addItem(self.labelWidget)
136-
136+
layout.addStretch()
137137
layout.setAlignment(self.pixmapWidget, Qt.AlignCenter)
138138
layout.setAlignment(self.labelWidget, Qt.AlignHCenter | Qt.AlignBottom)
139+
139140
self.setLayout(layout)
140141

141-
self.setSizePolicy(QSizePolicy.MinimumExpanding,
142-
QSizePolicy.MinimumExpanding)
142+
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
143143

144144
self.setFlag(QGraphicsItem.ItemIsSelectable, True)
145145
self.setTitle(title)
@@ -179,18 +179,14 @@ def paint(self, painter, option, widget=0):
179179
painter.save()
180180
painter.setPen(QPen(QColor(125, 162, 206, 192)))
181181
painter.setBrush(QBrush(QColor(217, 232, 252, 192)))
182-
painter.drawRoundedRect(QRectF(contents.topLeft(),
183-
self.geometry().size()), 3, 3)
182+
painter.drawRoundedRect(
183+
QRectF(contents.topLeft(), self.geometry().size()), 3, 3)
184184
painter.restore()
185185

186186
def _updatePixmapSize(self):
187-
pixmap = self.pixmap()
188-
if not pixmap.isNull() and self._size.isValid():
189-
pixsize = QSizeF(self.pixmap().size())
190-
pixsize.scale(self._size, Qt.KeepAspectRatio)
191-
else:
192-
pixsize = QSizeF()
193-
self.pixmapWidget.setPixmapSize(pixsize)
187+
pixsize = QSizeF(self._size)
188+
self.pixmapWidget.setMinimumSize(pixsize)
189+
self.pixmapWidget.setMaximumSize(pixsize)
194190

195191

196192
class ThumbnailWidget(QGraphicsWidget):
@@ -207,6 +203,16 @@ def setGeometry(self, geom):
207203
super(ThumbnailWidget, self).setGeometry(geom)
208204
self.reflow(self.size().width())
209205

206+
def event(self, event):
207+
if event.type() == QEvent.LayoutRequest:
208+
sh = self.effectiveSizeHint(Qt.PreferredSize)
209+
self.resize(sh)
210+
self.layout().activate()
211+
event.accept()
212+
return True
213+
else:
214+
return super().event(event)
215+
210216
def reflow(self, width):
211217
if not self.layout():
212218
return
@@ -232,6 +238,8 @@ def reflow(self, width):
232238
for i, item in enumerate(items):
233239
layout.addItem(item, i // ncol, i % ncol)
234240

241+
layout.invalidate()
242+
235243
def items(self):
236244
layout = self.layout()
237245
if layout:

0 commit comments

Comments
 (0)