25
25
#include <QAbstractScrollArea>
26
#include <QGraphicsLinearLayout>
26
27
#include <QGraphicsProxyWidget>
27
28
#include <QGraphicsScene>
28
29
#include <QGraphicsSceneMouseEvent>
52
52
#include <lib/documentview/rasterimageview.h>
53
53
#include <lib/documentview/svgviewadapter.h>
54
54
#include <lib/documentview/videoviewadapter.h>
55
#include <lib/graphicshudbutton.h>
55
56
#include <lib/graphicshudwidget.h>
56
57
#include <lib/graphicswidgetfloater.h>
57
58
#include <lib/gwenviewconfig.h>
76
77
static const int COMPARE_MARGIN = 4;
78
struct DocumentViewPrivate {
79
const int DocumentView::MaximumZoom = 16;
80
const int DocumentView::AnimDuration = 500;
82
struct DocumentViewPrivate
85
int mSortKey; // Used to sort views when displayed in compare mode
80
86
GraphicsHudWidget* mHud;
81
87
BirdEyeView* mBirdEyeView;
82
88
QWeakPointer<QPropertyAnimation> mMoveAnimation;
137
144
floater->setChildWidget(mLoadingIndicator);
140
QToolButton* createHudButton(const QString& text, const char* iconName, bool showText)
147
GraphicsHudButton* createHudButton(const QString& text, const char* iconName, bool showText)
142
QToolButton* button = new QToolButton;
149
GraphicsHudButton* button = new GraphicsHudButton;
144
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
145
151
button->setText(text);
147
153
button->setToolTip(text);
149
button->setIcon(SmallIcon(iconName));
155
button->setIcon(KIcon(iconName));
155
QToolButton* trashButton = createHudButton(i18n("Trash"), "user-trash", false);
156
QToolButton* deselectButton = createHudButton(i18n("Deselect"), "list-remove", true);
161
GraphicsHudButton* trashButton = createHudButton(i18n("Trash"), "user-trash", false);
162
GraphicsHudButton* deselectButton = createHudButton(i18n("Deselect"), "list-remove", true);
158
QWidget* content = new QWidget;
159
QHBoxLayout* layout = new QHBoxLayout(content);
160
layout->setMargin(0);
161
layout->setSpacing(4);
162
layout->addWidget(trashButton);
163
layout->addWidget(deselectButton);
164
QGraphicsWidget* content = new QGraphicsWidget;
165
QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(content);
166
layout->addItem(trashButton);
167
layout->addItem(deselectButton);
165
169
mHud = new GraphicsHudWidget(q);
166
170
mHud->init(content, GraphicsHudWidget::OptionNone);
260
264
mLoadingIndicator->hide();
263
void animate(QPropertyAnimation* anim)
265
QObject::connect(anim, SIGNAL(finished()),
266
q, SLOT(slotAnimationFinished()));
267
anim->setDuration(500);
268
// FIXME: If anim is not started with a QueuedConnection, then this fails:
271
// - Click an image => nothing appears!
272
QMetaObject::invokeMethod(anim, "start", Qt::QueuedConnection);
275
267
void resizeAdapterWidget()
277
269
QRectF rect = QRectF(QPointF(0, 0), q->boundingRect().size());
284
276
void fadeTo(qreal value)
286
278
if (mFadeAnimation.data()) {
287
// Reuse existing fade animation
288
mFadeAnimation.data()->stop();
289
mFadeAnimation.data()->setStartValue(q->opacity());
290
mFadeAnimation.data()->setEndValue(value);
291
mFadeAnimation.data()->start();
279
qreal endValue = mFadeAnimation.data()->endValue().toReal();
280
if (qFuzzyCompare(value, endValue)) {
281
// Same end value, don't change the actual animation
294
285
// Create a new fade animation
295
286
QPropertyAnimation* anim = new QPropertyAnimation(q, "opacity");
296
287
anim->setStartValue(q->opacity());
297
288
anim->setEndValue(value);
289
if (qFuzzyCompare(value, 1)) {
290
QObject::connect(anim, SIGNAL(finished()),
291
q, SLOT(slotFadeInFinished()));
293
anim->setDuration(DocumentView::AnimDuration);
294
anim->start(QAbstractAnimation::DeleteWhenStopped);
299
296
mFadeAnimation = anim;
398
396
createAdapterForDocument();
400
connect(d->mDocument.data(), SIGNAL(downSampledImageReady()),
402
connect(d->mDocument.data(), SIGNAL(loaded(KUrl)),
398
connect(d->mAdapter.data(), SIGNAL(completed()),
399
SLOT(slotCompleted()));
404
400
connect(d->mDocument.data(), SIGNAL(loadingFailed(KUrl)),
405
401
SLOT(slotLoadingFailed()));
406
402
d->mAdapter->setDocument(d->mDocument);
407
403
d->updateCaption();
409
if (d->mDocument->loadingState() == Document::Loaded) {
414
406
bool DocumentView::isEmpty() const
563
555
void DocumentView::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/)
565
if (!d->mCompareMode) {
557
QRectF visibleRect = mapRectFromItem(d->mAdapter->widget(), d->mAdapter->visibleDocumentRect());
558
if (d->mEraseBorders) {
559
QRegion borders = QRegion(boundingRect().toRect())
560
- QRegion(visibleRect.toRect());
561
Q_FOREACH(const QRect& rect, borders.rects()) {
562
painter->eraseRect(rect);
566
if (d->mCompareMode && d->mCurrent) {
570
568
painter->setBrush(Qt::NoBrush);
571
569
painter->setPen(QPen(palette().highlight().color(), 2));
572
570
painter->setRenderHint(QPainter::Antialiasing);
573
QRectF selectionRect = boundingRect().adjusted(2, 2, -2, -2);
571
QRectF selectionRect = visibleRect.adjusted(-2, -2, 2, 2);
574
572
painter->drawRoundedRect(selectionRect, 3, 3);
575
573
painter->restore();
677
675
QPropertyAnimation* anim = new QPropertyAnimation(this, "geometry");
678
676
anim->setStartValue(geometry());
679
677
anim->setEndValue(rect);
678
anim->setDuration(DocumentView::AnimDuration);
679
anim->start(QAbstractAnimation::DeleteWhenStopped);
681
680
d->mMoveAnimation = anim;
684
void DocumentView::fadeIn()
683
QPropertyAnimation* DocumentView::fadeIn()
686
return d->mFadeAnimation.data();
689
689
void DocumentView::fadeOut()
709
709
return imageView() ? imageView()->currentTool() : 0;
712
int DocumentView::sortKey() const
717
void DocumentView::setSortKey(int sortKey)
719
d->mSortKey = sortKey;
722
void DocumentView::setEraseBorders(bool value)
724
d->mEraseBorders = value;
727
void DocumentView::hideAndDeleteLater()