From e98bf43728640ff6a54b393e9f28287f34db6d9e Mon Sep 17 00:00:00 2001 From: zeljko Date: Thu, 24 Jul 2008 16:56:33 +0000 Subject: [PATCH] Qt: Changed TQtScrollBar focus behaviour. Fixes #11601 git-svn-id: trunk@15859 - --- lcl/interfaces/qt/qtwidgets.pas | 49 ++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index 9b8d618990..5381cd7a08 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -271,6 +271,8 @@ type { TQtScrollBar } TQtScrollBar = class(TQtAbstractSlider) + private + FRealParentCtl: TWinControl; protected function CreateWidget(const AParams: TCreateParams):QWidgetH; override; public @@ -4492,19 +4494,62 @@ begin {$ifdef VerboseQt} WriteLn('TQtScrollBar.Create'); {$endif} + FRealParentCtl := nil; Result := QScrollBar_create(); FHasPaint := True; end; function TQtScrollBar.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; +var + QtWidget: TQtWidget; + AParent: TWinControl; + w: QWidgetH; begin beginEventProcessing; + + {fixes #11601 - + TODO: Real qt apps behaviour: when we click onto scrollbar + it focuses control eg. treeview (if it isn't focused yet) + but seem that we cannot get it via LCL. + For now we use FRealParentCtl variable to get around this ! + } + if QWidget_focusProxy(QWidgetH(Sender)) = nil then + begin + if not (csDesigning in LCLObject.ComponentState) then + begin + AParent := LCLObject.Parent; + if Assigned(AParent) then + begin + if AParent.HandleAllocated then + begin + QtWidget := TQtWidget(AParent.Handle); + if Assigned(QtWidget) and (QtWidget.Widget <> nil) then + begin + while Assigned(AParent.Parent) do + begin + AParent := AParent.Parent; + QtWidget := TQtWidget(AParent.Handle); + end; + if (QtWidget <> nil) and Assigned(AParent) then + QWidget_setFocusProxy(QWidgetH(Sender), QtWidget.Widget); + end; + end; + end; + end; + end; + case QEvent_type(Event) of {if any of those events returs TRUE our scrollbar becomes invisible.} QEventMouseButtonPress, QEventMouseButtonRelease, - QEventMouseButtonDblClick, + QEventMouseButtonDblClick: + begin + if (FRealParentCtl <> nil) + and not FRealParentCtl.Focused then + FRealParentCtl.SetFocus; + Result := False; + end; QEventMouseMove, QEventWheel, QEventPaint, @@ -7445,6 +7490,7 @@ begin begin FHScrollBar := TQtScrollBar.CreateFrom(LCLObject, QAbstractScrollArea_horizontalScrollBar(QAbstractScrollAreaH(Widget))); FHScrollBar.AttachEvents; + FHScrollBar.FRealParentCtl := LCLObject; end; Result := FHScrollBar; end; @@ -7463,6 +7509,7 @@ begin begin FVScrollbar := TQtScrollBar.CreateFrom(LCLObject, QAbstractScrollArea_verticalScrollBar(QAbstractScrollAreaH(Widget)));; FVScrollbar.AttachEvents; + FVScrollBar.FRealParentCtl := LCLObject; end; Result := FVScrollBar; end;