kwin/kcmkwin/kwinscreenedges/screenpreviewwidget.cpp

164 lines
4.2 KiB
C++

/* This file is part of the KDE libraries
Copyright (C) 2009 Marco Martin <notmart@gmail.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "screenpreviewwidget.h"
#include <QResizeEvent>
#include <QPaintEvent>
#include <QPainter>
#include <QDebug>
#include <QMimeData>
#include <Plasma/FrameSvg>
#include <kurlmimedata.h>
class ScreenPreviewWidgetPrivate
{
public:
ScreenPreviewWidgetPrivate(ScreenPreviewWidget *screen)
: q(screen),
ratio(1)
{}
~ScreenPreviewWidgetPrivate()
{}
void updateRect(const QRectF& rect)
{
q->update(rect.toRect());
}
void updateScreenGraphics()
{
int bottomElements = screenGraphics->elementSize("base").height() + screenGraphics->marginSize(Plasma::Types::BottomMargin);
QRect bounds(QPoint(0,0), QSize(q->size().width(), q->height() - bottomElements));
QSize monitorSize(q->size().width(), q->size().width()/ratio);
monitorSize.scale(bounds.size(), Qt::KeepAspectRatio);
if (monitorSize.isEmpty()) {
return;
}
monitorRect = QRect(QPoint(0,0), monitorSize);
monitorRect.moveCenter(bounds.center());
screenGraphics->resizeFrame(monitorRect.size());
previewRect = screenGraphics->contentsRect().toRect();
previewRect.moveCenter(bounds.center());
}
ScreenPreviewWidget *q;
Plasma::FrameSvg *screenGraphics;
QPixmap preview;
QRect monitorRect;
qreal ratio;
QRect previewRect;
};
ScreenPreviewWidget::ScreenPreviewWidget(QWidget *parent)
: QWidget(parent),
d(new ScreenPreviewWidgetPrivate(this))
{
d->screenGraphics = new Plasma::FrameSvg(this);
d->screenGraphics->setImagePath("widgets/monitor");
d->updateScreenGraphics();
}
ScreenPreviewWidget::~ScreenPreviewWidget()
{
delete d;
}
void ScreenPreviewWidget::setPreview(const QPixmap &preview)
{
d->preview = preview;
update();
}
const QPixmap ScreenPreviewWidget::preview() const
{
return d->preview;
}
void ScreenPreviewWidget::setRatio(const qreal ratio)
{
d->ratio = ratio;
d->updateScreenGraphics();
}
qreal ScreenPreviewWidget::ratio() const
{
return d->ratio;
}
QRect ScreenPreviewWidget::previewRect() const
{
return d->previewRect;
}
void ScreenPreviewWidget::resizeEvent(QResizeEvent *e)
{
Q_UNUSED(e)
d->updateScreenGraphics();
}
void ScreenPreviewWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
if (d->monitorRect.size().isEmpty()) {
return;
}
QPainter painter(this);
QPoint standPosition(d->monitorRect.center().x() - d->screenGraphics->elementSize("base").width()/2, d->previewRect.bottom());
d->screenGraphics->paint(&painter, QRect(standPosition, d->screenGraphics->elementSize("base")), "base");
d->screenGraphics->paintFrame(&painter, d->monitorRect.topLeft());
painter.save();
if (!d->preview.isNull()) {
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.drawPixmap(d->previewRect, d->preview, d->preview.rect());
}
painter.restore();
d->screenGraphics->paint(&painter, d->previewRect, "glass");
}
void ScreenPreviewWidget::dropEvent(QDropEvent *e)
{
if (!e->mimeData()->hasUrls())
return;
QList<QUrl> uris(KUrlMimeData::urlsFromMimeData(e->mimeData()));
if (!uris.isEmpty()) {
// TODO: Download remote file
if (uris.first().isLocalFile())
emit imageDropped(uris.first().path());
}
}
#include "moc_screenpreviewwidget.cpp"