/* * Copyright (c) 2012 Yoann Blein * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include "RemoteScreenViewerWidget.h" #include #include #include #include #include namespace Swift { RemoteScreenViewerWidget::RemoteScreenViewerWidget(boost::shared_ptr incScreenSharing, QWidget *parent) : QWidget(parent), iss(incScreenSharing) { setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); iss->onNewImageReceived.connect(boost::bind(&RemoteScreenViewerWidget::handleNewImageReceived, this, _1)); } RemoteScreenViewerWidget::~RemoteScreenViewerWidget() { iss->onNewImageReceived.disconnect(boost::bind(&RemoteScreenViewerWidget::handleNewImageReceived, this, _1)); } void RemoteScreenViewerWidget::paintEvent(QPaintEvent*) { if (!pixmap.isNull()) { QPainter painter(this); painter.translate(geometry().center()); painter.drawPixmap(-pixmap.rect().center(), pixmap); } } void RemoteScreenViewerWidget::resizeEvent(QResizeEvent* event) { if (!pixmap.isNull()) { pixmap = pixmap.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); } QWidget::resizeEvent(event); } void RemoteScreenViewerWidget::keyPressEvent(QKeyEvent* event) { InputEventPayload::Event ev(InputEventPayload::Event::KeyPress, event->key()); iss->sendInputEvent(ev); QWidget::keyPressEvent(event); } void RemoteScreenViewerWidget::keyReleaseEvent(QKeyEvent* event) { InputEventPayload::Event ev(InputEventPayload::Event::KeyRelease, event->key()); iss->sendInputEvent(ev); QWidget::keyReleaseEvent(event); } void RemoteScreenViewerWidget::mouseMoveEvent(QMouseEvent* event) { float x = static_cast(event->x()) / pixmap.width(); float y = static_cast(event->y()) / pixmap.height(); InputEventPayload::Event ev(InputEventPayload::Event::MouseMove, x, y); iss->sendInputEvent(ev); QWidget::mouseMoveEvent(event); } void RemoteScreenViewerWidget::mousePressEvent(QMouseEvent* event) { int btnId = 0; switch (event->button()) { case Qt::LeftButton: btnId = 3; break; case Qt::MidButton: btnId = 2; break; case Qt::RightButton: btnId = 1; break; default: break; } if (btnId) { InputEventPayload::Event ev(InputEventPayload::Event::MousePress, btnId); iss->sendInputEvent(ev); } QWidget::mousePressEvent(event); } void RemoteScreenViewerWidget::mouseReleaseEvent(QMouseEvent* event) { int btnId = 0; switch (event->button()) { case Qt::LeftButton: btnId = 3; break; case Qt::MidButton: btnId = 2; break; case Qt::RightButton: btnId = 1; break; default: break; } if (btnId) { InputEventPayload::Event ev(InputEventPayload::Event::MouseRelease, btnId); iss->sendInputEvent(ev); } QWidget::mouseReleaseEvent(event); } void RemoteScreenViewerWidget::wheelEvent(QWheelEvent* event) { InputEventPayload::Event ev(InputEventPayload::Event::MouseWheel, event->delta()); iss->sendInputEvent(ev); QWidget::wheelEvent(event); } void RemoteScreenViewerWidget::handleNewImageReceived(const Image& image) { QImage qImg(image.data.data(), image.width, image.height, QImage::Format_RGB888); pixmap = QPixmap::fromImage(qImg).scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); update(); } }