diff -r b0dd75e285d2 -r 0f2326c2a325 ginebra2/ChromeSnippet.cpp --- a/ginebra2/ChromeSnippet.cpp Fri May 14 15:40:36 2010 +0300 +++ b/ginebra2/ChromeSnippet.cpp Wed Jun 23 17:59:43 2010 +0300 @@ -1,21 +1,24 @@ /* * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License as published by +* the Free Software Foundation, version 2.1 of the License. * -* Initial Contributors: -* Nokia Corporation - initial contribution. +* This program 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 Lesser General Public License for more details. * -* Contributors: +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, +* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/". * -* Description: +* Description: * */ - #include "ChromeSnippet.h" #include "VisibilityAnimator.h" #include "GraphicsItemAnimation.h" @@ -28,8 +31,8 @@ namespace GVA { - ChromeSnippet::ChromeSnippet(const QString & elementId, ChromeWidget * chrome, QGraphicsWidget * widget, const QWebElement & element) - : m_elementId(elementId), + ChromeSnippet::ChromeSnippet(const QString & elementId, ChromeWidget * chrome, QGraphicsWidget * widget, const QWebElement & element) + : m_elementId(elementId), m_element(element), m_parentId(QString()), m_chrome(chrome), @@ -42,10 +45,12 @@ m_vAnimator(0), m_effect(0), m_hiding(0), - m_dontshowFlag (false) + m_dontshowFlag (false), + m_enabled(true), + m_link(0) { setObjectName(m_elementId); //This will be the name under which the snippet is visible in snippets js object - if(m_widget) + if (m_widget) m_widget->hide(); //When chrome is resized child snippets may need to be repositioned QObject::connect(m_chrome->renderer(), SIGNAL(chromeResized()), this, SLOT(positionChildren())); @@ -63,7 +68,7 @@ // delete m_widget; delete m_vAnimator; } - + //This method slot is not actually hooked up in the base ChromeSnippet class. //Instead, specializations of this class can hook it up to their underlying //widget implementations as appropriate. Currently this hooked up in WebChromeSnippet @@ -74,15 +79,15 @@ qDebug() << "ChromeSnippet::contextMenuEvent: " << ev->pos(); emit contextMenuEvent(ev->pos().x(), ev->pos().y()); } - + //NB: Would be architecturally cleaner to do this translation in ChromeDOM //so snippets don't have to know anything about dom attribute string values void ChromeSnippet::setAnchor(const QString& anchor, bool update) { - - if(anchor == "AnchorTop") + + if (anchor == "AnchorTop") setAnchor(anchorTop); else if (anchor == "AnchorBottom") setAnchor(anchorBottom); @@ -102,7 +107,7 @@ setAnchor(anchorBottomRight); else setAnchor(anchorNone); - if(update) + if (update) m_chrome->anchorSnippet(this); } @@ -110,16 +115,16 @@ { int delta = offset - m_anchorOffset; m_anchorOffset = offset; - - if(update){ - if(m_widget->isVisible()) - m_chrome->adjustAnchorOffset(this, delta); + + if (update){ + if (m_widget->isVisible()) + m_chrome->adjustAnchorOffset(this, delta); m_chrome->anchorSnippet(this); } } QString ChromeSnippet::getAnchorString() { - switch(anchor()) { + switch (anchor()) { case anchorTop: return "AnchorTop"; case anchorBottom: @@ -146,21 +151,21 @@ void ChromeSnippet::setVisible(bool visibility, bool animate) { - if(m_visible == visibility) + if (m_visible == visibility) return; m_visible = visibility; - if(m_visible) { + if (m_visible) { - //Visibility animators might leave the snippet - //in some visual state where it cannot be properly shown (e.g. transparent) - //on a previous hide. If no animation is wanted, we need to ask the + //Visibility animators might leave the snippet + //in some visual state where it cannot be properly shown (e.g. transparent) + //on a previous hide. If no animation is wanted, we need to ask the //animator to put the snippet back into a showable state before we show it. - if(m_vAnimator && !animate) - m_vAnimator->setVisible(m_visible, animate); + if (m_vAnimator && !animate) + m_vAnimator->setVisible(m_visible, animate); m_widget->show(); - if(m_vAnimator && animate) - m_vAnimator->setVisible(m_visible, animate); + if (m_vAnimator && animate) + m_vAnimator->setVisible(m_visible, animate); m_chrome->snippetShown(this); //NB: handle this via shown signal m_hiding = false; emit shown(); @@ -168,18 +173,21 @@ else{ m_chrome->snippetHiding(this); //NB: handle this via hiding signal m_hiding = true; - emit hidden(); - if(m_vAnimator) - m_vAnimator->setVisible(m_visible, animate); - else - m_widget->hide(); + if (m_vAnimator) + m_vAnimator->setVisible(m_visible, animate); + else { + m_widget->hide(); + emit hidden(); + } } } void ChromeSnippet::visibilityFinished(bool visible) { - if(!visible) + if (!visible) { m_widget->hide(); + emit hidden(); + } } void ChromeSnippet::toggleVisibility(bool animate) @@ -192,17 +200,33 @@ m_widget->setOpacity(opacity); } - qreal ChromeSnippet::opacity() { return m_widget->opacity(); } + bool ChromeSnippet::enabled() const { + return m_enabled; + } + + void ChromeSnippet::setEnabled(bool value) { + qDebug() << "ChromeSnippet::setEnabled: " << objectName() << value; + if(m_enabled == value) + return; + + m_enabled = value; + m_widget->setEnabled(value); + } + //NB: Move effects to a separate class factory void ChromeSnippet::setEffect(const QString & effect) { - if(effect=="Shadow"){ + if (m_effect){ + delete m_effect; + m_effect = 0; + } + if (effect=="Shadow"){ m_effect = new QGraphicsDropShadowEffect(); static_cast(m_effect)->setOffset(3.0,3.0); static_cast(m_effect)->setBlurRadius(3.0); @@ -217,58 +241,66 @@ static_cast(m_effect)->setBlurRadius(5.0); static_cast(m_effect)->setColor(Qt::green); } - else + else if (effect=="Opacity"){ + m_effect = new QGraphicsOpacityEffect (); + static_cast(m_effect)->setOpacity(.65); + } + else if (effect=="Colorize"){ + m_effect = new QGraphicsColorizeEffect (); + static_cast(m_effect)->setStrength(.65); + static_cast(m_effect)->setColor(Qt::white); + } + else return; m_widget->setGraphicsEffect(m_effect); } void ChromeSnippet::enableEffect(bool enable) { - if(m_effect) + if (m_effect) m_effect->setEnabled(enable); } void ChromeSnippet::toggleEffect() { - if(m_effect) + if (m_effect) m_effect->setEnabled(!m_effect->isEnabled()); } void ChromeSnippet::moveBy(int dx, int dy) { m_widget->moveBy(dx,dy); - } + } QObject *ChromeSnippet::getGeometry() const { - + ScriptRectF *r = new ScriptRectF(m_widget->mapToScene(m_widget->rect()).boundingRect()); - // m_owner->chromePage()->mainFrame()->addToJavaScriptWindowObject("rectf", r, QScriptEngine::ScriptOwnership); + m_chrome->page()->mainFrame()->addToJavaScriptWindowObject("rectf", r, QScriptEngine::ScriptOwnership); return r; } QObject *ChromeSnippet::childGeometry(const QString id) const { QWebElement child = m_element.findFirst("#" + id); - if(child.isNull()) + if (child.isNull()) return 0; QRect childGeo = child.geometry(); QRect parentGeo = m_element.geometry(); //Return geometry relative to parent - return new ScriptRectF(QRect(childGeo.x()-parentGeo.x(), childGeo.y()-parentGeo.y(), childGeo.width(), childGeo.height())); + ScriptRectF *r = new ScriptRectF(QRect(childGeo.x()-parentGeo.x(), childGeo.y()-parentGeo.y(), childGeo.width(), childGeo.height())); + m_chrome->page()->mainFrame()->addToJavaScriptWindowObject("ch_rectf", r, QScriptEngine::ScriptOwnership); + return r; } void ChromeSnippet::onChromeComplete() { positionChildren(); - //If this snippet is linked to another (through 'LinkedTo' attribute, add as a link to that snippet + //If this snippet is linked to another (through 'LinkedTo' attribute, add as a link to that snippet QString linkedTo = m_element.attribute("data-GinebraItemLinkedTo", "none" ); if (linkedTo != "none") { ChromeSnippet * s = m_chrome->getSnippet(linkedTo); if (s) { s->addLink(this); - WebChromeItem * item = static_cast (widget()); - connect(item, SIGNAL(mouseEvent(QEvent::Type)), this, SIGNAL(snippetMouseEvent(QEvent::Type))); - } } @@ -283,7 +315,7 @@ QRect parentGeo = m_element.geometry(); //Get child geometry relative to parent QRectF childGeom(childGeo.x()-parentGeo.x(), childGeo.y()-parentGeo.y(), childGeo.width(), childGeo.height()); - qDebug() << "Parent geometry: " << parentGeo << " child geometry: " << childGeo; + qDebug() << "Parent geometry: " << parentGeo << " child geometry: " << childGeo; childSnippet->widget()->setGeometry(childGeom); } @@ -293,12 +325,12 @@ { qDebug() << "ChromeSnippet::addChild: " << child->elementId(); QWebElement c = m_element.findFirst("#" + child->elementId()); - if(c.isNull()) + if (c.isNull()) return; QRect childGeo = c.geometry(); QRect parentGeo = m_element.geometry(); //Get child geometry relative to parent - QRectF childGeom(childGeo.x()-parentGeo.x(), childGeo.y()-parentGeo.y(), childGeo.width(), childGeo.height()); + QRectF childGeom(childGeo.x()-parentGeo.x(), childGeo.y()-parentGeo.y(), childGeo.width(), childGeo.height()); child->widget()->setGeometry(childGeom); child->widget()->setParentItem(widget()); } @@ -311,7 +343,7 @@ QObject *ChromeSnippet::getPosition() const { ScriptPoint *result = new ScriptPoint(position().toPoint()); - //m_owner->chromePage()->mainFrame()->addToJavaScriptWindowObject("point", result, QScriptEngine::ScriptOwnership); + m_chrome->page()->mainFrame()->addToJavaScriptWindowObject("point", result, QScriptEngine::ScriptOwnership); return result; } @@ -320,15 +352,17 @@ //qDebug() << "Requested x: " << x << " y: " << y; //qDebug() << "Set position: " << m_widget->mapFromScene(QPointF(x,y)); m_widget->setPos(QPointF(x,y)); - } + } void ChromeSnippet::anchorToView(const QString& view, const QString& where) { + Q_UNUSED(where) m_chrome->anchorToView(this, view); } - - void ChromeSnippet::detachFromView(const QString& view, const QString& where) + + void ChromeSnippet::detachFromView(const QString& view, const QString& where) { + Q_UNUSED(where) m_chrome->detachFromView(this, view); } @@ -342,17 +376,18 @@ setAnchor("AnchorNone"); m_chrome->unAnchor(this); } - + QObject *ChromeSnippet::animate(int duration) { GraphicsItemAnimation *an = new GraphicsItemAnimation(this, duration); - //m_owner->chromePage()->mainFrame()->addToJavaScriptWindowObject("animation", an, QScriptEngine::ScriptOwnership); + m_chrome->page()->mainFrame()->addToJavaScriptWindowObject("animation", an, QScriptEngine::ScriptOwnership); return an; } - void ChromeSnippet::setVisibilityAnimator(const QString& animator) + QObject *ChromeSnippet::setVisibilityAnimator(const QString& animator) { m_vAnimator = VisibilityAnimator::create(animator, this); connect(m_vAnimator, SIGNAL(finished(bool)), this, SLOT(visibilityFinished(bool))); + return m_vAnimator; } void ChromeSnippet::grabFocus() @@ -365,15 +400,15 @@ { return m_widget->zValue(); } - + void ChromeSnippet::setZValue(int z) { m_widget->setZValue(z); } - void ChromeSnippet::setTransform(QTransform transform) + void ChromeSnippet::setTransform(QTransform transform) { - m_widget->setTransform(transform); + m_widget->setTransform(transform); } QTransform ChromeSnippet::transform() @@ -383,7 +418,7 @@ void ChromeSnippet::addLink(ChromeSnippet * snippet) { - m_links.append(snippet); + m_link = snippet; } void ChromeSnippet::dump() {