Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/gui/widgets/qfocusframe.cpp

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    5454    Q_DECLARE_PUBLIC(QFocusFrame)
    5555    QWidget *widget;
    56 
     56    QWidget *frameParent;
     57    bool showFrameAboveWidget;
    5758public:
    5859    QFocusFramePrivate() {
    5960        widget = 0;
     61        frameParent = 0;
    6062        sendChildEvents = false;
     63        showFrameAboveWidget = false;
    6164    }
    6265    void updateSize();
     
    6770{
    6871    Q_Q(QFocusFrame);
    69     q->setParent(widget->parentWidget());
     72    q->setParent(frameParent);
    7073    updateSize();
    7174    if (q->parentWidget()->rect().intersects(q->geometry())) {
    72         if (q->style()->styleHint(QStyle::SH_FocusFrame_AboveWidget, 0, q))
     75        if (showFrameAboveWidget)
    7376            q->raise();
    7477        else
     
    8588    int vmargin = q->style()->pixelMetric(QStyle::PM_FocusFrameVMargin),
    8689        hmargin = q->style()->pixelMetric(QStyle::PM_FocusFrameHMargin);
    87     QRect geom(widget->x()-hmargin, widget->y()-vmargin,
     90    QPoint pos(widget->x(), widget->y());
     91    if (q->parentWidget() != widget->parentWidget())
     92        pos = widget->parentWidget()->mapTo(q->parentWidget(), pos);
     93    QRect geom(pos.x()-hmargin, pos.y()-vmargin,
    8894               widget->width()+(hmargin*2), widget->height()+(vmargin*2));
    8995    if(q->geometry() == geom)
     
    177183{
    178184    Q_D(QFocusFrame);
    179     if(widget == d->widget)
     185
     186    if (style()->styleHint(QStyle::SH_FocusFrame_AboveWidget, 0, this))
     187        d->showFrameAboveWidget = true;
     188    else
     189        d->showFrameAboveWidget = false;
     190
     191    if (widget == d->widget)
    180192        return;
    181 
    182     if(d->widget)
    183         d->widget->removeEventFilter(this);
    184     if(widget && !widget->isWindow() && widget->parentWidget()->windowType() != Qt::SubWindow) {
     193    if (d->widget) {
     194        // Remove event filters from the widget hierarchy.
     195        QWidget *p = d->widget;
     196        do {
     197            p->removeEventFilter(this);
     198            if (!d->showFrameAboveWidget || p == d->frameParent)
     199                break;
     200            p = p->parentWidget();
     201        }while (p);
     202    }
     203    if (widget && !widget->isWindow() && widget->parentWidget()->windowType() != Qt::SubWindow) {
    185204        d->widget = widget;
    186         widget->installEventFilter(this);
     205        d->widget->installEventFilter(this);
     206        QWidget *p = widget->parentWidget();
     207        QWidget *prev = 0;
     208        if (d->showFrameAboveWidget) {
     209            // Find the right parent for the focus frame.
     210            while (p) {
     211                // Traverse the hirerarchy of the 'widget' for setting event filter.
     212                // During this if come across toolbar or a top level, use that
     213                // as the parent for the focus frame. If we find a scroll area
     214                // use its viewport as the parent.
     215                bool isScrollArea = false;
     216                if (p->isWindow() || p->inherits("QToolBar") || (isScrollArea = p->inherits("QAbstractScrollArea"))) {
     217                    d->frameParent = p;
     218                    // The previous one in the hierarchy will be the viewport.
     219                    if (prev && isScrollArea)
     220                        d->frameParent = prev;
     221                    break;
     222                } else {
     223                    p->installEventFilter(this);
     224                    prev = p;
     225                    p = p->parentWidget();
     226                }
     227            }
     228        } else {
     229            d->frameParent = p;
     230        }
    187231        d->update();
    188232    } else {
     
    211255QFocusFrame::paintEvent(QPaintEvent *)
    212256{
     257    Q_D(QFocusFrame);
    213258    QStylePainter p(this);
    214259    QStyleOption option;
    215260    initStyleOption(&option);
     261    int vmargin = style()->pixelMetric(QStyle::PM_FocusFrameVMargin);
     262    int hmargin = style()->pixelMetric(QStyle::PM_FocusFrameHMargin);
     263    QWidgetPrivate *wd = qt_widget_private(d->widget);
     264    QRect rect = wd->clipRect().adjusted(0, 0, hmargin*2, vmargin*2);
     265    p.setClipRect(rect);
    216266    p.drawControl(QStyle::CE_FocusFrame, option);
    217267}
     
    234284            break;
    235285        case QEvent::ParentChange:
    236             d->update();
     286            if (d->showFrameAboveWidget) {
     287                QWidget *w = d->widget;
     288                setWidget(0);
     289                setWidget(w);
     290            } else {
     291                d->update();
     292            }
    237293            break;
    238294        case QEvent::Show:
     
    255311            break;
    256312        }
     313    } else if (d->showFrameAboveWidget) {
     314        // Handle changes in the parent widgets we are monitoring.
     315        switch(e->type()) {
     316        case QEvent::Move:
     317        case QEvent::Resize:
     318            d->updateSize();
     319            break;
     320        case QEvent::ZOrderChange:
     321            raise();
     322            break;
     323        default:
     324            break;
     325        }
    257326    }
    258327    return false;
Note: See TracChangeset for help on using the changeset viewer.