1/* 2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 * 19 */ 20#include "WebPlugin.h" 21 22#include <QEvent> 23#include <QHBoxLayout> 24#include <QKeyEvent> 25#include <QListWidget> 26#include <QListWidgetItem> 27#include <QPainter> 28#include <QtPlugin> 29#include <QPushButton> 30#include <QStyledItemDelegate> 31#include <QVBoxLayout> 32 33static const int gMaemoListItemSize = 70; 34static const int gMaemoListPadding = 38; 35static const int gMaemoMaxVisibleItems = 5; 36 37void Popup::populateList() 38{ 39 QListWidgetItem* listItem; 40 for (int i = 0; i < m_data.itemCount(); ++i) { 41 if (m_data.itemType(i) == QWebSelectData::Option) { 42 listItem = new QListWidgetItem(m_data.itemText(i)); 43 m_list->addItem(listItem); 44 listItem->setSelected(m_data.itemIsSelected(i)); 45 } else if (m_data.itemType(i) == QWebSelectData::Group) { 46 listItem = new QListWidgetItem(m_data.itemText(i)); 47 m_list->addItem(listItem); 48 listItem->setSelected(false); 49 listItem->setFlags(Qt::NoItemFlags); 50 } 51 } 52 connect(m_list, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(onItemSelected(QListWidgetItem*))); 53} 54 55void Popup::onItemSelected(QListWidgetItem* item) 56{ 57 if (item->flags() != Qt::NoItemFlags) 58 emit itemClicked(m_list->row(item)); 59} 60 61WebPopup::WebPopup() 62 : m_popup(0) 63{ 64} 65 66WebPopup::~WebPopup() 67{ 68 if (m_popup) 69 m_popup->deleteLater(); 70} 71 72Popup* WebPopup::createSingleSelectionPopup(const QWebSelectData& data) 73{ 74 return new SingleSelectionPopup(data); 75} 76 77Popup* WebPopup::createMultipleSelectionPopup(const QWebSelectData& data) 78{ 79 return new MultipleSelectionPopup(data); 80} 81 82Popup* WebPopup::createPopup(const QWebSelectData& data) 83{ 84 Popup* result = data.multiple() ? createMultipleSelectionPopup(data) : createSingleSelectionPopup(data); 85 connect(result, SIGNAL(finished(int)), this, SLOT(popupClosed())); 86 connect(result, SIGNAL(itemClicked(int)), this, SLOT(itemClicked(int))); 87 return result; 88} 89 90void WebPopup::show(const QWebSelectData& data) 91{ 92 if (m_popup) 93 return; 94 95 m_popup = createPopup(data); 96 m_popup->show(); 97} 98 99void WebPopup::hide() 100{ 101 if (!m_popup) 102 return; 103 104 m_popup->accept(); 105} 106 107void WebPopup::popupClosed() 108{ 109 if (!m_popup) 110 return; 111 112 m_popup->deleteLater(); 113 m_popup = 0; 114 emit didHide(); 115} 116 117void WebPopup::itemClicked(int idx) 118{ 119 emit selectItem(idx, true, false); 120} 121 122SingleSelectionPopup::SingleSelectionPopup(const QWebSelectData& data) 123 : Popup(data) 124{ 125 const char* title = "select"; 126 if (qstrcmp(title, "weba_ti_texlist_single")) 127 setWindowTitle(QString::fromUtf8(title)); 128 else 129 setWindowTitle("Select item"); 130 131 QHBoxLayout* hLayout = new QHBoxLayout(this); 132 hLayout->setContentsMargins(0, 0, 0, 0); 133 134 m_list = new QListWidget(this); 135 populateList(); 136 137 hLayout->addSpacing(gMaemoListPadding); 138 hLayout->addWidget(m_list); 139 hLayout->addSpacing(gMaemoListPadding); 140 141 connect(m_list, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(accept())); 142 143 const int visibleItemCount = (m_list->count() > gMaemoMaxVisibleItems) ? gMaemoMaxVisibleItems : m_list->count(); 144 resize(size().width(), visibleItemCount * gMaemoListItemSize); 145} 146 147 148class MultipleItemListDelegate : public QStyledItemDelegate { 149public: 150 MultipleItemListDelegate(QObject* parent = 0) 151 : QStyledItemDelegate(parent) 152 { 153 tickMark = QIcon::fromTheme("widgets_tickmark_list").pixmap(48, 48); 154 } 155 156 void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 157 { 158 QStyledItemDelegate::paint(painter, option, index); 159 160 if (option.state & QStyle::State_Selected) 161 painter->drawPixmap(option.rect.width() - tickMark.rect().width(), option.rect.y() + (option.rect.height() / 2 - tickMark.rect().height() / 2), tickMark); 162 } 163 164private: 165 QPixmap tickMark; 166}; 167 168MultipleSelectionPopup::MultipleSelectionPopup(const QWebSelectData& data) 169 : Popup(data) 170{ 171 const char* title = "select"; 172 if (qstrcmp(title, "weba_ti_textlist_multi")) 173 setWindowTitle(QString::fromUtf8(title)); 174 else 175 setWindowTitle("Select items"); 176 177 QHBoxLayout* hLayout = new QHBoxLayout(this); 178 hLayout->setContentsMargins(0, 0, 0, 0); 179 180 m_list = new QListWidget(this); 181 m_list->setSelectionMode(QAbstractItemView::MultiSelection); 182 populateList(); 183 184 MultipleItemListDelegate* delegate = new MultipleItemListDelegate(this); 185 m_list->setItemDelegate(delegate); 186 187 hLayout->addSpacing(gMaemoListPadding); 188 hLayout->addWidget(m_list); 189 190 QVBoxLayout* vLayout = new QVBoxLayout(); 191 192 const int visibleItemCount = (m_list->count() > gMaemoMaxVisibleItems) ? gMaemoMaxVisibleItems : m_list->count(); 193 vLayout->addSpacing((visibleItemCount - 1) * gMaemoListItemSize); 194 195 QPushButton* done = new QPushButton(this); 196 title = "done"; 197 if (qstrcmp(title, "wdgt_bd_done")) 198 done->setText(QString::fromUtf8(title)); 199 else 200 done->setText("Done"); 201 202 done->setMinimumWidth(178); 203 vLayout->addWidget(done); 204 205 hLayout->addSpacing(8); 206 hLayout->addLayout(vLayout); 207 hLayout->addSpacing(18); 208 209 connect(done, SIGNAL(clicked()), this, SLOT(accept())); 210 resize(size().width(), visibleItemCount * gMaemoListItemSize); 211} 212 213#if defined(WTF_USE_QT_MULTIMEDIA) && WTF_USE_QT_MULTIMEDIA 214FullScreenVideoWidget::FullScreenVideoWidget(QMediaPlayer* player) 215 : QVideoWidget() 216 , m_mediaPlayer(player) 217{ 218 Q_ASSERT(m_mediaPlayer); 219 220 setFullScreen(true); 221 m_mediaPlayer->setVideoOutput(this); 222} 223 224bool FullScreenVideoWidget::event(QEvent* ev) 225{ 226 if (ev->type() == QEvent::MouseButtonDblClick) { 227 emit fullScreenClosed(); 228 ev->accept(); 229 return true; 230 } 231 return QWidget::event(ev); 232} 233 234void FullScreenVideoWidget::keyPressEvent(QKeyEvent* ev) 235{ 236 if (ev->key() == Qt::Key_Space) { 237 if (m_mediaPlayer->state() == QMediaPlayer::PlayingState) 238 m_mediaPlayer->pause(); 239 else 240 m_mediaPlayer->play(); 241 ev->accept(); 242 return; 243 } 244} 245 246FullScreenVideoHandler::FullScreenVideoHandler() 247 : m_mediaWidget(0) 248{ 249} 250 251FullScreenVideoHandler::~FullScreenVideoHandler() 252{ 253 delete m_mediaWidget; 254} 255 256bool FullScreenVideoHandler::requiresFullScreenForVideoPlayback() const 257{ 258 return true; 259} 260 261void FullScreenVideoHandler::enterFullScreen(QMediaPlayer* player) 262{ 263 Q_ASSERT(player); 264 265 m_mediaWidget = new FullScreenVideoWidget(player); 266 connect(m_mediaWidget, SIGNAL(fullScreenClosed()), this, SIGNAL(fullScreenClosed())); 267 m_mediaWidget->showFullScreen(); 268} 269 270void FullScreenVideoHandler::exitFullScreen() 271{ 272 m_mediaWidget->hide(); 273 delete m_mediaWidget; 274 m_mediaWidget = 0; 275} 276#endif 277 278bool WebPlugin::supportsExtension(Extension extension) const 279{ 280 switch (extension) { 281 case MultipleSelections: 282 return true; 283#if ENABLE_NOTIFICATIONS 284 case Notifications: 285 return true; 286#endif 287 case TouchInteraction: 288 return true; 289#if defined(WTF_USE_QT_MULTIMEDIA) && WTF_USE_QT_MULTIMEDIA 290 case FullScreenVideoPlayer: 291 return true; 292#endif 293 default: 294 return false; 295 } 296} 297 298QObject* WebPlugin::createExtension(Extension extension) const 299{ 300 switch (extension) { 301 case MultipleSelections: 302 return new WebPopup(); 303#if ENABLE_NOTIFICATIONS 304 case Notifications: 305 return new WebNotificationPresenter(); 306#endif 307 case TouchInteraction: 308 return new TouchModifier(); 309#if defined(WTF_USE_QT_MULTIMEDIA) && WTF_USE_QT_MULTIMEDIA 310 case FullScreenVideoPlayer: 311 return new FullScreenVideoHandler(); 312#endif 313 default: 314 return 0; 315 } 316} 317 318Q_EXPORT_PLUGIN2(platformplugin, WebPlugin) 319