KHtml

render_media.cpp
1 /*
2  * Copyright (C) 2009 Michael Howell <[email protected]>.
3  * Parts copyright (C) 2007, 2008 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #include "render_media.h"
28 #include "media_controls.h"
29 #include <phonon/mediaobject.h>
30 #include <phonon/videowidget.h>
31 #include <QVBoxLayout>
32 
33 const double doubleMax = 999999999.8; // ### numeric_limits<double>::max()
34 const double doubleInf = 999999999.0; // ### numeric_limits<double>::infinity()
35 
36 using namespace DOM;
37 
38 namespace khtml
39 {
40 
41 RenderMedia::RenderMedia(HTMLMediaElement *element) : RenderWidget(element), m_player(nullptr)
42 {
43  setInline(true); // <video> is an inline element.
44  QWidget *container = new QWidget();
45  container->setLayout(new QVBoxLayout(container));
46  setQWidget(container);
47 }
48 
49 void RenderMedia::setPlayer(MediaPlayer *player)
50 {
51  if (m_player == player) {
52  return;
53  }
54  if (m_player) {
55  m_player->deleteLater();
56  }
57  m_player = player;
58  connect(player->mediaObject(), SIGNAL(metaDataChanged()), SLOT(slotMetaDataChanged()));
59  player->setParent(widget());
60  widget()->layout()->addWidget(player);
61 }
62 
63 void RenderMedia::layout()
64 {
65  calcWidth();
66  calcHeight();
67 
68  RenderWidget::layout();
69 
70  if (mediaElement()->controls() && widget()->layout()->count() == 1) {
71  MediaControls *toolbox = new MediaControls(player(), widget());
72  widget()->layout()->addWidget(toolbox);
73  if ((!widget()->underMouse()) && mediaElement()->isVideo()) {
74  toolbox->hide();
75  } else {
76  toolbox->show();
77  }
78  }
79 }
80 
81 bool RenderMedia::eventFilter(QObject *o, QEvent *e)
82 {
83  if (widget()->layout()->count() > 1 && mediaElement()->isVideo()) {
84  switch (e->type()) {
85  case QEvent::Enter:
86  case QEvent::FocusIn:
87  widget()->layout()->itemAt(1)->widget()->show();
88  break;
89  case QEvent::Leave:
90  case QEvent::FocusOut:
91  widget()->layout()->itemAt(1)->widget()->hide();
92  break;
93  default:;
94  }
95  }
96 
97  return RenderWidget::eventFilter(o, e);
98 }
99 
100 void RenderMedia::updateFromElement()
101 {
102  RenderWidget::updateFromElement();
103 }
104 
105 void RenderMedia::slotMetaDataChanged()
106 {
107  if (mediaElement()->isVideo()) {
108  if (player()->videoWidget()->sizeHint().isValid()) {
109  setIntrinsicWidth(player()->videoWidget()->sizeHint().width());
110  setIntrinsicHeight(player()->videoWidget()->sizeHint().height());
111  }
112  } else {
113  if (widget()->sizeHint().isValid()) {
114  setIntrinsicWidth(widget()->sizeHint().width());
115  setIntrinsicHeight(widget()->sizeHint().height());
116  }
117  player()->hide();
118  }
119 
120  setNeedsLayoutAndMinMaxRecalc();
121 }
122 
123 }
QEvent::Type type() const const
This file is part of the HTML rendering engine for KDE.
void setLayout(QLayout *layout)
RenderObject * container() const
returns the object containing this one.
This library provides a full-featured HTML parser and widget.
bool isValid(QStringView ifopt)
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Tue Oct 26 2021 22:48:08 by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.