Changeset 846 for trunk/src/gui/widgets/qfocusframe.cpp
- Timestamp:
- May 5, 2011, 5:36:53 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.7.2 (added) merged: 845 /branches/vendor/nokia/qt/current merged: 844 /branches/vendor/nokia/qt/4.6.3 removed
- Property svn:mergeinfo changed
-
trunk/src/gui/widgets/qfocusframe.cpp
r651 r846 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 201 0Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 54 54 Q_DECLARE_PUBLIC(QFocusFrame) 55 55 QWidget *widget; 56 56 QWidget *frameParent; 57 bool showFrameAboveWidget; 57 58 public: 58 59 QFocusFramePrivate() { 59 60 widget = 0; 61 frameParent = 0; 60 62 sendChildEvents = false; 63 showFrameAboveWidget = false; 61 64 } 62 65 void updateSize(); … … 67 70 { 68 71 Q_Q(QFocusFrame); 69 q->setParent( widget->parentWidget());72 q->setParent(frameParent); 70 73 updateSize(); 71 74 if (q->parentWidget()->rect().intersects(q->geometry())) { 72 if ( q->style()->styleHint(QStyle::SH_FocusFrame_AboveWidget, 0, q))75 if (showFrameAboveWidget) 73 76 q->raise(); 74 77 else … … 85 88 int vmargin = q->style()->pixelMetric(QStyle::PM_FocusFrameVMargin), 86 89 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, 88 94 widget->width()+(hmargin*2), widget->height()+(vmargin*2)); 89 95 if(q->geometry() == geom) … … 177 183 { 178 184 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) 180 192 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) { 185 204 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 } 187 231 d->update(); 188 232 } else { … … 211 255 QFocusFrame::paintEvent(QPaintEvent *) 212 256 { 257 Q_D(QFocusFrame); 213 258 QStylePainter p(this); 214 259 QStyleOption option; 215 260 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); 216 266 p.drawControl(QStyle::CE_FocusFrame, option); 217 267 } … … 234 284 break; 235 285 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 } 237 293 break; 238 294 case QEvent::Show: … … 255 311 break; 256 312 } 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 } 257 326 } 258 327 return false;
Note:
See TracChangeset
for help on using the changeset viewer.