QIArrowSplitter.cpp revision 4be39ac606cc80de5b28e745a94b099557387ff7
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync/* $Id$ */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync/** @file
5b281ba489ca18f0380d7efc7a5108b606cce449vboxsync *
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * VBox frontends: Qt GUI ("VirtualBox"):
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * VirtualBox Qt extensions: QIArrowSplitter class implementation
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync */
68308f6fe3c9a03c39acd9615d767ad0b3b5dcedvboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync/*
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync *
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * available from http://www.virtualbox.org. This file is free software;
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * General Public License (GPL) as published by the Free Software
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync *
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync * additional information or have any questions.
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync/* VBox includes */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync#include "VBoxGlobal.h"
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync#include "QIArrowSplitter.h"
3aad980b92149dd95a1ab72ddb8d11d61a28ace6vboxsync
3aad980b92149dd95a1ab72ddb8d11d61a28ace6vboxsync/* Qt includes */
ab93606043a9881487aa83be04191d2f4ea24071vboxsync#include <QHBoxLayout>
3aad980b92149dd95a1ab72ddb8d11d61a28ace6vboxsync#include <QKeyEvent>
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsyncQIArrowSplitter::QIArrowSplitter (QWidget *aChild, QWidget *aParent)
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync : QWidget (aParent)
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync , mMainLayout (new QVBoxLayout (this))
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync , mSwitchButton (new QIArrowButtonSwitch())
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync , mBackButton (new QIArrowButtonPress (false, tr ("&Back")))
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync , mNextButton (new QIArrowButtonPress (true, tr ("&Next")))
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync , mChild (aChild)
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync{
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync /* Setup main-layout */
0a7b20727716a00270f358a1c546473d8c36e8f3vboxsync VBoxGlobal::setLayoutMargin (mMainLayout, 0);
3aad980b92149dd95a1ab72ddb8d11d61a28ace6vboxsync
3aad980b92149dd95a1ab72ddb8d11d61a28ace6vboxsync /* Setup buttons */
3aad980b92149dd95a1ab72ddb8d11d61a28ace6vboxsync mBackButton->setVisible (false);
3aad980b92149dd95a1ab72ddb8d11d61a28ace6vboxsync mNextButton->setVisible (false);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync /* Setup connections */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync connect (mSwitchButton, SIGNAL (clicked()), this, SLOT (toggleWidget()));
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync connect (mBackButton, SIGNAL (clicked()), this, SIGNAL (showBackDetails()));
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync connect (mNextButton, SIGNAL (clicked()), this, SIGNAL (showNextDetails()));
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync /* Setup button layout */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync QHBoxLayout *buttonLayout = new QHBoxLayout();
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync VBoxGlobal::setLayoutMargin (buttonLayout, 0);
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync buttonLayout->setSpacing (0);
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync buttonLayout->addWidget (mSwitchButton);
7ccd30dd4bbced565b32c255a11640cd4093abb6vboxsync buttonLayout->addStretch();
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync buttonLayout->addWidget (mBackButton);
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync buttonLayout->addWidget (mNextButton);
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync /* Append layout with children */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mMainLayout->addLayout (buttonLayout);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mMainLayout->addWidget (mChild);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync /* Install event-filter */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync qApp->installEventFilter (this);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync}
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsyncvoid QIArrowSplitter::setMultiPaging (bool aMultiPage)
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync{
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mBackButton->setVisible (aMultiPage);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mNextButton->setVisible (aMultiPage);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync}
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsyncvoid QIArrowSplitter::setButtonEnabled (bool aNext, bool aEnabled)
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync{
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync aNext ? mNextButton->setEnabled (aEnabled)
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync : mBackButton->setEnabled (aEnabled);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync}
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsyncvoid QIArrowSplitter::setName (const QString &aName)
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync{
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mSwitchButton->setText (aName);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync relayout();
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync}
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsyncvoid QIArrowSplitter::toggleWidget()
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync{
d605d5391db09e6395a1c091f148f4b86af84bd3vboxsync mChild->setVisible (mSwitchButton->isExpanded());
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync relayout();
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync}
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsyncbool QIArrowSplitter::eventFilter (QObject *aObject, QEvent *aEvent)
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync{
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync /* Process only parent window children */
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync if (!(aObject == window() || window()->children().contains (aObject)))
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync return QWidget::eventFilter (aObject, aEvent);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync /* Do not process QIArrowButtonSwitch & QIArrowButtonPress children */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync if (aObject == mSwitchButton ||
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync aObject == mBackButton ||
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync aObject == mNextButton ||
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mSwitchButton->children().contains (aObject) ||
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mBackButton->children().contains (aObject) ||
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mNextButton->children().contains (aObject))
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync return QWidget::eventFilter (aObject, aEvent);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync /* Process some keyboard events */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync if (aEvent->type() == QEvent::KeyPress)
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync {
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync QKeyEvent *kEvent = static_cast <QKeyEvent*> (aEvent);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync switch (kEvent->key())
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync {
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync case Qt::Key_Plus:
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync {
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync if (!mSwitchButton->isExpanded())
ab93606043a9881487aa83be04191d2f4ea24071vboxsync mSwitchButton->animateClick();
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync break;
ab93606043a9881487aa83be04191d2f4ea24071vboxsync }
ab93606043a9881487aa83be04191d2f4ea24071vboxsync case Qt::Key_Minus:
ab93606043a9881487aa83be04191d2f4ea24071vboxsync {
ab93606043a9881487aa83be04191d2f4ea24071vboxsync if (mSwitchButton->isExpanded())
ab93606043a9881487aa83be04191d2f4ea24071vboxsync mSwitchButton->animateClick();
ab93606043a9881487aa83be04191d2f4ea24071vboxsync break;
ab93606043a9881487aa83be04191d2f4ea24071vboxsync }
ab93606043a9881487aa83be04191d2f4ea24071vboxsync case Qt::Key_PageUp:
ab93606043a9881487aa83be04191d2f4ea24071vboxsync {
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync if (mNextButton->isEnabled())
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync mNextButton->animateClick();
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync break;
89dfdbb56cf9dddad3c7685b41bda1e4e4c1d6f9vboxsync }
89dfdbb56cf9dddad3c7685b41bda1e4e4c1d6f9vboxsync case Qt::Key_PageDown:
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync {
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync if (mBackButton->isEnabled())
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync mBackButton->animateClick();
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync break;
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync }
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync }
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync }
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync /* Default one handler */
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync return QWidget::eventFilter (aObject, aEvent);
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync}
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsyncvoid QIArrowSplitter::relayout()
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync{
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync /* Update full layout system of message window */
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync QList <QLayout*> layouts = findChildren <QLayout*> ();
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync foreach (QLayout *item, layouts)
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync {
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync item->update();
2e42e0850e182e37277fe28ba5b5d1c37018e783vboxsync item->activate();
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync }
8e342a5c34610667d2b554cb86f1dc2f38a5313cvboxsync
ab93606043a9881487aa83be04191d2f4ea24071vboxsync /* Update main layout of message window at last */
ab93606043a9881487aa83be04191d2f4ea24071vboxsync window()->layout()->update();
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync window()->layout()->activate();
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync qApp->processEvents();
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync /* Now resize window to minimum possible size */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync window()->resize (window()->minimumSizeHint());
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync qApp->processEvents();
ab93606043a9881487aa83be04191d2f4ea24071vboxsync
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync /* Check if we have to make dialog fixed in height */
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync if (mSwitchButton->isExpanded())
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync window()->setMaximumHeight (QWIDGETSIZE_MAX);
9e5c26690d45216629b5f588aced8fcfb68c23b6vboxsync else
ab93606043a9881487aa83be04191d2f4ea24071vboxsync window()->setFixedHeight (window()->minimumSizeHint().height());
ab93606043a9881487aa83be04191d2f4ea24071vboxsync}
ab93606043a9881487aa83be04191d2f4ea24071vboxsync
ab93606043a9881487aa83be04191d2f4ea24071vboxsync