diff -r 0f2326c2a325 -r 1c3b8676e58c ginebra2/ChromeLayout.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra2/ChromeLayout.cpp Tue Jul 06 14:03:49 2010 +0300 @@ -0,0 +1,308 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* +* 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. +* +* 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. +* +* 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: +* +*/ + +#include +#include +#include + +#include "ChromeSnippet.h" +#include "WebChromeContainerSnippet.h" +#include "ChromeLayout.h" +#include "SlidingWidget.h" +#include "ViewController.h" +#include "ObjectCharm.h" +#include "bedrockprovisioning.h" + +namespace GVA { + +// ----------------------------- + + ChromeLayout::ChromeLayout(QGraphicsItem * parent, Qt::WindowFlags wFlags) + : QGraphicsWidget(parent, wFlags), + m_topBar(0), + m_bottomBar(0), + m_leftBar(0), + m_rightBar(0), + m_aspect(portrait), + m_bottomBarHeight(0) + { + m_layout = new QGraphicsAnchorLayout(); + m_layout->setContentsMargins(0,0,0,0); + m_layout->setSpacing(0); + setLayout(m_layout); + addAnchors(); + m_viewPort = new SlidingWidget(this); + m_layout->addAnchor(m_viewPort, Qt::AnchorTop, m_topBar, Qt::AnchorBottom); + m_layout->addAnchor(m_viewPort, Qt::AnchorBottom, m_bottomBar, Qt::AnchorTop); + m_layout->addAnchor(m_viewPort, Qt::AnchorLeft, m_leftBar, Qt::AnchorRight); + m_layout->addAnchor(m_viewPort, Qt::AnchorRight, m_rightBar, Qt::AnchorLeft); + } + + ChromeLayout::~ChromeLayout() + { + delete m_bottomBar; + delete m_topBar; + delete m_leftBar; + delete m_rightBar; + delete m_viewPort; + } + + void ChromeLayout::addAnchors(){ + if (!m_bottomBar){ + m_bottomBar = new QGraphicsWidget(this); + m_bottomBar->setPreferredHeight(0); + m_bottomBar->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); + m_layout->addAnchor(m_bottomBar, Qt::AnchorBottom, m_layout, Qt::AnchorBottom); + m_layout->addAnchors(m_bottomBar, m_layout, Qt::Horizontal); + } + if (!m_topBar){ + m_topBar = new QGraphicsWidget(this); + m_topBar->setPreferredHeight(0); + m_topBar->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); + m_layout->addAnchor(m_topBar, Qt::AnchorTop, m_layout, Qt::AnchorTop); + m_layout->addAnchors(m_topBar, m_layout, Qt::Horizontal); + } + if (!m_leftBar){ + m_leftBar = new QGraphicsWidget(this); + m_leftBar->setPreferredWidth(0); + m_leftBar->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); + m_layout->addAnchor(m_leftBar, Qt::AnchorLeft, m_layout, Qt::AnchorLeft); + m_layout->addAnchors(m_leftBar, m_layout, Qt::Vertical); + } + if (!m_rightBar){ + m_rightBar = new QGraphicsWidget(this); + m_rightBar->setPreferredWidth(0); + m_rightBar->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); + m_layout->addAnchor(m_rightBar, Qt::AnchorRight, m_layout, Qt::AnchorRight); + m_layout->addAnchors(m_rightBar, m_layout, Qt::Vertical); + } + } + + void ChromeLayout::resizeEvent(QGraphicsSceneResizeEvent *ev) + { + emit resizing(ev->newSize()); + int aspect = m_aspect; + m_aspect = (ev->newSize().width() > ev->newSize().height())?landscape:portrait; + if (m_aspect != aspect) { + QString mode = (m_aspect == landscape ? "Landscape" : "Portrait"); + emit aspectChanged(m_aspect); + } + QGraphicsWidget::resizeEvent(ev); + } + + void ChromeLayout::addView(ControllableViewBase * controllableView){ + if (controllableView->widget()) { + m_viewPort->setWindow(controllableView->widget()); + controllableView->widget()->setFocusPolicy(Qt::ClickFocus); //NB: Is this needed? Does it break anything? + controllableView->widget()->setZValue(-1.0); //Make sure we are behind any center anchored snippets + } + } + + void ChromeLayout::anchorToView(ChromeSnippet* snippet, const QString& where) + { + Q_UNUSED(where) + m_viewPort->attachItem(snippet->widget()); + } + + void ChromeLayout::detachFromView(ChromeSnippet* snippet, const QString& where) + { + Q_UNUSED(where) + m_viewPort->detachItem(snippet->widget()); + } + + void ChromeLayout::anchorTogether(ChromeSnippet * first, ChromeSnippet * second, qreal x, qreal y) + { + first->widget()->setParentItem(second->widget()); + first->widget()->setPos(x,y); + } + + void ChromeLayout::unAnchor(ChromeSnippet* snippet) + { + snippet->widget()->setParentItem(0); + snippet->widget()->setParentItem(this); + } + + qreal ChromeLayout::shrinkView(qreal delta) + { + m_viewPort->setShrinkMax(bottomBarHeight()); + return m_viewPort->shrink(delta); + } + + qreal ChromeLayout::slideView(qreal delta) + { + return m_viewPort->slide(delta); + } + + //Check to see if snippet has an anchor and lay it out accordingly. + //Otherwise snippets determine their own positions from html + + void ChromeLayout::anchorSnippet(ChromeSnippet * snippet) + { + if (snippet->anchor() == anchorBottom){ + if (snippet->hidesContent()){ + m_layout->addAnchor(snippet->widget(), Qt::AnchorBottom, m_bottomBar, Qt::AnchorTop); + m_layout->addAnchor(snippet->widget(), Qt::AnchorHorizontalCenter, m_bottomBar, Qt::AnchorHorizontalCenter); + } else { + snippet->widget()->setParentItem(m_bottomBar); + snippet->widget()->setY(-snippet->anchorOffset()); + } + } + else if (snippet->anchor() == anchorTop){ + if (snippet->hidesContent()){ + m_layout->addAnchor(snippet->widget(),Qt::AnchorTop, m_topBar, Qt::AnchorBottom); + m_layout->addAnchor(snippet->widget(), Qt::AnchorHorizontalCenter, m_topBar, Qt::AnchorHorizontalCenter); + } + else { + snippet->widget()->setParentItem(m_topBar); + snippet->widget()->setY(snippet->anchorOffset()); + } + } + else if (snippet->anchor() == anchorLeft){ + if (snippet->hidesContent()) + m_layout->addAnchor(snippet->widget(),Qt::AnchorLeft, m_leftBar, Qt::AnchorRight); + else { + snippet->widget()->setParentItem(m_leftBar); + snippet->widget()->setX(snippet->anchorOffset()); + } + } + else if (snippet->anchor() == anchorRight){ + if (snippet->hidesContent()) + m_layout->addAnchor(snippet->widget(),Qt::AnchorRight, m_rightBar, Qt::AnchorLeft); + else { + snippet->widget()->setParentItem(m_rightBar); + snippet->widget()->setX(-snippet->anchorOffset()); + } + } + else if (snippet->anchor() == anchorCenter) { + snippet->widget()->setParentItem(m_viewPort); + snippet->widget()->setZValue(0.0); + QGraphicsAnchorLayout * vl = static_cast(m_viewPort->layout()); + vl->addAnchor(snippet->widget(), Qt::AnchorVerticalCenter, vl, Qt::AnchorVerticalCenter); + vl->addAnchor(snippet->widget(), Qt::AnchorHorizontalCenter, vl, Qt::AnchorHorizontalCenter); + } + else if (snippet->anchor() == anchorTopLeft){ + m_layout->addCornerAnchors(snippet->widget(), Qt::TopLeftCorner, m_layout, Qt::TopLeftCorner); + } + else if (snippet->anchor() == anchorTopRight) + m_layout->addCornerAnchors(snippet->widget(), Qt::TopRightCorner, m_layout, Qt::TopRightCorner); + else if (snippet->anchor() == anchorBottomLeft) + m_layout->addCornerAnchors(snippet->widget(), Qt::BottomLeftCorner, m_layout, Qt::BottomLeftCorner); + else if (snippet->anchor() == anchorBottomRight) + m_layout->addCornerAnchors(snippet->widget(), Qt::BottomRightCorner, m_layout, Qt::BottomRightCorner); + } + + void ChromeLayout:: addSnippet(ChromeSnippet * snippet, ChromeSnippet * container ) + { + snippet->widget()->setParentItem(this); + if (container){ + container->addChild(snippet); + } + anchorSnippet(snippet); + } + + // Call after a snippet changes to visible state + + void ChromeLayout::snippetShown(ChromeSnippet * snippet) + { + if (snippet->hidesContent()) { + if (snippet->anchor() == anchorBottom) { + /* snippet->widget()->size().height() is zero for WebChromeContainerSnippet + when default visible container snippet is shown, get ownerArea height instead */ + WebChromeContainerSnippet * s = dynamic_cast(snippet); + if (!s) { + m_bottomBarHeight = snippet->widget()->size().height(); + } + else { + m_bottomBarHeight = s->ownerArea().height(); + } + } + return; + } + if (snippet->anchor() == anchorBottom) + m_bottomBar->setPreferredHeight(m_bottomBar->preferredHeight() + snippet->widget()->preferredHeight()); + else if (snippet->anchor() == anchorTop) + m_topBar->setPreferredHeight(m_topBar->preferredHeight() + snippet->widget()->preferredHeight()); + else if (snippet->anchor() == anchorLeft){ + m_leftBar->setPreferredWidth(m_leftBar->preferredWidth() + snippet->widget()->preferredWidth()); + } + else if (snippet->anchor() == anchorRight){ + m_rightBar->setPreferredWidth(m_rightBar->preferredWidth() + snippet->widget()->preferredWidth()); + } + } + + // Call before a snippet changes to invisible state + + void ChromeLayout::snippetHiding(ChromeSnippet * snippet) + { + if (snippet->hidesContent()) + return; + if (snippet->anchor() == anchorBottom) + m_bottomBar->setPreferredHeight(m_bottomBar->preferredHeight() - snippet->widget()->preferredHeight()); + else if (snippet->anchor() == anchorTop) + m_topBar->setPreferredHeight(m_topBar->preferredHeight() - snippet->widget()->preferredHeight()); + else if (snippet->anchor() == anchorLeft){ + m_leftBar->setPreferredWidth(m_leftBar->preferredWidth() - snippet->widget()->preferredWidth()); + } + else if (snippet->anchor() == anchorRight){ + m_rightBar->setPreferredWidth(m_rightBar->preferredWidth() - snippet->widget()->preferredWidth()); + } + } + + QString ChromeLayout::getDisplayMode() const { + return (m_aspect==portrait)?"portrait":"landscape"; + } + + void ChromeLayout::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) + { + event->accept(); + } + + //NB: Deprecate. This really shouldn't be necessary: anchor bars should be implemented as an expanding + //widget class. + + void ChromeLayout::adjustAnchorOffset(ChromeSnippet * snippet, qreal delta) + { + if (snippet->anchor() == anchorBottom) + m_bottomBar->setPreferredHeight(m_bottomBar->preferredHeight() + delta); + else if (snippet->anchor() == anchorTop) + m_topBar->setPreferredHeight(m_topBar->preferredHeight() + delta); + else if (snippet->anchor() == anchorLeft){ + m_leftBar->setPreferredWidth(m_leftBar->preferredWidth() + delta); + } + else if (snippet->anchor() == anchorRight){ + m_rightBar->setPreferredWidth(m_rightBar->preferredWidth() + delta); + } + } + + void ChromeLayout::setScene(QGraphicsScene *scene) + { + m_scene = scene; + //This is the root of the scene hierarchy + m_scene->addItem(this); + + // For testing, turn on red dot that appears in response to various mouse events. + if(BEDROCK_PROVISIONING::BedrockProvisioning::createBedrockProvisioning()->valueAsInt("EnableTouchCircle", false)) { + new TouchCircleCharm(m_scene, this); + } + + } + +} // endof namespace GVA