move some event handling to video renderer widget's filter

bug: videogroup example can not handle key event
This commit is contained in:
wang-bin
2013-10-17 23:34:20 +08:00
parent 1b16535090
commit 32b94c4ae9
8 changed files with 76 additions and 56 deletions
+8
View File
@@ -313,6 +313,14 @@ void AVPlayer::setPlayerEventFilter(QObject *obj)
event_filter = obj; //the default event filter's parent is this, so AVPlayer will try to delete event_filter
if (obj) {
qApp->installEventFilter(event_filter);
} else {
//new created renderers keep the event filter
QList<VideoRenderer*> vos = videoOutputs();
if (!vos.isEmpty()) {
foreach (VideoRenderer *vo, vos) {
vo->enableDefaultEventFilter(false);
}
}
}
}
-44
View File
@@ -124,50 +124,6 @@ bool EventFilter::eventFilter(QObject *watched, QEvent *event)
#endif //0
QEvent::Type type = event->type();
switch (type) {
case QEvent::MouseButtonPress: {
qDebug("EventFilter: Mouse press");
QMouseEvent *me = static_cast<QMouseEvent*>(event);
Qt::MouseButton mbt = me->button();
if (mbt == Qt::LeftButton) {
gMousePos = me->globalPos();
iMousePos = me->pos();
}
//TODO: wheel to control volume etc.
}
break;
case QEvent::MouseButtonRelease: {
QMouseEvent *me = static_cast<QMouseEvent*>(event);
Qt::MouseButton mbt = me->button();
qDebug("release btn = %d", mbt);
if (mbt != Qt::LeftButton)
return false;
iMousePos = QPoint();
gMousePos = QPoint();
}
break;
case QEvent::MouseMove: {
if (iMousePos.isNull() || gMousePos.isNull() || !player->renderer()->widget())
return false;
QMouseEvent *me = static_cast<QMouseEvent*>(event);
QWidget *window = player->renderer()->widget()->window();
int x = window->pos().x();
int y = window->pos().y();
int dx = me->globalPos().x() - gMousePos.x();
int dy = me->globalPos().y() - gMousePos.y();
gMousePos = me->globalPos();
window->move(x + dx, y + dy);
}
break;
case QEvent::MouseButtonDblClick: { //TODO: move to gui
QWidget *w = qApp->activeWindow();
if (!w)
return false;
if (w->isFullScreen())
w->showNormal();
else
w->showFullScreen();
}
break;
case QEvent::KeyPress: {
QKeyEvent *key_event = static_cast<QKeyEvent*>(event);
int key = key_event->key();
-1
View File
@@ -54,7 +54,6 @@ protected:
private:
QMenu *menu;
QPoint gMousePos, iMousePos;
};
} //namespace QtAV
+3
View File
@@ -23,6 +23,7 @@
#define QTAV_VIDEOOUTPUTEVENTFILTER_H
#include <QtCore/QObject>
#include <QtCore/QPoint>
#include <QtAV/QtAV_Global.h>
namespace QtAV {
@@ -38,8 +39,10 @@ public:
private slots:
void stopFiltering();
private:
void switchFullScreen();
bool mRendererIsQObj;
VideoRenderer *mpRenderer;
QPoint gMousePos, iMousePos;
};
} //namespace QtAV
+3
View File
@@ -132,6 +132,8 @@ public:
OSDFilter *osdFilter();
Filter* setSubtitleFilter(Filter *filter);
Filter* subtitleFilter();
void enableDefaultEventFilter(bool e);
bool isDefaultEventFilterEnabled() const;
protected:
VideoRenderer(VideoRendererPrivate &d);
virtual bool needUpdateBackground() const;
@@ -152,6 +154,7 @@ protected:
virtual void resizeFrame(int width, int height);
//TODO: parameter QRect?
void handlePaintEvent();
private:
friend class VideoThread;
+2
View File
@@ -57,6 +57,7 @@ public:
, item_holder(0)
, osd_filter(0)
, subtitle_filter(0)
, default_event_filter(true)
{
//conv.setInFormat(PIX_FMT_YUV420P);
//conv.setOutFormat(PIX_FMT_BGR32); //TODO: why not RGB32?
@@ -114,6 +115,7 @@ public:
QGraphicsItem *item_holder;
Filter *osd_filter, *subtitle_filter; //should be at the end of list and draw top level
bool default_event_filter;
};
} //namespace QtAV
+50 -11
View File
@@ -56,6 +56,8 @@ bool VideoOutputEventFilter::eventFilter(QObject *watched, QEvent *event)
}
if (!mpRenderer)
return false;
if (!mpRenderer->isDefaultEventFilterEnabled())
return false;
if (watched != mpRenderer->widget()
/* && watched != mpRenderer->graphicsWidget()*/ //no showFullScreen() etc.
)
@@ -64,22 +66,48 @@ bool VideoOutputEventFilter::eventFilter(QObject *watched, QEvent *event)
case QEvent::KeyPress: {
QKeyEvent *key_event = static_cast<QKeyEvent*>(event);
int key = key_event->key();
Qt::KeyboardModifiers modifiers = key_event->modifiers();
//Qt::KeyboardModifiers modifiers = key_event->modifiers();
switch (key) {
case Qt::Key_F: { //TODO: move to gui
//TODO: active window
QWidget *w = mpRenderer->widget();
if (!w)
return false;
if (w->isFullScreen())
w->showNormal();
else
w->showFullScreen();
}
case Qt::Key_F:
switchFullScreen();
break;
}
}
break;
case QEvent::MouseButtonDblClick:
switchFullScreen();
break;
case QEvent::MouseButtonPress: {
QMouseEvent *me = static_cast<QMouseEvent*>(event);
Qt::MouseButton mbt = me->button();
if (mbt == Qt::LeftButton) {
gMousePos = me->globalPos();
iMousePos = me->pos();
}
}
break;
case QEvent::MouseButtonRelease: {
QMouseEvent *me = static_cast<QMouseEvent*>(event);
Qt::MouseButton mbt = me->button();
if (mbt != Qt::LeftButton)
return false;
iMousePos = QPoint();
gMousePos = QPoint();
}
break;
case QEvent::MouseMove: {
if (iMousePos.isNull() || gMousePos.isNull())
return false;
QMouseEvent *me = static_cast<QMouseEvent*>(event);
QWidget *window = mpRenderer->widget()->window();
int x = window->pos().x();
int y = window->pos().y();
int dx = me->globalPos().x() - gMousePos.x();
int dy = me->globalPos().y() - gMousePos.y();
gMousePos = me->globalPos();
window->move(x + dx, y + dy);
}
break;
default:
break;
}
@@ -91,4 +119,15 @@ void VideoOutputEventFilter::stopFiltering()
mpRenderer = 0;
}
void VideoOutputEventFilter::switchFullScreen()
{
if (!mpRenderer || !mpRenderer->widget())
return;
QWidget *window = mpRenderer->widget()->window();
if (window->isFullScreen())
window->showNormal();
else
window->showFullScreen();
}
} //namespace QtAV
+10
View File
@@ -391,4 +391,14 @@ void VideoRenderer::handlePaintEvent()
//end paint. how about QPainter::endNativePainting()?
}
void VideoRenderer::enableDefaultEventFilter(bool e)
{
d_func().default_event_filter = e;
}
bool VideoRenderer::isDefaultEventFilterEnabled() const
{
return d_func().default_event_filter;
}
} //namespace QtAV